From 86cb85e0479ee82f2d45dc415df3fc30c0bc911c Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Tue, 16 Dec 2025 17:26:37 +0000 Subject: [PATCH 01/64] wip --- package-lock.json | 351 +- package.json | 4 + src/grpc/a2a.ts | 7322 +++++++++++++++++ src/grpc/google/api/annotations.ts | 9 + src/grpc/google/api/client.ts | 2624 ++++++ src/grpc/google/api/field_behavior.ts | 145 + src/grpc/google/api/http.ts | 795 ++ src/grpc/google/api/launch_stage.ts | 121 + src/grpc/google/protobuf/descriptor.ts | 6970 ++++++++++++++++ src/grpc/google/protobuf/duration.ts | 201 + src/grpc/google/protobuf/empty.ts | 87 + src/grpc/google/protobuf/struct.ts | 604 ++ src/grpc/google/protobuf/timestamp.ts | 230 + src/grpc/utils/proto_type_converter.ts | 124 + .../transports/grpc/grpc_transport_handler.ts | 61 + 15 files changed, 19638 insertions(+), 10 deletions(-) create mode 100644 src/grpc/a2a.ts create mode 100644 src/grpc/google/api/annotations.ts create mode 100644 src/grpc/google/api/client.ts create mode 100644 src/grpc/google/api/field_behavior.ts create mode 100644 src/grpc/google/api/http.ts create mode 100644 src/grpc/google/api/launch_stage.ts create mode 100644 src/grpc/google/protobuf/descriptor.ts create mode 100644 src/grpc/google/protobuf/duration.ts create mode 100644 src/grpc/google/protobuf/empty.ts create mode 100644 src/grpc/google/protobuf/struct.ts create mode 100644 src/grpc/google/protobuf/timestamp.ts create mode 100644 src/grpc/utils/proto_type_converter.ts create mode 100644 src/server/transports/grpc/grpc_transport_handler.ts diff --git a/package-lock.json b/package-lock.json index e0bf30ac..b37969b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.3.6", "license": "Apache-2.0", "dependencies": { + "@grpc/grpc-js": "^1.14.3", "uuid": "^11.1.0" }, "devDependencies": { @@ -24,11 +25,13 @@ "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.4", "express": "^5.1.0", + "google-proto-files": "^5.0.1", "gts": "^6.0.2", "json-schema-to-typescript": "^15.0.4", "prettier": "^3.6.2", "sinon": "^20.0.0", "supertest": "^7.1.4", + "ts-proto": "^2.8.3", "tsup": "^8.5.0", "tsx": "^4.19.3", "typescript": "^5.9.3", @@ -140,6 +143,13 @@ "node": ">=18" } }, + "node_modules/@bufbuild/protobuf": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.10.2.tgz", + "integrity": "sha512-uFsRXwIGyu+r6AMdz+XijIIZJYpoWeYzILt5yZ2d3mCjQrWUTVpVD9WL/jZAbvp+Ed04rOhrsk7FiTcEDseB5A==", + "dev": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, "node_modules/@edge-runtime/primitives": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-6.0.0.tgz", @@ -749,6 +759,37 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@grpc/grpc-js": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", + "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", + "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.3", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -936,6 +977,16 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", @@ -1028,6 +1079,70 @@ "url": "https://opencollective.com/pkgr" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.53.2", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.2.tgz", @@ -1508,7 +1623,6 @@ "version": "22.19.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", - "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -2108,7 +2222,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -2118,7 +2231,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -2368,6 +2480,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/case-anything": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz", + "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2431,11 +2556,41 @@ "node": ">= 10" } }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -2448,7 +2603,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, "license": "MIT" }, "node_modules/combined-stream": { @@ -2656,6 +2810,19 @@ "node": ">= 0.8" } }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -2703,6 +2870,16 @@ "node": ">=6.0.0" } }, + "node_modules/dprint-node": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.8.tgz", + "integrity": "sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2736,7 +2913,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, "license": "MIT" }, "node_modules/encodeurl": { @@ -2857,6 +3033,15 @@ "@esbuild/win32-x64": "0.27.0" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -3652,6 +3837,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -3811,6 +4005,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/google-proto-files": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-5.0.1.tgz", + "integrity": "sha512-DM5x0D1QM/kTQ12p57lG14+aL3PMPtbzYf+oekPMkUweUjrrT4crzV7O9LakZF5/rdl+SVBeSiA/sfTu/dAWvw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "protobufjs": "7.5.4", + "walkdir": "^0.4.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -4644,7 +4852,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -4972,6 +5179,12 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4979,6 +5192,12 @@ "dev": true, "license": "MIT" }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -5836,6 +6055,30 @@ "node": ">=6.0.0" } }, + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -6114,6 +6357,15 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -6626,7 +6878,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -6657,7 +6908,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -6983,6 +7233,42 @@ "dev": true, "license": "Apache-2.0" }, + "node_modules/ts-poet": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.12.0.tgz", + "integrity": "sha512-xo+iRNMWqyvXpFTaOAvLPA5QAWO6TZrSUs5s4Odaya3epqofBu/fMLHEWl8jPmjhA0s9sgj9sNvF1BmaQlmQkA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dprint-node": "^1.0.8" + } + }, + "node_modules/ts-proto": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-2.8.3.tgz", + "integrity": "sha512-TdXInqG+61pj/TvORqITWjvjTTsL1EZxwX49iEj89+xFAcqPT8tjChpAGQXzfcF4MJwvNiuoCEbBOKqVf3ds3g==", + "dev": true, + "license": "ISC", + "dependencies": { + "@bufbuild/protobuf": "^2.0.0", + "case-anything": "^2.1.13", + "ts-poet": "^6.12.0", + "ts-proto-descriptors": "2.0.0" + }, + "bin": { + "protoc-gen-ts_proto": "protoc-gen-ts_proto" + } + }, + "node_modules/ts-proto-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-2.0.0.tgz", + "integrity": "sha512-wHcTH3xIv11jxgkX5OyCSFfw27agpInAd6yh89hKG6zqIXnjW9SYqSER2CVQxdPj4czeOhGagNvZBEbJPy7qkw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@bufbuild/protobuf": "^2.0.0" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -7690,7 +7976,6 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, "license": "MIT" }, "node_modules/unpipe": { @@ -8394,6 +8679,16 @@ "node": ">=18" } }, + "node_modules/walkdir": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", + "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -8569,6 +8864,15 @@ "dev": true, "license": "ISC" }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -8576,6 +8880,33 @@ "dev": true, "license": "ISC" }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index b6ec1a7b..7e5f6927 100644 --- a/package.json +++ b/package.json @@ -53,11 +53,13 @@ "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.4", "express": "^5.1.0", + "google-proto-files": "^5.0.1", "gts": "^6.0.2", "json-schema-to-typescript": "^15.0.4", "prettier": "^3.6.2", "sinon": "^20.0.0", "supertest": "^7.1.4", + "ts-proto": "^2.8.3", "tsup": "^8.5.0", "tsx": "^4.19.3", "typescript": "^5.9.3", @@ -73,10 +75,12 @@ "format:readme": "prettier --write ./README.md", "lint:fix": "npx eslint . --fix", "coverage": "vitest run --coverage", + "ts-proto": "curl -o ./src/grpc/a2a.proto https://raw.githubusercontent.com/a2aproject/A2A/main/specification/grpc/a2a.proto && protoc --plugin=./node_modules/.bin/protoc-gen-ts_proto --ts_proto_out=./src/grpc --ts_proto_opt=oneof=unions-value,importSuffix=.js,outputServices=grpc-js,env=node,esModuleInterop=true --proto_path=./src/grpc ./src/grpc/a2a.proto -I ./node_modules/google-proto-files && rm ./src/grpc/a2a.proto", "generate": "curl https://raw.githubusercontent.com/google-a2a/A2A/refs/heads/main/specification/json/a2a.json > spec.json && node scripts/generateTypes.js && rm spec.json", "test-build:browser": "esbuild ./dist/client/index.js ./dist/index.js --bundle --platform=browser --outdir=dist/tmp-checks --outbase=./dist" }, "dependencies": { + "@grpc/grpc-js": "^1.14.3", "uuid": "^11.1.0" }, "peerDependencies": { diff --git a/src/grpc/a2a.ts b/src/grpc/a2a.ts new file mode 100644 index 00000000..be83eb2d --- /dev/null +++ b/src/grpc/a2a.ts @@ -0,0 +1,7322 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.8.3 +// protoc v3.21.12 +// source: a2a.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; +import { + type CallOptions, + type ChannelCredentials, + Client, + type ClientOptions, + type ClientReadableStream, + type ClientUnaryCall, + type handleServerStreamingCall, + type handleUnaryCall, + makeGenericClientConstructor, + type Metadata, + type ServiceError, + type UntypedServiceImplementation, +} from "@grpc/grpc-js"; +import { Empty } from "./google/protobuf/empty.js"; +import { Struct } from "./google/protobuf/struct.js"; +import { Timestamp } from "./google/protobuf/timestamp.js"; + +export const protobufPackage = "a2a.v1"; + +/** Older protoc compilers don't understand edition yet. */ + +/** + * --8<-- [start:TaskState] + * Defines the possible lifecycle states of a Task. + */ +export enum TaskState { + /** TASK_STATE_UNSPECIFIED - The task is in an unknown or indeterminate state. */ + TASK_STATE_UNSPECIFIED = 0, + /** TASK_STATE_SUBMITTED - Represents the status that acknowledges a task is created. */ + TASK_STATE_SUBMITTED = 1, + /** TASK_STATE_WORKING - Represents the status that a task is actively being processed. */ + TASK_STATE_WORKING = 2, + /** TASK_STATE_COMPLETED - Represents the status a task is finished. This is a terminal state. */ + TASK_STATE_COMPLETED = 3, + /** TASK_STATE_FAILED - Represents the status a task is done but failed. This is a terminal state. */ + TASK_STATE_FAILED = 4, + /** + * TASK_STATE_CANCELLED - Represents the status a task was cancelled before it finished. + * This is a terminal state. + */ + TASK_STATE_CANCELLED = 5, + /** + * TASK_STATE_INPUT_REQUIRED - Represents the status that the task requires information to complete. + * This is an interrupted state. + */ + TASK_STATE_INPUT_REQUIRED = 6, + /** + * TASK_STATE_REJECTED - Represents the status that the agent has decided to not perform the task. + * This may be done during initial task creation or later once an agent + * has determined it can't or won't proceed. This is a terminal state. + */ + TASK_STATE_REJECTED = 7, + /** + * TASK_STATE_AUTH_REQUIRED - Represents the state that some authentication is needed from the upstream + * client. Authentication is expected to come out-of-band thus this is not + * an interrupted or terminal state. + */ + TASK_STATE_AUTH_REQUIRED = 8, + UNRECOGNIZED = -1, +} + +export function taskStateFromJSON(object: any): TaskState { + switch (object) { + case 0: + case "TASK_STATE_UNSPECIFIED": + return TaskState.TASK_STATE_UNSPECIFIED; + case 1: + case "TASK_STATE_SUBMITTED": + return TaskState.TASK_STATE_SUBMITTED; + case 2: + case "TASK_STATE_WORKING": + return TaskState.TASK_STATE_WORKING; + case 3: + case "TASK_STATE_COMPLETED": + return TaskState.TASK_STATE_COMPLETED; + case 4: + case "TASK_STATE_FAILED": + return TaskState.TASK_STATE_FAILED; + case 5: + case "TASK_STATE_CANCELLED": + return TaskState.TASK_STATE_CANCELLED; + case 6: + case "TASK_STATE_INPUT_REQUIRED": + return TaskState.TASK_STATE_INPUT_REQUIRED; + case 7: + case "TASK_STATE_REJECTED": + return TaskState.TASK_STATE_REJECTED; + case 8: + case "TASK_STATE_AUTH_REQUIRED": + return TaskState.TASK_STATE_AUTH_REQUIRED; + case -1: + case "UNRECOGNIZED": + default: + return TaskState.UNRECOGNIZED; + } +} + +export function taskStateToJSON(object: TaskState): string { + switch (object) { + case TaskState.TASK_STATE_UNSPECIFIED: + return "TASK_STATE_UNSPECIFIED"; + case TaskState.TASK_STATE_SUBMITTED: + return "TASK_STATE_SUBMITTED"; + case TaskState.TASK_STATE_WORKING: + return "TASK_STATE_WORKING"; + case TaskState.TASK_STATE_COMPLETED: + return "TASK_STATE_COMPLETED"; + case TaskState.TASK_STATE_FAILED: + return "TASK_STATE_FAILED"; + case TaskState.TASK_STATE_CANCELLED: + return "TASK_STATE_CANCELLED"; + case TaskState.TASK_STATE_INPUT_REQUIRED: + return "TASK_STATE_INPUT_REQUIRED"; + case TaskState.TASK_STATE_REJECTED: + return "TASK_STATE_REJECTED"; + case TaskState.TASK_STATE_AUTH_REQUIRED: + return "TASK_STATE_AUTH_REQUIRED"; + case TaskState.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** + * --8<-- [start:Role] + * Defines the sender of a message in A2A protocol communication. + */ +export enum Role { + ROLE_UNSPECIFIED = 0, + /** ROLE_USER - USER role refers to communication from the client to the server. */ + ROLE_USER = 1, + /** ROLE_AGENT - AGENT role refers to communication from the server to the client. */ + ROLE_AGENT = 2, + UNRECOGNIZED = -1, +} + +export function roleFromJSON(object: any): Role { + switch (object) { + case 0: + case "ROLE_UNSPECIFIED": + return Role.ROLE_UNSPECIFIED; + case 1: + case "ROLE_USER": + return Role.ROLE_USER; + case 2: + case "ROLE_AGENT": + return Role.ROLE_AGENT; + case -1: + case "UNRECOGNIZED": + default: + return Role.UNRECOGNIZED; + } +} + +export function roleToJSON(object: Role): string { + switch (object) { + case Role.ROLE_UNSPECIFIED: + return "ROLE_UNSPECIFIED"; + case Role.ROLE_USER: + return "ROLE_USER"; + case Role.ROLE_AGENT: + return "ROLE_AGENT"; + case Role.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** + * --8<-- [start:SendMessageConfiguration] + * Configuration of a send message request. + */ +export interface SendMessageConfiguration { + /** A list of media types the client is prepared to accept for response parts. Agents SHOULD use this to tailor their output. */ + acceptedOutputModes: string[]; + /** Configuration for the agent to send push notifications for task updates. */ + pushNotificationConfig: + | PushNotificationConfig + | undefined; + /** The maximum number of messages to include in the history. */ + historyLength?: + | number + | undefined; + /** If true, the operation waits until the task reaches a terminal state before returning. Default is false. */ + blocking: boolean; +} + +/** + * --8<-- [start:Task] + * Task is the core unit of action for A2A. It has a current status + * and when results are created for the task they are stored in the + * artifact. If there are multiple turns for a task, these are stored in + * history. + */ +export interface Task { + /** + * Unique identifier (e.g. UUID) for the task, generated by the server for a + * new task. + */ + id: string; + /** + * Unique identifier (e.g. UUID) for the contextual collection of interactions + * (tasks and messages). Created by the A2A server. + */ + contextId: string; + /** The current status of a Task, including state and a message. */ + status: + | TaskStatus + | undefined; + /** A set of output artifacts for a Task. */ + artifacts: Artifact[]; + /** + * protolint:disable REPEATED_FIELD_NAMES_PLURALIZED + * The history of interactions from a task. + */ + history: Message[]; + /** + * protolint:enable REPEATED_FIELD_NAMES_PLURALIZED + * A key/value object to store custom metadata about a task. + */ + metadata: { [key: string]: any } | undefined; +} + +/** + * --8<-- [start:TaskStatus] + * A container for the status of a task + */ +export interface TaskStatus { + /** The current state of this task. */ + state: TaskState; + /** A message associated with the status. */ + message: + | Message + | undefined; + /** + * ISO 8601 Timestamp when the status was recorded. + * Example: "2023-10-27T10:00:00Z" + */ + timestamp: Date | undefined; +} + +/** + * --8<-- [start:Part] + * Part represents a container for a section of communication content. + * Parts can be purely textual, some sort of file (image, video, etc) or + * a structured data blob (i.e. JSON). + */ +export interface Part { + part?: + | // + /** The string content of the text part. */ + { $case: "text"; value: string } + | // + /** The file content, represented as either a URI or as base64-encoded bytes. */ + { $case: "file"; value: FilePart } + | // + /** The structured data content. */ + { $case: "data"; value: DataPart } + | undefined; + /** Optional metadata associated with this part. */ + metadata: { [key: string]: any } | undefined; +} + +/** + * --8<-- [start:FilePart] + * FilePart represents the different ways files can be provided. If files are + * small, directly feeding the bytes is supported via file_with_bytes. If the + * file is large, the agent should read the content as appropriate directly + * from the file_with_uri source. + */ +export interface FilePart { + file?: + | // + /** A URL pointing to the file's content. */ + { $case: "fileWithUri"; value: string } + | // + /** The base64-encoded content of the file. */ + { $case: "fileWithBytes"; value: Buffer } + | undefined; + /** The media type of the file (e.g., "application/pdf"). */ + mediaType: string; + /** An optional name for the file (e.g., "document.pdf"). */ + name: string; +} + +/** + * --8<-- [start:DataPart] + * DataPart represents a structured blob. + */ +export interface DataPart { + /** A JSON object containing arbitrary data. */ + data: { [key: string]: any } | undefined; +} + +/** + * --8<-- [start:Message] + * Message is one unit of communication between client and server. It is + * associated with a context and optionally a task. Since the server is + * responsible for the context definition, it must always provide a context_id + * in its messages. The client can optionally provide the context_id if it + * knows the context to associate the message to. Similarly for task_id, + * except the server decides if a task is created and whether to include the + * task_id. + */ +export interface Message { + /** + * The unique identifier (e.g. UUID) of the message. This is required and + * created by the message creator. + */ + messageId: string; + /** + * The context id of the message. This is optional and if set, the message + * will be associated with the given context. + */ + contextId: string; + /** + * The task id of the message. This is optional and if set, the message + * will be associated with the given task. + */ + taskId: string; + /** Identifies the sender of the message. */ + role: Role; + /** + * protolint:disable REPEATED_FIELD_NAMES_PLURALIZED + * Parts is the container of the message content. + */ + parts: Part[]; + /** + * protolint:enable REPEATED_FIELD_NAMES_PLURALIZED + * Any optional metadata to provide along with the message. + */ + metadata: + | { [key: string]: any } + | undefined; + /** The URIs of extensions that are present or contributed to this Message. */ + extensions: string[]; + /** A list of task IDs that this message references for additional context. */ + referenceTaskIds: string[]; +} + +/** + * --8<-- [start:Artifact] + * Artifacts represent task outputs. + */ +export interface Artifact { + /** + * Unique identifier (e.g. UUID) for the artifact. It must be at least unique + * within a task. + */ + artifactId: string; + /** A human readable name for the artifact. */ + name: string; + /** A human readable description of the artifact, optional. */ + description: string; + /** The content of the artifact. Must contain at least one part. */ + parts: Part[]; + /** Optional metadata included with the artifact. */ + metadata: + | { [key: string]: any } + | undefined; + /** The URIs of extensions that are present or contributed to this Artifact. */ + extensions: string[]; +} + +/** + * --8<-- [start:TaskStatusUpdateEvent] + * An event sent by the agent to notify the client of a change in a task's + * status. + */ +export interface TaskStatusUpdateEvent { + /** The id of the task that is changed */ + taskId: string; + /** The id of the context that the task belongs to */ + contextId: string; + /** The new status of the task. */ + status: + | TaskStatus + | undefined; + /** If true, this is the final event in the stream for this interaction. */ + final: boolean; + /** Optional metadata to associate with the task update. */ + metadata: { [key: string]: any } | undefined; +} + +/** + * --8<-- [start:TaskArtifactUpdateEvent] + * TaskArtifactUpdateEvent represents a task delta where an artifact has + * been generated. + */ +export interface TaskArtifactUpdateEvent { + /** The id of the task for this artifact. */ + taskId: string; + /** The id of the context that this task belongs to. */ + contextId: string; + /** The artifact that was generated or updated. */ + artifact: + | Artifact + | undefined; + /** + * If true, the content of this artifact should be appended to a previously + * sent artifact with the same ID. + */ + append: boolean; + /** If true, this is the final chunk of the artifact. */ + lastChunk: boolean; + /** Optional metadata associated with the artifact update. */ + metadata: { [key: string]: any } | undefined; +} + +/** + * --8<-- [start:PushNotificationConfig] + * Configuration for setting up push notifications for task updates. + */ +export interface PushNotificationConfig { + /** A unique identifier (e.g. UUID) for this push notification. */ + id: string; + /** Url to send the notification too */ + url: string; + /** Token unique for this task/session */ + token: string; + /** Information about the authentication to sent with the notification */ + authentication: AuthenticationInfo | undefined; +} + +/** + * --8<-- [start:PushNotificationAuthenticationInfo] + * Defines authentication details, used for push notifications. + */ +export interface AuthenticationInfo { + /** A list of supported authentication schemes (e.g., 'Basic', 'Bearer'). */ + schemes: string[]; + /** Optional credentials */ + credentials: string; +} + +/** + * --8<-- [start:AgentInterface] + * Declares a combination of a target URL and a transport protocol for interacting with the agent. + * This allows agents to expose the same functionality over multiple protocol binding mechanisms. + */ +export interface AgentInterface { + /** + * The URL where this interface is available. Must be a valid absolute HTTPS URL in production. + * Example: "https://api.example.com/a2a/v1", "https://grpc.example.com/a2a" + */ + url: string; + /** + * The protocol binding supported at this URL. This is an open form string, to be + * easily extended for other protocol bindings. The core ones officially + * supported are `JSONRPC`, `GRPC` and `HTTP+JSON`. + */ + protocolBinding: string; + /** Tenant to be set in the request when calling the agent. */ + tenant: string; +} + +/** + * --8<-- [start:AgentCard] + * AgentCard is a self-describing manifest for an agent. It provides essential + * metadata including the agent's identity, capabilities, skills, supported + * communication methods, and security requirements. + * Next ID: 20 + */ +export interface AgentCard { + /** + * The version of the A2A protocol this agent supports. + * Default: "1.0" + */ + protocolVersion?: + | string + | undefined; + /** + * A human readable name for the agent. + * Example: "Recipe Agent" + */ + name: string; + /** + * A human-readable description of the agent, assisting users and other agents + * in understanding its purpose. + * Example: "Agent that helps users with recipes and cooking." + */ + description: string; + /** Ordered list of supported interfaces. First entry is preferred. */ + supportedInterfaces: AgentInterface[]; + /** + * DEPRECATED: Use 'supported_interfaces' instead. + * + * @deprecated + */ + url?: + | string + | undefined; + /** + * DEPRECATED: Use 'supported_interfaces' instead. + * + * @deprecated + */ + preferredTransport?: + | string + | undefined; + /** + * DEPRECATED: Use 'supported_interfaces' instead. + * + * @deprecated + */ + additionalInterfaces: AgentInterface[]; + /** The service provider of the agent. */ + provider: + | AgentProvider + | undefined; + /** + * The version of the agent. + * Example: "1.0.0" + */ + version: string; + /** A url to provide additional documentation about the agent. */ + documentationUrl?: + | string + | undefined; + /** A2A Capability set supported by the agent. */ + capabilities: + | AgentCapabilities + | undefined; + /** The security scheme details used for authenticating with this agent. */ + securitySchemes: { [key: string]: SecurityScheme }; + /** + * protolint:disable REPEATED_FIELD_NAMES_PLURALIZED + * Security requirements for contacting the agent. + */ + security: Security[]; + /** + * protolint:enable REPEATED_FIELD_NAMES_PLURALIZED + * The set of interaction modes that the agent supports across all skills. + * This can be overridden per skill. Defined as media types. + */ + defaultInputModes: string[]; + /** The media types supported as outputs from this agent. */ + defaultOutputModes: string[]; + /** + * Skills represent an ability of an agent. It is largely + * a descriptive concept but represents a more focused set of behaviors that the + * agent is likely to succeed at. + */ + skills: AgentSkill[]; + /** Whether the agent supports providing an extended agent card when authenticated. */ + supportsExtendedAgentCard?: + | boolean + | undefined; + /** JSON Web Signatures computed for this AgentCard. */ + signatures: AgentCardSignature[]; + /** An optional URL to an icon for the agent. */ + iconUrl?: string | undefined; +} + +export interface AgentCard_SecuritySchemesEntry { + key: string; + value: SecurityScheme | undefined; +} + +/** + * --8<-- [start:AgentProvider] + * Represents the service provider of an agent. + */ +export interface AgentProvider { + /** + * A URL for the agent provider's website or relevant documentation. + * Example: "https://ai.google.dev" + */ + url: string; + /** + * The name of the agent provider's organization. + * Example: "Google" + */ + organization: string; +} + +/** + * --8<-- [start:AgentCapabilities] + * Defines optional capabilities supported by an agent. + */ +export interface AgentCapabilities { + /** Indicates if the agent supports streaming responses. */ + streaming?: + | boolean + | undefined; + /** Indicates if the agent supports sending push notifications for asynchronous task updates. */ + pushNotifications?: + | boolean + | undefined; + /** A list of protocol extensions supported by the agent. */ + extensions: AgentExtension[]; + /** Indicates if the agent provides a history of state transitions for a task. */ + stateTransitionHistory?: boolean | undefined; +} + +/** + * --8<-- [start:AgentExtension] + * A declaration of a protocol extension supported by an Agent. + */ +export interface AgentExtension { + /** The unique URI identifying the extension. */ + uri: string; + /** A human-readable description of how this agent uses the extension. */ + description: string; + /** If true, the client must understand and comply with the extension's requirements. */ + required: boolean; + /** Optional, extension-specific configuration parameters. */ + params: { [key: string]: any } | undefined; +} + +/** + * --8<-- [start:AgentSkill] + * Represents a distinct capability or function that an agent can perform. + */ +export interface AgentSkill { + /** A unique identifier for the agent's skill. */ + id: string; + /** A human-readable name for the skill. */ + name: string; + /** A detailed description of the skill. */ + description: string; + /** A set of keywords describing the skill's capabilities. */ + tags: string[]; + /** Example prompts or scenarios that this skill can handle. */ + examples: string[]; + /** The set of supported input media types for this skill, overriding the agent's defaults. */ + inputModes: string[]; + /** The set of supported output media types for this skill, overriding the agent's defaults. */ + outputModes: string[]; + /** + * protolint:disable REPEATED_FIELD_NAMES_PLURALIZED + * Security schemes necessary for this skill. + */ + security: Security[]; +} + +/** + * --8<-- [start:AgentCardSignature] + * AgentCardSignature represents a JWS signature of an AgentCard. + * This follows the JSON format of an RFC 7515 JSON Web Signature (JWS). + */ +export interface AgentCardSignature { + /** + * The protected JWS header for the signature. This is always a + * base64url-encoded JSON object. Required. + */ + protected: string; + /** The computed signature, base64url-encoded. Required. */ + signature: string; + /** The unprotected JWS header values. */ + header: { [key: string]: any } | undefined; +} + +/** + * --8<-- [start:TaskPushNotificationConfig] + * A container associating a push notification configuration with a specific + * task. + */ +export interface TaskPushNotificationConfig { + /** + * The resource name of the config. + * Format: tasks/{task_id}/pushNotificationConfigs/{config_id} + */ + name: string; + /** The push notification configuration details. */ + pushNotificationConfig: PushNotificationConfig | undefined; +} + +/** protolint:disable REPEATED_FIELD_NAMES_PLURALIZED */ +export interface StringList { + list: string[]; +} + +export interface Security { + schemes: { [key: string]: StringList }; +} + +export interface Security_SchemesEntry { + key: string; + value: StringList | undefined; +} + +/** + * --8<-- [start:SecurityScheme] + * Defines a security scheme that can be used to secure an agent's endpoints. + * This is a discriminated union type based on the OpenAPI 3.2 Security Scheme Object. + * See: https://spec.openapis.org/oas/v3.2.0.html#security-scheme-object + */ +export interface SecurityScheme { + scheme?: + | // + /** API key-based authentication. */ + { $case: "apiKeySecurityScheme"; value: APIKeySecurityScheme } + | // + /** HTTP authentication (Basic, Bearer, etc.). */ + { $case: "httpAuthSecurityScheme"; value: HTTPAuthSecurityScheme } + | // + /** OAuth 2.0 authentication. */ + { $case: "oauth2SecurityScheme"; value: OAuth2SecurityScheme } + | // + /** OpenID Connect authentication. */ + { $case: "openIdConnectSecurityScheme"; value: OpenIdConnectSecurityScheme } + | // + /** Mutual TLS authentication. */ + { $case: "mtlsSecurityScheme"; value: MutualTlsSecurityScheme } + | undefined; +} + +/** + * --8<-- [start:APIKeySecurityScheme] + * Defines a security scheme using an API key. + */ +export interface APIKeySecurityScheme { + /** An optional description for the security scheme. */ + description: string; + /** The location of the API key. Valid values are "query", "header", or "cookie". */ + location: string; + /** The name of the header, query, or cookie parameter to be used. */ + name: string; +} + +/** + * --8<-- [start:HTTPAuthSecurityScheme] + * Defines a security scheme using HTTP authentication. + */ +export interface HTTPAuthSecurityScheme { + /** An optional description for the security scheme. */ + description: string; + /** + * The name of the HTTP Authentication scheme to be used in the Authorization header, + * as defined in RFC7235 (e.g., "Bearer"). + * This value should be registered in the IANA Authentication Scheme registry. + */ + scheme: string; + /** + * A hint to the client to identify how the bearer token is formatted (e.g., "JWT"). + * This is primarily for documentation purposes. + */ + bearerFormat: string; +} + +/** + * --8<-- [start:OAuth2SecurityScheme] + * Defines a security scheme using OAuth 2.0. + */ +export interface OAuth2SecurityScheme { + /** An optional description for the security scheme. */ + description: string; + /** An object containing configuration information for the supported OAuth 2.0 flows. */ + flows: + | OAuthFlows + | undefined; + /** + * URL to the oauth2 authorization server metadata + * RFC8414 (https://datatracker.ietf.org/doc/html/rfc8414). TLS is required. + */ + oauth2MetadataUrl: string; +} + +/** + * --8<-- [start:OpenIdConnectSecurityScheme] + * Defines a security scheme using OpenID Connect. + */ +export interface OpenIdConnectSecurityScheme { + /** An optional description for the security scheme. */ + description: string; + /** + * The OpenID Connect Discovery URL for the OIDC provider's metadata. + * See: https://openid.net/specs/openid-connect-discovery-1_0.html + */ + openIdConnectUrl: string; +} + +/** + * --8<-- [start:MutualTLSSecurityScheme] + * Defines a security scheme using mTLS authentication. + */ +export interface MutualTlsSecurityScheme { + /** An optional description for the security scheme. */ + description: string; +} + +/** + * --8<-- [start:OAuthFlows] + * Defines the configuration for the supported OAuth 2.0 flows. + */ +export interface OAuthFlows { + flow?: + | // + /** Configuration for the OAuth Authorization Code flow. */ + { $case: "authorizationCode"; value: AuthorizationCodeOAuthFlow } + | // + /** Configuration for the OAuth Client Credentials flow. */ + { $case: "clientCredentials"; value: ClientCredentialsOAuthFlow } + | // + /** Configuration for the OAuth Implicit flow. */ + { $case: "implicit"; value: ImplicitOAuthFlow } + | // + /** Configuration for the OAuth Resource Owner Password flow. */ + { $case: "password"; value: PasswordOAuthFlow } + | undefined; +} + +/** + * --8<-- [start:AuthorizationCodeOAuthFlow] + * Defines configuration details for the OAuth 2.0 Authorization Code flow. + */ +export interface AuthorizationCodeOAuthFlow { + /** The authorization URL to be used for this flow. */ + authorizationUrl: string; + /** The token URL to be used for this flow. */ + tokenUrl: string; + /** The URL to be used for obtaining refresh tokens. */ + refreshUrl: string; + /** The available scopes for the OAuth2 security scheme. */ + scopes: { [key: string]: string }; +} + +export interface AuthorizationCodeOAuthFlow_ScopesEntry { + key: string; + value: string; +} + +/** + * --8<-- [start:ClientCredentialsOAuthFlow] + * Defines configuration details for the OAuth 2.0 Client Credentials flow. + */ +export interface ClientCredentialsOAuthFlow { + /** The token URL to be used for this flow. */ + tokenUrl: string; + /** The URL to be used for obtaining refresh tokens. */ + refreshUrl: string; + /** The available scopes for the OAuth2 security scheme. */ + scopes: { [key: string]: string }; +} + +export interface ClientCredentialsOAuthFlow_ScopesEntry { + key: string; + value: string; +} + +/** + * --8<-- [start:ImplicitOAuthFlow] + * Defines configuration details for the OAuth 2.0 Implicit flow. + */ +export interface ImplicitOAuthFlow { + /** The authorization URL to be used for this flow. */ + authorizationUrl: string; + /** The URL to be used for obtaining refresh tokens. */ + refreshUrl: string; + /** The available scopes for the OAuth2 security scheme. */ + scopes: { [key: string]: string }; +} + +export interface ImplicitOAuthFlow_ScopesEntry { + key: string; + value: string; +} + +/** + * --8<-- [start:PasswordOAuthFlow] + * Defines configuration details for the OAuth 2.0 Resource Owner Password flow. + */ +export interface PasswordOAuthFlow { + /** The token URL to be used for this flow. */ + tokenUrl: string; + /** The URL to be used for obtaining refresh tokens. */ + refreshUrl: string; + /** The available scopes for the OAuth2 security scheme. */ + scopes: { [key: string]: string }; +} + +export interface PasswordOAuthFlow_ScopesEntry { + key: string; + value: string; +} + +/** + * /////////// Request Messages /////////// + * --8<-- [start:SendMessageRequest] + * Represents a request for the `message/send` method. + */ +export interface SendMessageRequest { + /** Optional tenant, provided as a path parameter. */ + tenant: string; + /** The message to send to the agent. */ + request: + | Message + | undefined; + /** Configuration for the send request. */ + configuration: + | SendMessageConfiguration + | undefined; + /** A flexible key-value map for passing additional context or parameters. */ + metadata: { [key: string]: any } | undefined; +} + +/** + * --8<-- [start:GetTaskRequest] + * Represents a request for the `tasks/get` method. + */ +export interface GetTaskRequest { + /** Optional tenant, provided as a path parameter. */ + tenant: string; + /** + * The resource name of the task. + * Format: tasks/{task_id} + */ + name: string; + /** The maximum number of messages to include in the history. */ + historyLength?: number | undefined; +} + +/** + * --8<-- [start:ListTasksRequest] + * Parameters for listing tasks with optional filtering criteria. + */ +export interface ListTasksRequest { + /** Optional tenant, provided as a path parameter. */ + tenant: string; + /** Filter tasks by context ID to get tasks from a specific conversation or session. */ + contextId: string; + /** Filter tasks by their current status state. */ + status: TaskState; + /** + * Maximum number of tasks to return. Must be between 1 and 100. + * Defaults to 50 if not specified. + */ + pageSize?: + | number + | undefined; + /** Token for pagination. Use the next_page_token from a previous ListTasksResponse. */ + pageToken: string; + /** The maximum number of messages to include in each task's history. */ + historyLength?: + | number + | undefined; + /** + * Filter tasks updated after this timestamp (milliseconds since epoch). + * Only tasks with a last updated time greater than or equal to this value will be returned. + */ + lastUpdatedAfter: number; + /** + * Whether to include artifacts in the returned tasks. + * Defaults to false to reduce payload size. + */ + includeArtifacts?: boolean | undefined; +} + +/** + * --8<-- [start:ListTasksResponse] + * Result object for tasks/list method containing an array of tasks and pagination information. + */ +export interface ListTasksResponse { + /** Array of tasks matching the specified criteria. */ + tasks: Task[]; + /** Token for retrieving the next page. Empty string if no more results. */ + nextPageToken: string; + /** The size of page requested. */ + pageSize: number; + /** Total number of tasks available (before pagination). */ + totalSize: number; +} + +/** + * --8<-- [start:CancelTaskRequest] + * Represents a request for the `tasks/cancel` method. + */ +export interface CancelTaskRequest { + /** Optional tenant, provided as a path parameter. */ + tenant: string; + /** + * The resource name of the task to cancel. + * Format: tasks/{task_id} + */ + name: string; +} + +/** --8<-- [start:GetTaskPushNotificationConfigRequest] */ +export interface GetTaskPushNotificationConfigRequest { + /** Optional tenant, provided as a path parameter. */ + tenant: string; + /** + * The resource name of the config to retrieve. + * Format: tasks/{task_id}/pushNotificationConfigs/{config_id} + */ + name: string; +} + +/** + * --8<-- [start:DeleteTaskPushNotificationConfigRequest] + * Represents a request for the `tasks/pushNotificationConfig/delete` method. + */ +export interface DeleteTaskPushNotificationConfigRequest { + /** Optional tenant, provided as a path parameter. */ + tenant: string; + /** + * The resource name of the config to delete. + * Format: tasks/{task_id}/pushNotificationConfigs/{config_id} + */ + name: string; +} + +/** + * --8<-- [start:SetTaskPushNotificationConfigRequest] + * Represents a request for the `tasks/pushNotificationConfig/set` method. + */ +export interface SetTaskPushNotificationConfigRequest { + /** Optional tenant, provided as a path parameter. */ + tenant: string; + /** + * The parent task resource for this config. + * Format: tasks/{task_id} + */ + parent: string; + /** The ID for the new config. */ + configId: string; + /** The configuration to create. */ + config: TaskPushNotificationConfig | undefined; +} + +/** --8<-- [start:SubscribeToTaskRequest] */ +export interface SubscribeToTaskRequest { + /** Optional tenant, provided as a path parameter. */ + tenant: string; + /** + * The resource name of the task to subscribe to. + * Format: tasks/{task_id} + */ + name: string; +} + +/** --8<-- [start:ListTaskPushNotificationConfigRequest] */ +export interface ListTaskPushNotificationConfigRequest { + /** Optional tenant, provided as a path parameter. */ + tenant: string; + /** + * The parent task resource. + * Format: tasks/{task_id} + */ + parent: string; + /** The maximum number of configurations to return. */ + pageSize: number; + /** A page token received from a previous ListTaskPushNotificationConfigRequest call. */ + pageToken: string; +} + +/** --8<-- [start:GetExtendedAgentCardRequest] */ +export interface GetExtendedAgentCardRequest { + /** Optional tenant, provided as a path parameter. */ + tenant: string; +} + +/** + * ////// Response Messages /////////// + * --8<-- [start:SendMessageResponse] + */ +export interface SendMessageResponse { + payload?: { $case: "task"; value: Task } | { $case: "msg"; value: Message } | undefined; +} + +/** + * --8<-- [start:StreamResponse] + * A wrapper object used in streaming operations to encapsulate different types of response data. + */ +export interface StreamResponse { + payload?: + | // + /** A Task object containing the current state of the task. */ + { $case: "task"; value: Task } + | // + /** A Message object containing a message from the agent. */ + { $case: "msg"; value: Message } + | // + /** An event indicating a task status update. */ + { $case: "statusUpdate"; value: TaskStatusUpdateEvent } + | // + /** An event indicating a task artifact update. */ + { $case: "artifactUpdate"; value: TaskArtifactUpdateEvent } + | undefined; +} + +/** + * --8<-- [start:ListTaskPushNotificationConfigResponse] + * Represents a successful response for the `tasks/pushNotificationConfig/list` + * method. + */ +export interface ListTaskPushNotificationConfigResponse { + /** The list of push notification configurations. */ + configs: TaskPushNotificationConfig[]; + /** + * A token, which can be sent as `page_token` to retrieve the next page. + * If this field is omitted, there are no subsequent pages. + */ + nextPageToken: string; +} + +function createBaseSendMessageConfiguration(): SendMessageConfiguration { + return { acceptedOutputModes: [], pushNotificationConfig: undefined, historyLength: undefined, blocking: false }; +} + +export const SendMessageConfiguration: MessageFns = { + encode(message: SendMessageConfiguration, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.acceptedOutputModes) { + writer.uint32(10).string(v!); + } + if (message.pushNotificationConfig !== undefined) { + PushNotificationConfig.encode(message.pushNotificationConfig, writer.uint32(18).fork()).join(); + } + if (message.historyLength !== undefined) { + writer.uint32(24).int32(message.historyLength); + } + if (message.blocking !== false) { + writer.uint32(32).bool(message.blocking); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): SendMessageConfiguration { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSendMessageConfiguration(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.acceptedOutputModes.push(reader.string()); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.pushNotificationConfig = PushNotificationConfig.decode(reader, reader.uint32()); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.historyLength = reader.int32(); + continue; + } + case 4: { + if (tag !== 32) { + break; + } + + message.blocking = reader.bool(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): SendMessageConfiguration { + return { + acceptedOutputModes: globalThis.Array.isArray(object?.acceptedOutputModes) + ? object.acceptedOutputModes.map((e: any) => globalThis.String(e)) + : [], + pushNotificationConfig: isSet(object.pushNotificationConfig) + ? PushNotificationConfig.fromJSON(object.pushNotificationConfig) + : undefined, + historyLength: isSet(object.historyLength) ? globalThis.Number(object.historyLength) : undefined, + blocking: isSet(object.blocking) ? globalThis.Boolean(object.blocking) : false, + }; + }, + + toJSON(message: SendMessageConfiguration): unknown { + const obj: any = {}; + if (message.acceptedOutputModes?.length) { + obj.acceptedOutputModes = message.acceptedOutputModes; + } + if (message.pushNotificationConfig !== undefined) { + obj.pushNotificationConfig = PushNotificationConfig.toJSON(message.pushNotificationConfig); + } + if (message.historyLength !== undefined) { + obj.historyLength = Math.round(message.historyLength); + } + if (message.blocking !== false) { + obj.blocking = message.blocking; + } + return obj; + }, + + create, I>>(base?: I): SendMessageConfiguration { + return SendMessageConfiguration.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): SendMessageConfiguration { + const message = createBaseSendMessageConfiguration(); + message.acceptedOutputModes = object.acceptedOutputModes?.map((e) => e) || []; + message.pushNotificationConfig = + (object.pushNotificationConfig !== undefined && object.pushNotificationConfig !== null) + ? PushNotificationConfig.fromPartial(object.pushNotificationConfig) + : undefined; + message.historyLength = object.historyLength ?? undefined; + message.blocking = object.blocking ?? false; + return message; + }, +}; + +function createBaseTask(): Task { + return { id: "", contextId: "", status: undefined, artifacts: [], history: [], metadata: undefined }; +} + +export const Task: MessageFns = { + encode(message: Task, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.id !== "") { + writer.uint32(10).string(message.id); + } + if (message.contextId !== "") { + writer.uint32(18).string(message.contextId); + } + if (message.status !== undefined) { + TaskStatus.encode(message.status, writer.uint32(26).fork()).join(); + } + for (const v of message.artifacts) { + Artifact.encode(v!, writer.uint32(34).fork()).join(); + } + for (const v of message.history) { + Message.encode(v!, writer.uint32(42).fork()).join(); + } + if (message.metadata !== undefined) { + Struct.encode(Struct.wrap(message.metadata), writer.uint32(50).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Task { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTask(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.id = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.contextId = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.status = TaskStatus.decode(reader, reader.uint32()); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.artifacts.push(Artifact.decode(reader, reader.uint32())); + continue; + } + case 5: { + if (tag !== 42) { + break; + } + + message.history.push(Message.decode(reader, reader.uint32())); + continue; + } + case 6: { + if (tag !== 50) { + break; + } + + message.metadata = Struct.unwrap(Struct.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Task { + return { + id: isSet(object.id) ? globalThis.String(object.id) : "", + contextId: isSet(object.contextId) ? globalThis.String(object.contextId) : "", + status: isSet(object.status) ? TaskStatus.fromJSON(object.status) : undefined, + artifacts: globalThis.Array.isArray(object?.artifacts) + ? object.artifacts.map((e: any) => Artifact.fromJSON(e)) + : [], + history: globalThis.Array.isArray(object?.history) ? object.history.map((e: any) => Message.fromJSON(e)) : [], + metadata: isObject(object.metadata) ? object.metadata : undefined, + }; + }, + + toJSON(message: Task): unknown { + const obj: any = {}; + if (message.id !== "") { + obj.id = message.id; + } + if (message.contextId !== "") { + obj.contextId = message.contextId; + } + if (message.status !== undefined) { + obj.status = TaskStatus.toJSON(message.status); + } + if (message.artifacts?.length) { + obj.artifacts = message.artifacts.map((e) => Artifact.toJSON(e)); + } + if (message.history?.length) { + obj.history = message.history.map((e) => Message.toJSON(e)); + } + if (message.metadata !== undefined) { + obj.metadata = message.metadata; + } + return obj; + }, + + create, I>>(base?: I): Task { + return Task.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Task { + const message = createBaseTask(); + message.id = object.id ?? ""; + message.contextId = object.contextId ?? ""; + message.status = (object.status !== undefined && object.status !== null) + ? TaskStatus.fromPartial(object.status) + : undefined; + message.artifacts = object.artifacts?.map((e) => Artifact.fromPartial(e)) || []; + message.history = object.history?.map((e) => Message.fromPartial(e)) || []; + message.metadata = object.metadata ?? undefined; + return message; + }, +}; + +function createBaseTaskStatus(): TaskStatus { + return { state: 0, message: undefined, timestamp: undefined }; +} + +export const TaskStatus: MessageFns = { + encode(message: TaskStatus, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.state !== 0) { + writer.uint32(8).int32(message.state); + } + if (message.message !== undefined) { + Message.encode(message.message, writer.uint32(18).fork()).join(); + } + if (message.timestamp !== undefined) { + Timestamp.encode(toTimestamp(message.timestamp), writer.uint32(26).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): TaskStatus { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTaskStatus(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.state = reader.int32() as any; + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.message = Message.decode(reader, reader.uint32()); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.timestamp = fromTimestamp(Timestamp.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): TaskStatus { + return { + state: isSet(object.state) ? taskStateFromJSON(object.state) : 0, + message: isSet(object.message) ? Message.fromJSON(object.message) : undefined, + timestamp: isSet(object.timestamp) ? fromJsonTimestamp(object.timestamp) : undefined, + }; + }, + + toJSON(message: TaskStatus): unknown { + const obj: any = {}; + if (message.state !== 0) { + obj.state = taskStateToJSON(message.state); + } + if (message.message !== undefined) { + obj.message = Message.toJSON(message.message); + } + if (message.timestamp !== undefined) { + obj.timestamp = message.timestamp.toISOString(); + } + return obj; + }, + + create, I>>(base?: I): TaskStatus { + return TaskStatus.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): TaskStatus { + const message = createBaseTaskStatus(); + message.state = object.state ?? 0; + message.message = (object.message !== undefined && object.message !== null) + ? Message.fromPartial(object.message) + : undefined; + message.timestamp = object.timestamp ?? undefined; + return message; + }, +}; + +function createBasePart(): Part { + return { part: undefined, metadata: undefined }; +} + +export const Part: MessageFns = { + encode(message: Part, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + switch (message.part?.$case) { + case "text": + writer.uint32(10).string(message.part.value); + break; + case "file": + FilePart.encode(message.part.value, writer.uint32(18).fork()).join(); + break; + case "data": + DataPart.encode(message.part.value, writer.uint32(26).fork()).join(); + break; + } + if (message.metadata !== undefined) { + Struct.encode(Struct.wrap(message.metadata), writer.uint32(34).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Part { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePart(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.part = { $case: "text", value: reader.string() }; + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.part = { $case: "file", value: FilePart.decode(reader, reader.uint32()) }; + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.part = { $case: "data", value: DataPart.decode(reader, reader.uint32()) }; + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.metadata = Struct.unwrap(Struct.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Part { + return { + part: isSet(object.text) + ? { $case: "text", value: globalThis.String(object.text) } + : isSet(object.file) + ? { $case: "file", value: FilePart.fromJSON(object.file) } + : isSet(object.data) + ? { $case: "data", value: DataPart.fromJSON(object.data) } + : undefined, + metadata: isObject(object.metadata) ? object.metadata : undefined, + }; + }, + + toJSON(message: Part): unknown { + const obj: any = {}; + if (message.part?.$case === "text") { + obj.text = message.part.value; + } else if (message.part?.$case === "file") { + obj.file = FilePart.toJSON(message.part.value); + } else if (message.part?.$case === "data") { + obj.data = DataPart.toJSON(message.part.value); + } + if (message.metadata !== undefined) { + obj.metadata = message.metadata; + } + return obj; + }, + + create, I>>(base?: I): Part { + return Part.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Part { + const message = createBasePart(); + switch (object.part?.$case) { + case "text": { + if (object.part?.value !== undefined && object.part?.value !== null) { + message.part = { $case: "text", value: object.part.value }; + } + break; + } + case "file": { + if (object.part?.value !== undefined && object.part?.value !== null) { + message.part = { $case: "file", value: FilePart.fromPartial(object.part.value) }; + } + break; + } + case "data": { + if (object.part?.value !== undefined && object.part?.value !== null) { + message.part = { $case: "data", value: DataPart.fromPartial(object.part.value) }; + } + break; + } + } + message.metadata = object.metadata ?? undefined; + return message; + }, +}; + +function createBaseFilePart(): FilePart { + return { file: undefined, mediaType: "", name: "" }; +} + +export const FilePart: MessageFns = { + encode(message: FilePart, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + switch (message.file?.$case) { + case "fileWithUri": + writer.uint32(10).string(message.file.value); + break; + case "fileWithBytes": + writer.uint32(18).bytes(message.file.value); + break; + } + if (message.mediaType !== "") { + writer.uint32(26).string(message.mediaType); + } + if (message.name !== "") { + writer.uint32(34).string(message.name); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): FilePart { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFilePart(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.file = { $case: "fileWithUri", value: reader.string() }; + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.file = { $case: "fileWithBytes", value: Buffer.from(reader.bytes()) }; + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.mediaType = reader.string(); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.name = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): FilePart { + return { + file: isSet(object.fileWithUri) + ? { $case: "fileWithUri", value: globalThis.String(object.fileWithUri) } + : isSet(object.fileWithBytes) + ? { $case: "fileWithBytes", value: Buffer.from(bytesFromBase64(object.fileWithBytes)) } + : undefined, + mediaType: isSet(object.mediaType) ? globalThis.String(object.mediaType) : "", + name: isSet(object.name) ? globalThis.String(object.name) : "", + }; + }, + + toJSON(message: FilePart): unknown { + const obj: any = {}; + if (message.file?.$case === "fileWithUri") { + obj.fileWithUri = message.file.value; + } else if (message.file?.$case === "fileWithBytes") { + obj.fileWithBytes = base64FromBytes(message.file.value); + } + if (message.mediaType !== "") { + obj.mediaType = message.mediaType; + } + if (message.name !== "") { + obj.name = message.name; + } + return obj; + }, + + create, I>>(base?: I): FilePart { + return FilePart.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): FilePart { + const message = createBaseFilePart(); + switch (object.file?.$case) { + case "fileWithUri": { + if (object.file?.value !== undefined && object.file?.value !== null) { + message.file = { $case: "fileWithUri", value: object.file.value }; + } + break; + } + case "fileWithBytes": { + if (object.file?.value !== undefined && object.file?.value !== null) { + message.file = { $case: "fileWithBytes", value: object.file.value }; + } + break; + } + } + message.mediaType = object.mediaType ?? ""; + message.name = object.name ?? ""; + return message; + }, +}; + +function createBaseDataPart(): DataPart { + return { data: undefined }; +} + +export const DataPart: MessageFns = { + encode(message: DataPart, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.data !== undefined) { + Struct.encode(Struct.wrap(message.data), writer.uint32(10).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): DataPart { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDataPart(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.data = Struct.unwrap(Struct.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): DataPart { + return { data: isObject(object.data) ? object.data : undefined }; + }, + + toJSON(message: DataPart): unknown { + const obj: any = {}; + if (message.data !== undefined) { + obj.data = message.data; + } + return obj; + }, + + create, I>>(base?: I): DataPart { + return DataPart.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): DataPart { + const message = createBaseDataPart(); + message.data = object.data ?? undefined; + return message; + }, +}; + +function createBaseMessage(): Message { + return { + messageId: "", + contextId: "", + taskId: "", + role: 0, + parts: [], + metadata: undefined, + extensions: [], + referenceTaskIds: [], + }; +} + +export const Message: MessageFns = { + encode(message: Message, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.messageId !== "") { + writer.uint32(10).string(message.messageId); + } + if (message.contextId !== "") { + writer.uint32(18).string(message.contextId); + } + if (message.taskId !== "") { + writer.uint32(26).string(message.taskId); + } + if (message.role !== 0) { + writer.uint32(32).int32(message.role); + } + for (const v of message.parts) { + Part.encode(v!, writer.uint32(42).fork()).join(); + } + if (message.metadata !== undefined) { + Struct.encode(Struct.wrap(message.metadata), writer.uint32(50).fork()).join(); + } + for (const v of message.extensions) { + writer.uint32(58).string(v!); + } + for (const v of message.referenceTaskIds) { + writer.uint32(66).string(v!); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Message { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMessage(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.messageId = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.contextId = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.taskId = reader.string(); + continue; + } + case 4: { + if (tag !== 32) { + break; + } + + message.role = reader.int32() as any; + continue; + } + case 5: { + if (tag !== 42) { + break; + } + + message.parts.push(Part.decode(reader, reader.uint32())); + continue; + } + case 6: { + if (tag !== 50) { + break; + } + + message.metadata = Struct.unwrap(Struct.decode(reader, reader.uint32())); + continue; + } + case 7: { + if (tag !== 58) { + break; + } + + message.extensions.push(reader.string()); + continue; + } + case 8: { + if (tag !== 66) { + break; + } + + message.referenceTaskIds.push(reader.string()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Message { + return { + messageId: isSet(object.messageId) ? globalThis.String(object.messageId) : "", + contextId: isSet(object.contextId) ? globalThis.String(object.contextId) : "", + taskId: isSet(object.taskId) ? globalThis.String(object.taskId) : "", + role: isSet(object.role) ? roleFromJSON(object.role) : 0, + parts: globalThis.Array.isArray(object?.parts) ? object.parts.map((e: any) => Part.fromJSON(e)) : [], + metadata: isObject(object.metadata) ? object.metadata : undefined, + extensions: globalThis.Array.isArray(object?.extensions) + ? object.extensions.map((e: any) => globalThis.String(e)) + : [], + referenceTaskIds: globalThis.Array.isArray(object?.referenceTaskIds) + ? object.referenceTaskIds.map((e: any) => globalThis.String(e)) + : [], + }; + }, + + toJSON(message: Message): unknown { + const obj: any = {}; + if (message.messageId !== "") { + obj.messageId = message.messageId; + } + if (message.contextId !== "") { + obj.contextId = message.contextId; + } + if (message.taskId !== "") { + obj.taskId = message.taskId; + } + if (message.role !== 0) { + obj.role = roleToJSON(message.role); + } + if (message.parts?.length) { + obj.parts = message.parts.map((e) => Part.toJSON(e)); + } + if (message.metadata !== undefined) { + obj.metadata = message.metadata; + } + if (message.extensions?.length) { + obj.extensions = message.extensions; + } + if (message.referenceTaskIds?.length) { + obj.referenceTaskIds = message.referenceTaskIds; + } + return obj; + }, + + create, I>>(base?: I): Message { + return Message.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Message { + const message = createBaseMessage(); + message.messageId = object.messageId ?? ""; + message.contextId = object.contextId ?? ""; + message.taskId = object.taskId ?? ""; + message.role = object.role ?? 0; + message.parts = object.parts?.map((e) => Part.fromPartial(e)) || []; + message.metadata = object.metadata ?? undefined; + message.extensions = object.extensions?.map((e) => e) || []; + message.referenceTaskIds = object.referenceTaskIds?.map((e) => e) || []; + return message; + }, +}; + +function createBaseArtifact(): Artifact { + return { artifactId: "", name: "", description: "", parts: [], metadata: undefined, extensions: [] }; +} + +export const Artifact: MessageFns = { + encode(message: Artifact, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.artifactId !== "") { + writer.uint32(10).string(message.artifactId); + } + if (message.name !== "") { + writer.uint32(26).string(message.name); + } + if (message.description !== "") { + writer.uint32(34).string(message.description); + } + for (const v of message.parts) { + Part.encode(v!, writer.uint32(42).fork()).join(); + } + if (message.metadata !== undefined) { + Struct.encode(Struct.wrap(message.metadata), writer.uint32(50).fork()).join(); + } + for (const v of message.extensions) { + writer.uint32(58).string(v!); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Artifact { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseArtifact(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.artifactId = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.name = reader.string(); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.description = reader.string(); + continue; + } + case 5: { + if (tag !== 42) { + break; + } + + message.parts.push(Part.decode(reader, reader.uint32())); + continue; + } + case 6: { + if (tag !== 50) { + break; + } + + message.metadata = Struct.unwrap(Struct.decode(reader, reader.uint32())); + continue; + } + case 7: { + if (tag !== 58) { + break; + } + + message.extensions.push(reader.string()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Artifact { + return { + artifactId: isSet(object.artifactId) ? globalThis.String(object.artifactId) : "", + name: isSet(object.name) ? globalThis.String(object.name) : "", + description: isSet(object.description) ? globalThis.String(object.description) : "", + parts: globalThis.Array.isArray(object?.parts) ? object.parts.map((e: any) => Part.fromJSON(e)) : [], + metadata: isObject(object.metadata) ? object.metadata : undefined, + extensions: globalThis.Array.isArray(object?.extensions) + ? object.extensions.map((e: any) => globalThis.String(e)) + : [], + }; + }, + + toJSON(message: Artifact): unknown { + const obj: any = {}; + if (message.artifactId !== "") { + obj.artifactId = message.artifactId; + } + if (message.name !== "") { + obj.name = message.name; + } + if (message.description !== "") { + obj.description = message.description; + } + if (message.parts?.length) { + obj.parts = message.parts.map((e) => Part.toJSON(e)); + } + if (message.metadata !== undefined) { + obj.metadata = message.metadata; + } + if (message.extensions?.length) { + obj.extensions = message.extensions; + } + return obj; + }, + + create, I>>(base?: I): Artifact { + return Artifact.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Artifact { + const message = createBaseArtifact(); + message.artifactId = object.artifactId ?? ""; + message.name = object.name ?? ""; + message.description = object.description ?? ""; + message.parts = object.parts?.map((e) => Part.fromPartial(e)) || []; + message.metadata = object.metadata ?? undefined; + message.extensions = object.extensions?.map((e) => e) || []; + return message; + }, +}; + +function createBaseTaskStatusUpdateEvent(): TaskStatusUpdateEvent { + return { taskId: "", contextId: "", status: undefined, final: false, metadata: undefined }; +} + +export const TaskStatusUpdateEvent: MessageFns = { + encode(message: TaskStatusUpdateEvent, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.taskId !== "") { + writer.uint32(10).string(message.taskId); + } + if (message.contextId !== "") { + writer.uint32(18).string(message.contextId); + } + if (message.status !== undefined) { + TaskStatus.encode(message.status, writer.uint32(26).fork()).join(); + } + if (message.final !== false) { + writer.uint32(32).bool(message.final); + } + if (message.metadata !== undefined) { + Struct.encode(Struct.wrap(message.metadata), writer.uint32(42).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): TaskStatusUpdateEvent { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTaskStatusUpdateEvent(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.taskId = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.contextId = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.status = TaskStatus.decode(reader, reader.uint32()); + continue; + } + case 4: { + if (tag !== 32) { + break; + } + + message.final = reader.bool(); + continue; + } + case 5: { + if (tag !== 42) { + break; + } + + message.metadata = Struct.unwrap(Struct.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): TaskStatusUpdateEvent { + return { + taskId: isSet(object.taskId) ? globalThis.String(object.taskId) : "", + contextId: isSet(object.contextId) ? globalThis.String(object.contextId) : "", + status: isSet(object.status) ? TaskStatus.fromJSON(object.status) : undefined, + final: isSet(object.final) ? globalThis.Boolean(object.final) : false, + metadata: isObject(object.metadata) ? object.metadata : undefined, + }; + }, + + toJSON(message: TaskStatusUpdateEvent): unknown { + const obj: any = {}; + if (message.taskId !== "") { + obj.taskId = message.taskId; + } + if (message.contextId !== "") { + obj.contextId = message.contextId; + } + if (message.status !== undefined) { + obj.status = TaskStatus.toJSON(message.status); + } + if (message.final !== false) { + obj.final = message.final; + } + if (message.metadata !== undefined) { + obj.metadata = message.metadata; + } + return obj; + }, + + create, I>>(base?: I): TaskStatusUpdateEvent { + return TaskStatusUpdateEvent.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): TaskStatusUpdateEvent { + const message = createBaseTaskStatusUpdateEvent(); + message.taskId = object.taskId ?? ""; + message.contextId = object.contextId ?? ""; + message.status = (object.status !== undefined && object.status !== null) + ? TaskStatus.fromPartial(object.status) + : undefined; + message.final = object.final ?? false; + message.metadata = object.metadata ?? undefined; + return message; + }, +}; + +function createBaseTaskArtifactUpdateEvent(): TaskArtifactUpdateEvent { + return { taskId: "", contextId: "", artifact: undefined, append: false, lastChunk: false, metadata: undefined }; +} + +export const TaskArtifactUpdateEvent: MessageFns = { + encode(message: TaskArtifactUpdateEvent, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.taskId !== "") { + writer.uint32(10).string(message.taskId); + } + if (message.contextId !== "") { + writer.uint32(18).string(message.contextId); + } + if (message.artifact !== undefined) { + Artifact.encode(message.artifact, writer.uint32(26).fork()).join(); + } + if (message.append !== false) { + writer.uint32(32).bool(message.append); + } + if (message.lastChunk !== false) { + writer.uint32(40).bool(message.lastChunk); + } + if (message.metadata !== undefined) { + Struct.encode(Struct.wrap(message.metadata), writer.uint32(50).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): TaskArtifactUpdateEvent { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTaskArtifactUpdateEvent(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.taskId = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.contextId = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.artifact = Artifact.decode(reader, reader.uint32()); + continue; + } + case 4: { + if (tag !== 32) { + break; + } + + message.append = reader.bool(); + continue; + } + case 5: { + if (tag !== 40) { + break; + } + + message.lastChunk = reader.bool(); + continue; + } + case 6: { + if (tag !== 50) { + break; + } + + message.metadata = Struct.unwrap(Struct.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): TaskArtifactUpdateEvent { + return { + taskId: isSet(object.taskId) ? globalThis.String(object.taskId) : "", + contextId: isSet(object.contextId) ? globalThis.String(object.contextId) : "", + artifact: isSet(object.artifact) ? Artifact.fromJSON(object.artifact) : undefined, + append: isSet(object.append) ? globalThis.Boolean(object.append) : false, + lastChunk: isSet(object.lastChunk) ? globalThis.Boolean(object.lastChunk) : false, + metadata: isObject(object.metadata) ? object.metadata : undefined, + }; + }, + + toJSON(message: TaskArtifactUpdateEvent): unknown { + const obj: any = {}; + if (message.taskId !== "") { + obj.taskId = message.taskId; + } + if (message.contextId !== "") { + obj.contextId = message.contextId; + } + if (message.artifact !== undefined) { + obj.artifact = Artifact.toJSON(message.artifact); + } + if (message.append !== false) { + obj.append = message.append; + } + if (message.lastChunk !== false) { + obj.lastChunk = message.lastChunk; + } + if (message.metadata !== undefined) { + obj.metadata = message.metadata; + } + return obj; + }, + + create, I>>(base?: I): TaskArtifactUpdateEvent { + return TaskArtifactUpdateEvent.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): TaskArtifactUpdateEvent { + const message = createBaseTaskArtifactUpdateEvent(); + message.taskId = object.taskId ?? ""; + message.contextId = object.contextId ?? ""; + message.artifact = (object.artifact !== undefined && object.artifact !== null) + ? Artifact.fromPartial(object.artifact) + : undefined; + message.append = object.append ?? false; + message.lastChunk = object.lastChunk ?? false; + message.metadata = object.metadata ?? undefined; + return message; + }, +}; + +function createBasePushNotificationConfig(): PushNotificationConfig { + return { id: "", url: "", token: "", authentication: undefined }; +} + +export const PushNotificationConfig: MessageFns = { + encode(message: PushNotificationConfig, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.id !== "") { + writer.uint32(10).string(message.id); + } + if (message.url !== "") { + writer.uint32(18).string(message.url); + } + if (message.token !== "") { + writer.uint32(26).string(message.token); + } + if (message.authentication !== undefined) { + AuthenticationInfo.encode(message.authentication, writer.uint32(34).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): PushNotificationConfig { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePushNotificationConfig(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.id = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.url = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.token = reader.string(); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.authentication = AuthenticationInfo.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): PushNotificationConfig { + return { + id: isSet(object.id) ? globalThis.String(object.id) : "", + url: isSet(object.url) ? globalThis.String(object.url) : "", + token: isSet(object.token) ? globalThis.String(object.token) : "", + authentication: isSet(object.authentication) ? AuthenticationInfo.fromJSON(object.authentication) : undefined, + }; + }, + + toJSON(message: PushNotificationConfig): unknown { + const obj: any = {}; + if (message.id !== "") { + obj.id = message.id; + } + if (message.url !== "") { + obj.url = message.url; + } + if (message.token !== "") { + obj.token = message.token; + } + if (message.authentication !== undefined) { + obj.authentication = AuthenticationInfo.toJSON(message.authentication); + } + return obj; + }, + + create, I>>(base?: I): PushNotificationConfig { + return PushNotificationConfig.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): PushNotificationConfig { + const message = createBasePushNotificationConfig(); + message.id = object.id ?? ""; + message.url = object.url ?? ""; + message.token = object.token ?? ""; + message.authentication = (object.authentication !== undefined && object.authentication !== null) + ? AuthenticationInfo.fromPartial(object.authentication) + : undefined; + return message; + }, +}; + +function createBaseAuthenticationInfo(): AuthenticationInfo { + return { schemes: [], credentials: "" }; +} + +export const AuthenticationInfo: MessageFns = { + encode(message: AuthenticationInfo, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.schemes) { + writer.uint32(10).string(v!); + } + if (message.credentials !== "") { + writer.uint32(18).string(message.credentials); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): AuthenticationInfo { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAuthenticationInfo(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.schemes.push(reader.string()); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.credentials = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): AuthenticationInfo { + return { + schemes: globalThis.Array.isArray(object?.schemes) ? object.schemes.map((e: any) => globalThis.String(e)) : [], + credentials: isSet(object.credentials) ? globalThis.String(object.credentials) : "", + }; + }, + + toJSON(message: AuthenticationInfo): unknown { + const obj: any = {}; + if (message.schemes?.length) { + obj.schemes = message.schemes; + } + if (message.credentials !== "") { + obj.credentials = message.credentials; + } + return obj; + }, + + create, I>>(base?: I): AuthenticationInfo { + return AuthenticationInfo.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): AuthenticationInfo { + const message = createBaseAuthenticationInfo(); + message.schemes = object.schemes?.map((e) => e) || []; + message.credentials = object.credentials ?? ""; + return message; + }, +}; + +function createBaseAgentInterface(): AgentInterface { + return { url: "", protocolBinding: "", tenant: "" }; +} + +export const AgentInterface: MessageFns = { + encode(message: AgentInterface, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.url !== "") { + writer.uint32(10).string(message.url); + } + if (message.protocolBinding !== "") { + writer.uint32(18).string(message.protocolBinding); + } + if (message.tenant !== "") { + writer.uint32(26).string(message.tenant); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): AgentInterface { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAgentInterface(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.url = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.protocolBinding = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.tenant = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): AgentInterface { + return { + url: isSet(object.url) ? globalThis.String(object.url) : "", + protocolBinding: isSet(object.protocolBinding) ? globalThis.String(object.protocolBinding) : "", + tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "", + }; + }, + + toJSON(message: AgentInterface): unknown { + const obj: any = {}; + if (message.url !== "") { + obj.url = message.url; + } + if (message.protocolBinding !== "") { + obj.protocolBinding = message.protocolBinding; + } + if (message.tenant !== "") { + obj.tenant = message.tenant; + } + return obj; + }, + + create, I>>(base?: I): AgentInterface { + return AgentInterface.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): AgentInterface { + const message = createBaseAgentInterface(); + message.url = object.url ?? ""; + message.protocolBinding = object.protocolBinding ?? ""; + message.tenant = object.tenant ?? ""; + return message; + }, +}; + +function createBaseAgentCard(): AgentCard { + return { + protocolVersion: undefined, + name: "", + description: "", + supportedInterfaces: [], + url: undefined, + preferredTransport: undefined, + additionalInterfaces: [], + provider: undefined, + version: "", + documentationUrl: undefined, + capabilities: undefined, + securitySchemes: {}, + security: [], + defaultInputModes: [], + defaultOutputModes: [], + skills: [], + supportsExtendedAgentCard: undefined, + signatures: [], + iconUrl: undefined, + }; +} + +export const AgentCard: MessageFns = { + encode(message: AgentCard, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.protocolVersion !== undefined) { + writer.uint32(130).string(message.protocolVersion); + } + if (message.name !== "") { + writer.uint32(10).string(message.name); + } + if (message.description !== "") { + writer.uint32(18).string(message.description); + } + for (const v of message.supportedInterfaces) { + AgentInterface.encode(v!, writer.uint32(154).fork()).join(); + } + if (message.url !== undefined) { + writer.uint32(26).string(message.url); + } + if (message.preferredTransport !== undefined) { + writer.uint32(114).string(message.preferredTransport); + } + for (const v of message.additionalInterfaces) { + AgentInterface.encode(v!, writer.uint32(122).fork()).join(); + } + if (message.provider !== undefined) { + AgentProvider.encode(message.provider, writer.uint32(34).fork()).join(); + } + if (message.version !== "") { + writer.uint32(42).string(message.version); + } + if (message.documentationUrl !== undefined) { + writer.uint32(50).string(message.documentationUrl); + } + if (message.capabilities !== undefined) { + AgentCapabilities.encode(message.capabilities, writer.uint32(58).fork()).join(); + } + Object.entries(message.securitySchemes).forEach(([key, value]) => { + AgentCard_SecuritySchemesEntry.encode({ key: key as any, value }, writer.uint32(66).fork()).join(); + }); + for (const v of message.security) { + Security.encode(v!, writer.uint32(74).fork()).join(); + } + for (const v of message.defaultInputModes) { + writer.uint32(82).string(v!); + } + for (const v of message.defaultOutputModes) { + writer.uint32(90).string(v!); + } + for (const v of message.skills) { + AgentSkill.encode(v!, writer.uint32(98).fork()).join(); + } + if (message.supportsExtendedAgentCard !== undefined) { + writer.uint32(104).bool(message.supportsExtendedAgentCard); + } + for (const v of message.signatures) { + AgentCardSignature.encode(v!, writer.uint32(138).fork()).join(); + } + if (message.iconUrl !== undefined) { + writer.uint32(146).string(message.iconUrl); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): AgentCard { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAgentCard(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 16: { + if (tag !== 130) { + break; + } + + message.protocolVersion = reader.string(); + continue; + } + case 1: { + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.description = reader.string(); + continue; + } + case 19: { + if (tag !== 154) { + break; + } + + message.supportedInterfaces.push(AgentInterface.decode(reader, reader.uint32())); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.url = reader.string(); + continue; + } + case 14: { + if (tag !== 114) { + break; + } + + message.preferredTransport = reader.string(); + continue; + } + case 15: { + if (tag !== 122) { + break; + } + + message.additionalInterfaces.push(AgentInterface.decode(reader, reader.uint32())); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.provider = AgentProvider.decode(reader, reader.uint32()); + continue; + } + case 5: { + if (tag !== 42) { + break; + } + + message.version = reader.string(); + continue; + } + case 6: { + if (tag !== 50) { + break; + } + + message.documentationUrl = reader.string(); + continue; + } + case 7: { + if (tag !== 58) { + break; + } + + message.capabilities = AgentCapabilities.decode(reader, reader.uint32()); + continue; + } + case 8: { + if (tag !== 66) { + break; + } + + const entry8 = AgentCard_SecuritySchemesEntry.decode(reader, reader.uint32()); + if (entry8.value !== undefined) { + message.securitySchemes[entry8.key] = entry8.value; + } + continue; + } + case 9: { + if (tag !== 74) { + break; + } + + message.security.push(Security.decode(reader, reader.uint32())); + continue; + } + case 10: { + if (tag !== 82) { + break; + } + + message.defaultInputModes.push(reader.string()); + continue; + } + case 11: { + if (tag !== 90) { + break; + } + + message.defaultOutputModes.push(reader.string()); + continue; + } + case 12: { + if (tag !== 98) { + break; + } + + message.skills.push(AgentSkill.decode(reader, reader.uint32())); + continue; + } + case 13: { + if (tag !== 104) { + break; + } + + message.supportsExtendedAgentCard = reader.bool(); + continue; + } + case 17: { + if (tag !== 138) { + break; + } + + message.signatures.push(AgentCardSignature.decode(reader, reader.uint32())); + continue; + } + case 18: { + if (tag !== 146) { + break; + } + + message.iconUrl = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): AgentCard { + return { + protocolVersion: isSet(object.protocolVersion) ? globalThis.String(object.protocolVersion) : undefined, + name: isSet(object.name) ? globalThis.String(object.name) : "", + description: isSet(object.description) ? globalThis.String(object.description) : "", + supportedInterfaces: globalThis.Array.isArray(object?.supportedInterfaces) + ? object.supportedInterfaces.map((e: any) => AgentInterface.fromJSON(e)) + : [], + url: isSet(object.url) ? globalThis.String(object.url) : undefined, + preferredTransport: isSet(object.preferredTransport) ? globalThis.String(object.preferredTransport) : undefined, + additionalInterfaces: globalThis.Array.isArray(object?.additionalInterfaces) + ? object.additionalInterfaces.map((e: any) => AgentInterface.fromJSON(e)) + : [], + provider: isSet(object.provider) ? AgentProvider.fromJSON(object.provider) : undefined, + version: isSet(object.version) ? globalThis.String(object.version) : "", + documentationUrl: isSet(object.documentationUrl) ? globalThis.String(object.documentationUrl) : undefined, + capabilities: isSet(object.capabilities) ? AgentCapabilities.fromJSON(object.capabilities) : undefined, + securitySchemes: isObject(object.securitySchemes) + ? Object.entries(object.securitySchemes).reduce<{ [key: string]: SecurityScheme }>((acc, [key, value]) => { + acc[key] = SecurityScheme.fromJSON(value); + return acc; + }, {}) + : {}, + security: globalThis.Array.isArray(object?.security) ? object.security.map((e: any) => Security.fromJSON(e)) : [], + defaultInputModes: globalThis.Array.isArray(object?.defaultInputModes) + ? object.defaultInputModes.map((e: any) => globalThis.String(e)) + : [], + defaultOutputModes: globalThis.Array.isArray(object?.defaultOutputModes) + ? object.defaultOutputModes.map((e: any) => globalThis.String(e)) + : [], + skills: globalThis.Array.isArray(object?.skills) + ? object.skills.map((e: any) => AgentSkill.fromJSON(e)) + : [], + supportsExtendedAgentCard: isSet(object.supportsExtendedAgentCard) + ? globalThis.Boolean(object.supportsExtendedAgentCard) + : undefined, + signatures: globalThis.Array.isArray(object?.signatures) + ? object.signatures.map((e: any) => AgentCardSignature.fromJSON(e)) + : [], + iconUrl: isSet(object.iconUrl) ? globalThis.String(object.iconUrl) : undefined, + }; + }, + + toJSON(message: AgentCard): unknown { + const obj: any = {}; + if (message.protocolVersion !== undefined) { + obj.protocolVersion = message.protocolVersion; + } + if (message.name !== "") { + obj.name = message.name; + } + if (message.description !== "") { + obj.description = message.description; + } + if (message.supportedInterfaces?.length) { + obj.supportedInterfaces = message.supportedInterfaces.map((e) => AgentInterface.toJSON(e)); + } + if (message.url !== undefined) { + obj.url = message.url; + } + if (message.preferredTransport !== undefined) { + obj.preferredTransport = message.preferredTransport; + } + if (message.additionalInterfaces?.length) { + obj.additionalInterfaces = message.additionalInterfaces.map((e) => AgentInterface.toJSON(e)); + } + if (message.provider !== undefined) { + obj.provider = AgentProvider.toJSON(message.provider); + } + if (message.version !== "") { + obj.version = message.version; + } + if (message.documentationUrl !== undefined) { + obj.documentationUrl = message.documentationUrl; + } + if (message.capabilities !== undefined) { + obj.capabilities = AgentCapabilities.toJSON(message.capabilities); + } + if (message.securitySchemes) { + const entries = Object.entries(message.securitySchemes); + if (entries.length > 0) { + obj.securitySchemes = {}; + entries.forEach(([k, v]) => { + obj.securitySchemes[k] = SecurityScheme.toJSON(v); + }); + } + } + if (message.security?.length) { + obj.security = message.security.map((e) => Security.toJSON(e)); + } + if (message.defaultInputModes?.length) { + obj.defaultInputModes = message.defaultInputModes; + } + if (message.defaultOutputModes?.length) { + obj.defaultOutputModes = message.defaultOutputModes; + } + if (message.skills?.length) { + obj.skills = message.skills.map((e) => AgentSkill.toJSON(e)); + } + if (message.supportsExtendedAgentCard !== undefined) { + obj.supportsExtendedAgentCard = message.supportsExtendedAgentCard; + } + if (message.signatures?.length) { + obj.signatures = message.signatures.map((e) => AgentCardSignature.toJSON(e)); + } + if (message.iconUrl !== undefined) { + obj.iconUrl = message.iconUrl; + } + return obj; + }, + + create, I>>(base?: I): AgentCard { + return AgentCard.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): AgentCard { + const message = createBaseAgentCard(); + message.protocolVersion = object.protocolVersion ?? undefined; + message.name = object.name ?? ""; + message.description = object.description ?? ""; + message.supportedInterfaces = object.supportedInterfaces?.map((e) => AgentInterface.fromPartial(e)) || []; + message.url = object.url ?? undefined; + message.preferredTransport = object.preferredTransport ?? undefined; + message.additionalInterfaces = object.additionalInterfaces?.map((e) => AgentInterface.fromPartial(e)) || []; + message.provider = (object.provider !== undefined && object.provider !== null) + ? AgentProvider.fromPartial(object.provider) + : undefined; + message.version = object.version ?? ""; + message.documentationUrl = object.documentationUrl ?? undefined; + message.capabilities = (object.capabilities !== undefined && object.capabilities !== null) + ? AgentCapabilities.fromPartial(object.capabilities) + : undefined; + message.securitySchemes = Object.entries(object.securitySchemes ?? {}).reduce<{ [key: string]: SecurityScheme }>( + (acc, [key, value]) => { + if (value !== undefined) { + acc[key] = SecurityScheme.fromPartial(value); + } + return acc; + }, + {}, + ); + message.security = object.security?.map((e) => Security.fromPartial(e)) || []; + message.defaultInputModes = object.defaultInputModes?.map((e) => e) || []; + message.defaultOutputModes = object.defaultOutputModes?.map((e) => e) || []; + message.skills = object.skills?.map((e) => AgentSkill.fromPartial(e)) || []; + message.supportsExtendedAgentCard = object.supportsExtendedAgentCard ?? undefined; + message.signatures = object.signatures?.map((e) => AgentCardSignature.fromPartial(e)) || []; + message.iconUrl = object.iconUrl ?? undefined; + return message; + }, +}; + +function createBaseAgentCard_SecuritySchemesEntry(): AgentCard_SecuritySchemesEntry { + return { key: "", value: undefined }; +} + +export const AgentCard_SecuritySchemesEntry: MessageFns = { + encode(message: AgentCard_SecuritySchemesEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== undefined) { + SecurityScheme.encode(message.value, writer.uint32(18).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): AgentCard_SecuritySchemesEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAgentCard_SecuritySchemesEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = SecurityScheme.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): AgentCard_SecuritySchemesEntry { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object.value) ? SecurityScheme.fromJSON(object.value) : undefined, + }; + }, + + toJSON(message: AgentCard_SecuritySchemesEntry): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== undefined) { + obj.value = SecurityScheme.toJSON(message.value); + } + return obj; + }, + + create, I>>(base?: I): AgentCard_SecuritySchemesEntry { + return AgentCard_SecuritySchemesEntry.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): AgentCard_SecuritySchemesEntry { + const message = createBaseAgentCard_SecuritySchemesEntry(); + message.key = object.key ?? ""; + message.value = (object.value !== undefined && object.value !== null) + ? SecurityScheme.fromPartial(object.value) + : undefined; + return message; + }, +}; + +function createBaseAgentProvider(): AgentProvider { + return { url: "", organization: "" }; +} + +export const AgentProvider: MessageFns = { + encode(message: AgentProvider, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.url !== "") { + writer.uint32(10).string(message.url); + } + if (message.organization !== "") { + writer.uint32(18).string(message.organization); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): AgentProvider { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAgentProvider(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.url = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.organization = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): AgentProvider { + return { + url: isSet(object.url) ? globalThis.String(object.url) : "", + organization: isSet(object.organization) ? globalThis.String(object.organization) : "", + }; + }, + + toJSON(message: AgentProvider): unknown { + const obj: any = {}; + if (message.url !== "") { + obj.url = message.url; + } + if (message.organization !== "") { + obj.organization = message.organization; + } + return obj; + }, + + create, I>>(base?: I): AgentProvider { + return AgentProvider.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): AgentProvider { + const message = createBaseAgentProvider(); + message.url = object.url ?? ""; + message.organization = object.organization ?? ""; + return message; + }, +}; + +function createBaseAgentCapabilities(): AgentCapabilities { + return { streaming: undefined, pushNotifications: undefined, extensions: [], stateTransitionHistory: undefined }; +} + +export const AgentCapabilities: MessageFns = { + encode(message: AgentCapabilities, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.streaming !== undefined) { + writer.uint32(8).bool(message.streaming); + } + if (message.pushNotifications !== undefined) { + writer.uint32(16).bool(message.pushNotifications); + } + for (const v of message.extensions) { + AgentExtension.encode(v!, writer.uint32(26).fork()).join(); + } + if (message.stateTransitionHistory !== undefined) { + writer.uint32(32).bool(message.stateTransitionHistory); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): AgentCapabilities { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAgentCapabilities(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.streaming = reader.bool(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.pushNotifications = reader.bool(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.extensions.push(AgentExtension.decode(reader, reader.uint32())); + continue; + } + case 4: { + if (tag !== 32) { + break; + } + + message.stateTransitionHistory = reader.bool(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): AgentCapabilities { + return { + streaming: isSet(object.streaming) ? globalThis.Boolean(object.streaming) : undefined, + pushNotifications: isSet(object.pushNotifications) ? globalThis.Boolean(object.pushNotifications) : undefined, + extensions: globalThis.Array.isArray(object?.extensions) + ? object.extensions.map((e: any) => AgentExtension.fromJSON(e)) + : [], + stateTransitionHistory: isSet(object.stateTransitionHistory) + ? globalThis.Boolean(object.stateTransitionHistory) + : undefined, + }; + }, + + toJSON(message: AgentCapabilities): unknown { + const obj: any = {}; + if (message.streaming !== undefined) { + obj.streaming = message.streaming; + } + if (message.pushNotifications !== undefined) { + obj.pushNotifications = message.pushNotifications; + } + if (message.extensions?.length) { + obj.extensions = message.extensions.map((e) => AgentExtension.toJSON(e)); + } + if (message.stateTransitionHistory !== undefined) { + obj.stateTransitionHistory = message.stateTransitionHistory; + } + return obj; + }, + + create, I>>(base?: I): AgentCapabilities { + return AgentCapabilities.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): AgentCapabilities { + const message = createBaseAgentCapabilities(); + message.streaming = object.streaming ?? undefined; + message.pushNotifications = object.pushNotifications ?? undefined; + message.extensions = object.extensions?.map((e) => AgentExtension.fromPartial(e)) || []; + message.stateTransitionHistory = object.stateTransitionHistory ?? undefined; + return message; + }, +}; + +function createBaseAgentExtension(): AgentExtension { + return { uri: "", description: "", required: false, params: undefined }; +} + +export const AgentExtension: MessageFns = { + encode(message: AgentExtension, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.uri !== "") { + writer.uint32(10).string(message.uri); + } + if (message.description !== "") { + writer.uint32(18).string(message.description); + } + if (message.required !== false) { + writer.uint32(24).bool(message.required); + } + if (message.params !== undefined) { + Struct.encode(Struct.wrap(message.params), writer.uint32(34).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): AgentExtension { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAgentExtension(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.uri = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.description = reader.string(); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.required = reader.bool(); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.params = Struct.unwrap(Struct.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): AgentExtension { + return { + uri: isSet(object.uri) ? globalThis.String(object.uri) : "", + description: isSet(object.description) ? globalThis.String(object.description) : "", + required: isSet(object.required) ? globalThis.Boolean(object.required) : false, + params: isObject(object.params) ? object.params : undefined, + }; + }, + + toJSON(message: AgentExtension): unknown { + const obj: any = {}; + if (message.uri !== "") { + obj.uri = message.uri; + } + if (message.description !== "") { + obj.description = message.description; + } + if (message.required !== false) { + obj.required = message.required; + } + if (message.params !== undefined) { + obj.params = message.params; + } + return obj; + }, + + create, I>>(base?: I): AgentExtension { + return AgentExtension.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): AgentExtension { + const message = createBaseAgentExtension(); + message.uri = object.uri ?? ""; + message.description = object.description ?? ""; + message.required = object.required ?? false; + message.params = object.params ?? undefined; + return message; + }, +}; + +function createBaseAgentSkill(): AgentSkill { + return { id: "", name: "", description: "", tags: [], examples: [], inputModes: [], outputModes: [], security: [] }; +} + +export const AgentSkill: MessageFns = { + encode(message: AgentSkill, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.id !== "") { + writer.uint32(10).string(message.id); + } + if (message.name !== "") { + writer.uint32(18).string(message.name); + } + if (message.description !== "") { + writer.uint32(26).string(message.description); + } + for (const v of message.tags) { + writer.uint32(34).string(v!); + } + for (const v of message.examples) { + writer.uint32(42).string(v!); + } + for (const v of message.inputModes) { + writer.uint32(50).string(v!); + } + for (const v of message.outputModes) { + writer.uint32(58).string(v!); + } + for (const v of message.security) { + Security.encode(v!, writer.uint32(66).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): AgentSkill { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAgentSkill(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.id = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.name = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.description = reader.string(); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.tags.push(reader.string()); + continue; + } + case 5: { + if (tag !== 42) { + break; + } + + message.examples.push(reader.string()); + continue; + } + case 6: { + if (tag !== 50) { + break; + } + + message.inputModes.push(reader.string()); + continue; + } + case 7: { + if (tag !== 58) { + break; + } + + message.outputModes.push(reader.string()); + continue; + } + case 8: { + if (tag !== 66) { + break; + } + + message.security.push(Security.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): AgentSkill { + return { + id: isSet(object.id) ? globalThis.String(object.id) : "", + name: isSet(object.name) ? globalThis.String(object.name) : "", + description: isSet(object.description) ? globalThis.String(object.description) : "", + tags: globalThis.Array.isArray(object?.tags) ? object.tags.map((e: any) => globalThis.String(e)) : [], + examples: globalThis.Array.isArray(object?.examples) ? object.examples.map((e: any) => globalThis.String(e)) : [], + inputModes: globalThis.Array.isArray(object?.inputModes) + ? object.inputModes.map((e: any) => globalThis.String(e)) + : [], + outputModes: globalThis.Array.isArray(object?.outputModes) + ? object.outputModes.map((e: any) => globalThis.String(e)) + : [], + security: globalThis.Array.isArray(object?.security) ? object.security.map((e: any) => Security.fromJSON(e)) : [], + }; + }, + + toJSON(message: AgentSkill): unknown { + const obj: any = {}; + if (message.id !== "") { + obj.id = message.id; + } + if (message.name !== "") { + obj.name = message.name; + } + if (message.description !== "") { + obj.description = message.description; + } + if (message.tags?.length) { + obj.tags = message.tags; + } + if (message.examples?.length) { + obj.examples = message.examples; + } + if (message.inputModes?.length) { + obj.inputModes = message.inputModes; + } + if (message.outputModes?.length) { + obj.outputModes = message.outputModes; + } + if (message.security?.length) { + obj.security = message.security.map((e) => Security.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): AgentSkill { + return AgentSkill.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): AgentSkill { + const message = createBaseAgentSkill(); + message.id = object.id ?? ""; + message.name = object.name ?? ""; + message.description = object.description ?? ""; + message.tags = object.tags?.map((e) => e) || []; + message.examples = object.examples?.map((e) => e) || []; + message.inputModes = object.inputModes?.map((e) => e) || []; + message.outputModes = object.outputModes?.map((e) => e) || []; + message.security = object.security?.map((e) => Security.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseAgentCardSignature(): AgentCardSignature { + return { protected: "", signature: "", header: undefined }; +} + +export const AgentCardSignature: MessageFns = { + encode(message: AgentCardSignature, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.protected !== "") { + writer.uint32(10).string(message.protected); + } + if (message.signature !== "") { + writer.uint32(18).string(message.signature); + } + if (message.header !== undefined) { + Struct.encode(Struct.wrap(message.header), writer.uint32(26).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): AgentCardSignature { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAgentCardSignature(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.protected = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.signature = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.header = Struct.unwrap(Struct.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): AgentCardSignature { + return { + protected: isSet(object.protected) ? globalThis.String(object.protected) : "", + signature: isSet(object.signature) ? globalThis.String(object.signature) : "", + header: isObject(object.header) ? object.header : undefined, + }; + }, + + toJSON(message: AgentCardSignature): unknown { + const obj: any = {}; + if (message.protected !== "") { + obj.protected = message.protected; + } + if (message.signature !== "") { + obj.signature = message.signature; + } + if (message.header !== undefined) { + obj.header = message.header; + } + return obj; + }, + + create, I>>(base?: I): AgentCardSignature { + return AgentCardSignature.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): AgentCardSignature { + const message = createBaseAgentCardSignature(); + message.protected = object.protected ?? ""; + message.signature = object.signature ?? ""; + message.header = object.header ?? undefined; + return message; + }, +}; + +function createBaseTaskPushNotificationConfig(): TaskPushNotificationConfig { + return { name: "", pushNotificationConfig: undefined }; +} + +export const TaskPushNotificationConfig: MessageFns = { + encode(message: TaskPushNotificationConfig, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.name !== "") { + writer.uint32(10).string(message.name); + } + if (message.pushNotificationConfig !== undefined) { + PushNotificationConfig.encode(message.pushNotificationConfig, writer.uint32(18).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): TaskPushNotificationConfig { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTaskPushNotificationConfig(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.pushNotificationConfig = PushNotificationConfig.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): TaskPushNotificationConfig { + return { + name: isSet(object.name) ? globalThis.String(object.name) : "", + pushNotificationConfig: isSet(object.pushNotificationConfig) + ? PushNotificationConfig.fromJSON(object.pushNotificationConfig) + : undefined, + }; + }, + + toJSON(message: TaskPushNotificationConfig): unknown { + const obj: any = {}; + if (message.name !== "") { + obj.name = message.name; + } + if (message.pushNotificationConfig !== undefined) { + obj.pushNotificationConfig = PushNotificationConfig.toJSON(message.pushNotificationConfig); + } + return obj; + }, + + create, I>>(base?: I): TaskPushNotificationConfig { + return TaskPushNotificationConfig.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): TaskPushNotificationConfig { + const message = createBaseTaskPushNotificationConfig(); + message.name = object.name ?? ""; + message.pushNotificationConfig = + (object.pushNotificationConfig !== undefined && object.pushNotificationConfig !== null) + ? PushNotificationConfig.fromPartial(object.pushNotificationConfig) + : undefined; + return message; + }, +}; + +function createBaseStringList(): StringList { + return { list: [] }; +} + +export const StringList: MessageFns = { + encode(message: StringList, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.list) { + writer.uint32(10).string(v!); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): StringList { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseStringList(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.list.push(reader.string()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): StringList { + return { list: globalThis.Array.isArray(object?.list) ? object.list.map((e: any) => globalThis.String(e)) : [] }; + }, + + toJSON(message: StringList): unknown { + const obj: any = {}; + if (message.list?.length) { + obj.list = message.list; + } + return obj; + }, + + create, I>>(base?: I): StringList { + return StringList.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): StringList { + const message = createBaseStringList(); + message.list = object.list?.map((e) => e) || []; + return message; + }, +}; + +function createBaseSecurity(): Security { + return { schemes: {} }; +} + +export const Security: MessageFns = { + encode(message: Security, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + Object.entries(message.schemes).forEach(([key, value]) => { + Security_SchemesEntry.encode({ key: key as any, value }, writer.uint32(10).fork()).join(); + }); + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Security { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSecurity(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + const entry1 = Security_SchemesEntry.decode(reader, reader.uint32()); + if (entry1.value !== undefined) { + message.schemes[entry1.key] = entry1.value; + } + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Security { + return { + schemes: isObject(object.schemes) + ? Object.entries(object.schemes).reduce<{ [key: string]: StringList }>((acc, [key, value]) => { + acc[key] = StringList.fromJSON(value); + return acc; + }, {}) + : {}, + }; + }, + + toJSON(message: Security): unknown { + const obj: any = {}; + if (message.schemes) { + const entries = Object.entries(message.schemes); + if (entries.length > 0) { + obj.schemes = {}; + entries.forEach(([k, v]) => { + obj.schemes[k] = StringList.toJSON(v); + }); + } + } + return obj; + }, + + create, I>>(base?: I): Security { + return Security.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Security { + const message = createBaseSecurity(); + message.schemes = Object.entries(object.schemes ?? {}).reduce<{ [key: string]: StringList }>( + (acc, [key, value]) => { + if (value !== undefined) { + acc[key] = StringList.fromPartial(value); + } + return acc; + }, + {}, + ); + return message; + }, +}; + +function createBaseSecurity_SchemesEntry(): Security_SchemesEntry { + return { key: "", value: undefined }; +} + +export const Security_SchemesEntry: MessageFns = { + encode(message: Security_SchemesEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== undefined) { + StringList.encode(message.value, writer.uint32(18).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Security_SchemesEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSecurity_SchemesEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = StringList.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Security_SchemesEntry { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object.value) ? StringList.fromJSON(object.value) : undefined, + }; + }, + + toJSON(message: Security_SchemesEntry): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== undefined) { + obj.value = StringList.toJSON(message.value); + } + return obj; + }, + + create, I>>(base?: I): Security_SchemesEntry { + return Security_SchemesEntry.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Security_SchemesEntry { + const message = createBaseSecurity_SchemesEntry(); + message.key = object.key ?? ""; + message.value = (object.value !== undefined && object.value !== null) + ? StringList.fromPartial(object.value) + : undefined; + return message; + }, +}; + +function createBaseSecurityScheme(): SecurityScheme { + return { scheme: undefined }; +} + +export const SecurityScheme: MessageFns = { + encode(message: SecurityScheme, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + switch (message.scheme?.$case) { + case "apiKeySecurityScheme": + APIKeySecurityScheme.encode(message.scheme.value, writer.uint32(10).fork()).join(); + break; + case "httpAuthSecurityScheme": + HTTPAuthSecurityScheme.encode(message.scheme.value, writer.uint32(18).fork()).join(); + break; + case "oauth2SecurityScheme": + OAuth2SecurityScheme.encode(message.scheme.value, writer.uint32(26).fork()).join(); + break; + case "openIdConnectSecurityScheme": + OpenIdConnectSecurityScheme.encode(message.scheme.value, writer.uint32(34).fork()).join(); + break; + case "mtlsSecurityScheme": + MutualTlsSecurityScheme.encode(message.scheme.value, writer.uint32(42).fork()).join(); + break; + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): SecurityScheme { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSecurityScheme(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.scheme = { + $case: "apiKeySecurityScheme", + value: APIKeySecurityScheme.decode(reader, reader.uint32()), + }; + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.scheme = { + $case: "httpAuthSecurityScheme", + value: HTTPAuthSecurityScheme.decode(reader, reader.uint32()), + }; + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.scheme = { + $case: "oauth2SecurityScheme", + value: OAuth2SecurityScheme.decode(reader, reader.uint32()), + }; + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.scheme = { + $case: "openIdConnectSecurityScheme", + value: OpenIdConnectSecurityScheme.decode(reader, reader.uint32()), + }; + continue; + } + case 5: { + if (tag !== 42) { + break; + } + + message.scheme = { + $case: "mtlsSecurityScheme", + value: MutualTlsSecurityScheme.decode(reader, reader.uint32()), + }; + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): SecurityScheme { + return { + scheme: isSet(object.apiKeySecurityScheme) + ? { $case: "apiKeySecurityScheme", value: APIKeySecurityScheme.fromJSON(object.apiKeySecurityScheme) } + : isSet(object.httpAuthSecurityScheme) + ? { $case: "httpAuthSecurityScheme", value: HTTPAuthSecurityScheme.fromJSON(object.httpAuthSecurityScheme) } + : isSet(object.oauth2SecurityScheme) + ? { $case: "oauth2SecurityScheme", value: OAuth2SecurityScheme.fromJSON(object.oauth2SecurityScheme) } + : isSet(object.openIdConnectSecurityScheme) + ? { + $case: "openIdConnectSecurityScheme", + value: OpenIdConnectSecurityScheme.fromJSON(object.openIdConnectSecurityScheme), + } + : isSet(object.mtlsSecurityScheme) + ? { $case: "mtlsSecurityScheme", value: MutualTlsSecurityScheme.fromJSON(object.mtlsSecurityScheme) } + : undefined, + }; + }, + + toJSON(message: SecurityScheme): unknown { + const obj: any = {}; + if (message.scheme?.$case === "apiKeySecurityScheme") { + obj.apiKeySecurityScheme = APIKeySecurityScheme.toJSON(message.scheme.value); + } else if (message.scheme?.$case === "httpAuthSecurityScheme") { + obj.httpAuthSecurityScheme = HTTPAuthSecurityScheme.toJSON(message.scheme.value); + } else if (message.scheme?.$case === "oauth2SecurityScheme") { + obj.oauth2SecurityScheme = OAuth2SecurityScheme.toJSON(message.scheme.value); + } else if (message.scheme?.$case === "openIdConnectSecurityScheme") { + obj.openIdConnectSecurityScheme = OpenIdConnectSecurityScheme.toJSON(message.scheme.value); + } else if (message.scheme?.$case === "mtlsSecurityScheme") { + obj.mtlsSecurityScheme = MutualTlsSecurityScheme.toJSON(message.scheme.value); + } + return obj; + }, + + create, I>>(base?: I): SecurityScheme { + return SecurityScheme.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): SecurityScheme { + const message = createBaseSecurityScheme(); + switch (object.scheme?.$case) { + case "apiKeySecurityScheme": { + if (object.scheme?.value !== undefined && object.scheme?.value !== null) { + message.scheme = { + $case: "apiKeySecurityScheme", + value: APIKeySecurityScheme.fromPartial(object.scheme.value), + }; + } + break; + } + case "httpAuthSecurityScheme": { + if (object.scheme?.value !== undefined && object.scheme?.value !== null) { + message.scheme = { + $case: "httpAuthSecurityScheme", + value: HTTPAuthSecurityScheme.fromPartial(object.scheme.value), + }; + } + break; + } + case "oauth2SecurityScheme": { + if (object.scheme?.value !== undefined && object.scheme?.value !== null) { + message.scheme = { + $case: "oauth2SecurityScheme", + value: OAuth2SecurityScheme.fromPartial(object.scheme.value), + }; + } + break; + } + case "openIdConnectSecurityScheme": { + if (object.scheme?.value !== undefined && object.scheme?.value !== null) { + message.scheme = { + $case: "openIdConnectSecurityScheme", + value: OpenIdConnectSecurityScheme.fromPartial(object.scheme.value), + }; + } + break; + } + case "mtlsSecurityScheme": { + if (object.scheme?.value !== undefined && object.scheme?.value !== null) { + message.scheme = { + $case: "mtlsSecurityScheme", + value: MutualTlsSecurityScheme.fromPartial(object.scheme.value), + }; + } + break; + } + } + return message; + }, +}; + +function createBaseAPIKeySecurityScheme(): APIKeySecurityScheme { + return { description: "", location: "", name: "" }; +} + +export const APIKeySecurityScheme: MessageFns = { + encode(message: APIKeySecurityScheme, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.description !== "") { + writer.uint32(10).string(message.description); + } + if (message.location !== "") { + writer.uint32(18).string(message.location); + } + if (message.name !== "") { + writer.uint32(26).string(message.name); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): APIKeySecurityScheme { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAPIKeySecurityScheme(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.description = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.location = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.name = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): APIKeySecurityScheme { + return { + description: isSet(object.description) ? globalThis.String(object.description) : "", + location: isSet(object.location) ? globalThis.String(object.location) : "", + name: isSet(object.name) ? globalThis.String(object.name) : "", + }; + }, + + toJSON(message: APIKeySecurityScheme): unknown { + const obj: any = {}; + if (message.description !== "") { + obj.description = message.description; + } + if (message.location !== "") { + obj.location = message.location; + } + if (message.name !== "") { + obj.name = message.name; + } + return obj; + }, + + create, I>>(base?: I): APIKeySecurityScheme { + return APIKeySecurityScheme.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): APIKeySecurityScheme { + const message = createBaseAPIKeySecurityScheme(); + message.description = object.description ?? ""; + message.location = object.location ?? ""; + message.name = object.name ?? ""; + return message; + }, +}; + +function createBaseHTTPAuthSecurityScheme(): HTTPAuthSecurityScheme { + return { description: "", scheme: "", bearerFormat: "" }; +} + +export const HTTPAuthSecurityScheme: MessageFns = { + encode(message: HTTPAuthSecurityScheme, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.description !== "") { + writer.uint32(10).string(message.description); + } + if (message.scheme !== "") { + writer.uint32(18).string(message.scheme); + } + if (message.bearerFormat !== "") { + writer.uint32(26).string(message.bearerFormat); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): HTTPAuthSecurityScheme { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseHTTPAuthSecurityScheme(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.description = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.scheme = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.bearerFormat = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): HTTPAuthSecurityScheme { + return { + description: isSet(object.description) ? globalThis.String(object.description) : "", + scheme: isSet(object.scheme) ? globalThis.String(object.scheme) : "", + bearerFormat: isSet(object.bearerFormat) ? globalThis.String(object.bearerFormat) : "", + }; + }, + + toJSON(message: HTTPAuthSecurityScheme): unknown { + const obj: any = {}; + if (message.description !== "") { + obj.description = message.description; + } + if (message.scheme !== "") { + obj.scheme = message.scheme; + } + if (message.bearerFormat !== "") { + obj.bearerFormat = message.bearerFormat; + } + return obj; + }, + + create, I>>(base?: I): HTTPAuthSecurityScheme { + return HTTPAuthSecurityScheme.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): HTTPAuthSecurityScheme { + const message = createBaseHTTPAuthSecurityScheme(); + message.description = object.description ?? ""; + message.scheme = object.scheme ?? ""; + message.bearerFormat = object.bearerFormat ?? ""; + return message; + }, +}; + +function createBaseOAuth2SecurityScheme(): OAuth2SecurityScheme { + return { description: "", flows: undefined, oauth2MetadataUrl: "" }; +} + +export const OAuth2SecurityScheme: MessageFns = { + encode(message: OAuth2SecurityScheme, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.description !== "") { + writer.uint32(10).string(message.description); + } + if (message.flows !== undefined) { + OAuthFlows.encode(message.flows, writer.uint32(18).fork()).join(); + } + if (message.oauth2MetadataUrl !== "") { + writer.uint32(26).string(message.oauth2MetadataUrl); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): OAuth2SecurityScheme { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseOAuth2SecurityScheme(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.description = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.flows = OAuthFlows.decode(reader, reader.uint32()); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.oauth2MetadataUrl = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): OAuth2SecurityScheme { + return { + description: isSet(object.description) ? globalThis.String(object.description) : "", + flows: isSet(object.flows) ? OAuthFlows.fromJSON(object.flows) : undefined, + oauth2MetadataUrl: isSet(object.oauth2MetadataUrl) ? globalThis.String(object.oauth2MetadataUrl) : "", + }; + }, + + toJSON(message: OAuth2SecurityScheme): unknown { + const obj: any = {}; + if (message.description !== "") { + obj.description = message.description; + } + if (message.flows !== undefined) { + obj.flows = OAuthFlows.toJSON(message.flows); + } + if (message.oauth2MetadataUrl !== "") { + obj.oauth2MetadataUrl = message.oauth2MetadataUrl; + } + return obj; + }, + + create, I>>(base?: I): OAuth2SecurityScheme { + return OAuth2SecurityScheme.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): OAuth2SecurityScheme { + const message = createBaseOAuth2SecurityScheme(); + message.description = object.description ?? ""; + message.flows = (object.flows !== undefined && object.flows !== null) + ? OAuthFlows.fromPartial(object.flows) + : undefined; + message.oauth2MetadataUrl = object.oauth2MetadataUrl ?? ""; + return message; + }, +}; + +function createBaseOpenIdConnectSecurityScheme(): OpenIdConnectSecurityScheme { + return { description: "", openIdConnectUrl: "" }; +} + +export const OpenIdConnectSecurityScheme: MessageFns = { + encode(message: OpenIdConnectSecurityScheme, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.description !== "") { + writer.uint32(10).string(message.description); + } + if (message.openIdConnectUrl !== "") { + writer.uint32(18).string(message.openIdConnectUrl); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): OpenIdConnectSecurityScheme { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseOpenIdConnectSecurityScheme(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.description = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.openIdConnectUrl = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): OpenIdConnectSecurityScheme { + return { + description: isSet(object.description) ? globalThis.String(object.description) : "", + openIdConnectUrl: isSet(object.openIdConnectUrl) ? globalThis.String(object.openIdConnectUrl) : "", + }; + }, + + toJSON(message: OpenIdConnectSecurityScheme): unknown { + const obj: any = {}; + if (message.description !== "") { + obj.description = message.description; + } + if (message.openIdConnectUrl !== "") { + obj.openIdConnectUrl = message.openIdConnectUrl; + } + return obj; + }, + + create, I>>(base?: I): OpenIdConnectSecurityScheme { + return OpenIdConnectSecurityScheme.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): OpenIdConnectSecurityScheme { + const message = createBaseOpenIdConnectSecurityScheme(); + message.description = object.description ?? ""; + message.openIdConnectUrl = object.openIdConnectUrl ?? ""; + return message; + }, +}; + +function createBaseMutualTlsSecurityScheme(): MutualTlsSecurityScheme { + return { description: "" }; +} + +export const MutualTlsSecurityScheme: MessageFns = { + encode(message: MutualTlsSecurityScheme, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.description !== "") { + writer.uint32(10).string(message.description); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): MutualTlsSecurityScheme { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMutualTlsSecurityScheme(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.description = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): MutualTlsSecurityScheme { + return { description: isSet(object.description) ? globalThis.String(object.description) : "" }; + }, + + toJSON(message: MutualTlsSecurityScheme): unknown { + const obj: any = {}; + if (message.description !== "") { + obj.description = message.description; + } + return obj; + }, + + create, I>>(base?: I): MutualTlsSecurityScheme { + return MutualTlsSecurityScheme.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): MutualTlsSecurityScheme { + const message = createBaseMutualTlsSecurityScheme(); + message.description = object.description ?? ""; + return message; + }, +}; + +function createBaseOAuthFlows(): OAuthFlows { + return { flow: undefined }; +} + +export const OAuthFlows: MessageFns = { + encode(message: OAuthFlows, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + switch (message.flow?.$case) { + case "authorizationCode": + AuthorizationCodeOAuthFlow.encode(message.flow.value, writer.uint32(10).fork()).join(); + break; + case "clientCredentials": + ClientCredentialsOAuthFlow.encode(message.flow.value, writer.uint32(18).fork()).join(); + break; + case "implicit": + ImplicitOAuthFlow.encode(message.flow.value, writer.uint32(26).fork()).join(); + break; + case "password": + PasswordOAuthFlow.encode(message.flow.value, writer.uint32(34).fork()).join(); + break; + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): OAuthFlows { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseOAuthFlows(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.flow = { + $case: "authorizationCode", + value: AuthorizationCodeOAuthFlow.decode(reader, reader.uint32()), + }; + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.flow = { + $case: "clientCredentials", + value: ClientCredentialsOAuthFlow.decode(reader, reader.uint32()), + }; + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.flow = { $case: "implicit", value: ImplicitOAuthFlow.decode(reader, reader.uint32()) }; + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.flow = { $case: "password", value: PasswordOAuthFlow.decode(reader, reader.uint32()) }; + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): OAuthFlows { + return { + flow: isSet(object.authorizationCode) + ? { $case: "authorizationCode", value: AuthorizationCodeOAuthFlow.fromJSON(object.authorizationCode) } + : isSet(object.clientCredentials) + ? { $case: "clientCredentials", value: ClientCredentialsOAuthFlow.fromJSON(object.clientCredentials) } + : isSet(object.implicit) + ? { $case: "implicit", value: ImplicitOAuthFlow.fromJSON(object.implicit) } + : isSet(object.password) + ? { $case: "password", value: PasswordOAuthFlow.fromJSON(object.password) } + : undefined, + }; + }, + + toJSON(message: OAuthFlows): unknown { + const obj: any = {}; + if (message.flow?.$case === "authorizationCode") { + obj.authorizationCode = AuthorizationCodeOAuthFlow.toJSON(message.flow.value); + } else if (message.flow?.$case === "clientCredentials") { + obj.clientCredentials = ClientCredentialsOAuthFlow.toJSON(message.flow.value); + } else if (message.flow?.$case === "implicit") { + obj.implicit = ImplicitOAuthFlow.toJSON(message.flow.value); + } else if (message.flow?.$case === "password") { + obj.password = PasswordOAuthFlow.toJSON(message.flow.value); + } + return obj; + }, + + create, I>>(base?: I): OAuthFlows { + return OAuthFlows.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): OAuthFlows { + const message = createBaseOAuthFlows(); + switch (object.flow?.$case) { + case "authorizationCode": { + if (object.flow?.value !== undefined && object.flow?.value !== null) { + message.flow = { + $case: "authorizationCode", + value: AuthorizationCodeOAuthFlow.fromPartial(object.flow.value), + }; + } + break; + } + case "clientCredentials": { + if (object.flow?.value !== undefined && object.flow?.value !== null) { + message.flow = { + $case: "clientCredentials", + value: ClientCredentialsOAuthFlow.fromPartial(object.flow.value), + }; + } + break; + } + case "implicit": { + if (object.flow?.value !== undefined && object.flow?.value !== null) { + message.flow = { $case: "implicit", value: ImplicitOAuthFlow.fromPartial(object.flow.value) }; + } + break; + } + case "password": { + if (object.flow?.value !== undefined && object.flow?.value !== null) { + message.flow = { $case: "password", value: PasswordOAuthFlow.fromPartial(object.flow.value) }; + } + break; + } + } + return message; + }, +}; + +function createBaseAuthorizationCodeOAuthFlow(): AuthorizationCodeOAuthFlow { + return { authorizationUrl: "", tokenUrl: "", refreshUrl: "", scopes: {} }; +} + +export const AuthorizationCodeOAuthFlow: MessageFns = { + encode(message: AuthorizationCodeOAuthFlow, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.authorizationUrl !== "") { + writer.uint32(10).string(message.authorizationUrl); + } + if (message.tokenUrl !== "") { + writer.uint32(18).string(message.tokenUrl); + } + if (message.refreshUrl !== "") { + writer.uint32(26).string(message.refreshUrl); + } + Object.entries(message.scopes).forEach(([key, value]) => { + AuthorizationCodeOAuthFlow_ScopesEntry.encode({ key: key as any, value }, writer.uint32(34).fork()).join(); + }); + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): AuthorizationCodeOAuthFlow { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAuthorizationCodeOAuthFlow(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.authorizationUrl = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.tokenUrl = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.refreshUrl = reader.string(); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + const entry4 = AuthorizationCodeOAuthFlow_ScopesEntry.decode(reader, reader.uint32()); + if (entry4.value !== undefined) { + message.scopes[entry4.key] = entry4.value; + } + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): AuthorizationCodeOAuthFlow { + return { + authorizationUrl: isSet(object.authorizationUrl) ? globalThis.String(object.authorizationUrl) : "", + tokenUrl: isSet(object.tokenUrl) ? globalThis.String(object.tokenUrl) : "", + refreshUrl: isSet(object.refreshUrl) ? globalThis.String(object.refreshUrl) : "", + scopes: isObject(object.scopes) + ? Object.entries(object.scopes).reduce<{ [key: string]: string }>((acc, [key, value]) => { + acc[key] = String(value); + return acc; + }, {}) + : {}, + }; + }, + + toJSON(message: AuthorizationCodeOAuthFlow): unknown { + const obj: any = {}; + if (message.authorizationUrl !== "") { + obj.authorizationUrl = message.authorizationUrl; + } + if (message.tokenUrl !== "") { + obj.tokenUrl = message.tokenUrl; + } + if (message.refreshUrl !== "") { + obj.refreshUrl = message.refreshUrl; + } + if (message.scopes) { + const entries = Object.entries(message.scopes); + if (entries.length > 0) { + obj.scopes = {}; + entries.forEach(([k, v]) => { + obj.scopes[k] = v; + }); + } + } + return obj; + }, + + create, I>>(base?: I): AuthorizationCodeOAuthFlow { + return AuthorizationCodeOAuthFlow.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): AuthorizationCodeOAuthFlow { + const message = createBaseAuthorizationCodeOAuthFlow(); + message.authorizationUrl = object.authorizationUrl ?? ""; + message.tokenUrl = object.tokenUrl ?? ""; + message.refreshUrl = object.refreshUrl ?? ""; + message.scopes = Object.entries(object.scopes ?? {}).reduce<{ [key: string]: string }>((acc, [key, value]) => { + if (value !== undefined) { + acc[key] = globalThis.String(value); + } + return acc; + }, {}); + return message; + }, +}; + +function createBaseAuthorizationCodeOAuthFlow_ScopesEntry(): AuthorizationCodeOAuthFlow_ScopesEntry { + return { key: "", value: "" }; +} + +export const AuthorizationCodeOAuthFlow_ScopesEntry: MessageFns = { + encode(message: AuthorizationCodeOAuthFlow_ScopesEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== "") { + writer.uint32(18).string(message.value); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): AuthorizationCodeOAuthFlow_ScopesEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseAuthorizationCodeOAuthFlow_ScopesEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): AuthorizationCodeOAuthFlow_ScopesEntry { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object.value) ? globalThis.String(object.value) : "", + }; + }, + + toJSON(message: AuthorizationCodeOAuthFlow_ScopesEntry): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== "") { + obj.value = message.value; + } + return obj; + }, + + create, I>>( + base?: I, + ): AuthorizationCodeOAuthFlow_ScopesEntry { + return AuthorizationCodeOAuthFlow_ScopesEntry.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): AuthorizationCodeOAuthFlow_ScopesEntry { + const message = createBaseAuthorizationCodeOAuthFlow_ScopesEntry(); + message.key = object.key ?? ""; + message.value = object.value ?? ""; + return message; + }, +}; + +function createBaseClientCredentialsOAuthFlow(): ClientCredentialsOAuthFlow { + return { tokenUrl: "", refreshUrl: "", scopes: {} }; +} + +export const ClientCredentialsOAuthFlow: MessageFns = { + encode(message: ClientCredentialsOAuthFlow, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.tokenUrl !== "") { + writer.uint32(10).string(message.tokenUrl); + } + if (message.refreshUrl !== "") { + writer.uint32(18).string(message.refreshUrl); + } + Object.entries(message.scopes).forEach(([key, value]) => { + ClientCredentialsOAuthFlow_ScopesEntry.encode({ key: key as any, value }, writer.uint32(26).fork()).join(); + }); + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ClientCredentialsOAuthFlow { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseClientCredentialsOAuthFlow(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.tokenUrl = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.refreshUrl = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + const entry3 = ClientCredentialsOAuthFlow_ScopesEntry.decode(reader, reader.uint32()); + if (entry3.value !== undefined) { + message.scopes[entry3.key] = entry3.value; + } + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ClientCredentialsOAuthFlow { + return { + tokenUrl: isSet(object.tokenUrl) ? globalThis.String(object.tokenUrl) : "", + refreshUrl: isSet(object.refreshUrl) ? globalThis.String(object.refreshUrl) : "", + scopes: isObject(object.scopes) + ? Object.entries(object.scopes).reduce<{ [key: string]: string }>((acc, [key, value]) => { + acc[key] = String(value); + return acc; + }, {}) + : {}, + }; + }, + + toJSON(message: ClientCredentialsOAuthFlow): unknown { + const obj: any = {}; + if (message.tokenUrl !== "") { + obj.tokenUrl = message.tokenUrl; + } + if (message.refreshUrl !== "") { + obj.refreshUrl = message.refreshUrl; + } + if (message.scopes) { + const entries = Object.entries(message.scopes); + if (entries.length > 0) { + obj.scopes = {}; + entries.forEach(([k, v]) => { + obj.scopes[k] = v; + }); + } + } + return obj; + }, + + create, I>>(base?: I): ClientCredentialsOAuthFlow { + return ClientCredentialsOAuthFlow.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ClientCredentialsOAuthFlow { + const message = createBaseClientCredentialsOAuthFlow(); + message.tokenUrl = object.tokenUrl ?? ""; + message.refreshUrl = object.refreshUrl ?? ""; + message.scopes = Object.entries(object.scopes ?? {}).reduce<{ [key: string]: string }>((acc, [key, value]) => { + if (value !== undefined) { + acc[key] = globalThis.String(value); + } + return acc; + }, {}); + return message; + }, +}; + +function createBaseClientCredentialsOAuthFlow_ScopesEntry(): ClientCredentialsOAuthFlow_ScopesEntry { + return { key: "", value: "" }; +} + +export const ClientCredentialsOAuthFlow_ScopesEntry: MessageFns = { + encode(message: ClientCredentialsOAuthFlow_ScopesEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== "") { + writer.uint32(18).string(message.value); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ClientCredentialsOAuthFlow_ScopesEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseClientCredentialsOAuthFlow_ScopesEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ClientCredentialsOAuthFlow_ScopesEntry { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object.value) ? globalThis.String(object.value) : "", + }; + }, + + toJSON(message: ClientCredentialsOAuthFlow_ScopesEntry): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== "") { + obj.value = message.value; + } + return obj; + }, + + create, I>>( + base?: I, + ): ClientCredentialsOAuthFlow_ScopesEntry { + return ClientCredentialsOAuthFlow_ScopesEntry.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): ClientCredentialsOAuthFlow_ScopesEntry { + const message = createBaseClientCredentialsOAuthFlow_ScopesEntry(); + message.key = object.key ?? ""; + message.value = object.value ?? ""; + return message; + }, +}; + +function createBaseImplicitOAuthFlow(): ImplicitOAuthFlow { + return { authorizationUrl: "", refreshUrl: "", scopes: {} }; +} + +export const ImplicitOAuthFlow: MessageFns = { + encode(message: ImplicitOAuthFlow, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.authorizationUrl !== "") { + writer.uint32(10).string(message.authorizationUrl); + } + if (message.refreshUrl !== "") { + writer.uint32(18).string(message.refreshUrl); + } + Object.entries(message.scopes).forEach(([key, value]) => { + ImplicitOAuthFlow_ScopesEntry.encode({ key: key as any, value }, writer.uint32(26).fork()).join(); + }); + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ImplicitOAuthFlow { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseImplicitOAuthFlow(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.authorizationUrl = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.refreshUrl = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + const entry3 = ImplicitOAuthFlow_ScopesEntry.decode(reader, reader.uint32()); + if (entry3.value !== undefined) { + message.scopes[entry3.key] = entry3.value; + } + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ImplicitOAuthFlow { + return { + authorizationUrl: isSet(object.authorizationUrl) ? globalThis.String(object.authorizationUrl) : "", + refreshUrl: isSet(object.refreshUrl) ? globalThis.String(object.refreshUrl) : "", + scopes: isObject(object.scopes) + ? Object.entries(object.scopes).reduce<{ [key: string]: string }>((acc, [key, value]) => { + acc[key] = String(value); + return acc; + }, {}) + : {}, + }; + }, + + toJSON(message: ImplicitOAuthFlow): unknown { + const obj: any = {}; + if (message.authorizationUrl !== "") { + obj.authorizationUrl = message.authorizationUrl; + } + if (message.refreshUrl !== "") { + obj.refreshUrl = message.refreshUrl; + } + if (message.scopes) { + const entries = Object.entries(message.scopes); + if (entries.length > 0) { + obj.scopes = {}; + entries.forEach(([k, v]) => { + obj.scopes[k] = v; + }); + } + } + return obj; + }, + + create, I>>(base?: I): ImplicitOAuthFlow { + return ImplicitOAuthFlow.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ImplicitOAuthFlow { + const message = createBaseImplicitOAuthFlow(); + message.authorizationUrl = object.authorizationUrl ?? ""; + message.refreshUrl = object.refreshUrl ?? ""; + message.scopes = Object.entries(object.scopes ?? {}).reduce<{ [key: string]: string }>((acc, [key, value]) => { + if (value !== undefined) { + acc[key] = globalThis.String(value); + } + return acc; + }, {}); + return message; + }, +}; + +function createBaseImplicitOAuthFlow_ScopesEntry(): ImplicitOAuthFlow_ScopesEntry { + return { key: "", value: "" }; +} + +export const ImplicitOAuthFlow_ScopesEntry: MessageFns = { + encode(message: ImplicitOAuthFlow_ScopesEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== "") { + writer.uint32(18).string(message.value); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ImplicitOAuthFlow_ScopesEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseImplicitOAuthFlow_ScopesEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ImplicitOAuthFlow_ScopesEntry { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object.value) ? globalThis.String(object.value) : "", + }; + }, + + toJSON(message: ImplicitOAuthFlow_ScopesEntry): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== "") { + obj.value = message.value; + } + return obj; + }, + + create, I>>(base?: I): ImplicitOAuthFlow_ScopesEntry { + return ImplicitOAuthFlow_ScopesEntry.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): ImplicitOAuthFlow_ScopesEntry { + const message = createBaseImplicitOAuthFlow_ScopesEntry(); + message.key = object.key ?? ""; + message.value = object.value ?? ""; + return message; + }, +}; + +function createBasePasswordOAuthFlow(): PasswordOAuthFlow { + return { tokenUrl: "", refreshUrl: "", scopes: {} }; +} + +export const PasswordOAuthFlow: MessageFns = { + encode(message: PasswordOAuthFlow, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.tokenUrl !== "") { + writer.uint32(10).string(message.tokenUrl); + } + if (message.refreshUrl !== "") { + writer.uint32(18).string(message.refreshUrl); + } + Object.entries(message.scopes).forEach(([key, value]) => { + PasswordOAuthFlow_ScopesEntry.encode({ key: key as any, value }, writer.uint32(26).fork()).join(); + }); + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): PasswordOAuthFlow { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePasswordOAuthFlow(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.tokenUrl = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.refreshUrl = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + const entry3 = PasswordOAuthFlow_ScopesEntry.decode(reader, reader.uint32()); + if (entry3.value !== undefined) { + message.scopes[entry3.key] = entry3.value; + } + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): PasswordOAuthFlow { + return { + tokenUrl: isSet(object.tokenUrl) ? globalThis.String(object.tokenUrl) : "", + refreshUrl: isSet(object.refreshUrl) ? globalThis.String(object.refreshUrl) : "", + scopes: isObject(object.scopes) + ? Object.entries(object.scopes).reduce<{ [key: string]: string }>((acc, [key, value]) => { + acc[key] = String(value); + return acc; + }, {}) + : {}, + }; + }, + + toJSON(message: PasswordOAuthFlow): unknown { + const obj: any = {}; + if (message.tokenUrl !== "") { + obj.tokenUrl = message.tokenUrl; + } + if (message.refreshUrl !== "") { + obj.refreshUrl = message.refreshUrl; + } + if (message.scopes) { + const entries = Object.entries(message.scopes); + if (entries.length > 0) { + obj.scopes = {}; + entries.forEach(([k, v]) => { + obj.scopes[k] = v; + }); + } + } + return obj; + }, + + create, I>>(base?: I): PasswordOAuthFlow { + return PasswordOAuthFlow.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): PasswordOAuthFlow { + const message = createBasePasswordOAuthFlow(); + message.tokenUrl = object.tokenUrl ?? ""; + message.refreshUrl = object.refreshUrl ?? ""; + message.scopes = Object.entries(object.scopes ?? {}).reduce<{ [key: string]: string }>((acc, [key, value]) => { + if (value !== undefined) { + acc[key] = globalThis.String(value); + } + return acc; + }, {}); + return message; + }, +}; + +function createBasePasswordOAuthFlow_ScopesEntry(): PasswordOAuthFlow_ScopesEntry { + return { key: "", value: "" }; +} + +export const PasswordOAuthFlow_ScopesEntry: MessageFns = { + encode(message: PasswordOAuthFlow_ScopesEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== "") { + writer.uint32(18).string(message.value); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): PasswordOAuthFlow_ScopesEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePasswordOAuthFlow_ScopesEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): PasswordOAuthFlow_ScopesEntry { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object.value) ? globalThis.String(object.value) : "", + }; + }, + + toJSON(message: PasswordOAuthFlow_ScopesEntry): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== "") { + obj.value = message.value; + } + return obj; + }, + + create, I>>(base?: I): PasswordOAuthFlow_ScopesEntry { + return PasswordOAuthFlow_ScopesEntry.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): PasswordOAuthFlow_ScopesEntry { + const message = createBasePasswordOAuthFlow_ScopesEntry(); + message.key = object.key ?? ""; + message.value = object.value ?? ""; + return message; + }, +}; + +function createBaseSendMessageRequest(): SendMessageRequest { + return { tenant: "", request: undefined, configuration: undefined, metadata: undefined }; +} + +export const SendMessageRequest: MessageFns = { + encode(message: SendMessageRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.tenant !== "") { + writer.uint32(34).string(message.tenant); + } + if (message.request !== undefined) { + Message.encode(message.request, writer.uint32(10).fork()).join(); + } + if (message.configuration !== undefined) { + SendMessageConfiguration.encode(message.configuration, writer.uint32(18).fork()).join(); + } + if (message.metadata !== undefined) { + Struct.encode(Struct.wrap(message.metadata), writer.uint32(26).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): SendMessageRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSendMessageRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 4: { + if (tag !== 34) { + break; + } + + message.tenant = reader.string(); + continue; + } + case 1: { + if (tag !== 10) { + break; + } + + message.request = Message.decode(reader, reader.uint32()); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.configuration = SendMessageConfiguration.decode(reader, reader.uint32()); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.metadata = Struct.unwrap(Struct.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): SendMessageRequest { + return { + tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "", + request: isSet(object.message) ? Message.fromJSON(object.message) : undefined, + configuration: isSet(object.configuration) ? SendMessageConfiguration.fromJSON(object.configuration) : undefined, + metadata: isObject(object.metadata) ? object.metadata : undefined, + }; + }, + + toJSON(message: SendMessageRequest): unknown { + const obj: any = {}; + if (message.tenant !== "") { + obj.tenant = message.tenant; + } + if (message.request !== undefined) { + obj.message = Message.toJSON(message.request); + } + if (message.configuration !== undefined) { + obj.configuration = SendMessageConfiguration.toJSON(message.configuration); + } + if (message.metadata !== undefined) { + obj.metadata = message.metadata; + } + return obj; + }, + + create, I>>(base?: I): SendMessageRequest { + return SendMessageRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): SendMessageRequest { + const message = createBaseSendMessageRequest(); + message.tenant = object.tenant ?? ""; + message.request = (object.request !== undefined && object.request !== null) + ? Message.fromPartial(object.request) + : undefined; + message.configuration = (object.configuration !== undefined && object.configuration !== null) + ? SendMessageConfiguration.fromPartial(object.configuration) + : undefined; + message.metadata = object.metadata ?? undefined; + return message; + }, +}; + +function createBaseGetTaskRequest(): GetTaskRequest { + return { tenant: "", name: "", historyLength: undefined }; +} + +export const GetTaskRequest: MessageFns = { + encode(message: GetTaskRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.tenant !== "") { + writer.uint32(26).string(message.tenant); + } + if (message.name !== "") { + writer.uint32(10).string(message.name); + } + if (message.historyLength !== undefined) { + writer.uint32(16).int32(message.historyLength); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): GetTaskRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetTaskRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 3: { + if (tag !== 26) { + break; + } + + message.tenant = reader.string(); + continue; + } + case 1: { + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.historyLength = reader.int32(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): GetTaskRequest { + return { + tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "", + name: isSet(object.name) ? globalThis.String(object.name) : "", + historyLength: isSet(object.historyLength) ? globalThis.Number(object.historyLength) : undefined, + }; + }, + + toJSON(message: GetTaskRequest): unknown { + const obj: any = {}; + if (message.tenant !== "") { + obj.tenant = message.tenant; + } + if (message.name !== "") { + obj.name = message.name; + } + if (message.historyLength !== undefined) { + obj.historyLength = Math.round(message.historyLength); + } + return obj; + }, + + create, I>>(base?: I): GetTaskRequest { + return GetTaskRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): GetTaskRequest { + const message = createBaseGetTaskRequest(); + message.tenant = object.tenant ?? ""; + message.name = object.name ?? ""; + message.historyLength = object.historyLength ?? undefined; + return message; + }, +}; + +function createBaseListTasksRequest(): ListTasksRequest { + return { + tenant: "", + contextId: "", + status: 0, + pageSize: undefined, + pageToken: "", + historyLength: undefined, + lastUpdatedAfter: 0, + includeArtifacts: undefined, + }; +} + +export const ListTasksRequest: MessageFns = { + encode(message: ListTasksRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.tenant !== "") { + writer.uint32(74).string(message.tenant); + } + if (message.contextId !== "") { + writer.uint32(10).string(message.contextId); + } + if (message.status !== 0) { + writer.uint32(16).int32(message.status); + } + if (message.pageSize !== undefined) { + writer.uint32(24).int32(message.pageSize); + } + if (message.pageToken !== "") { + writer.uint32(34).string(message.pageToken); + } + if (message.historyLength !== undefined) { + writer.uint32(40).int32(message.historyLength); + } + if (message.lastUpdatedAfter !== 0) { + writer.uint32(48).int64(message.lastUpdatedAfter); + } + if (message.includeArtifacts !== undefined) { + writer.uint32(56).bool(message.includeArtifacts); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ListTasksRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseListTasksRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 9: { + if (tag !== 74) { + break; + } + + message.tenant = reader.string(); + continue; + } + case 1: { + if (tag !== 10) { + break; + } + + message.contextId = reader.string(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.status = reader.int32() as any; + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.pageSize = reader.int32(); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.pageToken = reader.string(); + continue; + } + case 5: { + if (tag !== 40) { + break; + } + + message.historyLength = reader.int32(); + continue; + } + case 6: { + if (tag !== 48) { + break; + } + + message.lastUpdatedAfter = longToNumber(reader.int64()); + continue; + } + case 7: { + if (tag !== 56) { + break; + } + + message.includeArtifacts = reader.bool(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ListTasksRequest { + return { + tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "", + contextId: isSet(object.contextId) ? globalThis.String(object.contextId) : "", + status: isSet(object.status) ? taskStateFromJSON(object.status) : 0, + pageSize: isSet(object.pageSize) ? globalThis.Number(object.pageSize) : undefined, + pageToken: isSet(object.pageToken) ? globalThis.String(object.pageToken) : "", + historyLength: isSet(object.historyLength) ? globalThis.Number(object.historyLength) : undefined, + lastUpdatedAfter: isSet(object.lastUpdatedAfter) ? globalThis.Number(object.lastUpdatedAfter) : 0, + includeArtifacts: isSet(object.includeArtifacts) ? globalThis.Boolean(object.includeArtifacts) : undefined, + }; + }, + + toJSON(message: ListTasksRequest): unknown { + const obj: any = {}; + if (message.tenant !== "") { + obj.tenant = message.tenant; + } + if (message.contextId !== "") { + obj.contextId = message.contextId; + } + if (message.status !== 0) { + obj.status = taskStateToJSON(message.status); + } + if (message.pageSize !== undefined) { + obj.pageSize = Math.round(message.pageSize); + } + if (message.pageToken !== "") { + obj.pageToken = message.pageToken; + } + if (message.historyLength !== undefined) { + obj.historyLength = Math.round(message.historyLength); + } + if (message.lastUpdatedAfter !== 0) { + obj.lastUpdatedAfter = Math.round(message.lastUpdatedAfter); + } + if (message.includeArtifacts !== undefined) { + obj.includeArtifacts = message.includeArtifacts; + } + return obj; + }, + + create, I>>(base?: I): ListTasksRequest { + return ListTasksRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ListTasksRequest { + const message = createBaseListTasksRequest(); + message.tenant = object.tenant ?? ""; + message.contextId = object.contextId ?? ""; + message.status = object.status ?? 0; + message.pageSize = object.pageSize ?? undefined; + message.pageToken = object.pageToken ?? ""; + message.historyLength = object.historyLength ?? undefined; + message.lastUpdatedAfter = object.lastUpdatedAfter ?? 0; + message.includeArtifacts = object.includeArtifacts ?? undefined; + return message; + }, +}; + +function createBaseListTasksResponse(): ListTasksResponse { + return { tasks: [], nextPageToken: "", pageSize: 0, totalSize: 0 }; +} + +export const ListTasksResponse: MessageFns = { + encode(message: ListTasksResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.tasks) { + Task.encode(v!, writer.uint32(10).fork()).join(); + } + if (message.nextPageToken !== "") { + writer.uint32(18).string(message.nextPageToken); + } + if (message.pageSize !== 0) { + writer.uint32(24).int32(message.pageSize); + } + if (message.totalSize !== 0) { + writer.uint32(32).int32(message.totalSize); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ListTasksResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseListTasksResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.tasks.push(Task.decode(reader, reader.uint32())); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.nextPageToken = reader.string(); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.pageSize = reader.int32(); + continue; + } + case 4: { + if (tag !== 32) { + break; + } + + message.totalSize = reader.int32(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ListTasksResponse { + return { + tasks: globalThis.Array.isArray(object?.tasks) ? object.tasks.map((e: any) => Task.fromJSON(e)) : [], + nextPageToken: isSet(object.nextPageToken) ? globalThis.String(object.nextPageToken) : "", + pageSize: isSet(object.pageSize) ? globalThis.Number(object.pageSize) : 0, + totalSize: isSet(object.totalSize) ? globalThis.Number(object.totalSize) : 0, + }; + }, + + toJSON(message: ListTasksResponse): unknown { + const obj: any = {}; + if (message.tasks?.length) { + obj.tasks = message.tasks.map((e) => Task.toJSON(e)); + } + if (message.nextPageToken !== "") { + obj.nextPageToken = message.nextPageToken; + } + if (message.pageSize !== 0) { + obj.pageSize = Math.round(message.pageSize); + } + if (message.totalSize !== 0) { + obj.totalSize = Math.round(message.totalSize); + } + return obj; + }, + + create, I>>(base?: I): ListTasksResponse { + return ListTasksResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ListTasksResponse { + const message = createBaseListTasksResponse(); + message.tasks = object.tasks?.map((e) => Task.fromPartial(e)) || []; + message.nextPageToken = object.nextPageToken ?? ""; + message.pageSize = object.pageSize ?? 0; + message.totalSize = object.totalSize ?? 0; + return message; + }, +}; + +function createBaseCancelTaskRequest(): CancelTaskRequest { + return { tenant: "", name: "" }; +} + +export const CancelTaskRequest: MessageFns = { + encode(message: CancelTaskRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.tenant !== "") { + writer.uint32(18).string(message.tenant); + } + if (message.name !== "") { + writer.uint32(10).string(message.name); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): CancelTaskRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseCancelTaskRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 2: { + if (tag !== 18) { + break; + } + + message.tenant = reader.string(); + continue; + } + case 1: { + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): CancelTaskRequest { + return { + tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "", + name: isSet(object.name) ? globalThis.String(object.name) : "", + }; + }, + + toJSON(message: CancelTaskRequest): unknown { + const obj: any = {}; + if (message.tenant !== "") { + obj.tenant = message.tenant; + } + if (message.name !== "") { + obj.name = message.name; + } + return obj; + }, + + create, I>>(base?: I): CancelTaskRequest { + return CancelTaskRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): CancelTaskRequest { + const message = createBaseCancelTaskRequest(); + message.tenant = object.tenant ?? ""; + message.name = object.name ?? ""; + return message; + }, +}; + +function createBaseGetTaskPushNotificationConfigRequest(): GetTaskPushNotificationConfigRequest { + return { tenant: "", name: "" }; +} + +export const GetTaskPushNotificationConfigRequest: MessageFns = { + encode(message: GetTaskPushNotificationConfigRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.tenant !== "") { + writer.uint32(18).string(message.tenant); + } + if (message.name !== "") { + writer.uint32(10).string(message.name); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): GetTaskPushNotificationConfigRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetTaskPushNotificationConfigRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 2: { + if (tag !== 18) { + break; + } + + message.tenant = reader.string(); + continue; + } + case 1: { + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): GetTaskPushNotificationConfigRequest { + return { + tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "", + name: isSet(object.name) ? globalThis.String(object.name) : "", + }; + }, + + toJSON(message: GetTaskPushNotificationConfigRequest): unknown { + const obj: any = {}; + if (message.tenant !== "") { + obj.tenant = message.tenant; + } + if (message.name !== "") { + obj.name = message.name; + } + return obj; + }, + + create, I>>( + base?: I, + ): GetTaskPushNotificationConfigRequest { + return GetTaskPushNotificationConfigRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): GetTaskPushNotificationConfigRequest { + const message = createBaseGetTaskPushNotificationConfigRequest(); + message.tenant = object.tenant ?? ""; + message.name = object.name ?? ""; + return message; + }, +}; + +function createBaseDeleteTaskPushNotificationConfigRequest(): DeleteTaskPushNotificationConfigRequest { + return { tenant: "", name: "" }; +} + +export const DeleteTaskPushNotificationConfigRequest: MessageFns = { + encode(message: DeleteTaskPushNotificationConfigRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.tenant !== "") { + writer.uint32(18).string(message.tenant); + } + if (message.name !== "") { + writer.uint32(10).string(message.name); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): DeleteTaskPushNotificationConfigRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDeleteTaskPushNotificationConfigRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 2: { + if (tag !== 18) { + break; + } + + message.tenant = reader.string(); + continue; + } + case 1: { + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): DeleteTaskPushNotificationConfigRequest { + return { + tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "", + name: isSet(object.name) ? globalThis.String(object.name) : "", + }; + }, + + toJSON(message: DeleteTaskPushNotificationConfigRequest): unknown { + const obj: any = {}; + if (message.tenant !== "") { + obj.tenant = message.tenant; + } + if (message.name !== "") { + obj.name = message.name; + } + return obj; + }, + + create, I>>( + base?: I, + ): DeleteTaskPushNotificationConfigRequest { + return DeleteTaskPushNotificationConfigRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): DeleteTaskPushNotificationConfigRequest { + const message = createBaseDeleteTaskPushNotificationConfigRequest(); + message.tenant = object.tenant ?? ""; + message.name = object.name ?? ""; + return message; + }, +}; + +function createBaseSetTaskPushNotificationConfigRequest(): SetTaskPushNotificationConfigRequest { + return { tenant: "", parent: "", configId: "", config: undefined }; +} + +export const SetTaskPushNotificationConfigRequest: MessageFns = { + encode(message: SetTaskPushNotificationConfigRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.tenant !== "") { + writer.uint32(34).string(message.tenant); + } + if (message.parent !== "") { + writer.uint32(10).string(message.parent); + } + if (message.configId !== "") { + writer.uint32(18).string(message.configId); + } + if (message.config !== undefined) { + TaskPushNotificationConfig.encode(message.config, writer.uint32(26).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): SetTaskPushNotificationConfigRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSetTaskPushNotificationConfigRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 4: { + if (tag !== 34) { + break; + } + + message.tenant = reader.string(); + continue; + } + case 1: { + if (tag !== 10) { + break; + } + + message.parent = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.configId = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.config = TaskPushNotificationConfig.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): SetTaskPushNotificationConfigRequest { + return { + tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "", + parent: isSet(object.parent) ? globalThis.String(object.parent) : "", + configId: isSet(object.configId) ? globalThis.String(object.configId) : "", + config: isSet(object.config) ? TaskPushNotificationConfig.fromJSON(object.config) : undefined, + }; + }, + + toJSON(message: SetTaskPushNotificationConfigRequest): unknown { + const obj: any = {}; + if (message.tenant !== "") { + obj.tenant = message.tenant; + } + if (message.parent !== "") { + obj.parent = message.parent; + } + if (message.configId !== "") { + obj.configId = message.configId; + } + if (message.config !== undefined) { + obj.config = TaskPushNotificationConfig.toJSON(message.config); + } + return obj; + }, + + create, I>>( + base?: I, + ): SetTaskPushNotificationConfigRequest { + return SetTaskPushNotificationConfigRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): SetTaskPushNotificationConfigRequest { + const message = createBaseSetTaskPushNotificationConfigRequest(); + message.tenant = object.tenant ?? ""; + message.parent = object.parent ?? ""; + message.configId = object.configId ?? ""; + message.config = (object.config !== undefined && object.config !== null) + ? TaskPushNotificationConfig.fromPartial(object.config) + : undefined; + return message; + }, +}; + +function createBaseSubscribeToTaskRequest(): SubscribeToTaskRequest { + return { tenant: "", name: "" }; +} + +export const SubscribeToTaskRequest: MessageFns = { + encode(message: SubscribeToTaskRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.tenant !== "") { + writer.uint32(18).string(message.tenant); + } + if (message.name !== "") { + writer.uint32(10).string(message.name); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): SubscribeToTaskRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSubscribeToTaskRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 2: { + if (tag !== 18) { + break; + } + + message.tenant = reader.string(); + continue; + } + case 1: { + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): SubscribeToTaskRequest { + return { + tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "", + name: isSet(object.name) ? globalThis.String(object.name) : "", + }; + }, + + toJSON(message: SubscribeToTaskRequest): unknown { + const obj: any = {}; + if (message.tenant !== "") { + obj.tenant = message.tenant; + } + if (message.name !== "") { + obj.name = message.name; + } + return obj; + }, + + create, I>>(base?: I): SubscribeToTaskRequest { + return SubscribeToTaskRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): SubscribeToTaskRequest { + const message = createBaseSubscribeToTaskRequest(); + message.tenant = object.tenant ?? ""; + message.name = object.name ?? ""; + return message; + }, +}; + +function createBaseListTaskPushNotificationConfigRequest(): ListTaskPushNotificationConfigRequest { + return { tenant: "", parent: "", pageSize: 0, pageToken: "" }; +} + +export const ListTaskPushNotificationConfigRequest: MessageFns = { + encode(message: ListTaskPushNotificationConfigRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.tenant !== "") { + writer.uint32(34).string(message.tenant); + } + if (message.parent !== "") { + writer.uint32(10).string(message.parent); + } + if (message.pageSize !== 0) { + writer.uint32(16).int32(message.pageSize); + } + if (message.pageToken !== "") { + writer.uint32(26).string(message.pageToken); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ListTaskPushNotificationConfigRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseListTaskPushNotificationConfigRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 4: { + if (tag !== 34) { + break; + } + + message.tenant = reader.string(); + continue; + } + case 1: { + if (tag !== 10) { + break; + } + + message.parent = reader.string(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.pageSize = reader.int32(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.pageToken = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ListTaskPushNotificationConfigRequest { + return { + tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "", + parent: isSet(object.parent) ? globalThis.String(object.parent) : "", + pageSize: isSet(object.pageSize) ? globalThis.Number(object.pageSize) : 0, + pageToken: isSet(object.pageToken) ? globalThis.String(object.pageToken) : "", + }; + }, + + toJSON(message: ListTaskPushNotificationConfigRequest): unknown { + const obj: any = {}; + if (message.tenant !== "") { + obj.tenant = message.tenant; + } + if (message.parent !== "") { + obj.parent = message.parent; + } + if (message.pageSize !== 0) { + obj.pageSize = Math.round(message.pageSize); + } + if (message.pageToken !== "") { + obj.pageToken = message.pageToken; + } + return obj; + }, + + create, I>>( + base?: I, + ): ListTaskPushNotificationConfigRequest { + return ListTaskPushNotificationConfigRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): ListTaskPushNotificationConfigRequest { + const message = createBaseListTaskPushNotificationConfigRequest(); + message.tenant = object.tenant ?? ""; + message.parent = object.parent ?? ""; + message.pageSize = object.pageSize ?? 0; + message.pageToken = object.pageToken ?? ""; + return message; + }, +}; + +function createBaseGetExtendedAgentCardRequest(): GetExtendedAgentCardRequest { + return { tenant: "" }; +} + +export const GetExtendedAgentCardRequest: MessageFns = { + encode(message: GetExtendedAgentCardRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.tenant !== "") { + writer.uint32(10).string(message.tenant); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): GetExtendedAgentCardRequest { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGetExtendedAgentCardRequest(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.tenant = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): GetExtendedAgentCardRequest { + return { tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "" }; + }, + + toJSON(message: GetExtendedAgentCardRequest): unknown { + const obj: any = {}; + if (message.tenant !== "") { + obj.tenant = message.tenant; + } + return obj; + }, + + create, I>>(base?: I): GetExtendedAgentCardRequest { + return GetExtendedAgentCardRequest.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): GetExtendedAgentCardRequest { + const message = createBaseGetExtendedAgentCardRequest(); + message.tenant = object.tenant ?? ""; + return message; + }, +}; + +function createBaseSendMessageResponse(): SendMessageResponse { + return { payload: undefined }; +} + +export const SendMessageResponse: MessageFns = { + encode(message: SendMessageResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + switch (message.payload?.$case) { + case "task": + Task.encode(message.payload.value, writer.uint32(10).fork()).join(); + break; + case "msg": + Message.encode(message.payload.value, writer.uint32(18).fork()).join(); + break; + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): SendMessageResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSendMessageResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.payload = { $case: "task", value: Task.decode(reader, reader.uint32()) }; + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.payload = { $case: "msg", value: Message.decode(reader, reader.uint32()) }; + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): SendMessageResponse { + return { + payload: isSet(object.task) + ? { $case: "task", value: Task.fromJSON(object.task) } + : isSet(object.message) + ? { $case: "msg", value: Message.fromJSON(object.message) } + : undefined, + }; + }, + + toJSON(message: SendMessageResponse): unknown { + const obj: any = {}; + if (message.payload?.$case === "task") { + obj.task = Task.toJSON(message.payload.value); + } else if (message.payload?.$case === "msg") { + obj.message = Message.toJSON(message.payload.value); + } + return obj; + }, + + create, I>>(base?: I): SendMessageResponse { + return SendMessageResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): SendMessageResponse { + const message = createBaseSendMessageResponse(); + switch (object.payload?.$case) { + case "task": { + if (object.payload?.value !== undefined && object.payload?.value !== null) { + message.payload = { $case: "task", value: Task.fromPartial(object.payload.value) }; + } + break; + } + case "msg": { + if (object.payload?.value !== undefined && object.payload?.value !== null) { + message.payload = { $case: "msg", value: Message.fromPartial(object.payload.value) }; + } + break; + } + } + return message; + }, +}; + +function createBaseStreamResponse(): StreamResponse { + return { payload: undefined }; +} + +export const StreamResponse: MessageFns = { + encode(message: StreamResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + switch (message.payload?.$case) { + case "task": + Task.encode(message.payload.value, writer.uint32(10).fork()).join(); + break; + case "msg": + Message.encode(message.payload.value, writer.uint32(18).fork()).join(); + break; + case "statusUpdate": + TaskStatusUpdateEvent.encode(message.payload.value, writer.uint32(26).fork()).join(); + break; + case "artifactUpdate": + TaskArtifactUpdateEvent.encode(message.payload.value, writer.uint32(34).fork()).join(); + break; + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): StreamResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseStreamResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.payload = { $case: "task", value: Task.decode(reader, reader.uint32()) }; + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.payload = { $case: "msg", value: Message.decode(reader, reader.uint32()) }; + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.payload = { $case: "statusUpdate", value: TaskStatusUpdateEvent.decode(reader, reader.uint32()) }; + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.payload = { $case: "artifactUpdate", value: TaskArtifactUpdateEvent.decode(reader, reader.uint32()) }; + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): StreamResponse { + return { + payload: isSet(object.task) + ? { $case: "task", value: Task.fromJSON(object.task) } + : isSet(object.message) + ? { $case: "msg", value: Message.fromJSON(object.message) } + : isSet(object.statusUpdate) + ? { $case: "statusUpdate", value: TaskStatusUpdateEvent.fromJSON(object.statusUpdate) } + : isSet(object.artifactUpdate) + ? { $case: "artifactUpdate", value: TaskArtifactUpdateEvent.fromJSON(object.artifactUpdate) } + : undefined, + }; + }, + + toJSON(message: StreamResponse): unknown { + const obj: any = {}; + if (message.payload?.$case === "task") { + obj.task = Task.toJSON(message.payload.value); + } else if (message.payload?.$case === "msg") { + obj.message = Message.toJSON(message.payload.value); + } else if (message.payload?.$case === "statusUpdate") { + obj.statusUpdate = TaskStatusUpdateEvent.toJSON(message.payload.value); + } else if (message.payload?.$case === "artifactUpdate") { + obj.artifactUpdate = TaskArtifactUpdateEvent.toJSON(message.payload.value); + } + return obj; + }, + + create, I>>(base?: I): StreamResponse { + return StreamResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): StreamResponse { + const message = createBaseStreamResponse(); + switch (object.payload?.$case) { + case "task": { + if (object.payload?.value !== undefined && object.payload?.value !== null) { + message.payload = { $case: "task", value: Task.fromPartial(object.payload.value) }; + } + break; + } + case "msg": { + if (object.payload?.value !== undefined && object.payload?.value !== null) { + message.payload = { $case: "msg", value: Message.fromPartial(object.payload.value) }; + } + break; + } + case "statusUpdate": { + if (object.payload?.value !== undefined && object.payload?.value !== null) { + message.payload = { $case: "statusUpdate", value: TaskStatusUpdateEvent.fromPartial(object.payload.value) }; + } + break; + } + case "artifactUpdate": { + if (object.payload?.value !== undefined && object.payload?.value !== null) { + message.payload = { + $case: "artifactUpdate", + value: TaskArtifactUpdateEvent.fromPartial(object.payload.value), + }; + } + break; + } + } + return message; + }, +}; + +function createBaseListTaskPushNotificationConfigResponse(): ListTaskPushNotificationConfigResponse { + return { configs: [], nextPageToken: "" }; +} + +export const ListTaskPushNotificationConfigResponse: MessageFns = { + encode(message: ListTaskPushNotificationConfigResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.configs) { + TaskPushNotificationConfig.encode(v!, writer.uint32(10).fork()).join(); + } + if (message.nextPageToken !== "") { + writer.uint32(18).string(message.nextPageToken); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ListTaskPushNotificationConfigResponse { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseListTaskPushNotificationConfigResponse(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.configs.push(TaskPushNotificationConfig.decode(reader, reader.uint32())); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.nextPageToken = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ListTaskPushNotificationConfigResponse { + return { + configs: globalThis.Array.isArray(object?.configs) + ? object.configs.map((e: any) => TaskPushNotificationConfig.fromJSON(e)) + : [], + nextPageToken: isSet(object.nextPageToken) ? globalThis.String(object.nextPageToken) : "", + }; + }, + + toJSON(message: ListTaskPushNotificationConfigResponse): unknown { + const obj: any = {}; + if (message.configs?.length) { + obj.configs = message.configs.map((e) => TaskPushNotificationConfig.toJSON(e)); + } + if (message.nextPageToken !== "") { + obj.nextPageToken = message.nextPageToken; + } + return obj; + }, + + create, I>>( + base?: I, + ): ListTaskPushNotificationConfigResponse { + return ListTaskPushNotificationConfigResponse.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): ListTaskPushNotificationConfigResponse { + const message = createBaseListTaskPushNotificationConfigResponse(); + message.configs = object.configs?.map((e) => TaskPushNotificationConfig.fromPartial(e)) || []; + message.nextPageToken = object.nextPageToken ?? ""; + return message; + }, +}; + +/** A2AService defines the operations of the A2A protocol. */ +export type A2AServiceService = typeof A2AServiceService; +export const A2AServiceService = { + /** Send a message to the agent. */ + sendMessage: { + path: "/a2a.v1.A2AService/SendMessage", + requestStream: false, + responseStream: false, + requestSerialize: (value: SendMessageRequest): Buffer => Buffer.from(SendMessageRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): SendMessageRequest => SendMessageRequest.decode(value), + responseSerialize: (value: SendMessageResponse): Buffer => Buffer.from(SendMessageResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): SendMessageResponse => SendMessageResponse.decode(value), + }, + /** SendStreamingMessage is a streaming version of SendMessage. */ + sendStreamingMessage: { + path: "/a2a.v1.A2AService/SendStreamingMessage", + requestStream: false, + responseStream: true, + requestSerialize: (value: SendMessageRequest): Buffer => Buffer.from(SendMessageRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): SendMessageRequest => SendMessageRequest.decode(value), + responseSerialize: (value: StreamResponse): Buffer => Buffer.from(StreamResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): StreamResponse => StreamResponse.decode(value), + }, + /** Get the current state of a task from the agent. */ + getTask: { + path: "/a2a.v1.A2AService/GetTask", + requestStream: false, + responseStream: false, + requestSerialize: (value: GetTaskRequest): Buffer => Buffer.from(GetTaskRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): GetTaskRequest => GetTaskRequest.decode(value), + responseSerialize: (value: Task): Buffer => Buffer.from(Task.encode(value).finish()), + responseDeserialize: (value: Buffer): Task => Task.decode(value), + }, + /** List tasks with optional filtering and pagination. */ + listTasks: { + path: "/a2a.v1.A2AService/ListTasks", + requestStream: false, + responseStream: false, + requestSerialize: (value: ListTasksRequest): Buffer => Buffer.from(ListTasksRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): ListTasksRequest => ListTasksRequest.decode(value), + responseSerialize: (value: ListTasksResponse): Buffer => Buffer.from(ListTasksResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): ListTasksResponse => ListTasksResponse.decode(value), + }, + /** Cancel a task. */ + cancelTask: { + path: "/a2a.v1.A2AService/CancelTask", + requestStream: false, + responseStream: false, + requestSerialize: (value: CancelTaskRequest): Buffer => Buffer.from(CancelTaskRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): CancelTaskRequest => CancelTaskRequest.decode(value), + responseSerialize: (value: Task): Buffer => Buffer.from(Task.encode(value).finish()), + responseDeserialize: (value: Buffer): Task => Task.decode(value), + }, + /** + * SubscribeToTask allows subscribing to task updates for tasks not in terminal state. + * Returns UnsupportedOperationError if task is in terminal state (completed, failed, cancelled, rejected). + */ + subscribeToTask: { + path: "/a2a.v1.A2AService/SubscribeToTask", + requestStream: false, + responseStream: true, + requestSerialize: (value: SubscribeToTaskRequest): Buffer => + Buffer.from(SubscribeToTaskRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): SubscribeToTaskRequest => SubscribeToTaskRequest.decode(value), + responseSerialize: (value: StreamResponse): Buffer => Buffer.from(StreamResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): StreamResponse => StreamResponse.decode(value), + }, + /** Set a push notification config for a task. */ + setTaskPushNotificationConfig: { + path: "/a2a.v1.A2AService/SetTaskPushNotificationConfig", + requestStream: false, + responseStream: false, + requestSerialize: (value: SetTaskPushNotificationConfigRequest): Buffer => + Buffer.from(SetTaskPushNotificationConfigRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): SetTaskPushNotificationConfigRequest => + SetTaskPushNotificationConfigRequest.decode(value), + responseSerialize: (value: TaskPushNotificationConfig): Buffer => + Buffer.from(TaskPushNotificationConfig.encode(value).finish()), + responseDeserialize: (value: Buffer): TaskPushNotificationConfig => TaskPushNotificationConfig.decode(value), + }, + /** Get a push notification config for a task. */ + getTaskPushNotificationConfig: { + path: "/a2a.v1.A2AService/GetTaskPushNotificationConfig", + requestStream: false, + responseStream: false, + requestSerialize: (value: GetTaskPushNotificationConfigRequest): Buffer => + Buffer.from(GetTaskPushNotificationConfigRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): GetTaskPushNotificationConfigRequest => + GetTaskPushNotificationConfigRequest.decode(value), + responseSerialize: (value: TaskPushNotificationConfig): Buffer => + Buffer.from(TaskPushNotificationConfig.encode(value).finish()), + responseDeserialize: (value: Buffer): TaskPushNotificationConfig => TaskPushNotificationConfig.decode(value), + }, + /** Get a list of push notifications configured for a task. */ + listTaskPushNotificationConfig: { + path: "/a2a.v1.A2AService/ListTaskPushNotificationConfig", + requestStream: false, + responseStream: false, + requestSerialize: (value: ListTaskPushNotificationConfigRequest): Buffer => + Buffer.from(ListTaskPushNotificationConfigRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): ListTaskPushNotificationConfigRequest => + ListTaskPushNotificationConfigRequest.decode(value), + responseSerialize: (value: ListTaskPushNotificationConfigResponse): Buffer => + Buffer.from(ListTaskPushNotificationConfigResponse.encode(value).finish()), + responseDeserialize: (value: Buffer): ListTaskPushNotificationConfigResponse => + ListTaskPushNotificationConfigResponse.decode(value), + }, + /** GetExtendedAgentCard returns the extended agent card for authenticated agents. */ + getExtendedAgentCard: { + path: "/a2a.v1.A2AService/GetExtendedAgentCard", + requestStream: false, + responseStream: false, + requestSerialize: (value: GetExtendedAgentCardRequest): Buffer => + Buffer.from(GetExtendedAgentCardRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): GetExtendedAgentCardRequest => GetExtendedAgentCardRequest.decode(value), + responseSerialize: (value: AgentCard): Buffer => Buffer.from(AgentCard.encode(value).finish()), + responseDeserialize: (value: Buffer): AgentCard => AgentCard.decode(value), + }, + /** Delete a push notification config for a task. */ + deleteTaskPushNotificationConfig: { + path: "/a2a.v1.A2AService/DeleteTaskPushNotificationConfig", + requestStream: false, + responseStream: false, + requestSerialize: (value: DeleteTaskPushNotificationConfigRequest): Buffer => + Buffer.from(DeleteTaskPushNotificationConfigRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): DeleteTaskPushNotificationConfigRequest => + DeleteTaskPushNotificationConfigRequest.decode(value), + responseSerialize: (value: Empty): Buffer => Buffer.from(Empty.encode(value).finish()), + responseDeserialize: (value: Buffer): Empty => Empty.decode(value), + }, +} as const; + +export interface A2AServiceServer extends UntypedServiceImplementation { + /** Send a message to the agent. */ + sendMessage: handleUnaryCall; + /** SendStreamingMessage is a streaming version of SendMessage. */ + sendStreamingMessage: handleServerStreamingCall; + /** Get the current state of a task from the agent. */ + getTask: handleUnaryCall; + /** List tasks with optional filtering and pagination. */ + listTasks: handleUnaryCall; + /** Cancel a task. */ + cancelTask: handleUnaryCall; + /** + * SubscribeToTask allows subscribing to task updates for tasks not in terminal state. + * Returns UnsupportedOperationError if task is in terminal state (completed, failed, cancelled, rejected). + */ + subscribeToTask: handleServerStreamingCall; + /** Set a push notification config for a task. */ + setTaskPushNotificationConfig: handleUnaryCall; + /** Get a push notification config for a task. */ + getTaskPushNotificationConfig: handleUnaryCall; + /** Get a list of push notifications configured for a task. */ + listTaskPushNotificationConfig: handleUnaryCall< + ListTaskPushNotificationConfigRequest, + ListTaskPushNotificationConfigResponse + >; + /** GetExtendedAgentCard returns the extended agent card for authenticated agents. */ + getExtendedAgentCard: handleUnaryCall; + /** Delete a push notification config for a task. */ + deleteTaskPushNotificationConfig: handleUnaryCall; +} + +export interface A2AServiceClient extends Client { + /** Send a message to the agent. */ + sendMessage( + request: SendMessageRequest, + callback: (error: ServiceError | null, response: SendMessageResponse) => void, + ): ClientUnaryCall; + sendMessage( + request: SendMessageRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: SendMessageResponse) => void, + ): ClientUnaryCall; + sendMessage( + request: SendMessageRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: SendMessageResponse) => void, + ): ClientUnaryCall; + /** SendStreamingMessage is a streaming version of SendMessage. */ + sendStreamingMessage( + request: SendMessageRequest, + options?: Partial, + ): ClientReadableStream; + sendStreamingMessage( + request: SendMessageRequest, + metadata?: Metadata, + options?: Partial, + ): ClientReadableStream; + /** Get the current state of a task from the agent. */ + getTask(request: GetTaskRequest, callback: (error: ServiceError | null, response: Task) => void): ClientUnaryCall; + getTask( + request: GetTaskRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: Task) => void, + ): ClientUnaryCall; + getTask( + request: GetTaskRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: Task) => void, + ): ClientUnaryCall; + /** List tasks with optional filtering and pagination. */ + listTasks( + request: ListTasksRequest, + callback: (error: ServiceError | null, response: ListTasksResponse) => void, + ): ClientUnaryCall; + listTasks( + request: ListTasksRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: ListTasksResponse) => void, + ): ClientUnaryCall; + listTasks( + request: ListTasksRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: ListTasksResponse) => void, + ): ClientUnaryCall; + /** Cancel a task. */ + cancelTask( + request: CancelTaskRequest, + callback: (error: ServiceError | null, response: Task) => void, + ): ClientUnaryCall; + cancelTask( + request: CancelTaskRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: Task) => void, + ): ClientUnaryCall; + cancelTask( + request: CancelTaskRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: Task) => void, + ): ClientUnaryCall; + /** + * SubscribeToTask allows subscribing to task updates for tasks not in terminal state. + * Returns UnsupportedOperationError if task is in terminal state (completed, failed, cancelled, rejected). + */ + subscribeToTask( + request: SubscribeToTaskRequest, + options?: Partial, + ): ClientReadableStream; + subscribeToTask( + request: SubscribeToTaskRequest, + metadata?: Metadata, + options?: Partial, + ): ClientReadableStream; + /** Set a push notification config for a task. */ + setTaskPushNotificationConfig( + request: SetTaskPushNotificationConfigRequest, + callback: (error: ServiceError | null, response: TaskPushNotificationConfig) => void, + ): ClientUnaryCall; + setTaskPushNotificationConfig( + request: SetTaskPushNotificationConfigRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: TaskPushNotificationConfig) => void, + ): ClientUnaryCall; + setTaskPushNotificationConfig( + request: SetTaskPushNotificationConfigRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: TaskPushNotificationConfig) => void, + ): ClientUnaryCall; + /** Get a push notification config for a task. */ + getTaskPushNotificationConfig( + request: GetTaskPushNotificationConfigRequest, + callback: (error: ServiceError | null, response: TaskPushNotificationConfig) => void, + ): ClientUnaryCall; + getTaskPushNotificationConfig( + request: GetTaskPushNotificationConfigRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: TaskPushNotificationConfig) => void, + ): ClientUnaryCall; + getTaskPushNotificationConfig( + request: GetTaskPushNotificationConfigRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: TaskPushNotificationConfig) => void, + ): ClientUnaryCall; + /** Get a list of push notifications configured for a task. */ + listTaskPushNotificationConfig( + request: ListTaskPushNotificationConfigRequest, + callback: (error: ServiceError | null, response: ListTaskPushNotificationConfigResponse) => void, + ): ClientUnaryCall; + listTaskPushNotificationConfig( + request: ListTaskPushNotificationConfigRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: ListTaskPushNotificationConfigResponse) => void, + ): ClientUnaryCall; + listTaskPushNotificationConfig( + request: ListTaskPushNotificationConfigRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: ListTaskPushNotificationConfigResponse) => void, + ): ClientUnaryCall; + /** GetExtendedAgentCard returns the extended agent card for authenticated agents. */ + getExtendedAgentCard( + request: GetExtendedAgentCardRequest, + callback: (error: ServiceError | null, response: AgentCard) => void, + ): ClientUnaryCall; + getExtendedAgentCard( + request: GetExtendedAgentCardRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: AgentCard) => void, + ): ClientUnaryCall; + getExtendedAgentCard( + request: GetExtendedAgentCardRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: AgentCard) => void, + ): ClientUnaryCall; + /** Delete a push notification config for a task. */ + deleteTaskPushNotificationConfig( + request: DeleteTaskPushNotificationConfigRequest, + callback: (error: ServiceError | null, response: Empty) => void, + ): ClientUnaryCall; + deleteTaskPushNotificationConfig( + request: DeleteTaskPushNotificationConfigRequest, + metadata: Metadata, + callback: (error: ServiceError | null, response: Empty) => void, + ): ClientUnaryCall; + deleteTaskPushNotificationConfig( + request: DeleteTaskPushNotificationConfigRequest, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: Empty) => void, + ): ClientUnaryCall; +} + +export const A2AServiceClient = makeGenericClientConstructor(A2AServiceService, "a2a.v1.A2AService") as unknown as { + new (address: string, credentials: ChannelCredentials, options?: Partial): A2AServiceClient; + service: typeof A2AServiceService; + serviceName: string; +}; + +function bytesFromBase64(b64: string): Uint8Array { + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); +} + +function base64FromBytes(arr: Uint8Array): string { + return globalThis.Buffer.from(arr).toString("base64"); +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends { $case: string; value: unknown } ? { $case: T["$case"]; value?: DeepPartial } + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function toTimestamp(date: Date): Timestamp { + const seconds = Math.trunc(date.getTime() / 1_000); + const nanos = (date.getTime() % 1_000) * 1_000_000; + return { seconds, nanos }; +} + +function fromTimestamp(t: Timestamp): Date { + let millis = (t.seconds || 0) * 1_000; + millis += (t.nanos || 0) / 1_000_000; + return new globalThis.Date(millis); +} + +function fromJsonTimestamp(o: any): Date { + if (o instanceof globalThis.Date) { + return o; + } else if (typeof o === "string") { + return new globalThis.Date(o); + } else { + return fromTimestamp(Timestamp.fromJSON(o)); + } +} + +function longToNumber(int64: { toString(): string }): number { + const num = globalThis.Number(int64.toString()); + if (num > globalThis.Number.MAX_SAFE_INTEGER) { + throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); + } + if (num < globalThis.Number.MIN_SAFE_INTEGER) { + throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); + } + return num; +} + +function isObject(value: any): boolean { + return typeof value === "object" && value !== null; +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} diff --git a/src/grpc/google/api/annotations.ts b/src/grpc/google/api/annotations.ts new file mode 100644 index 00000000..6356dbb5 --- /dev/null +++ b/src/grpc/google/api/annotations.ts @@ -0,0 +1,9 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.8.3 +// protoc v3.21.12 +// source: google/api/annotations.proto + +/* eslint-disable */ + +export const protobufPackage = "google.api"; diff --git a/src/grpc/google/api/client.ts b/src/grpc/google/api/client.ts new file mode 100644 index 00000000..768a498b --- /dev/null +++ b/src/grpc/google/api/client.ts @@ -0,0 +1,2624 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.8.3 +// protoc v3.21.12 +// source: google/api/client.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; +import { Duration } from "../protobuf/duration.js"; +import { LaunchStage, launchStageFromJSON, launchStageToJSON } from "./launch_stage.js"; + +export const protobufPackage = "google.api"; + +/** + * The organization for which the client libraries are being published. + * Affects the url where generated docs are published, etc. + */ +export enum ClientLibraryOrganization { + /** CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED - Not useful. */ + CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED = 0, + /** CLOUD - Google Cloud Platform Org. */ + CLOUD = 1, + /** ADS - Ads (Advertising) Org. */ + ADS = 2, + /** PHOTOS - Photos Org. */ + PHOTOS = 3, + /** STREET_VIEW - Street View Org. */ + STREET_VIEW = 4, + /** SHOPPING - Shopping Org. */ + SHOPPING = 5, + /** GEO - Geo Org. */ + GEO = 6, + /** GENERATIVE_AI - Generative AI - https://developers.generativeai.google */ + GENERATIVE_AI = 7, + UNRECOGNIZED = -1, +} + +export function clientLibraryOrganizationFromJSON(object: any): ClientLibraryOrganization { + switch (object) { + case 0: + case "CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED": + return ClientLibraryOrganization.CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED; + case 1: + case "CLOUD": + return ClientLibraryOrganization.CLOUD; + case 2: + case "ADS": + return ClientLibraryOrganization.ADS; + case 3: + case "PHOTOS": + return ClientLibraryOrganization.PHOTOS; + case 4: + case "STREET_VIEW": + return ClientLibraryOrganization.STREET_VIEW; + case 5: + case "SHOPPING": + return ClientLibraryOrganization.SHOPPING; + case 6: + case "GEO": + return ClientLibraryOrganization.GEO; + case 7: + case "GENERATIVE_AI": + return ClientLibraryOrganization.GENERATIVE_AI; + case -1: + case "UNRECOGNIZED": + default: + return ClientLibraryOrganization.UNRECOGNIZED; + } +} + +export function clientLibraryOrganizationToJSON(object: ClientLibraryOrganization): string { + switch (object) { + case ClientLibraryOrganization.CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED: + return "CLIENT_LIBRARY_ORGANIZATION_UNSPECIFIED"; + case ClientLibraryOrganization.CLOUD: + return "CLOUD"; + case ClientLibraryOrganization.ADS: + return "ADS"; + case ClientLibraryOrganization.PHOTOS: + return "PHOTOS"; + case ClientLibraryOrganization.STREET_VIEW: + return "STREET_VIEW"; + case ClientLibraryOrganization.SHOPPING: + return "SHOPPING"; + case ClientLibraryOrganization.GEO: + return "GEO"; + case ClientLibraryOrganization.GENERATIVE_AI: + return "GENERATIVE_AI"; + case ClientLibraryOrganization.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** To where should client libraries be published? */ +export enum ClientLibraryDestination { + /** + * CLIENT_LIBRARY_DESTINATION_UNSPECIFIED - Client libraries will neither be generated nor published to package + * managers. + */ + CLIENT_LIBRARY_DESTINATION_UNSPECIFIED = 0, + /** + * GITHUB - Generate the client library in a repo under github.com/googleapis, + * but don't publish it to package managers. + */ + GITHUB = 10, + /** PACKAGE_MANAGER - Publish the library to package managers like nuget.org and npmjs.com. */ + PACKAGE_MANAGER = 20, + UNRECOGNIZED = -1, +} + +export function clientLibraryDestinationFromJSON(object: any): ClientLibraryDestination { + switch (object) { + case 0: + case "CLIENT_LIBRARY_DESTINATION_UNSPECIFIED": + return ClientLibraryDestination.CLIENT_LIBRARY_DESTINATION_UNSPECIFIED; + case 10: + case "GITHUB": + return ClientLibraryDestination.GITHUB; + case 20: + case "PACKAGE_MANAGER": + return ClientLibraryDestination.PACKAGE_MANAGER; + case -1: + case "UNRECOGNIZED": + default: + return ClientLibraryDestination.UNRECOGNIZED; + } +} + +export function clientLibraryDestinationToJSON(object: ClientLibraryDestination): string { + switch (object) { + case ClientLibraryDestination.CLIENT_LIBRARY_DESTINATION_UNSPECIFIED: + return "CLIENT_LIBRARY_DESTINATION_UNSPECIFIED"; + case ClientLibraryDestination.GITHUB: + return "GITHUB"; + case ClientLibraryDestination.PACKAGE_MANAGER: + return "PACKAGE_MANAGER"; + case ClientLibraryDestination.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** Required information for every language. */ +export interface CommonLanguageSettings { + /** + * Link to automatically generated reference documentation. Example: + * https://cloud.google.com/nodejs/docs/reference/asset/latest + * + * @deprecated + */ + referenceDocsUri: string; + /** The destination where API teams want this client library to be published. */ + destinations: ClientLibraryDestination[]; + /** Configuration for which RPCs should be generated in the GAPIC client. */ + selectiveGapicGeneration: SelectiveGapicGeneration | undefined; +} + +/** Details about how and where to publish client libraries. */ +export interface ClientLibrarySettings { + /** + * Version of the API to apply these settings to. This is the full protobuf + * package for the API, ending in the version element. + * Examples: "google.cloud.speech.v1" and "google.spanner.admin.database.v1". + */ + version: string; + /** Launch stage of this version of the API. */ + launchStage: LaunchStage; + /** + * When using transport=rest, the client request will encode enums as + * numbers rather than strings. + */ + restNumericEnums: boolean; + /** Settings for legacy Java features, supported in the Service YAML. */ + javaSettings: + | JavaSettings + | undefined; + /** Settings for C++ client libraries. */ + cppSettings: + | CppSettings + | undefined; + /** Settings for PHP client libraries. */ + phpSettings: + | PhpSettings + | undefined; + /** Settings for Python client libraries. */ + pythonSettings: + | PythonSettings + | undefined; + /** Settings for Node client libraries. */ + nodeSettings: + | NodeSettings + | undefined; + /** Settings for .NET client libraries. */ + dotnetSettings: + | DotnetSettings + | undefined; + /** Settings for Ruby client libraries. */ + rubySettings: + | RubySettings + | undefined; + /** Settings for Go client libraries. */ + goSettings: GoSettings | undefined; +} + +/** + * This message configures the settings for publishing [Google Cloud Client + * libraries](https://cloud.google.com/apis/docs/cloud-client-libraries) + * generated from the service config. + */ +export interface Publishing { + /** + * A list of API method settings, e.g. the behavior for methods that use the + * long-running operation pattern. + */ + methodSettings: MethodSettings[]; + /** + * Link to a *public* URI where users can report issues. Example: + * https://issuetracker.google.com/issues/new?component=190865&template=1161103 + */ + newIssueUri: string; + /** + * Link to product home page. Example: + * https://cloud.google.com/asset-inventory/docs/overview + */ + documentationUri: string; + /** + * Used as a tracking tag when collecting data about the APIs developer + * relations artifacts like docs, packages delivered to package managers, + * etc. Example: "speech". + */ + apiShortName: string; + /** GitHub label to apply to issues and pull requests opened for this API. */ + githubLabel: string; + /** + * GitHub teams to be added to CODEOWNERS in the directory in GitHub + * containing source code for the client libraries for this API. + */ + codeownerGithubTeams: string[]; + /** + * A prefix used in sample code when demarking regions to be included in + * documentation. + */ + docTagPrefix: string; + /** For whom the client library is being published. */ + organization: ClientLibraryOrganization; + /** + * Client library settings. If the same version string appears multiple + * times in this list, then the last one wins. Settings from earlier + * settings with the same version string are discarded. + */ + librarySettings: ClientLibrarySettings[]; + /** + * Optional link to proto reference documentation. Example: + * https://cloud.google.com/pubsub/lite/docs/reference/rpc + */ + protoReferenceDocumentationUri: string; + /** + * Optional link to REST reference documentation. Example: + * https://cloud.google.com/pubsub/lite/docs/reference/rest + */ + restReferenceDocumentationUri: string; +} + +/** Settings for Java client libraries. */ +export interface JavaSettings { + /** + * The package name to use in Java. Clobbers the java_package option + * set in the protobuf. This should be used **only** by APIs + * who have already set the language_settings.java.package_name" field + * in gapic.yaml. API teams should use the protobuf java_package option + * where possible. + * + * Example of a YAML configuration:: + * + * publishing: + * java_settings: + * library_package: com.google.cloud.pubsub.v1 + */ + libraryPackage: string; + /** + * Configure the Java class name to use instead of the service's for its + * corresponding generated GAPIC client. Keys are fully-qualified + * service names as they appear in the protobuf (including the full + * the language_settings.java.interface_names" field in gapic.yaml. API + * teams should otherwise use the service name as it appears in the + * protobuf. + * + * Example of a YAML configuration:: + * + * publishing: + * java_settings: + * service_class_names: + * - google.pubsub.v1.Publisher: TopicAdmin + * - google.pubsub.v1.Subscriber: SubscriptionAdmin + */ + serviceClassNames: { [key: string]: string }; + /** Some settings. */ + common: CommonLanguageSettings | undefined; +} + +export interface JavaSettings_ServiceClassNamesEntry { + key: string; + value: string; +} + +/** Settings for C++ client libraries. */ +export interface CppSettings { + /** Some settings. */ + common: CommonLanguageSettings | undefined; +} + +/** Settings for Php client libraries. */ +export interface PhpSettings { + /** Some settings. */ + common: CommonLanguageSettings | undefined; +} + +/** Settings for Python client libraries. */ +export interface PythonSettings { + /** Some settings. */ + common: + | CommonLanguageSettings + | undefined; + /** Experimental features to be included during client library generation. */ + experimentalFeatures: PythonSettings_ExperimentalFeatures | undefined; +} + +/** + * Experimental features to be included during client library generation. + * These fields will be deprecated once the feature graduates and is enabled + * by default. + */ +export interface PythonSettings_ExperimentalFeatures { + /** + * Enables generation of asynchronous REST clients if `rest` transport is + * enabled. By default, asynchronous REST clients will not be generated. + * This feature will be enabled by default 1 month after launching the + * feature in preview packages. + */ + restAsyncIoEnabled: boolean; + /** + * Enables generation of protobuf code using new types that are more + * Pythonic which are included in `protobuf>=5.29.x`. This feature will be + * enabled by default 1 month after launching the feature in preview + * packages. + */ + protobufPythonicTypesEnabled: boolean; + /** + * Disables generation of an unversioned Python package for this client + * library. This means that the module names will need to be versioned in + * import statements. For example `import google.cloud.library_v2` instead + * of `import google.cloud.library`. + */ + unversionedPackageDisabled: boolean; +} + +/** Settings for Node client libraries. */ +export interface NodeSettings { + /** Some settings. */ + common: CommonLanguageSettings | undefined; +} + +/** Settings for Dotnet client libraries. */ +export interface DotnetSettings { + /** Some settings. */ + common: + | CommonLanguageSettings + | undefined; + /** + * Map from original service names to renamed versions. + * This is used when the default generated types + * would cause a naming conflict. (Neither name is + * fully-qualified.) + * Example: Subscriber to SubscriberServiceApi. + */ + renamedServices: { [key: string]: string }; + /** + * Map from full resource types to the effective short name + * for the resource. This is used when otherwise resource + * named from different services would cause naming collisions. + * Example entry: + * "datalabeling.googleapis.com/Dataset": "DataLabelingDataset" + */ + renamedResources: { [key: string]: string }; + /** + * List of full resource types to ignore during generation. + * This is typically used for API-specific Location resources, + * which should be handled by the generator as if they were actually + * the common Location resources. + * Example entry: "documentai.googleapis.com/Location" + */ + ignoredResources: string[]; + /** + * Namespaces which must be aliased in snippets due to + * a known (but non-generator-predictable) naming collision + */ + forcedNamespaceAliases: string[]; + /** + * Method signatures (in the form "service.method(signature)") + * which are provided separately, so shouldn't be generated. + * Snippets *calling* these methods are still generated, however. + */ + handwrittenSignatures: string[]; +} + +export interface DotnetSettings_RenamedServicesEntry { + key: string; + value: string; +} + +export interface DotnetSettings_RenamedResourcesEntry { + key: string; + value: string; +} + +/** Settings for Ruby client libraries. */ +export interface RubySettings { + /** Some settings. */ + common: CommonLanguageSettings | undefined; +} + +/** Settings for Go client libraries. */ +export interface GoSettings { + /** Some settings. */ + common: + | CommonLanguageSettings + | undefined; + /** + * Map of service names to renamed services. Keys are the package relative + * service names and values are the name to be used for the service client + * and call options. + * + * publishing: + * go_settings: + * renamed_services: + * Publisher: TopicAdmin + */ + renamedServices: { [key: string]: string }; +} + +export interface GoSettings_RenamedServicesEntry { + key: string; + value: string; +} + +/** Describes the generator configuration for a method. */ +export interface MethodSettings { + /** + * The fully qualified name of the method, for which the options below apply. + * This is used to find the method to apply the options. + * + * Example: + * + * publishing: + * method_settings: + * - selector: google.storage.control.v2.StorageControl.CreateFolder + * # method settings for CreateFolder... + */ + selector: string; + /** + * Describes settings to use for long-running operations when generating + * API methods for RPCs. Complements RPCs that use the annotations in + * google/longrunning/operations.proto. + * + * Example of a YAML configuration:: + * + * publishing: + * method_settings: + * - selector: google.cloud.speech.v2.Speech.BatchRecognize + * long_running: + * initial_poll_delay: 60s # 1 minute + * poll_delay_multiplier: 1.5 + * max_poll_delay: 360s # 6 minutes + * total_poll_timeout: 54000s # 90 minutes + */ + longRunning: + | MethodSettings_LongRunning + | undefined; + /** + * List of top-level fields of the request message, that should be + * automatically populated by the client libraries based on their + * (google.api.field_info).format. Currently supported format: UUID4. + * + * Example of a YAML configuration: + * + * publishing: + * method_settings: + * - selector: google.example.v1.ExampleService.CreateExample + * auto_populated_fields: + * - request_id + */ + autoPopulatedFields: string[]; +} + +/** + * Describes settings to use when generating API methods that use the + * long-running operation pattern. + * All default values below are from those used in the client library + * generators (e.g. + * [Java](https://github.com/googleapis/gapic-generator-java/blob/04c2faa191a9b5a10b92392fe8482279c4404803/src/main/java/com/google/api/generator/gapic/composer/common/RetrySettingsComposer.java)). + */ +export interface MethodSettings_LongRunning { + /** + * Initial delay after which the first poll request will be made. + * Default value: 5 seconds. + */ + initialPollDelay: + | Duration + | undefined; + /** + * Multiplier to gradually increase delay between subsequent polls until it + * reaches max_poll_delay. + * Default value: 1.5. + */ + pollDelayMultiplier: number; + /** + * Maximum time between two subsequent poll requests. + * Default value: 45 seconds. + */ + maxPollDelay: + | Duration + | undefined; + /** + * Total polling timeout. + * Default value: 5 minutes. + */ + totalPollTimeout: Duration | undefined; +} + +/** + * This message is used to configure the generation of a subset of the RPCs in + * a service for client libraries. + */ +export interface SelectiveGapicGeneration { + /** + * An allowlist of the fully qualified names of RPCs that should be included + * on public client surfaces. + */ + methods: string[]; + /** + * Setting this to true indicates to the client generators that methods + * that would be excluded from the generation should instead be generated + * in a way that indicates these methods should not be consumed by + * end users. How this is expressed is up to individual language + * implementations to decide. Some examples may be: added annotations, + * obfuscated identifiers, or other language idiomatic patterns. + */ + generateOmittedAsInternal: boolean; +} + +function createBaseCommonLanguageSettings(): CommonLanguageSettings { + return { referenceDocsUri: "", destinations: [], selectiveGapicGeneration: undefined }; +} + +export const CommonLanguageSettings: MessageFns = { + encode(message: CommonLanguageSettings, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.referenceDocsUri !== "") { + writer.uint32(10).string(message.referenceDocsUri); + } + writer.uint32(18).fork(); + for (const v of message.destinations) { + writer.int32(v); + } + writer.join(); + if (message.selectiveGapicGeneration !== undefined) { + SelectiveGapicGeneration.encode(message.selectiveGapicGeneration, writer.uint32(26).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): CommonLanguageSettings { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseCommonLanguageSettings(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.referenceDocsUri = reader.string(); + continue; + } + case 2: { + if (tag === 16) { + message.destinations.push(reader.int32() as any); + + continue; + } + + if (tag === 18) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.destinations.push(reader.int32() as any); + } + + continue; + } + + break; + } + case 3: { + if (tag !== 26) { + break; + } + + message.selectiveGapicGeneration = SelectiveGapicGeneration.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): CommonLanguageSettings { + return { + referenceDocsUri: isSet(object.referenceDocsUri) ? globalThis.String(object.referenceDocsUri) : "", + destinations: globalThis.Array.isArray(object?.destinations) + ? object.destinations.map((e: any) => clientLibraryDestinationFromJSON(e)) + : [], + selectiveGapicGeneration: isSet(object.selectiveGapicGeneration) + ? SelectiveGapicGeneration.fromJSON(object.selectiveGapicGeneration) + : undefined, + }; + }, + + toJSON(message: CommonLanguageSettings): unknown { + const obj: any = {}; + if (message.referenceDocsUri !== "") { + obj.referenceDocsUri = message.referenceDocsUri; + } + if (message.destinations?.length) { + obj.destinations = message.destinations.map((e) => clientLibraryDestinationToJSON(e)); + } + if (message.selectiveGapicGeneration !== undefined) { + obj.selectiveGapicGeneration = SelectiveGapicGeneration.toJSON(message.selectiveGapicGeneration); + } + return obj; + }, + + create, I>>(base?: I): CommonLanguageSettings { + return CommonLanguageSettings.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): CommonLanguageSettings { + const message = createBaseCommonLanguageSettings(); + message.referenceDocsUri = object.referenceDocsUri ?? ""; + message.destinations = object.destinations?.map((e) => e) || []; + message.selectiveGapicGeneration = + (object.selectiveGapicGeneration !== undefined && object.selectiveGapicGeneration !== null) + ? SelectiveGapicGeneration.fromPartial(object.selectiveGapicGeneration) + : undefined; + return message; + }, +}; + +function createBaseClientLibrarySettings(): ClientLibrarySettings { + return { + version: "", + launchStage: 0, + restNumericEnums: false, + javaSettings: undefined, + cppSettings: undefined, + phpSettings: undefined, + pythonSettings: undefined, + nodeSettings: undefined, + dotnetSettings: undefined, + rubySettings: undefined, + goSettings: undefined, + }; +} + +export const ClientLibrarySettings: MessageFns = { + encode(message: ClientLibrarySettings, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.version !== "") { + writer.uint32(10).string(message.version); + } + if (message.launchStage !== 0) { + writer.uint32(16).int32(message.launchStage); + } + if (message.restNumericEnums !== false) { + writer.uint32(24).bool(message.restNumericEnums); + } + if (message.javaSettings !== undefined) { + JavaSettings.encode(message.javaSettings, writer.uint32(170).fork()).join(); + } + if (message.cppSettings !== undefined) { + CppSettings.encode(message.cppSettings, writer.uint32(178).fork()).join(); + } + if (message.phpSettings !== undefined) { + PhpSettings.encode(message.phpSettings, writer.uint32(186).fork()).join(); + } + if (message.pythonSettings !== undefined) { + PythonSettings.encode(message.pythonSettings, writer.uint32(194).fork()).join(); + } + if (message.nodeSettings !== undefined) { + NodeSettings.encode(message.nodeSettings, writer.uint32(202).fork()).join(); + } + if (message.dotnetSettings !== undefined) { + DotnetSettings.encode(message.dotnetSettings, writer.uint32(210).fork()).join(); + } + if (message.rubySettings !== undefined) { + RubySettings.encode(message.rubySettings, writer.uint32(218).fork()).join(); + } + if (message.goSettings !== undefined) { + GoSettings.encode(message.goSettings, writer.uint32(226).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ClientLibrarySettings { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseClientLibrarySettings(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.version = reader.string(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.launchStage = reader.int32() as any; + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.restNumericEnums = reader.bool(); + continue; + } + case 21: { + if (tag !== 170) { + break; + } + + message.javaSettings = JavaSettings.decode(reader, reader.uint32()); + continue; + } + case 22: { + if (tag !== 178) { + break; + } + + message.cppSettings = CppSettings.decode(reader, reader.uint32()); + continue; + } + case 23: { + if (tag !== 186) { + break; + } + + message.phpSettings = PhpSettings.decode(reader, reader.uint32()); + continue; + } + case 24: { + if (tag !== 194) { + break; + } + + message.pythonSettings = PythonSettings.decode(reader, reader.uint32()); + continue; + } + case 25: { + if (tag !== 202) { + break; + } + + message.nodeSettings = NodeSettings.decode(reader, reader.uint32()); + continue; + } + case 26: { + if (tag !== 210) { + break; + } + + message.dotnetSettings = DotnetSettings.decode(reader, reader.uint32()); + continue; + } + case 27: { + if (tag !== 218) { + break; + } + + message.rubySettings = RubySettings.decode(reader, reader.uint32()); + continue; + } + case 28: { + if (tag !== 226) { + break; + } + + message.goSettings = GoSettings.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ClientLibrarySettings { + return { + version: isSet(object.version) ? globalThis.String(object.version) : "", + launchStage: isSet(object.launchStage) ? launchStageFromJSON(object.launchStage) : 0, + restNumericEnums: isSet(object.restNumericEnums) ? globalThis.Boolean(object.restNumericEnums) : false, + javaSettings: isSet(object.javaSettings) ? JavaSettings.fromJSON(object.javaSettings) : undefined, + cppSettings: isSet(object.cppSettings) ? CppSettings.fromJSON(object.cppSettings) : undefined, + phpSettings: isSet(object.phpSettings) ? PhpSettings.fromJSON(object.phpSettings) : undefined, + pythonSettings: isSet(object.pythonSettings) ? PythonSettings.fromJSON(object.pythonSettings) : undefined, + nodeSettings: isSet(object.nodeSettings) ? NodeSettings.fromJSON(object.nodeSettings) : undefined, + dotnetSettings: isSet(object.dotnetSettings) ? DotnetSettings.fromJSON(object.dotnetSettings) : undefined, + rubySettings: isSet(object.rubySettings) ? RubySettings.fromJSON(object.rubySettings) : undefined, + goSettings: isSet(object.goSettings) ? GoSettings.fromJSON(object.goSettings) : undefined, + }; + }, + + toJSON(message: ClientLibrarySettings): unknown { + const obj: any = {}; + if (message.version !== "") { + obj.version = message.version; + } + if (message.launchStage !== 0) { + obj.launchStage = launchStageToJSON(message.launchStage); + } + if (message.restNumericEnums !== false) { + obj.restNumericEnums = message.restNumericEnums; + } + if (message.javaSettings !== undefined) { + obj.javaSettings = JavaSettings.toJSON(message.javaSettings); + } + if (message.cppSettings !== undefined) { + obj.cppSettings = CppSettings.toJSON(message.cppSettings); + } + if (message.phpSettings !== undefined) { + obj.phpSettings = PhpSettings.toJSON(message.phpSettings); + } + if (message.pythonSettings !== undefined) { + obj.pythonSettings = PythonSettings.toJSON(message.pythonSettings); + } + if (message.nodeSettings !== undefined) { + obj.nodeSettings = NodeSettings.toJSON(message.nodeSettings); + } + if (message.dotnetSettings !== undefined) { + obj.dotnetSettings = DotnetSettings.toJSON(message.dotnetSettings); + } + if (message.rubySettings !== undefined) { + obj.rubySettings = RubySettings.toJSON(message.rubySettings); + } + if (message.goSettings !== undefined) { + obj.goSettings = GoSettings.toJSON(message.goSettings); + } + return obj; + }, + + create, I>>(base?: I): ClientLibrarySettings { + return ClientLibrarySettings.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ClientLibrarySettings { + const message = createBaseClientLibrarySettings(); + message.version = object.version ?? ""; + message.launchStage = object.launchStage ?? 0; + message.restNumericEnums = object.restNumericEnums ?? false; + message.javaSettings = (object.javaSettings !== undefined && object.javaSettings !== null) + ? JavaSettings.fromPartial(object.javaSettings) + : undefined; + message.cppSettings = (object.cppSettings !== undefined && object.cppSettings !== null) + ? CppSettings.fromPartial(object.cppSettings) + : undefined; + message.phpSettings = (object.phpSettings !== undefined && object.phpSettings !== null) + ? PhpSettings.fromPartial(object.phpSettings) + : undefined; + message.pythonSettings = (object.pythonSettings !== undefined && object.pythonSettings !== null) + ? PythonSettings.fromPartial(object.pythonSettings) + : undefined; + message.nodeSettings = (object.nodeSettings !== undefined && object.nodeSettings !== null) + ? NodeSettings.fromPartial(object.nodeSettings) + : undefined; + message.dotnetSettings = (object.dotnetSettings !== undefined && object.dotnetSettings !== null) + ? DotnetSettings.fromPartial(object.dotnetSettings) + : undefined; + message.rubySettings = (object.rubySettings !== undefined && object.rubySettings !== null) + ? RubySettings.fromPartial(object.rubySettings) + : undefined; + message.goSettings = (object.goSettings !== undefined && object.goSettings !== null) + ? GoSettings.fromPartial(object.goSettings) + : undefined; + return message; + }, +}; + +function createBasePublishing(): Publishing { + return { + methodSettings: [], + newIssueUri: "", + documentationUri: "", + apiShortName: "", + githubLabel: "", + codeownerGithubTeams: [], + docTagPrefix: "", + organization: 0, + librarySettings: [], + protoReferenceDocumentationUri: "", + restReferenceDocumentationUri: "", + }; +} + +export const Publishing: MessageFns = { + encode(message: Publishing, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.methodSettings) { + MethodSettings.encode(v!, writer.uint32(18).fork()).join(); + } + if (message.newIssueUri !== "") { + writer.uint32(810).string(message.newIssueUri); + } + if (message.documentationUri !== "") { + writer.uint32(818).string(message.documentationUri); + } + if (message.apiShortName !== "") { + writer.uint32(826).string(message.apiShortName); + } + if (message.githubLabel !== "") { + writer.uint32(834).string(message.githubLabel); + } + for (const v of message.codeownerGithubTeams) { + writer.uint32(842).string(v!); + } + if (message.docTagPrefix !== "") { + writer.uint32(850).string(message.docTagPrefix); + } + if (message.organization !== 0) { + writer.uint32(856).int32(message.organization); + } + for (const v of message.librarySettings) { + ClientLibrarySettings.encode(v!, writer.uint32(874).fork()).join(); + } + if (message.protoReferenceDocumentationUri !== "") { + writer.uint32(882).string(message.protoReferenceDocumentationUri); + } + if (message.restReferenceDocumentationUri !== "") { + writer.uint32(890).string(message.restReferenceDocumentationUri); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Publishing { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePublishing(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 2: { + if (tag !== 18) { + break; + } + + message.methodSettings.push(MethodSettings.decode(reader, reader.uint32())); + continue; + } + case 101: { + if (tag !== 810) { + break; + } + + message.newIssueUri = reader.string(); + continue; + } + case 102: { + if (tag !== 818) { + break; + } + + message.documentationUri = reader.string(); + continue; + } + case 103: { + if (tag !== 826) { + break; + } + + message.apiShortName = reader.string(); + continue; + } + case 104: { + if (tag !== 834) { + break; + } + + message.githubLabel = reader.string(); + continue; + } + case 105: { + if (tag !== 842) { + break; + } + + message.codeownerGithubTeams.push(reader.string()); + continue; + } + case 106: { + if (tag !== 850) { + break; + } + + message.docTagPrefix = reader.string(); + continue; + } + case 107: { + if (tag !== 856) { + break; + } + + message.organization = reader.int32() as any; + continue; + } + case 109: { + if (tag !== 874) { + break; + } + + message.librarySettings.push(ClientLibrarySettings.decode(reader, reader.uint32())); + continue; + } + case 110: { + if (tag !== 882) { + break; + } + + message.protoReferenceDocumentationUri = reader.string(); + continue; + } + case 111: { + if (tag !== 890) { + break; + } + + message.restReferenceDocumentationUri = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Publishing { + return { + methodSettings: globalThis.Array.isArray(object?.methodSettings) + ? object.methodSettings.map((e: any) => MethodSettings.fromJSON(e)) + : [], + newIssueUri: isSet(object.newIssueUri) ? globalThis.String(object.newIssueUri) : "", + documentationUri: isSet(object.documentationUri) ? globalThis.String(object.documentationUri) : "", + apiShortName: isSet(object.apiShortName) ? globalThis.String(object.apiShortName) : "", + githubLabel: isSet(object.githubLabel) ? globalThis.String(object.githubLabel) : "", + codeownerGithubTeams: globalThis.Array.isArray(object?.codeownerGithubTeams) + ? object.codeownerGithubTeams.map((e: any) => globalThis.String(e)) + : [], + docTagPrefix: isSet(object.docTagPrefix) ? globalThis.String(object.docTagPrefix) : "", + organization: isSet(object.organization) ? clientLibraryOrganizationFromJSON(object.organization) : 0, + librarySettings: globalThis.Array.isArray(object?.librarySettings) + ? object.librarySettings.map((e: any) => ClientLibrarySettings.fromJSON(e)) + : [], + protoReferenceDocumentationUri: isSet(object.protoReferenceDocumentationUri) + ? globalThis.String(object.protoReferenceDocumentationUri) + : "", + restReferenceDocumentationUri: isSet(object.restReferenceDocumentationUri) + ? globalThis.String(object.restReferenceDocumentationUri) + : "", + }; + }, + + toJSON(message: Publishing): unknown { + const obj: any = {}; + if (message.methodSettings?.length) { + obj.methodSettings = message.methodSettings.map((e) => MethodSettings.toJSON(e)); + } + if (message.newIssueUri !== "") { + obj.newIssueUri = message.newIssueUri; + } + if (message.documentationUri !== "") { + obj.documentationUri = message.documentationUri; + } + if (message.apiShortName !== "") { + obj.apiShortName = message.apiShortName; + } + if (message.githubLabel !== "") { + obj.githubLabel = message.githubLabel; + } + if (message.codeownerGithubTeams?.length) { + obj.codeownerGithubTeams = message.codeownerGithubTeams; + } + if (message.docTagPrefix !== "") { + obj.docTagPrefix = message.docTagPrefix; + } + if (message.organization !== 0) { + obj.organization = clientLibraryOrganizationToJSON(message.organization); + } + if (message.librarySettings?.length) { + obj.librarySettings = message.librarySettings.map((e) => ClientLibrarySettings.toJSON(e)); + } + if (message.protoReferenceDocumentationUri !== "") { + obj.protoReferenceDocumentationUri = message.protoReferenceDocumentationUri; + } + if (message.restReferenceDocumentationUri !== "") { + obj.restReferenceDocumentationUri = message.restReferenceDocumentationUri; + } + return obj; + }, + + create, I>>(base?: I): Publishing { + return Publishing.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Publishing { + const message = createBasePublishing(); + message.methodSettings = object.methodSettings?.map((e) => MethodSettings.fromPartial(e)) || []; + message.newIssueUri = object.newIssueUri ?? ""; + message.documentationUri = object.documentationUri ?? ""; + message.apiShortName = object.apiShortName ?? ""; + message.githubLabel = object.githubLabel ?? ""; + message.codeownerGithubTeams = object.codeownerGithubTeams?.map((e) => e) || []; + message.docTagPrefix = object.docTagPrefix ?? ""; + message.organization = object.organization ?? 0; + message.librarySettings = object.librarySettings?.map((e) => ClientLibrarySettings.fromPartial(e)) || []; + message.protoReferenceDocumentationUri = object.protoReferenceDocumentationUri ?? ""; + message.restReferenceDocumentationUri = object.restReferenceDocumentationUri ?? ""; + return message; + }, +}; + +function createBaseJavaSettings(): JavaSettings { + return { libraryPackage: "", serviceClassNames: {}, common: undefined }; +} + +export const JavaSettings: MessageFns = { + encode(message: JavaSettings, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.libraryPackage !== "") { + writer.uint32(10).string(message.libraryPackage); + } + Object.entries(message.serviceClassNames).forEach(([key, value]) => { + JavaSettings_ServiceClassNamesEntry.encode({ key: key as any, value }, writer.uint32(18).fork()).join(); + }); + if (message.common !== undefined) { + CommonLanguageSettings.encode(message.common, writer.uint32(26).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): JavaSettings { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseJavaSettings(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.libraryPackage = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + const entry2 = JavaSettings_ServiceClassNamesEntry.decode(reader, reader.uint32()); + if (entry2.value !== undefined) { + message.serviceClassNames[entry2.key] = entry2.value; + } + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.common = CommonLanguageSettings.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): JavaSettings { + return { + libraryPackage: isSet(object.libraryPackage) ? globalThis.String(object.libraryPackage) : "", + serviceClassNames: isObject(object.serviceClassNames) + ? Object.entries(object.serviceClassNames).reduce<{ [key: string]: string }>((acc, [key, value]) => { + acc[key] = String(value); + return acc; + }, {}) + : {}, + common: isSet(object.common) ? CommonLanguageSettings.fromJSON(object.common) : undefined, + }; + }, + + toJSON(message: JavaSettings): unknown { + const obj: any = {}; + if (message.libraryPackage !== "") { + obj.libraryPackage = message.libraryPackage; + } + if (message.serviceClassNames) { + const entries = Object.entries(message.serviceClassNames); + if (entries.length > 0) { + obj.serviceClassNames = {}; + entries.forEach(([k, v]) => { + obj.serviceClassNames[k] = v; + }); + } + } + if (message.common !== undefined) { + obj.common = CommonLanguageSettings.toJSON(message.common); + } + return obj; + }, + + create, I>>(base?: I): JavaSettings { + return JavaSettings.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): JavaSettings { + const message = createBaseJavaSettings(); + message.libraryPackage = object.libraryPackage ?? ""; + message.serviceClassNames = Object.entries(object.serviceClassNames ?? {}).reduce<{ [key: string]: string }>( + (acc, [key, value]) => { + if (value !== undefined) { + acc[key] = globalThis.String(value); + } + return acc; + }, + {}, + ); + message.common = (object.common !== undefined && object.common !== null) + ? CommonLanguageSettings.fromPartial(object.common) + : undefined; + return message; + }, +}; + +function createBaseJavaSettings_ServiceClassNamesEntry(): JavaSettings_ServiceClassNamesEntry { + return { key: "", value: "" }; +} + +export const JavaSettings_ServiceClassNamesEntry: MessageFns = { + encode(message: JavaSettings_ServiceClassNamesEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== "") { + writer.uint32(18).string(message.value); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): JavaSettings_ServiceClassNamesEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseJavaSettings_ServiceClassNamesEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): JavaSettings_ServiceClassNamesEntry { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object.value) ? globalThis.String(object.value) : "", + }; + }, + + toJSON(message: JavaSettings_ServiceClassNamesEntry): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== "") { + obj.value = message.value; + } + return obj; + }, + + create, I>>( + base?: I, + ): JavaSettings_ServiceClassNamesEntry { + return JavaSettings_ServiceClassNamesEntry.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): JavaSettings_ServiceClassNamesEntry { + const message = createBaseJavaSettings_ServiceClassNamesEntry(); + message.key = object.key ?? ""; + message.value = object.value ?? ""; + return message; + }, +}; + +function createBaseCppSettings(): CppSettings { + return { common: undefined }; +} + +export const CppSettings: MessageFns = { + encode(message: CppSettings, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.common !== undefined) { + CommonLanguageSettings.encode(message.common, writer.uint32(10).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): CppSettings { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseCppSettings(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.common = CommonLanguageSettings.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): CppSettings { + return { common: isSet(object.common) ? CommonLanguageSettings.fromJSON(object.common) : undefined }; + }, + + toJSON(message: CppSettings): unknown { + const obj: any = {}; + if (message.common !== undefined) { + obj.common = CommonLanguageSettings.toJSON(message.common); + } + return obj; + }, + + create, I>>(base?: I): CppSettings { + return CppSettings.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): CppSettings { + const message = createBaseCppSettings(); + message.common = (object.common !== undefined && object.common !== null) + ? CommonLanguageSettings.fromPartial(object.common) + : undefined; + return message; + }, +}; + +function createBasePhpSettings(): PhpSettings { + return { common: undefined }; +} + +export const PhpSettings: MessageFns = { + encode(message: PhpSettings, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.common !== undefined) { + CommonLanguageSettings.encode(message.common, writer.uint32(10).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): PhpSettings { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePhpSettings(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.common = CommonLanguageSettings.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): PhpSettings { + return { common: isSet(object.common) ? CommonLanguageSettings.fromJSON(object.common) : undefined }; + }, + + toJSON(message: PhpSettings): unknown { + const obj: any = {}; + if (message.common !== undefined) { + obj.common = CommonLanguageSettings.toJSON(message.common); + } + return obj; + }, + + create, I>>(base?: I): PhpSettings { + return PhpSettings.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): PhpSettings { + const message = createBasePhpSettings(); + message.common = (object.common !== undefined && object.common !== null) + ? CommonLanguageSettings.fromPartial(object.common) + : undefined; + return message; + }, +}; + +function createBasePythonSettings(): PythonSettings { + return { common: undefined, experimentalFeatures: undefined }; +} + +export const PythonSettings: MessageFns = { + encode(message: PythonSettings, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.common !== undefined) { + CommonLanguageSettings.encode(message.common, writer.uint32(10).fork()).join(); + } + if (message.experimentalFeatures !== undefined) { + PythonSettings_ExperimentalFeatures.encode(message.experimentalFeatures, writer.uint32(18).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): PythonSettings { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePythonSettings(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.common = CommonLanguageSettings.decode(reader, reader.uint32()); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.experimentalFeatures = PythonSettings_ExperimentalFeatures.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): PythonSettings { + return { + common: isSet(object.common) ? CommonLanguageSettings.fromJSON(object.common) : undefined, + experimentalFeatures: isSet(object.experimentalFeatures) + ? PythonSettings_ExperimentalFeatures.fromJSON(object.experimentalFeatures) + : undefined, + }; + }, + + toJSON(message: PythonSettings): unknown { + const obj: any = {}; + if (message.common !== undefined) { + obj.common = CommonLanguageSettings.toJSON(message.common); + } + if (message.experimentalFeatures !== undefined) { + obj.experimentalFeatures = PythonSettings_ExperimentalFeatures.toJSON(message.experimentalFeatures); + } + return obj; + }, + + create, I>>(base?: I): PythonSettings { + return PythonSettings.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): PythonSettings { + const message = createBasePythonSettings(); + message.common = (object.common !== undefined && object.common !== null) + ? CommonLanguageSettings.fromPartial(object.common) + : undefined; + message.experimentalFeatures = (object.experimentalFeatures !== undefined && object.experimentalFeatures !== null) + ? PythonSettings_ExperimentalFeatures.fromPartial(object.experimentalFeatures) + : undefined; + return message; + }, +}; + +function createBasePythonSettings_ExperimentalFeatures(): PythonSettings_ExperimentalFeatures { + return { restAsyncIoEnabled: false, protobufPythonicTypesEnabled: false, unversionedPackageDisabled: false }; +} + +export const PythonSettings_ExperimentalFeatures: MessageFns = { + encode(message: PythonSettings_ExperimentalFeatures, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.restAsyncIoEnabled !== false) { + writer.uint32(8).bool(message.restAsyncIoEnabled); + } + if (message.protobufPythonicTypesEnabled !== false) { + writer.uint32(16).bool(message.protobufPythonicTypesEnabled); + } + if (message.unversionedPackageDisabled !== false) { + writer.uint32(24).bool(message.unversionedPackageDisabled); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): PythonSettings_ExperimentalFeatures { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBasePythonSettings_ExperimentalFeatures(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.restAsyncIoEnabled = reader.bool(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.protobufPythonicTypesEnabled = reader.bool(); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.unversionedPackageDisabled = reader.bool(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): PythonSettings_ExperimentalFeatures { + return { + restAsyncIoEnabled: isSet(object.restAsyncIoEnabled) ? globalThis.Boolean(object.restAsyncIoEnabled) : false, + protobufPythonicTypesEnabled: isSet(object.protobufPythonicTypesEnabled) + ? globalThis.Boolean(object.protobufPythonicTypesEnabled) + : false, + unversionedPackageDisabled: isSet(object.unversionedPackageDisabled) + ? globalThis.Boolean(object.unversionedPackageDisabled) + : false, + }; + }, + + toJSON(message: PythonSettings_ExperimentalFeatures): unknown { + const obj: any = {}; + if (message.restAsyncIoEnabled !== false) { + obj.restAsyncIoEnabled = message.restAsyncIoEnabled; + } + if (message.protobufPythonicTypesEnabled !== false) { + obj.protobufPythonicTypesEnabled = message.protobufPythonicTypesEnabled; + } + if (message.unversionedPackageDisabled !== false) { + obj.unversionedPackageDisabled = message.unversionedPackageDisabled; + } + return obj; + }, + + create, I>>( + base?: I, + ): PythonSettings_ExperimentalFeatures { + return PythonSettings_ExperimentalFeatures.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): PythonSettings_ExperimentalFeatures { + const message = createBasePythonSettings_ExperimentalFeatures(); + message.restAsyncIoEnabled = object.restAsyncIoEnabled ?? false; + message.protobufPythonicTypesEnabled = object.protobufPythonicTypesEnabled ?? false; + message.unversionedPackageDisabled = object.unversionedPackageDisabled ?? false; + return message; + }, +}; + +function createBaseNodeSettings(): NodeSettings { + return { common: undefined }; +} + +export const NodeSettings: MessageFns = { + encode(message: NodeSettings, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.common !== undefined) { + CommonLanguageSettings.encode(message.common, writer.uint32(10).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): NodeSettings { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseNodeSettings(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.common = CommonLanguageSettings.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): NodeSettings { + return { common: isSet(object.common) ? CommonLanguageSettings.fromJSON(object.common) : undefined }; + }, + + toJSON(message: NodeSettings): unknown { + const obj: any = {}; + if (message.common !== undefined) { + obj.common = CommonLanguageSettings.toJSON(message.common); + } + return obj; + }, + + create, I>>(base?: I): NodeSettings { + return NodeSettings.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): NodeSettings { + const message = createBaseNodeSettings(); + message.common = (object.common !== undefined && object.common !== null) + ? CommonLanguageSettings.fromPartial(object.common) + : undefined; + return message; + }, +}; + +function createBaseDotnetSettings(): DotnetSettings { + return { + common: undefined, + renamedServices: {}, + renamedResources: {}, + ignoredResources: [], + forcedNamespaceAliases: [], + handwrittenSignatures: [], + }; +} + +export const DotnetSettings: MessageFns = { + encode(message: DotnetSettings, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.common !== undefined) { + CommonLanguageSettings.encode(message.common, writer.uint32(10).fork()).join(); + } + Object.entries(message.renamedServices).forEach(([key, value]) => { + DotnetSettings_RenamedServicesEntry.encode({ key: key as any, value }, writer.uint32(18).fork()).join(); + }); + Object.entries(message.renamedResources).forEach(([key, value]) => { + DotnetSettings_RenamedResourcesEntry.encode({ key: key as any, value }, writer.uint32(26).fork()).join(); + }); + for (const v of message.ignoredResources) { + writer.uint32(34).string(v!); + } + for (const v of message.forcedNamespaceAliases) { + writer.uint32(42).string(v!); + } + for (const v of message.handwrittenSignatures) { + writer.uint32(50).string(v!); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): DotnetSettings { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDotnetSettings(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.common = CommonLanguageSettings.decode(reader, reader.uint32()); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + const entry2 = DotnetSettings_RenamedServicesEntry.decode(reader, reader.uint32()); + if (entry2.value !== undefined) { + message.renamedServices[entry2.key] = entry2.value; + } + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + const entry3 = DotnetSettings_RenamedResourcesEntry.decode(reader, reader.uint32()); + if (entry3.value !== undefined) { + message.renamedResources[entry3.key] = entry3.value; + } + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.ignoredResources.push(reader.string()); + continue; + } + case 5: { + if (tag !== 42) { + break; + } + + message.forcedNamespaceAliases.push(reader.string()); + continue; + } + case 6: { + if (tag !== 50) { + break; + } + + message.handwrittenSignatures.push(reader.string()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): DotnetSettings { + return { + common: isSet(object.common) ? CommonLanguageSettings.fromJSON(object.common) : undefined, + renamedServices: isObject(object.renamedServices) + ? Object.entries(object.renamedServices).reduce<{ [key: string]: string }>((acc, [key, value]) => { + acc[key] = String(value); + return acc; + }, {}) + : {}, + renamedResources: isObject(object.renamedResources) + ? Object.entries(object.renamedResources).reduce<{ [key: string]: string }>((acc, [key, value]) => { + acc[key] = String(value); + return acc; + }, {}) + : {}, + ignoredResources: globalThis.Array.isArray(object?.ignoredResources) + ? object.ignoredResources.map((e: any) => globalThis.String(e)) + : [], + forcedNamespaceAliases: globalThis.Array.isArray(object?.forcedNamespaceAliases) + ? object.forcedNamespaceAliases.map((e: any) => globalThis.String(e)) + : [], + handwrittenSignatures: globalThis.Array.isArray(object?.handwrittenSignatures) + ? object.handwrittenSignatures.map((e: any) => globalThis.String(e)) + : [], + }; + }, + + toJSON(message: DotnetSettings): unknown { + const obj: any = {}; + if (message.common !== undefined) { + obj.common = CommonLanguageSettings.toJSON(message.common); + } + if (message.renamedServices) { + const entries = Object.entries(message.renamedServices); + if (entries.length > 0) { + obj.renamedServices = {}; + entries.forEach(([k, v]) => { + obj.renamedServices[k] = v; + }); + } + } + if (message.renamedResources) { + const entries = Object.entries(message.renamedResources); + if (entries.length > 0) { + obj.renamedResources = {}; + entries.forEach(([k, v]) => { + obj.renamedResources[k] = v; + }); + } + } + if (message.ignoredResources?.length) { + obj.ignoredResources = message.ignoredResources; + } + if (message.forcedNamespaceAliases?.length) { + obj.forcedNamespaceAliases = message.forcedNamespaceAliases; + } + if (message.handwrittenSignatures?.length) { + obj.handwrittenSignatures = message.handwrittenSignatures; + } + return obj; + }, + + create, I>>(base?: I): DotnetSettings { + return DotnetSettings.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): DotnetSettings { + const message = createBaseDotnetSettings(); + message.common = (object.common !== undefined && object.common !== null) + ? CommonLanguageSettings.fromPartial(object.common) + : undefined; + message.renamedServices = Object.entries(object.renamedServices ?? {}).reduce<{ [key: string]: string }>( + (acc, [key, value]) => { + if (value !== undefined) { + acc[key] = globalThis.String(value); + } + return acc; + }, + {}, + ); + message.renamedResources = Object.entries(object.renamedResources ?? {}).reduce<{ [key: string]: string }>( + (acc, [key, value]) => { + if (value !== undefined) { + acc[key] = globalThis.String(value); + } + return acc; + }, + {}, + ); + message.ignoredResources = object.ignoredResources?.map((e) => e) || []; + message.forcedNamespaceAliases = object.forcedNamespaceAliases?.map((e) => e) || []; + message.handwrittenSignatures = object.handwrittenSignatures?.map((e) => e) || []; + return message; + }, +}; + +function createBaseDotnetSettings_RenamedServicesEntry(): DotnetSettings_RenamedServicesEntry { + return { key: "", value: "" }; +} + +export const DotnetSettings_RenamedServicesEntry: MessageFns = { + encode(message: DotnetSettings_RenamedServicesEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== "") { + writer.uint32(18).string(message.value); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): DotnetSettings_RenamedServicesEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDotnetSettings_RenamedServicesEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): DotnetSettings_RenamedServicesEntry { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object.value) ? globalThis.String(object.value) : "", + }; + }, + + toJSON(message: DotnetSettings_RenamedServicesEntry): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== "") { + obj.value = message.value; + } + return obj; + }, + + create, I>>( + base?: I, + ): DotnetSettings_RenamedServicesEntry { + return DotnetSettings_RenamedServicesEntry.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): DotnetSettings_RenamedServicesEntry { + const message = createBaseDotnetSettings_RenamedServicesEntry(); + message.key = object.key ?? ""; + message.value = object.value ?? ""; + return message; + }, +}; + +function createBaseDotnetSettings_RenamedResourcesEntry(): DotnetSettings_RenamedResourcesEntry { + return { key: "", value: "" }; +} + +export const DotnetSettings_RenamedResourcesEntry: MessageFns = { + encode(message: DotnetSettings_RenamedResourcesEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== "") { + writer.uint32(18).string(message.value); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): DotnetSettings_RenamedResourcesEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDotnetSettings_RenamedResourcesEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): DotnetSettings_RenamedResourcesEntry { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object.value) ? globalThis.String(object.value) : "", + }; + }, + + toJSON(message: DotnetSettings_RenamedResourcesEntry): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== "") { + obj.value = message.value; + } + return obj; + }, + + create, I>>( + base?: I, + ): DotnetSettings_RenamedResourcesEntry { + return DotnetSettings_RenamedResourcesEntry.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): DotnetSettings_RenamedResourcesEntry { + const message = createBaseDotnetSettings_RenamedResourcesEntry(); + message.key = object.key ?? ""; + message.value = object.value ?? ""; + return message; + }, +}; + +function createBaseRubySettings(): RubySettings { + return { common: undefined }; +} + +export const RubySettings: MessageFns = { + encode(message: RubySettings, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.common !== undefined) { + CommonLanguageSettings.encode(message.common, writer.uint32(10).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): RubySettings { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseRubySettings(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.common = CommonLanguageSettings.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): RubySettings { + return { common: isSet(object.common) ? CommonLanguageSettings.fromJSON(object.common) : undefined }; + }, + + toJSON(message: RubySettings): unknown { + const obj: any = {}; + if (message.common !== undefined) { + obj.common = CommonLanguageSettings.toJSON(message.common); + } + return obj; + }, + + create, I>>(base?: I): RubySettings { + return RubySettings.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): RubySettings { + const message = createBaseRubySettings(); + message.common = (object.common !== undefined && object.common !== null) + ? CommonLanguageSettings.fromPartial(object.common) + : undefined; + return message; + }, +}; + +function createBaseGoSettings(): GoSettings { + return { common: undefined, renamedServices: {} }; +} + +export const GoSettings: MessageFns = { + encode(message: GoSettings, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.common !== undefined) { + CommonLanguageSettings.encode(message.common, writer.uint32(10).fork()).join(); + } + Object.entries(message.renamedServices).forEach(([key, value]) => { + GoSettings_RenamedServicesEntry.encode({ key: key as any, value }, writer.uint32(18).fork()).join(); + }); + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): GoSettings { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGoSettings(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.common = CommonLanguageSettings.decode(reader, reader.uint32()); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + const entry2 = GoSettings_RenamedServicesEntry.decode(reader, reader.uint32()); + if (entry2.value !== undefined) { + message.renamedServices[entry2.key] = entry2.value; + } + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): GoSettings { + return { + common: isSet(object.common) ? CommonLanguageSettings.fromJSON(object.common) : undefined, + renamedServices: isObject(object.renamedServices) + ? Object.entries(object.renamedServices).reduce<{ [key: string]: string }>((acc, [key, value]) => { + acc[key] = String(value); + return acc; + }, {}) + : {}, + }; + }, + + toJSON(message: GoSettings): unknown { + const obj: any = {}; + if (message.common !== undefined) { + obj.common = CommonLanguageSettings.toJSON(message.common); + } + if (message.renamedServices) { + const entries = Object.entries(message.renamedServices); + if (entries.length > 0) { + obj.renamedServices = {}; + entries.forEach(([k, v]) => { + obj.renamedServices[k] = v; + }); + } + } + return obj; + }, + + create, I>>(base?: I): GoSettings { + return GoSettings.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): GoSettings { + const message = createBaseGoSettings(); + message.common = (object.common !== undefined && object.common !== null) + ? CommonLanguageSettings.fromPartial(object.common) + : undefined; + message.renamedServices = Object.entries(object.renamedServices ?? {}).reduce<{ [key: string]: string }>( + (acc, [key, value]) => { + if (value !== undefined) { + acc[key] = globalThis.String(value); + } + return acc; + }, + {}, + ); + return message; + }, +}; + +function createBaseGoSettings_RenamedServicesEntry(): GoSettings_RenamedServicesEntry { + return { key: "", value: "" }; +} + +export const GoSettings_RenamedServicesEntry: MessageFns = { + encode(message: GoSettings_RenamedServicesEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== "") { + writer.uint32(18).string(message.value); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): GoSettings_RenamedServicesEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGoSettings_RenamedServicesEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): GoSettings_RenamedServicesEntry { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object.value) ? globalThis.String(object.value) : "", + }; + }, + + toJSON(message: GoSettings_RenamedServicesEntry): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== "") { + obj.value = message.value; + } + return obj; + }, + + create, I>>(base?: I): GoSettings_RenamedServicesEntry { + return GoSettings_RenamedServicesEntry.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): GoSettings_RenamedServicesEntry { + const message = createBaseGoSettings_RenamedServicesEntry(); + message.key = object.key ?? ""; + message.value = object.value ?? ""; + return message; + }, +}; + +function createBaseMethodSettings(): MethodSettings { + return { selector: "", longRunning: undefined, autoPopulatedFields: [] }; +} + +export const MethodSettings: MessageFns = { + encode(message: MethodSettings, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.selector !== "") { + writer.uint32(10).string(message.selector); + } + if (message.longRunning !== undefined) { + MethodSettings_LongRunning.encode(message.longRunning, writer.uint32(18).fork()).join(); + } + for (const v of message.autoPopulatedFields) { + writer.uint32(26).string(v!); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): MethodSettings { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMethodSettings(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.selector = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.longRunning = MethodSettings_LongRunning.decode(reader, reader.uint32()); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.autoPopulatedFields.push(reader.string()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): MethodSettings { + return { + selector: isSet(object.selector) ? globalThis.String(object.selector) : "", + longRunning: isSet(object.longRunning) ? MethodSettings_LongRunning.fromJSON(object.longRunning) : undefined, + autoPopulatedFields: globalThis.Array.isArray(object?.autoPopulatedFields) + ? object.autoPopulatedFields.map((e: any) => globalThis.String(e)) + : [], + }; + }, + + toJSON(message: MethodSettings): unknown { + const obj: any = {}; + if (message.selector !== "") { + obj.selector = message.selector; + } + if (message.longRunning !== undefined) { + obj.longRunning = MethodSettings_LongRunning.toJSON(message.longRunning); + } + if (message.autoPopulatedFields?.length) { + obj.autoPopulatedFields = message.autoPopulatedFields; + } + return obj; + }, + + create, I>>(base?: I): MethodSettings { + return MethodSettings.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): MethodSettings { + const message = createBaseMethodSettings(); + message.selector = object.selector ?? ""; + message.longRunning = (object.longRunning !== undefined && object.longRunning !== null) + ? MethodSettings_LongRunning.fromPartial(object.longRunning) + : undefined; + message.autoPopulatedFields = object.autoPopulatedFields?.map((e) => e) || []; + return message; + }, +}; + +function createBaseMethodSettings_LongRunning(): MethodSettings_LongRunning { + return { initialPollDelay: undefined, pollDelayMultiplier: 0, maxPollDelay: undefined, totalPollTimeout: undefined }; +} + +export const MethodSettings_LongRunning: MessageFns = { + encode(message: MethodSettings_LongRunning, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.initialPollDelay !== undefined) { + Duration.encode(message.initialPollDelay, writer.uint32(10).fork()).join(); + } + if (message.pollDelayMultiplier !== 0) { + writer.uint32(21).float(message.pollDelayMultiplier); + } + if (message.maxPollDelay !== undefined) { + Duration.encode(message.maxPollDelay, writer.uint32(26).fork()).join(); + } + if (message.totalPollTimeout !== undefined) { + Duration.encode(message.totalPollTimeout, writer.uint32(34).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): MethodSettings_LongRunning { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMethodSettings_LongRunning(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.initialPollDelay = Duration.decode(reader, reader.uint32()); + continue; + } + case 2: { + if (tag !== 21) { + break; + } + + message.pollDelayMultiplier = reader.float(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.maxPollDelay = Duration.decode(reader, reader.uint32()); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.totalPollTimeout = Duration.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): MethodSettings_LongRunning { + return { + initialPollDelay: isSet(object.initialPollDelay) ? Duration.fromJSON(object.initialPollDelay) : undefined, + pollDelayMultiplier: isSet(object.pollDelayMultiplier) ? globalThis.Number(object.pollDelayMultiplier) : 0, + maxPollDelay: isSet(object.maxPollDelay) ? Duration.fromJSON(object.maxPollDelay) : undefined, + totalPollTimeout: isSet(object.totalPollTimeout) ? Duration.fromJSON(object.totalPollTimeout) : undefined, + }; + }, + + toJSON(message: MethodSettings_LongRunning): unknown { + const obj: any = {}; + if (message.initialPollDelay !== undefined) { + obj.initialPollDelay = Duration.toJSON(message.initialPollDelay); + } + if (message.pollDelayMultiplier !== 0) { + obj.pollDelayMultiplier = message.pollDelayMultiplier; + } + if (message.maxPollDelay !== undefined) { + obj.maxPollDelay = Duration.toJSON(message.maxPollDelay); + } + if (message.totalPollTimeout !== undefined) { + obj.totalPollTimeout = Duration.toJSON(message.totalPollTimeout); + } + return obj; + }, + + create, I>>(base?: I): MethodSettings_LongRunning { + return MethodSettings_LongRunning.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): MethodSettings_LongRunning { + const message = createBaseMethodSettings_LongRunning(); + message.initialPollDelay = (object.initialPollDelay !== undefined && object.initialPollDelay !== null) + ? Duration.fromPartial(object.initialPollDelay) + : undefined; + message.pollDelayMultiplier = object.pollDelayMultiplier ?? 0; + message.maxPollDelay = (object.maxPollDelay !== undefined && object.maxPollDelay !== null) + ? Duration.fromPartial(object.maxPollDelay) + : undefined; + message.totalPollTimeout = (object.totalPollTimeout !== undefined && object.totalPollTimeout !== null) + ? Duration.fromPartial(object.totalPollTimeout) + : undefined; + return message; + }, +}; + +function createBaseSelectiveGapicGeneration(): SelectiveGapicGeneration { + return { methods: [], generateOmittedAsInternal: false }; +} + +export const SelectiveGapicGeneration: MessageFns = { + encode(message: SelectiveGapicGeneration, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.methods) { + writer.uint32(10).string(v!); + } + if (message.generateOmittedAsInternal !== false) { + writer.uint32(16).bool(message.generateOmittedAsInternal); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): SelectiveGapicGeneration { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSelectiveGapicGeneration(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.methods.push(reader.string()); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.generateOmittedAsInternal = reader.bool(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): SelectiveGapicGeneration { + return { + methods: globalThis.Array.isArray(object?.methods) ? object.methods.map((e: any) => globalThis.String(e)) : [], + generateOmittedAsInternal: isSet(object.generateOmittedAsInternal) + ? globalThis.Boolean(object.generateOmittedAsInternal) + : false, + }; + }, + + toJSON(message: SelectiveGapicGeneration): unknown { + const obj: any = {}; + if (message.methods?.length) { + obj.methods = message.methods; + } + if (message.generateOmittedAsInternal !== false) { + obj.generateOmittedAsInternal = message.generateOmittedAsInternal; + } + return obj; + }, + + create, I>>(base?: I): SelectiveGapicGeneration { + return SelectiveGapicGeneration.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): SelectiveGapicGeneration { + const message = createBaseSelectiveGapicGeneration(); + message.methods = object.methods?.map((e) => e) || []; + message.generateOmittedAsInternal = object.generateOmittedAsInternal ?? false; + return message; + }, +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends { $case: string; value: unknown } ? { $case: T["$case"]; value?: DeepPartial } + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function isObject(value: any): boolean { + return typeof value === "object" && value !== null; +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} diff --git a/src/grpc/google/api/field_behavior.ts b/src/grpc/google/api/field_behavior.ts new file mode 100644 index 00000000..a3af577a --- /dev/null +++ b/src/grpc/google/api/field_behavior.ts @@ -0,0 +1,145 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.8.3 +// protoc v3.21.12 +// source: google/api/field_behavior.proto + +/* eslint-disable */ + +export const protobufPackage = "google.api"; + +/** + * An indicator of the behavior of a given field (for example, that a field + * is required in requests, or given as output but ignored as input). + * This **does not** change the behavior in protocol buffers itself; it only + * denotes the behavior and may affect how API tooling handles the field. + * + * Note: This enum **may** receive new values in the future. + */ +export enum FieldBehavior { + /** FIELD_BEHAVIOR_UNSPECIFIED - Conventional default for enums. Do not use this. */ + FIELD_BEHAVIOR_UNSPECIFIED = 0, + /** + * OPTIONAL - Specifically denotes a field as optional. + * While all fields in protocol buffers are optional, this may be specified + * for emphasis if appropriate. + */ + OPTIONAL = 1, + /** + * REQUIRED - Denotes a field as required. + * This indicates that the field **must** be provided as part of the request, + * and failure to do so will cause an error (usually `INVALID_ARGUMENT`). + */ + REQUIRED = 2, + /** + * OUTPUT_ONLY - Denotes a field as output only. + * This indicates that the field is provided in responses, but including the + * field in a request does nothing (the server *must* ignore it and + * *must not* throw an error as a result of the field's presence). + */ + OUTPUT_ONLY = 3, + /** + * INPUT_ONLY - Denotes a field as input only. + * This indicates that the field is provided in requests, and the + * corresponding field is not included in output. + */ + INPUT_ONLY = 4, + /** + * IMMUTABLE - Denotes a field as immutable. + * This indicates that the field may be set once in a request to create a + * resource, but may not be changed thereafter. + */ + IMMUTABLE = 5, + /** + * UNORDERED_LIST - Denotes that a (repeated) field is an unordered list. + * This indicates that the service may provide the elements of the list + * in any arbitrary order, rather than the order the user originally + * provided. Additionally, the list's order may or may not be stable. + */ + UNORDERED_LIST = 6, + /** + * NON_EMPTY_DEFAULT - Denotes that this field returns a non-empty default value if not set. + * This indicates that if the user provides the empty value in a request, + * a non-empty value will be returned. The user will not be aware of what + * non-empty value to expect. + */ + NON_EMPTY_DEFAULT = 7, + /** + * IDENTIFIER - Denotes that the field in a resource (a message annotated with + * google.api.resource) is used in the resource name to uniquely identify the + * resource. For AIP-compliant APIs, this should only be applied to the + * `name` field on the resource. + * + * This behavior should not be applied to references to other resources within + * the message. + * + * The identifier field of resources often have different field behavior + * depending on the request it is embedded in (e.g. for Create methods name + * is optional and unused, while for Update methods it is required). Instead + * of method-specific annotations, only `IDENTIFIER` is required. + */ + IDENTIFIER = 8, + UNRECOGNIZED = -1, +} + +export function fieldBehaviorFromJSON(object: any): FieldBehavior { + switch (object) { + case 0: + case "FIELD_BEHAVIOR_UNSPECIFIED": + return FieldBehavior.FIELD_BEHAVIOR_UNSPECIFIED; + case 1: + case "OPTIONAL": + return FieldBehavior.OPTIONAL; + case 2: + case "REQUIRED": + return FieldBehavior.REQUIRED; + case 3: + case "OUTPUT_ONLY": + return FieldBehavior.OUTPUT_ONLY; + case 4: + case "INPUT_ONLY": + return FieldBehavior.INPUT_ONLY; + case 5: + case "IMMUTABLE": + return FieldBehavior.IMMUTABLE; + case 6: + case "UNORDERED_LIST": + return FieldBehavior.UNORDERED_LIST; + case 7: + case "NON_EMPTY_DEFAULT": + return FieldBehavior.NON_EMPTY_DEFAULT; + case 8: + case "IDENTIFIER": + return FieldBehavior.IDENTIFIER; + case -1: + case "UNRECOGNIZED": + default: + return FieldBehavior.UNRECOGNIZED; + } +} + +export function fieldBehaviorToJSON(object: FieldBehavior): string { + switch (object) { + case FieldBehavior.FIELD_BEHAVIOR_UNSPECIFIED: + return "FIELD_BEHAVIOR_UNSPECIFIED"; + case FieldBehavior.OPTIONAL: + return "OPTIONAL"; + case FieldBehavior.REQUIRED: + return "REQUIRED"; + case FieldBehavior.OUTPUT_ONLY: + return "OUTPUT_ONLY"; + case FieldBehavior.INPUT_ONLY: + return "INPUT_ONLY"; + case FieldBehavior.IMMUTABLE: + return "IMMUTABLE"; + case FieldBehavior.UNORDERED_LIST: + return "UNORDERED_LIST"; + case FieldBehavior.NON_EMPTY_DEFAULT: + return "NON_EMPTY_DEFAULT"; + case FieldBehavior.IDENTIFIER: + return "IDENTIFIER"; + case FieldBehavior.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} diff --git a/src/grpc/google/api/http.ts b/src/grpc/google/api/http.ts new file mode 100644 index 00000000..e75de9df --- /dev/null +++ b/src/grpc/google/api/http.ts @@ -0,0 +1,795 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.8.3 +// protoc v3.21.12 +// source: google/api/http.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; + +export const protobufPackage = "google.api"; + +/** + * Defines the HTTP configuration for an API service. It contains a list of + * [HttpRule][google.api.HttpRule], each specifying the mapping of an RPC method + * to one or more HTTP REST API methods. + */ +export interface Http { + /** + * A list of HTTP configuration rules that apply to individual API methods. + * + * **NOTE:** All service configuration rules follow "last one wins" order. + */ + rules: HttpRule[]; + /** + * When set to true, URL path parameters will be fully URI-decoded except in + * cases of single segment matches in reserved expansion, where "%2F" will be + * left encoded. + * + * The default behavior is to not decode RFC 6570 reserved characters in multi + * segment matches. + */ + fullyDecodeReservedExpansion: boolean; +} + +/** + * gRPC Transcoding + * + * gRPC Transcoding is a feature for mapping between a gRPC method and one or + * more HTTP REST endpoints. It allows developers to build a single API service + * that supports both gRPC APIs and REST APIs. Many systems, including [Google + * APIs](https://github.com/googleapis/googleapis), + * [Cloud Endpoints](https://cloud.google.com/endpoints), [gRPC + * Gateway](https://github.com/grpc-ecosystem/grpc-gateway), + * and [Envoy](https://github.com/envoyproxy/envoy) proxy support this feature + * and use it for large scale production services. + * + * `HttpRule` defines the schema of the gRPC/REST mapping. The mapping specifies + * how different portions of the gRPC request message are mapped to the URL + * path, URL query parameters, and HTTP request body. It also controls how the + * gRPC response message is mapped to the HTTP response body. `HttpRule` is + * typically specified as an `google.api.http` annotation on the gRPC method. + * + * Each mapping specifies a URL path template and an HTTP method. The path + * template may refer to one or more fields in the gRPC request message, as long + * as each field is a non-repeated field with a primitive (non-message) type. + * The path template controls how fields of the request message are mapped to + * the URL path. + * + * Example: + * + * service Messaging { + * rpc GetMessage(GetMessageRequest) returns (Message) { + * option (google.api.http) = { + * get: "/v1/{name=messages/*}" + * }; + * } + * } + * message GetMessageRequest { + * string name = 1; // Mapped to URL path. + * } + * message Message { + * string text = 1; // The resource content. + * } + * + * This enables an HTTP REST to gRPC mapping as below: + * + * - HTTP: `GET /v1/messages/123456` + * - gRPC: `GetMessage(name: "messages/123456")` + * + * Any fields in the request message which are not bound by the path template + * automatically become HTTP query parameters if there is no HTTP request body. + * For example: + * + * service Messaging { + * rpc GetMessage(GetMessageRequest) returns (Message) { + * option (google.api.http) = { + * get:"/v1/messages/{message_id}" + * }; + * } + * } + * message GetMessageRequest { + * message SubMessage { + * string subfield = 1; + * } + * string message_id = 1; // Mapped to URL path. + * int64 revision = 2; // Mapped to URL query parameter `revision`. + * SubMessage sub = 3; // Mapped to URL query parameter `sub.subfield`. + * } + * + * This enables a HTTP JSON to RPC mapping as below: + * + * - HTTP: `GET /v1/messages/123456?revision=2&sub.subfield=foo` + * - gRPC: `GetMessage(message_id: "123456" revision: 2 sub: + * SubMessage(subfield: "foo"))` + * + * Note that fields which are mapped to URL query parameters must have a + * primitive type or a repeated primitive type or a non-repeated message type. + * In the case of a repeated type, the parameter can be repeated in the URL + * as `...?param=A¶m=B`. In the case of a message type, each field of the + * message is mapped to a separate parameter, such as + * `...?foo.a=A&foo.b=B&foo.c=C`. + * + * For HTTP methods that allow a request body, the `body` field + * specifies the mapping. Consider a REST update method on the + * message resource collection: + * + * service Messaging { + * rpc UpdateMessage(UpdateMessageRequest) returns (Message) { + * option (google.api.http) = { + * patch: "/v1/messages/{message_id}" + * body: "message" + * }; + * } + * } + * message UpdateMessageRequest { + * string message_id = 1; // mapped to the URL + * Message message = 2; // mapped to the body + * } + * + * The following HTTP JSON to RPC mapping is enabled, where the + * representation of the JSON in the request body is determined by + * protos JSON encoding: + * + * - HTTP: `PATCH /v1/messages/123456 { "text": "Hi!" }` + * - gRPC: `UpdateMessage(message_id: "123456" message { text: "Hi!" })` + * + * The special name `*` can be used in the body mapping to define that + * every field not bound by the path template should be mapped to the + * request body. This enables the following alternative definition of + * the update method: + * + * service Messaging { + * rpc UpdateMessage(Message) returns (Message) { + * option (google.api.http) = { + * patch: "/v1/messages/{message_id}" + * body: "*" + * }; + * } + * } + * message Message { + * string message_id = 1; + * string text = 2; + * } + * + * The following HTTP JSON to RPC mapping is enabled: + * + * - HTTP: `PATCH /v1/messages/123456 { "text": "Hi!" }` + * - gRPC: `UpdateMessage(message_id: "123456" text: "Hi!")` + * + * Note that when using `*` in the body mapping, it is not possible to + * have HTTP parameters, as all fields not bound by the path end in + * the body. This makes this option more rarely used in practice when + * defining REST APIs. The common usage of `*` is in custom methods + * which don't use the URL at all for transferring data. + * + * It is possible to define multiple HTTP methods for one RPC by using + * the `additional_bindings` option. Example: + * + * service Messaging { + * rpc GetMessage(GetMessageRequest) returns (Message) { + * option (google.api.http) = { + * get: "/v1/messages/{message_id}" + * additional_bindings { + * get: "/v1/users/{user_id}/messages/{message_id}" + * } + * }; + * } + * } + * message GetMessageRequest { + * string message_id = 1; + * string user_id = 2; + * } + * + * This enables the following two alternative HTTP JSON to RPC mappings: + * + * - HTTP: `GET /v1/messages/123456` + * - gRPC: `GetMessage(message_id: "123456")` + * + * - HTTP: `GET /v1/users/me/messages/123456` + * - gRPC: `GetMessage(user_id: "me" message_id: "123456")` + * + * Rules for HTTP mapping + * + * 1. Leaf request fields (recursive expansion nested messages in the request + * message) are classified into three categories: + * - Fields referred by the path template. They are passed via the URL path. + * - Fields referred by the [HttpRule.body][google.api.HttpRule.body]. They + * are passed via the HTTP + * request body. + * - All other fields are passed via the URL query parameters, and the + * parameter name is the field path in the request message. A repeated + * field can be represented as multiple query parameters under the same + * name. + * 2. If [HttpRule.body][google.api.HttpRule.body] is "*", there is no URL + * query parameter, all fields + * are passed via URL path and HTTP request body. + * 3. If [HttpRule.body][google.api.HttpRule.body] is omitted, there is no HTTP + * request body, all + * fields are passed via URL path and URL query parameters. + * + * Path template syntax + * + * Template = "/" Segments [ Verb ] ; + * Segments = Segment { "/" Segment } ; + * Segment = "*" | "**" | LITERAL | Variable ; + * Variable = "{" FieldPath [ "=" Segments ] "}" ; + * FieldPath = IDENT { "." IDENT } ; + * Verb = ":" LITERAL ; + * + * The syntax `*` matches a single URL path segment. The syntax `**` matches + * zero or more URL path segments, which must be the last part of the URL path + * except the `Verb`. + * + * The syntax `Variable` matches part of the URL path as specified by its + * template. A variable template must not contain other variables. If a variable + * matches a single path segment, its template may be omitted, e.g. `{var}` + * is equivalent to `{var=*}`. + * + * The syntax `LITERAL` matches literal text in the URL path. If the `LITERAL` + * contains any reserved character, such characters should be percent-encoded + * before the matching. + * + * If a variable contains exactly one path segment, such as `"{var}"` or + * `"{var=*}"`, when such a variable is expanded into a URL path on the client + * side, all characters except `[-_.~0-9a-zA-Z]` are percent-encoded. The + * server side does the reverse decoding. Such variables show up in the + * [Discovery + * Document](https://developers.google.com/discovery/v1/reference/apis) as + * `{var}`. + * + * If a variable contains multiple path segments, such as `"{var=foo/*}"` + * or `"{var=**}"`, when such a variable is expanded into a URL path on the + * client side, all characters except `[-_.~/0-9a-zA-Z]` are percent-encoded. + * The server side does the reverse decoding, except "%2F" and "%2f" are left + * unchanged. Such variables show up in the + * [Discovery + * Document](https://developers.google.com/discovery/v1/reference/apis) as + * `{+var}`. + * + * Using gRPC API Service Configuration + * + * gRPC API Service Configuration (service config) is a configuration language + * for configuring a gRPC service to become a user-facing product. The + * service config is simply the YAML representation of the `google.api.Service` + * proto message. + * + * As an alternative to annotating your proto file, you can configure gRPC + * transcoding in your service config YAML files. You do this by specifying a + * `HttpRule` that maps the gRPC method to a REST endpoint, achieving the same + * effect as the proto annotation. This can be particularly useful if you + * have a proto that is reused in multiple services. Note that any transcoding + * specified in the service config will override any matching transcoding + * configuration in the proto. + * + * The following example selects a gRPC method and applies an `HttpRule` to it: + * + * http: + * rules: + * - selector: example.v1.Messaging.GetMessage + * get: /v1/messages/{message_id}/{sub.subfield} + * + * Special notes + * + * When gRPC Transcoding is used to map a gRPC to JSON REST endpoints, the + * proto to JSON conversion must follow the [proto3 + * specification](https://developers.google.com/protocol-buffers/docs/proto3#json). + * + * While the single segment variable follows the semantics of + * [RFC 6570](https://tools.ietf.org/html/rfc6570) Section 3.2.2 Simple String + * Expansion, the multi segment variable **does not** follow RFC 6570 Section + * 3.2.3 Reserved Expansion. The reason is that the Reserved Expansion + * does not expand special characters like `?` and `#`, which would lead + * to invalid URLs. As the result, gRPC Transcoding uses a custom encoding + * for multi segment variables. + * + * The path variables **must not** refer to any repeated or mapped field, + * because client libraries are not capable of handling such variable expansion. + * + * The path variables **must not** capture the leading "/" character. The reason + * is that the most common use case "{var}" does not capture the leading "/" + * character. For consistency, all path variables must share the same behavior. + * + * Repeated message fields must not be mapped to URL query parameters, because + * no client library can support such complicated mapping. + * + * If an API needs to use a JSON array for request or response body, it can map + * the request or response body to a repeated field. However, some gRPC + * Transcoding implementations may not support this feature. + */ +export interface HttpRule { + /** + * Selects a method to which this rule applies. + * + * Refer to [selector][google.api.DocumentationRule.selector] for syntax + * details. + */ + selector: string; + /** + * Determines the URL pattern is matched by this rules. This pattern can be + * used with any of the {get|put|post|delete|patch} methods. A custom method + * can be defined using the 'custom' field. + */ + pattern?: + | // + /** + * Maps to HTTP GET. Used for listing and getting information about + * resources. + */ + { $case: "get"; value: string } + | // + /** Maps to HTTP PUT. Used for replacing a resource. */ + { $case: "put"; value: string } + | // + /** Maps to HTTP POST. Used for creating a resource or performing an action. */ + { $case: "post"; value: string } + | // + /** Maps to HTTP DELETE. Used for deleting a resource. */ + { $case: "delete"; value: string } + | // + /** Maps to HTTP PATCH. Used for updating a resource. */ + { $case: "patch"; value: string } + | // + /** + * The custom pattern is used for specifying an HTTP method that is not + * included in the `pattern` field, such as HEAD, or "*" to leave the + * HTTP method unspecified for this rule. The wild-card rule is useful + * for services that provide content to Web (HTML) clients. + */ + { $case: "custom"; value: CustomHttpPattern } + | undefined; + /** + * The name of the request field whose value is mapped to the HTTP request + * body, or `*` for mapping all request fields not captured by the path + * pattern to the HTTP body, or omitted for not having any HTTP request body. + * + * NOTE: the referred field must be present at the top-level of the request + * message type. + */ + body: string; + /** + * Optional. The name of the response field whose value is mapped to the HTTP + * response body. When omitted, the entire response message will be used + * as the HTTP response body. + * + * NOTE: The referred field must be present at the top-level of the response + * message type. + */ + responseBody: string; + /** + * Additional HTTP bindings for the selector. Nested bindings must + * not contain an `additional_bindings` field themselves (that is, + * the nesting may only be one level deep). + */ + additionalBindings: HttpRule[]; +} + +/** A custom pattern is used for defining custom HTTP verb. */ +export interface CustomHttpPattern { + /** The name of this custom HTTP verb. */ + kind: string; + /** The path matched by this custom verb. */ + path: string; +} + +function createBaseHttp(): Http { + return { rules: [], fullyDecodeReservedExpansion: false }; +} + +export const Http: MessageFns = { + encode(message: Http, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.rules) { + HttpRule.encode(v!, writer.uint32(10).fork()).join(); + } + if (message.fullyDecodeReservedExpansion !== false) { + writer.uint32(16).bool(message.fullyDecodeReservedExpansion); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Http { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseHttp(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.rules.push(HttpRule.decode(reader, reader.uint32())); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.fullyDecodeReservedExpansion = reader.bool(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Http { + return { + rules: globalThis.Array.isArray(object?.rules) ? object.rules.map((e: any) => HttpRule.fromJSON(e)) : [], + fullyDecodeReservedExpansion: isSet(object.fullyDecodeReservedExpansion) + ? globalThis.Boolean(object.fullyDecodeReservedExpansion) + : false, + }; + }, + + toJSON(message: Http): unknown { + const obj: any = {}; + if (message.rules?.length) { + obj.rules = message.rules.map((e) => HttpRule.toJSON(e)); + } + if (message.fullyDecodeReservedExpansion !== false) { + obj.fullyDecodeReservedExpansion = message.fullyDecodeReservedExpansion; + } + return obj; + }, + + create, I>>(base?: I): Http { + return Http.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Http { + const message = createBaseHttp(); + message.rules = object.rules?.map((e) => HttpRule.fromPartial(e)) || []; + message.fullyDecodeReservedExpansion = object.fullyDecodeReservedExpansion ?? false; + return message; + }, +}; + +function createBaseHttpRule(): HttpRule { + return { selector: "", pattern: undefined, body: "", responseBody: "", additionalBindings: [] }; +} + +export const HttpRule: MessageFns = { + encode(message: HttpRule, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.selector !== "") { + writer.uint32(10).string(message.selector); + } + switch (message.pattern?.$case) { + case "get": + writer.uint32(18).string(message.pattern.value); + break; + case "put": + writer.uint32(26).string(message.pattern.value); + break; + case "post": + writer.uint32(34).string(message.pattern.value); + break; + case "delete": + writer.uint32(42).string(message.pattern.value); + break; + case "patch": + writer.uint32(50).string(message.pattern.value); + break; + case "custom": + CustomHttpPattern.encode(message.pattern.value, writer.uint32(66).fork()).join(); + break; + } + if (message.body !== "") { + writer.uint32(58).string(message.body); + } + if (message.responseBody !== "") { + writer.uint32(98).string(message.responseBody); + } + for (const v of message.additionalBindings) { + HttpRule.encode(v!, writer.uint32(90).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): HttpRule { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseHttpRule(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.selector = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.pattern = { $case: "get", value: reader.string() }; + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.pattern = { $case: "put", value: reader.string() }; + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.pattern = { $case: "post", value: reader.string() }; + continue; + } + case 5: { + if (tag !== 42) { + break; + } + + message.pattern = { $case: "delete", value: reader.string() }; + continue; + } + case 6: { + if (tag !== 50) { + break; + } + + message.pattern = { $case: "patch", value: reader.string() }; + continue; + } + case 8: { + if (tag !== 66) { + break; + } + + message.pattern = { $case: "custom", value: CustomHttpPattern.decode(reader, reader.uint32()) }; + continue; + } + case 7: { + if (tag !== 58) { + break; + } + + message.body = reader.string(); + continue; + } + case 12: { + if (tag !== 98) { + break; + } + + message.responseBody = reader.string(); + continue; + } + case 11: { + if (tag !== 90) { + break; + } + + message.additionalBindings.push(HttpRule.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): HttpRule { + return { + selector: isSet(object.selector) ? globalThis.String(object.selector) : "", + pattern: isSet(object.get) + ? { $case: "get", value: globalThis.String(object.get) } + : isSet(object.put) + ? { $case: "put", value: globalThis.String(object.put) } + : isSet(object.post) + ? { $case: "post", value: globalThis.String(object.post) } + : isSet(object.delete) + ? { $case: "delete", value: globalThis.String(object.delete) } + : isSet(object.patch) + ? { $case: "patch", value: globalThis.String(object.patch) } + : isSet(object.custom) + ? { $case: "custom", value: CustomHttpPattern.fromJSON(object.custom) } + : undefined, + body: isSet(object.body) ? globalThis.String(object.body) : "", + responseBody: isSet(object.responseBody) ? globalThis.String(object.responseBody) : "", + additionalBindings: globalThis.Array.isArray(object?.additionalBindings) + ? object.additionalBindings.map((e: any) => HttpRule.fromJSON(e)) + : [], + }; + }, + + toJSON(message: HttpRule): unknown { + const obj: any = {}; + if (message.selector !== "") { + obj.selector = message.selector; + } + if (message.pattern?.$case === "get") { + obj.get = message.pattern.value; + } else if (message.pattern?.$case === "put") { + obj.put = message.pattern.value; + } else if (message.pattern?.$case === "post") { + obj.post = message.pattern.value; + } else if (message.pattern?.$case === "delete") { + obj.delete = message.pattern.value; + } else if (message.pattern?.$case === "patch") { + obj.patch = message.pattern.value; + } else if (message.pattern?.$case === "custom") { + obj.custom = CustomHttpPattern.toJSON(message.pattern.value); + } + if (message.body !== "") { + obj.body = message.body; + } + if (message.responseBody !== "") { + obj.responseBody = message.responseBody; + } + if (message.additionalBindings?.length) { + obj.additionalBindings = message.additionalBindings.map((e) => HttpRule.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): HttpRule { + return HttpRule.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): HttpRule { + const message = createBaseHttpRule(); + message.selector = object.selector ?? ""; + switch (object.pattern?.$case) { + case "get": { + if (object.pattern?.value !== undefined && object.pattern?.value !== null) { + message.pattern = { $case: "get", value: object.pattern.value }; + } + break; + } + case "put": { + if (object.pattern?.value !== undefined && object.pattern?.value !== null) { + message.pattern = { $case: "put", value: object.pattern.value }; + } + break; + } + case "post": { + if (object.pattern?.value !== undefined && object.pattern?.value !== null) { + message.pattern = { $case: "post", value: object.pattern.value }; + } + break; + } + case "delete": { + if (object.pattern?.value !== undefined && object.pattern?.value !== null) { + message.pattern = { $case: "delete", value: object.pattern.value }; + } + break; + } + case "patch": { + if (object.pattern?.value !== undefined && object.pattern?.value !== null) { + message.pattern = { $case: "patch", value: object.pattern.value }; + } + break; + } + case "custom": { + if (object.pattern?.value !== undefined && object.pattern?.value !== null) { + message.pattern = { $case: "custom", value: CustomHttpPattern.fromPartial(object.pattern.value) }; + } + break; + } + } + message.body = object.body ?? ""; + message.responseBody = object.responseBody ?? ""; + message.additionalBindings = object.additionalBindings?.map((e) => HttpRule.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseCustomHttpPattern(): CustomHttpPattern { + return { kind: "", path: "" }; +} + +export const CustomHttpPattern: MessageFns = { + encode(message: CustomHttpPattern, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.kind !== "") { + writer.uint32(10).string(message.kind); + } + if (message.path !== "") { + writer.uint32(18).string(message.path); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): CustomHttpPattern { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseCustomHttpPattern(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.kind = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.path = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): CustomHttpPattern { + return { + kind: isSet(object.kind) ? globalThis.String(object.kind) : "", + path: isSet(object.path) ? globalThis.String(object.path) : "", + }; + }, + + toJSON(message: CustomHttpPattern): unknown { + const obj: any = {}; + if (message.kind !== "") { + obj.kind = message.kind; + } + if (message.path !== "") { + obj.path = message.path; + } + return obj; + }, + + create, I>>(base?: I): CustomHttpPattern { + return CustomHttpPattern.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): CustomHttpPattern { + const message = createBaseCustomHttpPattern(); + message.kind = object.kind ?? ""; + message.path = object.path ?? ""; + return message; + }, +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends { $case: string; value: unknown } ? { $case: T["$case"]; value?: DeepPartial } + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} diff --git a/src/grpc/google/api/launch_stage.ts b/src/grpc/google/api/launch_stage.ts new file mode 100644 index 00000000..716da8b0 --- /dev/null +++ b/src/grpc/google/api/launch_stage.ts @@ -0,0 +1,121 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.8.3 +// protoc v3.21.12 +// source: google/api/launch_stage.proto + +/* eslint-disable */ + +export const protobufPackage = "google.api"; + +/** + * The launch stage as defined by [Google Cloud Platform + * Launch Stages](https://cloud.google.com/terms/launch-stages). + */ +export enum LaunchStage { + /** LAUNCH_STAGE_UNSPECIFIED - Do not use this default value. */ + LAUNCH_STAGE_UNSPECIFIED = 0, + /** UNIMPLEMENTED - The feature is not yet implemented. Users can not use it. */ + UNIMPLEMENTED = 6, + /** PRELAUNCH - Prelaunch features are hidden from users and are only visible internally. */ + PRELAUNCH = 7, + /** + * EARLY_ACCESS - Early Access features are limited to a closed group of testers. To use + * these features, you must sign up in advance and sign a Trusted Tester + * agreement (which includes confidentiality provisions). These features may + * be unstable, changed in backward-incompatible ways, and are not + * guaranteed to be released. + */ + EARLY_ACCESS = 1, + /** + * ALPHA - Alpha is a limited availability test for releases before they are cleared + * for widespread use. By Alpha, all significant design issues are resolved + * and we are in the process of verifying functionality. Alpha customers + * need to apply for access, agree to applicable terms, and have their + * projects allowlisted. Alpha releases don't have to be feature complete, + * no SLAs are provided, and there are no technical support obligations, but + * they will be far enough along that customers can actually use them in + * test environments or for limited-use tests -- just like they would in + * normal production cases. + */ + ALPHA = 2, + /** + * BETA - Beta is the point at which we are ready to open a release for any + * customer to use. There are no SLA or technical support obligations in a + * Beta release. Products will be complete from a feature perspective, but + * may have some open outstanding issues. Beta releases are suitable for + * limited production use cases. + */ + BETA = 3, + /** + * GA - GA features are open to all developers and are considered stable and + * fully qualified for production use. + */ + GA = 4, + /** + * DEPRECATED - Deprecated features are scheduled to be shut down and removed. For more + * information, see the "Deprecation Policy" section of our [Terms of + * Service](https://cloud.google.com/terms/) + * and the [Google Cloud Platform Subject to the Deprecation + * Policy](https://cloud.google.com/terms/deprecation) documentation. + */ + DEPRECATED = 5, + UNRECOGNIZED = -1, +} + +export function launchStageFromJSON(object: any): LaunchStage { + switch (object) { + case 0: + case "LAUNCH_STAGE_UNSPECIFIED": + return LaunchStage.LAUNCH_STAGE_UNSPECIFIED; + case 6: + case "UNIMPLEMENTED": + return LaunchStage.UNIMPLEMENTED; + case 7: + case "PRELAUNCH": + return LaunchStage.PRELAUNCH; + case 1: + case "EARLY_ACCESS": + return LaunchStage.EARLY_ACCESS; + case 2: + case "ALPHA": + return LaunchStage.ALPHA; + case 3: + case "BETA": + return LaunchStage.BETA; + case 4: + case "GA": + return LaunchStage.GA; + case 5: + case "DEPRECATED": + return LaunchStage.DEPRECATED; + case -1: + case "UNRECOGNIZED": + default: + return LaunchStage.UNRECOGNIZED; + } +} + +export function launchStageToJSON(object: LaunchStage): string { + switch (object) { + case LaunchStage.LAUNCH_STAGE_UNSPECIFIED: + return "LAUNCH_STAGE_UNSPECIFIED"; + case LaunchStage.UNIMPLEMENTED: + return "UNIMPLEMENTED"; + case LaunchStage.PRELAUNCH: + return "PRELAUNCH"; + case LaunchStage.EARLY_ACCESS: + return "EARLY_ACCESS"; + case LaunchStage.ALPHA: + return "ALPHA"; + case LaunchStage.BETA: + return "BETA"; + case LaunchStage.GA: + return "GA"; + case LaunchStage.DEPRECATED: + return "DEPRECATED"; + case LaunchStage.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} diff --git a/src/grpc/google/protobuf/descriptor.ts b/src/grpc/google/protobuf/descriptor.ts new file mode 100644 index 00000000..6406b005 --- /dev/null +++ b/src/grpc/google/protobuf/descriptor.ts @@ -0,0 +1,6970 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.8.3 +// protoc v3.21.12 +// source: google/protobuf/descriptor.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; + +export const protobufPackage = "google.protobuf"; + +/** The full set of known editions. */ +export enum Edition { + /** EDITION_UNKNOWN - A placeholder for an unknown edition value. */ + EDITION_UNKNOWN = 0, + /** + * EDITION_LEGACY - A placeholder edition for specifying default behaviors *before* a feature + * was first introduced. This is effectively an "infinite past". + */ + EDITION_LEGACY = 900, + /** + * EDITION_PROTO2 - Legacy syntax "editions". These pre-date editions, but behave much like + * distinct editions. These can't be used to specify the edition of proto + * files, but feature definitions must supply proto2/proto3 defaults for + * backwards compatibility. + */ + EDITION_PROTO2 = 998, + EDITION_PROTO3 = 999, + /** + * EDITION_2023 - Editions that have been released. The specific values are arbitrary and + * should not be depended on, but they will always be time-ordered for easy + * comparison. + */ + EDITION_2023 = 1000, + EDITION_2024 = 1001, + /** + * EDITION_1_TEST_ONLY - Placeholder editions for testing feature resolution. These should not be + * used or relied on outside of tests. + */ + EDITION_1_TEST_ONLY = 1, + EDITION_2_TEST_ONLY = 2, + EDITION_99997_TEST_ONLY = 99997, + EDITION_99998_TEST_ONLY = 99998, + EDITION_99999_TEST_ONLY = 99999, + /** + * EDITION_MAX - Placeholder for specifying unbounded edition support. This should only + * ever be used by plugins that can expect to never require any changes to + * support a new edition. + */ + EDITION_MAX = 2147483647, + UNRECOGNIZED = -1, +} + +export function editionFromJSON(object: any): Edition { + switch (object) { + case 0: + case "EDITION_UNKNOWN": + return Edition.EDITION_UNKNOWN; + case 900: + case "EDITION_LEGACY": + return Edition.EDITION_LEGACY; + case 998: + case "EDITION_PROTO2": + return Edition.EDITION_PROTO2; + case 999: + case "EDITION_PROTO3": + return Edition.EDITION_PROTO3; + case 1000: + case "EDITION_2023": + return Edition.EDITION_2023; + case 1001: + case "EDITION_2024": + return Edition.EDITION_2024; + case 1: + case "EDITION_1_TEST_ONLY": + return Edition.EDITION_1_TEST_ONLY; + case 2: + case "EDITION_2_TEST_ONLY": + return Edition.EDITION_2_TEST_ONLY; + case 99997: + case "EDITION_99997_TEST_ONLY": + return Edition.EDITION_99997_TEST_ONLY; + case 99998: + case "EDITION_99998_TEST_ONLY": + return Edition.EDITION_99998_TEST_ONLY; + case 99999: + case "EDITION_99999_TEST_ONLY": + return Edition.EDITION_99999_TEST_ONLY; + case 2147483647: + case "EDITION_MAX": + return Edition.EDITION_MAX; + case -1: + case "UNRECOGNIZED": + default: + return Edition.UNRECOGNIZED; + } +} + +export function editionToJSON(object: Edition): string { + switch (object) { + case Edition.EDITION_UNKNOWN: + return "EDITION_UNKNOWN"; + case Edition.EDITION_LEGACY: + return "EDITION_LEGACY"; + case Edition.EDITION_PROTO2: + return "EDITION_PROTO2"; + case Edition.EDITION_PROTO3: + return "EDITION_PROTO3"; + case Edition.EDITION_2023: + return "EDITION_2023"; + case Edition.EDITION_2024: + return "EDITION_2024"; + case Edition.EDITION_1_TEST_ONLY: + return "EDITION_1_TEST_ONLY"; + case Edition.EDITION_2_TEST_ONLY: + return "EDITION_2_TEST_ONLY"; + case Edition.EDITION_99997_TEST_ONLY: + return "EDITION_99997_TEST_ONLY"; + case Edition.EDITION_99998_TEST_ONLY: + return "EDITION_99998_TEST_ONLY"; + case Edition.EDITION_99999_TEST_ONLY: + return "EDITION_99999_TEST_ONLY"; + case Edition.EDITION_MAX: + return "EDITION_MAX"; + case Edition.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** + * Describes the 'visibility' of a symbol with respect to the proto import + * system. Symbols can only be imported when the visibility rules do not prevent + * it (ex: local symbols cannot be imported). Visibility modifiers can only set + * on `message` and `enum` as they are the only types available to be referenced + * from other files. + */ +export enum SymbolVisibility { + VISIBILITY_UNSET = 0, + VISIBILITY_LOCAL = 1, + VISIBILITY_EXPORT = 2, + UNRECOGNIZED = -1, +} + +export function symbolVisibilityFromJSON(object: any): SymbolVisibility { + switch (object) { + case 0: + case "VISIBILITY_UNSET": + return SymbolVisibility.VISIBILITY_UNSET; + case 1: + case "VISIBILITY_LOCAL": + return SymbolVisibility.VISIBILITY_LOCAL; + case 2: + case "VISIBILITY_EXPORT": + return SymbolVisibility.VISIBILITY_EXPORT; + case -1: + case "UNRECOGNIZED": + default: + return SymbolVisibility.UNRECOGNIZED; + } +} + +export function symbolVisibilityToJSON(object: SymbolVisibility): string { + switch (object) { + case SymbolVisibility.VISIBILITY_UNSET: + return "VISIBILITY_UNSET"; + case SymbolVisibility.VISIBILITY_LOCAL: + return "VISIBILITY_LOCAL"; + case SymbolVisibility.VISIBILITY_EXPORT: + return "VISIBILITY_EXPORT"; + case SymbolVisibility.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** + * The protocol compiler can output a FileDescriptorSet containing the .proto + * files it parses. + */ +export interface FileDescriptorSet { + file: FileDescriptorProto[]; +} + +/** Describes a complete .proto file. */ +export interface FileDescriptorProto { + /** file name, relative to root of source tree */ + name?: + | string + | undefined; + /** e.g. "foo", "foo.bar", etc. */ + package?: + | string + | undefined; + /** Names of files imported by this file. */ + dependency: string[]; + /** Indexes of the public imported files in the dependency list above. */ + publicDependency: number[]; + /** + * Indexes of the weak imported files in the dependency list. + * For Google-internal migration only. Do not use. + */ + weakDependency: number[]; + /** + * Names of files imported by this file purely for the purpose of providing + * option extensions. These are excluded from the dependency list above. + */ + optionDependency: string[]; + /** All top-level definitions in this file. */ + messageType: DescriptorProto[]; + enumType: EnumDescriptorProto[]; + service: ServiceDescriptorProto[]; + extension: FieldDescriptorProto[]; + options?: + | FileOptions + | undefined; + /** + * This field contains optional information about the original source code. + * You may safely remove this entire field without harming runtime + * functionality of the descriptors -- the information is needed only by + * development tools. + */ + sourceCodeInfo?: + | SourceCodeInfo + | undefined; + /** + * The syntax of the proto file. + * The supported values are "proto2", "proto3", and "editions". + * + * If `edition` is present, this value must be "editions". + * WARNING: This field should only be used by protobuf plugins or special + * cases like the proto compiler. Other uses are discouraged and + * developers should rely on the protoreflect APIs for their client language. + */ + syntax?: + | string + | undefined; + /** + * The edition of the proto file. + * WARNING: This field should only be used by protobuf plugins or special + * cases like the proto compiler. Other uses are discouraged and + * developers should rely on the protoreflect APIs for their client language. + */ + edition?: Edition | undefined; +} + +/** Describes a message type. */ +export interface DescriptorProto { + name?: string | undefined; + field: FieldDescriptorProto[]; + extension: FieldDescriptorProto[]; + nestedType: DescriptorProto[]; + enumType: EnumDescriptorProto[]; + extensionRange: DescriptorProto_ExtensionRange[]; + oneofDecl: OneofDescriptorProto[]; + options?: MessageOptions | undefined; + reservedRange: DescriptorProto_ReservedRange[]; + /** + * Reserved field names, which may not be used by fields in the same message. + * A given name may only be reserved once. + */ + reservedName: string[]; + /** Support for `export` and `local` keywords on enums. */ + visibility?: SymbolVisibility | undefined; +} + +export interface DescriptorProto_ExtensionRange { + /** Inclusive. */ + start?: + | number + | undefined; + /** Exclusive. */ + end?: number | undefined; + options?: ExtensionRangeOptions | undefined; +} + +/** + * Range of reserved tag numbers. Reserved tag numbers may not be used by + * fields or extension ranges in the same message. Reserved ranges may + * not overlap. + */ +export interface DescriptorProto_ReservedRange { + /** Inclusive. */ + start?: + | number + | undefined; + /** Exclusive. */ + end?: number | undefined; +} + +export interface ExtensionRangeOptions { + /** The parser stores options it doesn't recognize here. See above. */ + uninterpretedOption: UninterpretedOption[]; + /** + * For external users: DO NOT USE. We are in the process of open sourcing + * extension declaration and executing internal cleanups before it can be + * used externally. + */ + declaration: ExtensionRangeOptions_Declaration[]; + /** Any features defined in the specific edition. */ + features?: + | FeatureSet + | undefined; + /** + * The verification state of the range. + * TODO: flip the default to DECLARATION once all empty ranges + * are marked as UNVERIFIED. + */ + verification?: ExtensionRangeOptions_VerificationState | undefined; +} + +/** The verification state of the extension range. */ +export enum ExtensionRangeOptions_VerificationState { + /** DECLARATION - All the extensions of the range must be declared. */ + DECLARATION = 0, + UNVERIFIED = 1, + UNRECOGNIZED = -1, +} + +export function extensionRangeOptions_VerificationStateFromJSON(object: any): ExtensionRangeOptions_VerificationState { + switch (object) { + case 0: + case "DECLARATION": + return ExtensionRangeOptions_VerificationState.DECLARATION; + case 1: + case "UNVERIFIED": + return ExtensionRangeOptions_VerificationState.UNVERIFIED; + case -1: + case "UNRECOGNIZED": + default: + return ExtensionRangeOptions_VerificationState.UNRECOGNIZED; + } +} + +export function extensionRangeOptions_VerificationStateToJSON(object: ExtensionRangeOptions_VerificationState): string { + switch (object) { + case ExtensionRangeOptions_VerificationState.DECLARATION: + return "DECLARATION"; + case ExtensionRangeOptions_VerificationState.UNVERIFIED: + return "UNVERIFIED"; + case ExtensionRangeOptions_VerificationState.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +export interface ExtensionRangeOptions_Declaration { + /** The extension number declared within the extension range. */ + number?: + | number + | undefined; + /** + * The fully-qualified name of the extension field. There must be a leading + * dot in front of the full name. + */ + fullName?: + | string + | undefined; + /** + * The fully-qualified type name of the extension field. Unlike + * Metadata.type, Declaration.type must have a leading dot for messages + * and enums. + */ + type?: + | string + | undefined; + /** + * If true, indicates that the number is reserved in the extension range, + * and any extension field with the number will fail to compile. Set this + * when a declared extension field is deleted. + */ + reserved?: + | boolean + | undefined; + /** + * If true, indicates that the extension must be defined as repeated. + * Otherwise the extension must be defined as optional. + */ + repeated?: boolean | undefined; +} + +/** Describes a field within a message. */ +export interface FieldDescriptorProto { + name?: string | undefined; + number?: number | undefined; + label?: + | FieldDescriptorProto_Label + | undefined; + /** + * If type_name is set, this need not be set. If both this and type_name + * are set, this must be one of TYPE_ENUM, TYPE_MESSAGE or TYPE_GROUP. + */ + type?: + | FieldDescriptorProto_Type + | undefined; + /** + * For message and enum types, this is the name of the type. If the name + * starts with a '.', it is fully-qualified. Otherwise, C++-like scoping + * rules are used to find the type (i.e. first the nested types within this + * message are searched, then within the parent, on up to the root + * namespace). + */ + typeName?: + | string + | undefined; + /** + * For extensions, this is the name of the type being extended. It is + * resolved in the same manner as type_name. + */ + extendee?: + | string + | undefined; + /** + * For numeric types, contains the original text representation of the value. + * For booleans, "true" or "false". + * For strings, contains the default text contents (not escaped in any way). + * For bytes, contains the C escaped value. All bytes >= 128 are escaped. + */ + defaultValue?: + | string + | undefined; + /** + * If set, gives the index of a oneof in the containing type's oneof_decl + * list. This field is a member of that oneof. + */ + oneofIndex?: + | number + | undefined; + /** + * JSON name of this field. The value is set by protocol compiler. If the + * user has set a "json_name" option on this field, that option's value + * will be used. Otherwise, it's deduced from the field's name by converting + * it to camelCase. + */ + jsonName?: string | undefined; + options?: + | FieldOptions + | undefined; + /** + * If true, this is a proto3 "optional". When a proto3 field is optional, it + * tracks presence regardless of field type. + * + * When proto3_optional is true, this field must belong to a oneof to signal + * to old proto3 clients that presence is tracked for this field. This oneof + * is known as a "synthetic" oneof, and this field must be its sole member + * (each proto3 optional field gets its own synthetic oneof). Synthetic oneofs + * exist in the descriptor only, and do not generate any API. Synthetic oneofs + * must be ordered after all "real" oneofs. + * + * For message fields, proto3_optional doesn't create any semantic change, + * since non-repeated message fields always track presence. However it still + * indicates the semantic detail of whether the user wrote "optional" or not. + * This can be useful for round-tripping the .proto file. For consistency we + * give message fields a synthetic oneof also, even though it is not required + * to track presence. This is especially important because the parser can't + * tell if a field is a message or an enum, so it must always create a + * synthetic oneof. + * + * Proto2 optional fields do not set this flag, because they already indicate + * optional with `LABEL_OPTIONAL`. + */ + proto3Optional?: boolean | undefined; +} + +export enum FieldDescriptorProto_Type { + /** + * TYPE_DOUBLE - 0 is reserved for errors. + * Order is weird for historical reasons. + */ + TYPE_DOUBLE = 1, + TYPE_FLOAT = 2, + /** + * TYPE_INT64 - Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if + * negative values are likely. + */ + TYPE_INT64 = 3, + TYPE_UINT64 = 4, + /** + * TYPE_INT32 - Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if + * negative values are likely. + */ + TYPE_INT32 = 5, + TYPE_FIXED64 = 6, + TYPE_FIXED32 = 7, + TYPE_BOOL = 8, + TYPE_STRING = 9, + /** + * TYPE_GROUP - Tag-delimited aggregate. + * Group type is deprecated and not supported after google.protobuf. However, Proto3 + * implementations should still be able to parse the group wire format and + * treat group fields as unknown fields. In Editions, the group wire format + * can be enabled via the `message_encoding` feature. + */ + TYPE_GROUP = 10, + /** TYPE_MESSAGE - Length-delimited aggregate. */ + TYPE_MESSAGE = 11, + /** TYPE_BYTES - New in version 2. */ + TYPE_BYTES = 12, + TYPE_UINT32 = 13, + TYPE_ENUM = 14, + TYPE_SFIXED32 = 15, + TYPE_SFIXED64 = 16, + /** TYPE_SINT32 - Uses ZigZag encoding. */ + TYPE_SINT32 = 17, + /** TYPE_SINT64 - Uses ZigZag encoding. */ + TYPE_SINT64 = 18, + UNRECOGNIZED = -1, +} + +export function fieldDescriptorProto_TypeFromJSON(object: any): FieldDescriptorProto_Type { + switch (object) { + case 1: + case "TYPE_DOUBLE": + return FieldDescriptorProto_Type.TYPE_DOUBLE; + case 2: + case "TYPE_FLOAT": + return FieldDescriptorProto_Type.TYPE_FLOAT; + case 3: + case "TYPE_INT64": + return FieldDescriptorProto_Type.TYPE_INT64; + case 4: + case "TYPE_UINT64": + return FieldDescriptorProto_Type.TYPE_UINT64; + case 5: + case "TYPE_INT32": + return FieldDescriptorProto_Type.TYPE_INT32; + case 6: + case "TYPE_FIXED64": + return FieldDescriptorProto_Type.TYPE_FIXED64; + case 7: + case "TYPE_FIXED32": + return FieldDescriptorProto_Type.TYPE_FIXED32; + case 8: + case "TYPE_BOOL": + return FieldDescriptorProto_Type.TYPE_BOOL; + case 9: + case "TYPE_STRING": + return FieldDescriptorProto_Type.TYPE_STRING; + case 10: + case "TYPE_GROUP": + return FieldDescriptorProto_Type.TYPE_GROUP; + case 11: + case "TYPE_MESSAGE": + return FieldDescriptorProto_Type.TYPE_MESSAGE; + case 12: + case "TYPE_BYTES": + return FieldDescriptorProto_Type.TYPE_BYTES; + case 13: + case "TYPE_UINT32": + return FieldDescriptorProto_Type.TYPE_UINT32; + case 14: + case "TYPE_ENUM": + return FieldDescriptorProto_Type.TYPE_ENUM; + case 15: + case "TYPE_SFIXED32": + return FieldDescriptorProto_Type.TYPE_SFIXED32; + case 16: + case "TYPE_SFIXED64": + return FieldDescriptorProto_Type.TYPE_SFIXED64; + case 17: + case "TYPE_SINT32": + return FieldDescriptorProto_Type.TYPE_SINT32; + case 18: + case "TYPE_SINT64": + return FieldDescriptorProto_Type.TYPE_SINT64; + case -1: + case "UNRECOGNIZED": + default: + return FieldDescriptorProto_Type.UNRECOGNIZED; + } +} + +export function fieldDescriptorProto_TypeToJSON(object: FieldDescriptorProto_Type): string { + switch (object) { + case FieldDescriptorProto_Type.TYPE_DOUBLE: + return "TYPE_DOUBLE"; + case FieldDescriptorProto_Type.TYPE_FLOAT: + return "TYPE_FLOAT"; + case FieldDescriptorProto_Type.TYPE_INT64: + return "TYPE_INT64"; + case FieldDescriptorProto_Type.TYPE_UINT64: + return "TYPE_UINT64"; + case FieldDescriptorProto_Type.TYPE_INT32: + return "TYPE_INT32"; + case FieldDescriptorProto_Type.TYPE_FIXED64: + return "TYPE_FIXED64"; + case FieldDescriptorProto_Type.TYPE_FIXED32: + return "TYPE_FIXED32"; + case FieldDescriptorProto_Type.TYPE_BOOL: + return "TYPE_BOOL"; + case FieldDescriptorProto_Type.TYPE_STRING: + return "TYPE_STRING"; + case FieldDescriptorProto_Type.TYPE_GROUP: + return "TYPE_GROUP"; + case FieldDescriptorProto_Type.TYPE_MESSAGE: + return "TYPE_MESSAGE"; + case FieldDescriptorProto_Type.TYPE_BYTES: + return "TYPE_BYTES"; + case FieldDescriptorProto_Type.TYPE_UINT32: + return "TYPE_UINT32"; + case FieldDescriptorProto_Type.TYPE_ENUM: + return "TYPE_ENUM"; + case FieldDescriptorProto_Type.TYPE_SFIXED32: + return "TYPE_SFIXED32"; + case FieldDescriptorProto_Type.TYPE_SFIXED64: + return "TYPE_SFIXED64"; + case FieldDescriptorProto_Type.TYPE_SINT32: + return "TYPE_SINT32"; + case FieldDescriptorProto_Type.TYPE_SINT64: + return "TYPE_SINT64"; + case FieldDescriptorProto_Type.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +export enum FieldDescriptorProto_Label { + /** LABEL_OPTIONAL - 0 is reserved for errors */ + LABEL_OPTIONAL = 1, + LABEL_REPEATED = 3, + /** + * LABEL_REQUIRED - The required label is only allowed in google.protobuf. In proto3 and Editions + * it's explicitly prohibited. In Editions, the `field_presence` feature + * can be used to get this behavior. + */ + LABEL_REQUIRED = 2, + UNRECOGNIZED = -1, +} + +export function fieldDescriptorProto_LabelFromJSON(object: any): FieldDescriptorProto_Label { + switch (object) { + case 1: + case "LABEL_OPTIONAL": + return FieldDescriptorProto_Label.LABEL_OPTIONAL; + case 3: + case "LABEL_REPEATED": + return FieldDescriptorProto_Label.LABEL_REPEATED; + case 2: + case "LABEL_REQUIRED": + return FieldDescriptorProto_Label.LABEL_REQUIRED; + case -1: + case "UNRECOGNIZED": + default: + return FieldDescriptorProto_Label.UNRECOGNIZED; + } +} + +export function fieldDescriptorProto_LabelToJSON(object: FieldDescriptorProto_Label): string { + switch (object) { + case FieldDescriptorProto_Label.LABEL_OPTIONAL: + return "LABEL_OPTIONAL"; + case FieldDescriptorProto_Label.LABEL_REPEATED: + return "LABEL_REPEATED"; + case FieldDescriptorProto_Label.LABEL_REQUIRED: + return "LABEL_REQUIRED"; + case FieldDescriptorProto_Label.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** Describes a oneof. */ +export interface OneofDescriptorProto { + name?: string | undefined; + options?: OneofOptions | undefined; +} + +/** Describes an enum type. */ +export interface EnumDescriptorProto { + name?: string | undefined; + value: EnumValueDescriptorProto[]; + options?: + | EnumOptions + | undefined; + /** + * Range of reserved numeric values. Reserved numeric values may not be used + * by enum values in the same enum declaration. Reserved ranges may not + * overlap. + */ + reservedRange: EnumDescriptorProto_EnumReservedRange[]; + /** + * Reserved enum value names, which may not be reused. A given name may only + * be reserved once. + */ + reservedName: string[]; + /** Support for `export` and `local` keywords on enums. */ + visibility?: SymbolVisibility | undefined; +} + +/** + * Range of reserved numeric values. Reserved values may not be used by + * entries in the same enum. Reserved ranges may not overlap. + * + * Note that this is distinct from DescriptorProto.ReservedRange in that it + * is inclusive such that it can appropriately represent the entire int32 + * domain. + */ +export interface EnumDescriptorProto_EnumReservedRange { + /** Inclusive. */ + start?: + | number + | undefined; + /** Inclusive. */ + end?: number | undefined; +} + +/** Describes a value within an enum. */ +export interface EnumValueDescriptorProto { + name?: string | undefined; + number?: number | undefined; + options?: EnumValueOptions | undefined; +} + +/** Describes a service. */ +export interface ServiceDescriptorProto { + name?: string | undefined; + method: MethodDescriptorProto[]; + options?: ServiceOptions | undefined; +} + +/** Describes a method of a service. */ +export interface MethodDescriptorProto { + name?: + | string + | undefined; + /** + * Input and output type names. These are resolved in the same way as + * FieldDescriptorProto.type_name, but must refer to a message type. + */ + inputType?: string | undefined; + outputType?: string | undefined; + options?: + | MethodOptions + | undefined; + /** Identifies if client streams multiple client messages */ + clientStreaming?: + | boolean + | undefined; + /** Identifies if server streams multiple server messages */ + serverStreaming?: boolean | undefined; +} + +export interface FileOptions { + /** + * Sets the Java package where classes generated from this .proto will be + * placed. By default, the proto package is used, but this is often + * inappropriate because proto packages do not normally start with backwards + * domain names. + */ + javaPackage?: + | string + | undefined; + /** + * Controls the name of the wrapper Java class generated for the .proto file. + * That class will always contain the .proto file's getDescriptor() method as + * well as any top-level extensions defined in the .proto file. + * If java_multiple_files is disabled, then all the other classes from the + * .proto file will be nested inside the single wrapper outer class. + */ + javaOuterClassname?: + | string + | undefined; + /** + * If enabled, then the Java code generator will generate a separate .java + * file for each top-level message, enum, and service defined in the .proto + * file. Thus, these types will *not* be nested inside the wrapper class + * named by java_outer_classname. However, the wrapper class will still be + * generated to contain the file's getDescriptor() method as well as any + * top-level extensions defined in the file. + */ + javaMultipleFiles?: + | boolean + | undefined; + /** + * This option does nothing. + * + * @deprecated + */ + javaGenerateEqualsAndHash?: + | boolean + | undefined; + /** + * A proto2 file can set this to true to opt in to UTF-8 checking for Java, + * which will throw an exception if invalid UTF-8 is parsed from the wire or + * assigned to a string field. + * + * TODO: clarify exactly what kinds of field types this option + * applies to, and update these docs accordingly. + * + * Proto3 files already perform these checks. Setting the option explicitly to + * false has no effect: it cannot be used to opt proto3 files out of UTF-8 + * checks. + */ + javaStringCheckUtf8?: boolean | undefined; + optimizeFor?: + | FileOptions_OptimizeMode + | undefined; + /** + * Sets the Go package where structs generated from this .proto will be + * placed. If omitted, the Go package will be derived from the following: + * - The basename of the package import path, if provided. + * - Otherwise, the package statement in the .proto file, if present. + * - Otherwise, the basename of the .proto file, without extension. + */ + goPackage?: + | string + | undefined; + /** + * Should generic services be generated in each language? "Generic" services + * are not specific to any particular RPC system. They are generated by the + * main code generators in each language (without additional plugins). + * Generic services were the only kind of service generation supported by + * early versions of google.protobuf. + * + * Generic services are now considered deprecated in favor of using plugins + * that generate code specific to your particular RPC system. Therefore, + * these default to false. Old code which depends on generic services should + * explicitly set them to true. + */ + ccGenericServices?: boolean | undefined; + javaGenericServices?: boolean | undefined; + pyGenericServices?: + | boolean + | undefined; + /** + * Is this file deprecated? + * Depending on the target platform, this can emit Deprecated annotations + * for everything in the file, or it will be completely ignored; in the very + * least, this is a formalization for deprecating files. + */ + deprecated?: + | boolean + | undefined; + /** + * Enables the use of arenas for the proto messages in this file. This applies + * only to generated classes for C++. + */ + ccEnableArenas?: + | boolean + | undefined; + /** + * Sets the objective c class prefix which is prepended to all objective c + * generated classes from this .proto. There is no default. + */ + objcClassPrefix?: + | string + | undefined; + /** Namespace for generated classes; defaults to the package. */ + csharpNamespace?: + | string + | undefined; + /** + * By default Swift generators will take the proto package and CamelCase it + * replacing '.' with underscore and use that to prefix the types/symbols + * defined. When this options is provided, they will use this value instead + * to prefix the types/symbols defined. + */ + swiftPrefix?: + | string + | undefined; + /** + * Sets the php class prefix which is prepended to all php generated classes + * from this .proto. Default is empty. + */ + phpClassPrefix?: + | string + | undefined; + /** + * Use this option to change the namespace of php generated classes. Default + * is empty. When this option is empty, the package name will be used for + * determining the namespace. + */ + phpNamespace?: + | string + | undefined; + /** + * Use this option to change the namespace of php generated metadata classes. + * Default is empty. When this option is empty, the proto file name will be + * used for determining the namespace. + */ + phpMetadataNamespace?: + | string + | undefined; + /** + * Use this option to change the package of ruby generated classes. Default + * is empty. When this option is not set, the package name will be used for + * determining the ruby package. + */ + rubyPackage?: + | string + | undefined; + /** + * Any features defined in the specific edition. + * WARNING: This field should only be used by protobuf plugins or special + * cases like the proto compiler. Other uses are discouraged and + * developers should rely on the protoreflect APIs for their client language. + */ + features?: + | FeatureSet + | undefined; + /** + * The parser stores options it doesn't recognize here. + * See the documentation for the "Options" section above. + */ + uninterpretedOption: UninterpretedOption[]; +} + +/** Generated classes can be optimized for speed or code size. */ +export enum FileOptions_OptimizeMode { + /** SPEED - Generate complete code for parsing, serialization, */ + SPEED = 1, + /** CODE_SIZE - etc. */ + CODE_SIZE = 2, + /** LITE_RUNTIME - Generate code using MessageLite and the lite runtime. */ + LITE_RUNTIME = 3, + UNRECOGNIZED = -1, +} + +export function fileOptions_OptimizeModeFromJSON(object: any): FileOptions_OptimizeMode { + switch (object) { + case 1: + case "SPEED": + return FileOptions_OptimizeMode.SPEED; + case 2: + case "CODE_SIZE": + return FileOptions_OptimizeMode.CODE_SIZE; + case 3: + case "LITE_RUNTIME": + return FileOptions_OptimizeMode.LITE_RUNTIME; + case -1: + case "UNRECOGNIZED": + default: + return FileOptions_OptimizeMode.UNRECOGNIZED; + } +} + +export function fileOptions_OptimizeModeToJSON(object: FileOptions_OptimizeMode): string { + switch (object) { + case FileOptions_OptimizeMode.SPEED: + return "SPEED"; + case FileOptions_OptimizeMode.CODE_SIZE: + return "CODE_SIZE"; + case FileOptions_OptimizeMode.LITE_RUNTIME: + return "LITE_RUNTIME"; + case FileOptions_OptimizeMode.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +export interface MessageOptions { + /** + * Set true to use the old proto1 MessageSet wire format for extensions. + * This is provided for backwards-compatibility with the MessageSet wire + * format. You should not use this for any other reason: It's less + * efficient, has fewer features, and is more complicated. + * + * The message must be defined exactly as follows: + * message Foo { + * option message_set_wire_format = true; + * extensions 4 to max; + * } + * Note that the message cannot have any defined fields; MessageSets only + * have extensions. + * + * All extensions of your type must be singular messages; e.g. they cannot + * be int32s, enums, or repeated messages. + * + * Because this is an option, the above two restrictions are not enforced by + * the protocol compiler. + */ + messageSetWireFormat?: + | boolean + | undefined; + /** + * Disables the generation of the standard "descriptor()" accessor, which can + * conflict with a field of the same name. This is meant to make migration + * from proto1 easier; new code should avoid fields named "descriptor". + */ + noStandardDescriptorAccessor?: + | boolean + | undefined; + /** + * Is this message deprecated? + * Depending on the target platform, this can emit Deprecated annotations + * for the message, or it will be completely ignored; in the very least, + * this is a formalization for deprecating messages. + */ + deprecated?: + | boolean + | undefined; + /** + * Whether the message is an automatically generated map entry type for the + * maps field. + * + * For maps fields: + * map map_field = 1; + * The parsed descriptor looks like: + * message MapFieldEntry { + * option map_entry = true; + * optional KeyType key = 1; + * optional ValueType value = 2; + * } + * repeated MapFieldEntry map_field = 1; + * + * Implementations may choose not to generate the map_entry=true message, but + * use a native map in the target language to hold the keys and values. + * The reflection APIs in such implementations still need to work as + * if the field is a repeated message field. + * + * NOTE: Do not set the option in .proto files. Always use the maps syntax + * instead. The option should only be implicitly set by the proto compiler + * parser. + */ + mapEntry?: + | boolean + | undefined; + /** + * Enable the legacy handling of JSON field name conflicts. This lowercases + * and strips underscored from the fields before comparison in proto3 only. + * The new behavior takes `json_name` into account and applies to proto2 as + * well. + * + * This should only be used as a temporary measure against broken builds due + * to the change in behavior for JSON field name conflicts. + * + * TODO This is legacy behavior we plan to remove once downstream + * teams have had time to migrate. + * + * @deprecated + */ + deprecatedLegacyJsonFieldConflicts?: + | boolean + | undefined; + /** + * Any features defined in the specific edition. + * WARNING: This field should only be used by protobuf plugins or special + * cases like the proto compiler. Other uses are discouraged and + * developers should rely on the protoreflect APIs for their client language. + */ + features?: + | FeatureSet + | undefined; + /** The parser stores options it doesn't recognize here. See above. */ + uninterpretedOption: UninterpretedOption[]; +} + +export interface FieldOptions { + /** + * NOTE: ctype is deprecated. Use `features.(pb.cpp).string_type` instead. + * The ctype option instructs the C++ code generator to use a different + * representation of the field than it normally would. See the specific + * options below. This option is only implemented to support use of + * [ctype=CORD] and [ctype=STRING] (the default) on non-repeated fields of + * type "bytes" in the open source release. + * TODO: make ctype actually deprecated. + */ + ctype?: + | FieldOptions_CType + | undefined; + /** + * The packed option can be enabled for repeated primitive fields to enable + * a more efficient representation on the wire. Rather than repeatedly + * writing the tag and type for each element, the entire array is encoded as + * a single length-delimited blob. In proto3, only explicit setting it to + * false will avoid using packed encoding. This option is prohibited in + * Editions, but the `repeated_field_encoding` feature can be used to control + * the behavior. + */ + packed?: + | boolean + | undefined; + /** + * The jstype option determines the JavaScript type used for values of the + * field. The option is permitted only for 64 bit integral and fixed types + * (int64, uint64, sint64, fixed64, sfixed64). A field with jstype JS_STRING + * is represented as JavaScript string, which avoids loss of precision that + * can happen when a large value is converted to a floating point JavaScript. + * Specifying JS_NUMBER for the jstype causes the generated JavaScript code to + * use the JavaScript "number" type. The behavior of the default option + * JS_NORMAL is implementation dependent. + * + * This option is an enum to permit additional types to be added, e.g. + * goog.math.Integer. + */ + jstype?: + | FieldOptions_JSType + | undefined; + /** + * Should this field be parsed lazily? Lazy applies only to message-type + * fields. It means that when the outer message is initially parsed, the + * inner message's contents will not be parsed but instead stored in encoded + * form. The inner message will actually be parsed when it is first accessed. + * + * This is only a hint. Implementations are free to choose whether to use + * eager or lazy parsing regardless of the value of this option. However, + * setting this option true suggests that the protocol author believes that + * using lazy parsing on this field is worth the additional bookkeeping + * overhead typically needed to implement it. + * + * This option does not affect the public interface of any generated code; + * all method signatures remain the same. Furthermore, thread-safety of the + * interface is not affected by this option; const methods remain safe to + * call from multiple threads concurrently, while non-const methods continue + * to require exclusive access. + * + * Note that lazy message fields are still eagerly verified to check + * ill-formed wireformat or missing required fields. Calling IsInitialized() + * on the outer message would fail if the inner message has missing required + * fields. Failed verification would result in parsing failure (except when + * uninitialized messages are acceptable). + */ + lazy?: + | boolean + | undefined; + /** + * unverified_lazy does no correctness checks on the byte stream. This should + * only be used where lazy with verification is prohibitive for performance + * reasons. + */ + unverifiedLazy?: + | boolean + | undefined; + /** + * Is this field deprecated? + * Depending on the target platform, this can emit Deprecated annotations + * for accessors, or it will be completely ignored; in the very least, this + * is a formalization for deprecating fields. + */ + deprecated?: + | boolean + | undefined; + /** + * DEPRECATED. DO NOT USE! + * For Google-internal migration only. Do not use. + * + * @deprecated + */ + weak?: + | boolean + | undefined; + /** + * Indicate that the field value should not be printed out when using debug + * formats, e.g. when the field contains sensitive credentials. + */ + debugRedact?: boolean | undefined; + retention?: FieldOptions_OptionRetention | undefined; + targets: FieldOptions_OptionTargetType[]; + editionDefaults: FieldOptions_EditionDefault[]; + /** + * Any features defined in the specific edition. + * WARNING: This field should only be used by protobuf plugins or special + * cases like the proto compiler. Other uses are discouraged and + * developers should rely on the protoreflect APIs for their client language. + */ + features?: FeatureSet | undefined; + featureSupport?: + | FieldOptions_FeatureSupport + | undefined; + /** The parser stores options it doesn't recognize here. See above. */ + uninterpretedOption: UninterpretedOption[]; +} + +export enum FieldOptions_CType { + /** STRING - Default mode. */ + STRING = 0, + /** + * CORD - The option [ctype=CORD] may be applied to a non-repeated field of type + * "bytes". It indicates that in C++, the data should be stored in a Cord + * instead of a string. For very large strings, this may reduce memory + * fragmentation. It may also allow better performance when parsing from a + * Cord, or when parsing with aliasing enabled, as the parsed Cord may then + * alias the original buffer. + */ + CORD = 1, + STRING_PIECE = 2, + UNRECOGNIZED = -1, +} + +export function fieldOptions_CTypeFromJSON(object: any): FieldOptions_CType { + switch (object) { + case 0: + case "STRING": + return FieldOptions_CType.STRING; + case 1: + case "CORD": + return FieldOptions_CType.CORD; + case 2: + case "STRING_PIECE": + return FieldOptions_CType.STRING_PIECE; + case -1: + case "UNRECOGNIZED": + default: + return FieldOptions_CType.UNRECOGNIZED; + } +} + +export function fieldOptions_CTypeToJSON(object: FieldOptions_CType): string { + switch (object) { + case FieldOptions_CType.STRING: + return "STRING"; + case FieldOptions_CType.CORD: + return "CORD"; + case FieldOptions_CType.STRING_PIECE: + return "STRING_PIECE"; + case FieldOptions_CType.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +export enum FieldOptions_JSType { + /** JS_NORMAL - Use the default type. */ + JS_NORMAL = 0, + /** JS_STRING - Use JavaScript strings. */ + JS_STRING = 1, + /** JS_NUMBER - Use JavaScript numbers. */ + JS_NUMBER = 2, + UNRECOGNIZED = -1, +} + +export function fieldOptions_JSTypeFromJSON(object: any): FieldOptions_JSType { + switch (object) { + case 0: + case "JS_NORMAL": + return FieldOptions_JSType.JS_NORMAL; + case 1: + case "JS_STRING": + return FieldOptions_JSType.JS_STRING; + case 2: + case "JS_NUMBER": + return FieldOptions_JSType.JS_NUMBER; + case -1: + case "UNRECOGNIZED": + default: + return FieldOptions_JSType.UNRECOGNIZED; + } +} + +export function fieldOptions_JSTypeToJSON(object: FieldOptions_JSType): string { + switch (object) { + case FieldOptions_JSType.JS_NORMAL: + return "JS_NORMAL"; + case FieldOptions_JSType.JS_STRING: + return "JS_STRING"; + case FieldOptions_JSType.JS_NUMBER: + return "JS_NUMBER"; + case FieldOptions_JSType.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** If set to RETENTION_SOURCE, the option will be omitted from the binary. */ +export enum FieldOptions_OptionRetention { + RETENTION_UNKNOWN = 0, + RETENTION_RUNTIME = 1, + RETENTION_SOURCE = 2, + UNRECOGNIZED = -1, +} + +export function fieldOptions_OptionRetentionFromJSON(object: any): FieldOptions_OptionRetention { + switch (object) { + case 0: + case "RETENTION_UNKNOWN": + return FieldOptions_OptionRetention.RETENTION_UNKNOWN; + case 1: + case "RETENTION_RUNTIME": + return FieldOptions_OptionRetention.RETENTION_RUNTIME; + case 2: + case "RETENTION_SOURCE": + return FieldOptions_OptionRetention.RETENTION_SOURCE; + case -1: + case "UNRECOGNIZED": + default: + return FieldOptions_OptionRetention.UNRECOGNIZED; + } +} + +export function fieldOptions_OptionRetentionToJSON(object: FieldOptions_OptionRetention): string { + switch (object) { + case FieldOptions_OptionRetention.RETENTION_UNKNOWN: + return "RETENTION_UNKNOWN"; + case FieldOptions_OptionRetention.RETENTION_RUNTIME: + return "RETENTION_RUNTIME"; + case FieldOptions_OptionRetention.RETENTION_SOURCE: + return "RETENTION_SOURCE"; + case FieldOptions_OptionRetention.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** + * This indicates the types of entities that the field may apply to when used + * as an option. If it is unset, then the field may be freely used as an + * option on any kind of entity. + */ +export enum FieldOptions_OptionTargetType { + TARGET_TYPE_UNKNOWN = 0, + TARGET_TYPE_FILE = 1, + TARGET_TYPE_EXTENSION_RANGE = 2, + TARGET_TYPE_MESSAGE = 3, + TARGET_TYPE_FIELD = 4, + TARGET_TYPE_ONEOF = 5, + TARGET_TYPE_ENUM = 6, + TARGET_TYPE_ENUM_ENTRY = 7, + TARGET_TYPE_SERVICE = 8, + TARGET_TYPE_METHOD = 9, + UNRECOGNIZED = -1, +} + +export function fieldOptions_OptionTargetTypeFromJSON(object: any): FieldOptions_OptionTargetType { + switch (object) { + case 0: + case "TARGET_TYPE_UNKNOWN": + return FieldOptions_OptionTargetType.TARGET_TYPE_UNKNOWN; + case 1: + case "TARGET_TYPE_FILE": + return FieldOptions_OptionTargetType.TARGET_TYPE_FILE; + case 2: + case "TARGET_TYPE_EXTENSION_RANGE": + return FieldOptions_OptionTargetType.TARGET_TYPE_EXTENSION_RANGE; + case 3: + case "TARGET_TYPE_MESSAGE": + return FieldOptions_OptionTargetType.TARGET_TYPE_MESSAGE; + case 4: + case "TARGET_TYPE_FIELD": + return FieldOptions_OptionTargetType.TARGET_TYPE_FIELD; + case 5: + case "TARGET_TYPE_ONEOF": + return FieldOptions_OptionTargetType.TARGET_TYPE_ONEOF; + case 6: + case "TARGET_TYPE_ENUM": + return FieldOptions_OptionTargetType.TARGET_TYPE_ENUM; + case 7: + case "TARGET_TYPE_ENUM_ENTRY": + return FieldOptions_OptionTargetType.TARGET_TYPE_ENUM_ENTRY; + case 8: + case "TARGET_TYPE_SERVICE": + return FieldOptions_OptionTargetType.TARGET_TYPE_SERVICE; + case 9: + case "TARGET_TYPE_METHOD": + return FieldOptions_OptionTargetType.TARGET_TYPE_METHOD; + case -1: + case "UNRECOGNIZED": + default: + return FieldOptions_OptionTargetType.UNRECOGNIZED; + } +} + +export function fieldOptions_OptionTargetTypeToJSON(object: FieldOptions_OptionTargetType): string { + switch (object) { + case FieldOptions_OptionTargetType.TARGET_TYPE_UNKNOWN: + return "TARGET_TYPE_UNKNOWN"; + case FieldOptions_OptionTargetType.TARGET_TYPE_FILE: + return "TARGET_TYPE_FILE"; + case FieldOptions_OptionTargetType.TARGET_TYPE_EXTENSION_RANGE: + return "TARGET_TYPE_EXTENSION_RANGE"; + case FieldOptions_OptionTargetType.TARGET_TYPE_MESSAGE: + return "TARGET_TYPE_MESSAGE"; + case FieldOptions_OptionTargetType.TARGET_TYPE_FIELD: + return "TARGET_TYPE_FIELD"; + case FieldOptions_OptionTargetType.TARGET_TYPE_ONEOF: + return "TARGET_TYPE_ONEOF"; + case FieldOptions_OptionTargetType.TARGET_TYPE_ENUM: + return "TARGET_TYPE_ENUM"; + case FieldOptions_OptionTargetType.TARGET_TYPE_ENUM_ENTRY: + return "TARGET_TYPE_ENUM_ENTRY"; + case FieldOptions_OptionTargetType.TARGET_TYPE_SERVICE: + return "TARGET_TYPE_SERVICE"; + case FieldOptions_OptionTargetType.TARGET_TYPE_METHOD: + return "TARGET_TYPE_METHOD"; + case FieldOptions_OptionTargetType.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +export interface FieldOptions_EditionDefault { + edition?: + | Edition + | undefined; + /** Textproto value. */ + value?: string | undefined; +} + +/** Information about the support window of a feature. */ +export interface FieldOptions_FeatureSupport { + /** + * The edition that this feature was first available in. In editions + * earlier than this one, the default assigned to EDITION_LEGACY will be + * used, and proto files will not be able to override it. + */ + editionIntroduced?: + | Edition + | undefined; + /** + * The edition this feature becomes deprecated in. Using this after this + * edition may trigger warnings. + */ + editionDeprecated?: + | Edition + | undefined; + /** + * The deprecation warning text if this feature is used after the edition it + * was marked deprecated in. + */ + deprecationWarning?: + | string + | undefined; + /** + * The edition this feature is no longer available in. In editions after + * this one, the last default assigned will be used, and proto files will + * not be able to override it. + */ + editionRemoved?: Edition | undefined; +} + +export interface OneofOptions { + /** + * Any features defined in the specific edition. + * WARNING: This field should only be used by protobuf plugins or special + * cases like the proto compiler. Other uses are discouraged and + * developers should rely on the protoreflect APIs for their client language. + */ + features?: + | FeatureSet + | undefined; + /** The parser stores options it doesn't recognize here. See above. */ + uninterpretedOption: UninterpretedOption[]; +} + +export interface EnumOptions { + /** + * Set this option to true to allow mapping different tag names to the same + * value. + */ + allowAlias?: + | boolean + | undefined; + /** + * Is this enum deprecated? + * Depending on the target platform, this can emit Deprecated annotations + * for the enum, or it will be completely ignored; in the very least, this + * is a formalization for deprecating enums. + */ + deprecated?: + | boolean + | undefined; + /** + * Enable the legacy handling of JSON field name conflicts. This lowercases + * and strips underscored from the fields before comparison in proto3 only. + * The new behavior takes `json_name` into account and applies to proto2 as + * well. + * TODO Remove this legacy behavior once downstream teams have + * had time to migrate. + * + * @deprecated + */ + deprecatedLegacyJsonFieldConflicts?: + | boolean + | undefined; + /** + * Any features defined in the specific edition. + * WARNING: This field should only be used by protobuf plugins or special + * cases like the proto compiler. Other uses are discouraged and + * developers should rely on the protoreflect APIs for their client language. + */ + features?: + | FeatureSet + | undefined; + /** The parser stores options it doesn't recognize here. See above. */ + uninterpretedOption: UninterpretedOption[]; +} + +export interface EnumValueOptions { + /** + * Is this enum value deprecated? + * Depending on the target platform, this can emit Deprecated annotations + * for the enum value, or it will be completely ignored; in the very least, + * this is a formalization for deprecating enum values. + */ + deprecated?: + | boolean + | undefined; + /** + * Any features defined in the specific edition. + * WARNING: This field should only be used by protobuf plugins or special + * cases like the proto compiler. Other uses are discouraged and + * developers should rely on the protoreflect APIs for their client language. + */ + features?: + | FeatureSet + | undefined; + /** + * Indicate that fields annotated with this enum value should not be printed + * out when using debug formats, e.g. when the field contains sensitive + * credentials. + */ + debugRedact?: + | boolean + | undefined; + /** Information about the support window of a feature value. */ + featureSupport?: + | FieldOptions_FeatureSupport + | undefined; + /** The parser stores options it doesn't recognize here. See above. */ + uninterpretedOption: UninterpretedOption[]; +} + +export interface ServiceOptions { + /** + * Any features defined in the specific edition. + * WARNING: This field should only be used by protobuf plugins or special + * cases like the proto compiler. Other uses are discouraged and + * developers should rely on the protoreflect APIs for their client language. + */ + features?: + | FeatureSet + | undefined; + /** + * Is this service deprecated? + * Depending on the target platform, this can emit Deprecated annotations + * for the service, or it will be completely ignored; in the very least, + * this is a formalization for deprecating services. + */ + deprecated?: + | boolean + | undefined; + /** The parser stores options it doesn't recognize here. See above. */ + uninterpretedOption: UninterpretedOption[]; +} + +export interface MethodOptions { + /** + * Is this method deprecated? + * Depending on the target platform, this can emit Deprecated annotations + * for the method, or it will be completely ignored; in the very least, + * this is a formalization for deprecating methods. + */ + deprecated?: boolean | undefined; + idempotencyLevel?: + | MethodOptions_IdempotencyLevel + | undefined; + /** + * Any features defined in the specific edition. + * WARNING: This field should only be used by protobuf plugins or special + * cases like the proto compiler. Other uses are discouraged and + * developers should rely on the protoreflect APIs for their client language. + */ + features?: + | FeatureSet + | undefined; + /** The parser stores options it doesn't recognize here. See above. */ + uninterpretedOption: UninterpretedOption[]; +} + +/** + * Is this method side-effect-free (or safe in HTTP parlance), or idempotent, + * or neither? HTTP based RPC implementation may choose GET verb for safe + * methods, and PUT verb for idempotent methods instead of the default POST. + */ +export enum MethodOptions_IdempotencyLevel { + IDEMPOTENCY_UNKNOWN = 0, + /** NO_SIDE_EFFECTS - implies idempotent */ + NO_SIDE_EFFECTS = 1, + /** IDEMPOTENT - idempotent, but may have side effects */ + IDEMPOTENT = 2, + UNRECOGNIZED = -1, +} + +export function methodOptions_IdempotencyLevelFromJSON(object: any): MethodOptions_IdempotencyLevel { + switch (object) { + case 0: + case "IDEMPOTENCY_UNKNOWN": + return MethodOptions_IdempotencyLevel.IDEMPOTENCY_UNKNOWN; + case 1: + case "NO_SIDE_EFFECTS": + return MethodOptions_IdempotencyLevel.NO_SIDE_EFFECTS; + case 2: + case "IDEMPOTENT": + return MethodOptions_IdempotencyLevel.IDEMPOTENT; + case -1: + case "UNRECOGNIZED": + default: + return MethodOptions_IdempotencyLevel.UNRECOGNIZED; + } +} + +export function methodOptions_IdempotencyLevelToJSON(object: MethodOptions_IdempotencyLevel): string { + switch (object) { + case MethodOptions_IdempotencyLevel.IDEMPOTENCY_UNKNOWN: + return "IDEMPOTENCY_UNKNOWN"; + case MethodOptions_IdempotencyLevel.NO_SIDE_EFFECTS: + return "NO_SIDE_EFFECTS"; + case MethodOptions_IdempotencyLevel.IDEMPOTENT: + return "IDEMPOTENT"; + case MethodOptions_IdempotencyLevel.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** + * A message representing a option the parser does not recognize. This only + * appears in options protos created by the compiler::Parser class. + * DescriptorPool resolves these when building Descriptor objects. Therefore, + * options protos in descriptor objects (e.g. returned by Descriptor::options(), + * or produced by Descriptor::CopyTo()) will never have UninterpretedOptions + * in them. + */ +export interface UninterpretedOption { + name: UninterpretedOption_NamePart[]; + /** + * The value of the uninterpreted option, in whatever type the tokenizer + * identified it as during parsing. Exactly one of these should be set. + */ + identifierValue?: string | undefined; + positiveIntValue?: number | undefined; + negativeIntValue?: number | undefined; + doubleValue?: number | undefined; + stringValue?: Buffer | undefined; + aggregateValue?: string | undefined; +} + +/** + * The name of the uninterpreted option. Each string represents a segment in + * a dot-separated name. is_extension is true iff a segment represents an + * extension (denoted with parentheses in options specs in .proto files). + * E.g.,{ ["foo", false], ["bar.baz", true], ["moo", false] } represents + * "foo.(bar.baz).moo". + */ +export interface UninterpretedOption_NamePart { + namePart: string; + isExtension: boolean; +} + +/** + * TODO Enums in C++ gencode (and potentially other languages) are + * not well scoped. This means that each of the feature enums below can clash + * with each other. The short names we've chosen maximize call-site + * readability, but leave us very open to this scenario. A future feature will + * be designed and implemented to handle this, hopefully before we ever hit a + * conflict here. + */ +export interface FeatureSet { + fieldPresence?: FeatureSet_FieldPresence | undefined; + enumType?: FeatureSet_EnumType | undefined; + repeatedFieldEncoding?: FeatureSet_RepeatedFieldEncoding | undefined; + utf8Validation?: FeatureSet_Utf8Validation | undefined; + messageEncoding?: FeatureSet_MessageEncoding | undefined; + jsonFormat?: FeatureSet_JsonFormat | undefined; + enforceNamingStyle?: FeatureSet_EnforceNamingStyle | undefined; + defaultSymbolVisibility?: FeatureSet_VisibilityFeature_DefaultSymbolVisibility | undefined; +} + +export enum FeatureSet_FieldPresence { + FIELD_PRESENCE_UNKNOWN = 0, + EXPLICIT = 1, + IMPLICIT = 2, + LEGACY_REQUIRED = 3, + UNRECOGNIZED = -1, +} + +export function featureSet_FieldPresenceFromJSON(object: any): FeatureSet_FieldPresence { + switch (object) { + case 0: + case "FIELD_PRESENCE_UNKNOWN": + return FeatureSet_FieldPresence.FIELD_PRESENCE_UNKNOWN; + case 1: + case "EXPLICIT": + return FeatureSet_FieldPresence.EXPLICIT; + case 2: + case "IMPLICIT": + return FeatureSet_FieldPresence.IMPLICIT; + case 3: + case "LEGACY_REQUIRED": + return FeatureSet_FieldPresence.LEGACY_REQUIRED; + case -1: + case "UNRECOGNIZED": + default: + return FeatureSet_FieldPresence.UNRECOGNIZED; + } +} + +export function featureSet_FieldPresenceToJSON(object: FeatureSet_FieldPresence): string { + switch (object) { + case FeatureSet_FieldPresence.FIELD_PRESENCE_UNKNOWN: + return "FIELD_PRESENCE_UNKNOWN"; + case FeatureSet_FieldPresence.EXPLICIT: + return "EXPLICIT"; + case FeatureSet_FieldPresence.IMPLICIT: + return "IMPLICIT"; + case FeatureSet_FieldPresence.LEGACY_REQUIRED: + return "LEGACY_REQUIRED"; + case FeatureSet_FieldPresence.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +export enum FeatureSet_EnumType { + ENUM_TYPE_UNKNOWN = 0, + OPEN = 1, + CLOSED = 2, + UNRECOGNIZED = -1, +} + +export function featureSet_EnumTypeFromJSON(object: any): FeatureSet_EnumType { + switch (object) { + case 0: + case "ENUM_TYPE_UNKNOWN": + return FeatureSet_EnumType.ENUM_TYPE_UNKNOWN; + case 1: + case "OPEN": + return FeatureSet_EnumType.OPEN; + case 2: + case "CLOSED": + return FeatureSet_EnumType.CLOSED; + case -1: + case "UNRECOGNIZED": + default: + return FeatureSet_EnumType.UNRECOGNIZED; + } +} + +export function featureSet_EnumTypeToJSON(object: FeatureSet_EnumType): string { + switch (object) { + case FeatureSet_EnumType.ENUM_TYPE_UNKNOWN: + return "ENUM_TYPE_UNKNOWN"; + case FeatureSet_EnumType.OPEN: + return "OPEN"; + case FeatureSet_EnumType.CLOSED: + return "CLOSED"; + case FeatureSet_EnumType.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +export enum FeatureSet_RepeatedFieldEncoding { + REPEATED_FIELD_ENCODING_UNKNOWN = 0, + PACKED = 1, + EXPANDED = 2, + UNRECOGNIZED = -1, +} + +export function featureSet_RepeatedFieldEncodingFromJSON(object: any): FeatureSet_RepeatedFieldEncoding { + switch (object) { + case 0: + case "REPEATED_FIELD_ENCODING_UNKNOWN": + return FeatureSet_RepeatedFieldEncoding.REPEATED_FIELD_ENCODING_UNKNOWN; + case 1: + case "PACKED": + return FeatureSet_RepeatedFieldEncoding.PACKED; + case 2: + case "EXPANDED": + return FeatureSet_RepeatedFieldEncoding.EXPANDED; + case -1: + case "UNRECOGNIZED": + default: + return FeatureSet_RepeatedFieldEncoding.UNRECOGNIZED; + } +} + +export function featureSet_RepeatedFieldEncodingToJSON(object: FeatureSet_RepeatedFieldEncoding): string { + switch (object) { + case FeatureSet_RepeatedFieldEncoding.REPEATED_FIELD_ENCODING_UNKNOWN: + return "REPEATED_FIELD_ENCODING_UNKNOWN"; + case FeatureSet_RepeatedFieldEncoding.PACKED: + return "PACKED"; + case FeatureSet_RepeatedFieldEncoding.EXPANDED: + return "EXPANDED"; + case FeatureSet_RepeatedFieldEncoding.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +export enum FeatureSet_Utf8Validation { + UTF8_VALIDATION_UNKNOWN = 0, + VERIFY = 2, + NONE = 3, + UNRECOGNIZED = -1, +} + +export function featureSet_Utf8ValidationFromJSON(object: any): FeatureSet_Utf8Validation { + switch (object) { + case 0: + case "UTF8_VALIDATION_UNKNOWN": + return FeatureSet_Utf8Validation.UTF8_VALIDATION_UNKNOWN; + case 2: + case "VERIFY": + return FeatureSet_Utf8Validation.VERIFY; + case 3: + case "NONE": + return FeatureSet_Utf8Validation.NONE; + case -1: + case "UNRECOGNIZED": + default: + return FeatureSet_Utf8Validation.UNRECOGNIZED; + } +} + +export function featureSet_Utf8ValidationToJSON(object: FeatureSet_Utf8Validation): string { + switch (object) { + case FeatureSet_Utf8Validation.UTF8_VALIDATION_UNKNOWN: + return "UTF8_VALIDATION_UNKNOWN"; + case FeatureSet_Utf8Validation.VERIFY: + return "VERIFY"; + case FeatureSet_Utf8Validation.NONE: + return "NONE"; + case FeatureSet_Utf8Validation.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +export enum FeatureSet_MessageEncoding { + MESSAGE_ENCODING_UNKNOWN = 0, + LENGTH_PREFIXED = 1, + DELIMITED = 2, + UNRECOGNIZED = -1, +} + +export function featureSet_MessageEncodingFromJSON(object: any): FeatureSet_MessageEncoding { + switch (object) { + case 0: + case "MESSAGE_ENCODING_UNKNOWN": + return FeatureSet_MessageEncoding.MESSAGE_ENCODING_UNKNOWN; + case 1: + case "LENGTH_PREFIXED": + return FeatureSet_MessageEncoding.LENGTH_PREFIXED; + case 2: + case "DELIMITED": + return FeatureSet_MessageEncoding.DELIMITED; + case -1: + case "UNRECOGNIZED": + default: + return FeatureSet_MessageEncoding.UNRECOGNIZED; + } +} + +export function featureSet_MessageEncodingToJSON(object: FeatureSet_MessageEncoding): string { + switch (object) { + case FeatureSet_MessageEncoding.MESSAGE_ENCODING_UNKNOWN: + return "MESSAGE_ENCODING_UNKNOWN"; + case FeatureSet_MessageEncoding.LENGTH_PREFIXED: + return "LENGTH_PREFIXED"; + case FeatureSet_MessageEncoding.DELIMITED: + return "DELIMITED"; + case FeatureSet_MessageEncoding.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +export enum FeatureSet_JsonFormat { + JSON_FORMAT_UNKNOWN = 0, + ALLOW = 1, + LEGACY_BEST_EFFORT = 2, + UNRECOGNIZED = -1, +} + +export function featureSet_JsonFormatFromJSON(object: any): FeatureSet_JsonFormat { + switch (object) { + case 0: + case "JSON_FORMAT_UNKNOWN": + return FeatureSet_JsonFormat.JSON_FORMAT_UNKNOWN; + case 1: + case "ALLOW": + return FeatureSet_JsonFormat.ALLOW; + case 2: + case "LEGACY_BEST_EFFORT": + return FeatureSet_JsonFormat.LEGACY_BEST_EFFORT; + case -1: + case "UNRECOGNIZED": + default: + return FeatureSet_JsonFormat.UNRECOGNIZED; + } +} + +export function featureSet_JsonFormatToJSON(object: FeatureSet_JsonFormat): string { + switch (object) { + case FeatureSet_JsonFormat.JSON_FORMAT_UNKNOWN: + return "JSON_FORMAT_UNKNOWN"; + case FeatureSet_JsonFormat.ALLOW: + return "ALLOW"; + case FeatureSet_JsonFormat.LEGACY_BEST_EFFORT: + return "LEGACY_BEST_EFFORT"; + case FeatureSet_JsonFormat.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +export enum FeatureSet_EnforceNamingStyle { + ENFORCE_NAMING_STYLE_UNKNOWN = 0, + STYLE2024 = 1, + STYLE_LEGACY = 2, + UNRECOGNIZED = -1, +} + +export function featureSet_EnforceNamingStyleFromJSON(object: any): FeatureSet_EnforceNamingStyle { + switch (object) { + case 0: + case "ENFORCE_NAMING_STYLE_UNKNOWN": + return FeatureSet_EnforceNamingStyle.ENFORCE_NAMING_STYLE_UNKNOWN; + case 1: + case "STYLE2024": + return FeatureSet_EnforceNamingStyle.STYLE2024; + case 2: + case "STYLE_LEGACY": + return FeatureSet_EnforceNamingStyle.STYLE_LEGACY; + case -1: + case "UNRECOGNIZED": + default: + return FeatureSet_EnforceNamingStyle.UNRECOGNIZED; + } +} + +export function featureSet_EnforceNamingStyleToJSON(object: FeatureSet_EnforceNamingStyle): string { + switch (object) { + case FeatureSet_EnforceNamingStyle.ENFORCE_NAMING_STYLE_UNKNOWN: + return "ENFORCE_NAMING_STYLE_UNKNOWN"; + case FeatureSet_EnforceNamingStyle.STYLE2024: + return "STYLE2024"; + case FeatureSet_EnforceNamingStyle.STYLE_LEGACY: + return "STYLE_LEGACY"; + case FeatureSet_EnforceNamingStyle.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +export interface FeatureSet_VisibilityFeature { +} + +export enum FeatureSet_VisibilityFeature_DefaultSymbolVisibility { + DEFAULT_SYMBOL_VISIBILITY_UNKNOWN = 0, + /** EXPORT_ALL - Default pre-EDITION_2024, all UNSET visibility are export. */ + EXPORT_ALL = 1, + /** EXPORT_TOP_LEVEL - All top-level symbols default to export, nested default to local. */ + EXPORT_TOP_LEVEL = 2, + /** LOCAL_ALL - All symbols default to local. */ + LOCAL_ALL = 3, + /** + * STRICT - All symbols local by default. Nested types cannot be exported. + * With special case caveat for message { enum {} reserved 1 to max; } + * This is the recommended setting for new protos. + */ + STRICT = 4, + UNRECOGNIZED = -1, +} + +export function featureSet_VisibilityFeature_DefaultSymbolVisibilityFromJSON( + object: any, +): FeatureSet_VisibilityFeature_DefaultSymbolVisibility { + switch (object) { + case 0: + case "DEFAULT_SYMBOL_VISIBILITY_UNKNOWN": + return FeatureSet_VisibilityFeature_DefaultSymbolVisibility.DEFAULT_SYMBOL_VISIBILITY_UNKNOWN; + case 1: + case "EXPORT_ALL": + return FeatureSet_VisibilityFeature_DefaultSymbolVisibility.EXPORT_ALL; + case 2: + case "EXPORT_TOP_LEVEL": + return FeatureSet_VisibilityFeature_DefaultSymbolVisibility.EXPORT_TOP_LEVEL; + case 3: + case "LOCAL_ALL": + return FeatureSet_VisibilityFeature_DefaultSymbolVisibility.LOCAL_ALL; + case 4: + case "STRICT": + return FeatureSet_VisibilityFeature_DefaultSymbolVisibility.STRICT; + case -1: + case "UNRECOGNIZED": + default: + return FeatureSet_VisibilityFeature_DefaultSymbolVisibility.UNRECOGNIZED; + } +} + +export function featureSet_VisibilityFeature_DefaultSymbolVisibilityToJSON( + object: FeatureSet_VisibilityFeature_DefaultSymbolVisibility, +): string { + switch (object) { + case FeatureSet_VisibilityFeature_DefaultSymbolVisibility.DEFAULT_SYMBOL_VISIBILITY_UNKNOWN: + return "DEFAULT_SYMBOL_VISIBILITY_UNKNOWN"; + case FeatureSet_VisibilityFeature_DefaultSymbolVisibility.EXPORT_ALL: + return "EXPORT_ALL"; + case FeatureSet_VisibilityFeature_DefaultSymbolVisibility.EXPORT_TOP_LEVEL: + return "EXPORT_TOP_LEVEL"; + case FeatureSet_VisibilityFeature_DefaultSymbolVisibility.LOCAL_ALL: + return "LOCAL_ALL"; + case FeatureSet_VisibilityFeature_DefaultSymbolVisibility.STRICT: + return "STRICT"; + case FeatureSet_VisibilityFeature_DefaultSymbolVisibility.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** + * A compiled specification for the defaults of a set of features. These + * messages are generated from FeatureSet extensions and can be used to seed + * feature resolution. The resolution with this object becomes a simple search + * for the closest matching edition, followed by proto merges. + */ +export interface FeatureSetDefaults { + defaults: FeatureSetDefaults_FeatureSetEditionDefault[]; + /** + * The minimum supported edition (inclusive) when this was constructed. + * Editions before this will not have defaults. + */ + minimumEdition?: + | Edition + | undefined; + /** + * The maximum known edition (inclusive) when this was constructed. Editions + * after this will not have reliable defaults. + */ + maximumEdition?: Edition | undefined; +} + +/** + * A map from every known edition with a unique set of defaults to its + * defaults. Not all editions may be contained here. For a given edition, + * the defaults at the closest matching edition ordered at or before it should + * be used. This field must be in strict ascending order by edition. + */ +export interface FeatureSetDefaults_FeatureSetEditionDefault { + edition?: + | Edition + | undefined; + /** Defaults of features that can be overridden in this edition. */ + overridableFeatures?: + | FeatureSet + | undefined; + /** Defaults of features that can't be overridden in this edition. */ + fixedFeatures?: FeatureSet | undefined; +} + +/** + * Encapsulates information about the original source file from which a + * FileDescriptorProto was generated. + */ +export interface SourceCodeInfo { + /** + * A Location identifies a piece of source code in a .proto file which + * corresponds to a particular definition. This information is intended + * to be useful to IDEs, code indexers, documentation generators, and similar + * tools. + * + * For example, say we have a file like: + * message Foo { + * optional string foo = 1; + * } + * Let's look at just the field definition: + * optional string foo = 1; + * ^ ^^ ^^ ^ ^^^ + * a bc de f ghi + * We have the following locations: + * span path represents + * [a,i) [ 4, 0, 2, 0 ] The whole field definition. + * [a,b) [ 4, 0, 2, 0, 4 ] The label (optional). + * [c,d) [ 4, 0, 2, 0, 5 ] The type (string). + * [e,f) [ 4, 0, 2, 0, 1 ] The name (foo). + * [g,h) [ 4, 0, 2, 0, 3 ] The number (1). + * + * Notes: + * - A location may refer to a repeated field itself (i.e. not to any + * particular index within it). This is used whenever a set of elements are + * logically enclosed in a single code segment. For example, an entire + * extend block (possibly containing multiple extension definitions) will + * have an outer location whose path refers to the "extensions" repeated + * field without an index. + * - Multiple locations may have the same path. This happens when a single + * logical declaration is spread out across multiple places. The most + * obvious example is the "extend" block again -- there may be multiple + * extend blocks in the same scope, each of which will have the same path. + * - A location's span is not always a subset of its parent's span. For + * example, the "extendee" of an extension declaration appears at the + * beginning of the "extend" block and is shared by all extensions within + * the block. + * - Just because a location's span is a subset of some other location's span + * does not mean that it is a descendant. For example, a "group" defines + * both a type and a field in a single declaration. Thus, the locations + * corresponding to the type and field and their components will overlap. + * - Code which tries to interpret locations should probably be designed to + * ignore those that it doesn't understand, as more types of locations could + * be recorded in the future. + */ + location: SourceCodeInfo_Location[]; +} + +export interface SourceCodeInfo_Location { + /** + * Identifies which part of the FileDescriptorProto was defined at this + * location. + * + * Each element is a field number or an index. They form a path from + * the root FileDescriptorProto to the place where the definition appears. + * For example, this path: + * [ 4, 3, 2, 7, 1 ] + * refers to: + * file.message_type(3) // 4, 3 + * .field(7) // 2, 7 + * .name() // 1 + * This is because FileDescriptorProto.message_type has field number 4: + * repeated DescriptorProto message_type = 4; + * and DescriptorProto.field has field number 2: + * repeated FieldDescriptorProto field = 2; + * and FieldDescriptorProto.name has field number 1: + * optional string name = 1; + * + * Thus, the above path gives the location of a field name. If we removed + * the last element: + * [ 4, 3, 2, 7 ] + * this path refers to the whole field declaration (from the beginning + * of the label to the terminating semicolon). + */ + path: number[]; + /** + * Always has exactly three or four elements: start line, start column, + * end line (optional, otherwise assumed same as start line), end column. + * These are packed into a single field for efficiency. Note that line + * and column numbers are zero-based -- typically you will want to add + * 1 to each before displaying to a user. + */ + span: number[]; + /** + * If this SourceCodeInfo represents a complete declaration, these are any + * comments appearing before and after the declaration which appear to be + * attached to the declaration. + * + * A series of line comments appearing on consecutive lines, with no other + * tokens appearing on those lines, will be treated as a single comment. + * + * leading_detached_comments will keep paragraphs of comments that appear + * before (but not connected to) the current element. Each paragraph, + * separated by empty lines, will be one comment element in the repeated + * field. + * + * Only the comment content is provided; comment markers (e.g. //) are + * stripped out. For block comments, leading whitespace and an asterisk + * will be stripped from the beginning of each line other than the first. + * Newlines are included in the output. + * + * Examples: + * + * optional int32 foo = 1; // Comment attached to foo. + * // Comment attached to bar. + * optional int32 bar = 2; + * + * optional string baz = 3; + * // Comment attached to baz. + * // Another line attached to baz. + * + * // Comment attached to moo. + * // + * // Another line attached to moo. + * optional double moo = 4; + * + * // Detached comment for corge. This is not leading or trailing comments + * // to moo or corge because there are blank lines separating it from + * // both. + * + * // Detached comment for corge paragraph 2. + * + * optional string corge = 5; + * /* Block comment attached + * * to corge. Leading asterisks + * * will be removed. * / + * /* Block comment attached to + * * grault. * / + * optional int32 grault = 6; + * + * // ignored detached comments. + */ + leadingComments?: string | undefined; + trailingComments?: string | undefined; + leadingDetachedComments: string[]; +} + +/** + * Describes the relationship between generated code and its original source + * file. A GeneratedCodeInfo message is associated with only one generated + * source file, but may contain references to different source .proto files. + */ +export interface GeneratedCodeInfo { + /** + * An Annotation connects some span of text in generated code to an element + * of its generating .proto file. + */ + annotation: GeneratedCodeInfo_Annotation[]; +} + +export interface GeneratedCodeInfo_Annotation { + /** + * Identifies the element in the original source .proto file. This field + * is formatted the same as SourceCodeInfo.Location.path. + */ + path: number[]; + /** Identifies the filesystem path to the original source .proto. */ + sourceFile?: + | string + | undefined; + /** + * Identifies the starting offset in bytes in the generated code + * that relates to the identified object. + */ + begin?: + | number + | undefined; + /** + * Identifies the ending offset in bytes in the generated code that + * relates to the identified object. The end offset should be one past + * the last relevant byte (so the length of the text = end - begin). + */ + end?: number | undefined; + semantic?: GeneratedCodeInfo_Annotation_Semantic | undefined; +} + +/** + * Represents the identified object's effect on the element in the original + * .proto file. + */ +export enum GeneratedCodeInfo_Annotation_Semantic { + /** NONE - There is no effect or the effect is indescribable. */ + NONE = 0, + /** SET - The element is set or otherwise mutated. */ + SET = 1, + /** ALIAS - An alias to the element is returned. */ + ALIAS = 2, + UNRECOGNIZED = -1, +} + +export function generatedCodeInfo_Annotation_SemanticFromJSON(object: any): GeneratedCodeInfo_Annotation_Semantic { + switch (object) { + case 0: + case "NONE": + return GeneratedCodeInfo_Annotation_Semantic.NONE; + case 1: + case "SET": + return GeneratedCodeInfo_Annotation_Semantic.SET; + case 2: + case "ALIAS": + return GeneratedCodeInfo_Annotation_Semantic.ALIAS; + case -1: + case "UNRECOGNIZED": + default: + return GeneratedCodeInfo_Annotation_Semantic.UNRECOGNIZED; + } +} + +export function generatedCodeInfo_Annotation_SemanticToJSON(object: GeneratedCodeInfo_Annotation_Semantic): string { + switch (object) { + case GeneratedCodeInfo_Annotation_Semantic.NONE: + return "NONE"; + case GeneratedCodeInfo_Annotation_Semantic.SET: + return "SET"; + case GeneratedCodeInfo_Annotation_Semantic.ALIAS: + return "ALIAS"; + case GeneratedCodeInfo_Annotation_Semantic.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +function createBaseFileDescriptorSet(): FileDescriptorSet { + return { file: [] }; +} + +export const FileDescriptorSet: MessageFns = { + encode(message: FileDescriptorSet, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.file) { + FileDescriptorProto.encode(v!, writer.uint32(10).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): FileDescriptorSet { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFileDescriptorSet(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.file.push(FileDescriptorProto.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): FileDescriptorSet { + return { + file: globalThis.Array.isArray(object?.file) ? object.file.map((e: any) => FileDescriptorProto.fromJSON(e)) : [], + }; + }, + + toJSON(message: FileDescriptorSet): unknown { + const obj: any = {}; + if (message.file?.length) { + obj.file = message.file.map((e) => FileDescriptorProto.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): FileDescriptorSet { + return FileDescriptorSet.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): FileDescriptorSet { + const message = createBaseFileDescriptorSet(); + message.file = object.file?.map((e) => FileDescriptorProto.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseFileDescriptorProto(): FileDescriptorProto { + return { + name: "", + package: "", + dependency: [], + publicDependency: [], + weakDependency: [], + optionDependency: [], + messageType: [], + enumType: [], + service: [], + extension: [], + options: undefined, + sourceCodeInfo: undefined, + syntax: "", + edition: 0, + }; +} + +export const FileDescriptorProto: MessageFns = { + encode(message: FileDescriptorProto, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.name !== undefined && message.name !== "") { + writer.uint32(10).string(message.name); + } + if (message.package !== undefined && message.package !== "") { + writer.uint32(18).string(message.package); + } + for (const v of message.dependency) { + writer.uint32(26).string(v!); + } + for (const v of message.publicDependency) { + writer.uint32(80).int32(v!); + } + for (const v of message.weakDependency) { + writer.uint32(88).int32(v!); + } + for (const v of message.optionDependency) { + writer.uint32(122).string(v!); + } + for (const v of message.messageType) { + DescriptorProto.encode(v!, writer.uint32(34).fork()).join(); + } + for (const v of message.enumType) { + EnumDescriptorProto.encode(v!, writer.uint32(42).fork()).join(); + } + for (const v of message.service) { + ServiceDescriptorProto.encode(v!, writer.uint32(50).fork()).join(); + } + for (const v of message.extension) { + FieldDescriptorProto.encode(v!, writer.uint32(58).fork()).join(); + } + if (message.options !== undefined) { + FileOptions.encode(message.options, writer.uint32(66).fork()).join(); + } + if (message.sourceCodeInfo !== undefined) { + SourceCodeInfo.encode(message.sourceCodeInfo, writer.uint32(74).fork()).join(); + } + if (message.syntax !== undefined && message.syntax !== "") { + writer.uint32(98).string(message.syntax); + } + if (message.edition !== undefined && message.edition !== 0) { + writer.uint32(112).int32(message.edition); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): FileDescriptorProto { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFileDescriptorProto(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.package = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.dependency.push(reader.string()); + continue; + } + case 10: { + if (tag === 80) { + message.publicDependency.push(reader.int32()); + + continue; + } + + if (tag === 82) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.publicDependency.push(reader.int32()); + } + + continue; + } + + break; + } + case 11: { + if (tag === 88) { + message.weakDependency.push(reader.int32()); + + continue; + } + + if (tag === 90) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.weakDependency.push(reader.int32()); + } + + continue; + } + + break; + } + case 15: { + if (tag !== 122) { + break; + } + + message.optionDependency.push(reader.string()); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.messageType.push(DescriptorProto.decode(reader, reader.uint32())); + continue; + } + case 5: { + if (tag !== 42) { + break; + } + + message.enumType.push(EnumDescriptorProto.decode(reader, reader.uint32())); + continue; + } + case 6: { + if (tag !== 50) { + break; + } + + message.service.push(ServiceDescriptorProto.decode(reader, reader.uint32())); + continue; + } + case 7: { + if (tag !== 58) { + break; + } + + message.extension.push(FieldDescriptorProto.decode(reader, reader.uint32())); + continue; + } + case 8: { + if (tag !== 66) { + break; + } + + message.options = FileOptions.decode(reader, reader.uint32()); + continue; + } + case 9: { + if (tag !== 74) { + break; + } + + message.sourceCodeInfo = SourceCodeInfo.decode(reader, reader.uint32()); + continue; + } + case 12: { + if (tag !== 98) { + break; + } + + message.syntax = reader.string(); + continue; + } + case 14: { + if (tag !== 112) { + break; + } + + message.edition = reader.int32() as any; + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): FileDescriptorProto { + return { + name: isSet(object.name) ? globalThis.String(object.name) : "", + package: isSet(object.package) ? globalThis.String(object.package) : "", + dependency: globalThis.Array.isArray(object?.dependency) + ? object.dependency.map((e: any) => globalThis.String(e)) + : [], + publicDependency: globalThis.Array.isArray(object?.publicDependency) + ? object.publicDependency.map((e: any) => globalThis.Number(e)) + : [], + weakDependency: globalThis.Array.isArray(object?.weakDependency) + ? object.weakDependency.map((e: any) => globalThis.Number(e)) + : [], + optionDependency: globalThis.Array.isArray(object?.optionDependency) + ? object.optionDependency.map((e: any) => globalThis.String(e)) + : [], + messageType: globalThis.Array.isArray(object?.messageType) + ? object.messageType.map((e: any) => DescriptorProto.fromJSON(e)) + : [], + enumType: globalThis.Array.isArray(object?.enumType) + ? object.enumType.map((e: any) => EnumDescriptorProto.fromJSON(e)) + : [], + service: globalThis.Array.isArray(object?.service) + ? object.service.map((e: any) => ServiceDescriptorProto.fromJSON(e)) + : [], + extension: globalThis.Array.isArray(object?.extension) + ? object.extension.map((e: any) => FieldDescriptorProto.fromJSON(e)) + : [], + options: isSet(object.options) ? FileOptions.fromJSON(object.options) : undefined, + sourceCodeInfo: isSet(object.sourceCodeInfo) ? SourceCodeInfo.fromJSON(object.sourceCodeInfo) : undefined, + syntax: isSet(object.syntax) ? globalThis.String(object.syntax) : "", + edition: isSet(object.edition) ? editionFromJSON(object.edition) : 0, + }; + }, + + toJSON(message: FileDescriptorProto): unknown { + const obj: any = {}; + if (message.name !== undefined && message.name !== "") { + obj.name = message.name; + } + if (message.package !== undefined && message.package !== "") { + obj.package = message.package; + } + if (message.dependency?.length) { + obj.dependency = message.dependency; + } + if (message.publicDependency?.length) { + obj.publicDependency = message.publicDependency.map((e) => Math.round(e)); + } + if (message.weakDependency?.length) { + obj.weakDependency = message.weakDependency.map((e) => Math.round(e)); + } + if (message.optionDependency?.length) { + obj.optionDependency = message.optionDependency; + } + if (message.messageType?.length) { + obj.messageType = message.messageType.map((e) => DescriptorProto.toJSON(e)); + } + if (message.enumType?.length) { + obj.enumType = message.enumType.map((e) => EnumDescriptorProto.toJSON(e)); + } + if (message.service?.length) { + obj.service = message.service.map((e) => ServiceDescriptorProto.toJSON(e)); + } + if (message.extension?.length) { + obj.extension = message.extension.map((e) => FieldDescriptorProto.toJSON(e)); + } + if (message.options !== undefined) { + obj.options = FileOptions.toJSON(message.options); + } + if (message.sourceCodeInfo !== undefined) { + obj.sourceCodeInfo = SourceCodeInfo.toJSON(message.sourceCodeInfo); + } + if (message.syntax !== undefined && message.syntax !== "") { + obj.syntax = message.syntax; + } + if (message.edition !== undefined && message.edition !== 0) { + obj.edition = editionToJSON(message.edition); + } + return obj; + }, + + create, I>>(base?: I): FileDescriptorProto { + return FileDescriptorProto.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): FileDescriptorProto { + const message = createBaseFileDescriptorProto(); + message.name = object.name ?? ""; + message.package = object.package ?? ""; + message.dependency = object.dependency?.map((e) => e) || []; + message.publicDependency = object.publicDependency?.map((e) => e) || []; + message.weakDependency = object.weakDependency?.map((e) => e) || []; + message.optionDependency = object.optionDependency?.map((e) => e) || []; + message.messageType = object.messageType?.map((e) => DescriptorProto.fromPartial(e)) || []; + message.enumType = object.enumType?.map((e) => EnumDescriptorProto.fromPartial(e)) || []; + message.service = object.service?.map((e) => ServiceDescriptorProto.fromPartial(e)) || []; + message.extension = object.extension?.map((e) => FieldDescriptorProto.fromPartial(e)) || []; + message.options = (object.options !== undefined && object.options !== null) + ? FileOptions.fromPartial(object.options) + : undefined; + message.sourceCodeInfo = (object.sourceCodeInfo !== undefined && object.sourceCodeInfo !== null) + ? SourceCodeInfo.fromPartial(object.sourceCodeInfo) + : undefined; + message.syntax = object.syntax ?? ""; + message.edition = object.edition ?? 0; + return message; + }, +}; + +function createBaseDescriptorProto(): DescriptorProto { + return { + name: "", + field: [], + extension: [], + nestedType: [], + enumType: [], + extensionRange: [], + oneofDecl: [], + options: undefined, + reservedRange: [], + reservedName: [], + visibility: 0, + }; +} + +export const DescriptorProto: MessageFns = { + encode(message: DescriptorProto, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.name !== undefined && message.name !== "") { + writer.uint32(10).string(message.name); + } + for (const v of message.field) { + FieldDescriptorProto.encode(v!, writer.uint32(18).fork()).join(); + } + for (const v of message.extension) { + FieldDescriptorProto.encode(v!, writer.uint32(50).fork()).join(); + } + for (const v of message.nestedType) { + DescriptorProto.encode(v!, writer.uint32(26).fork()).join(); + } + for (const v of message.enumType) { + EnumDescriptorProto.encode(v!, writer.uint32(34).fork()).join(); + } + for (const v of message.extensionRange) { + DescriptorProto_ExtensionRange.encode(v!, writer.uint32(42).fork()).join(); + } + for (const v of message.oneofDecl) { + OneofDescriptorProto.encode(v!, writer.uint32(66).fork()).join(); + } + if (message.options !== undefined) { + MessageOptions.encode(message.options, writer.uint32(58).fork()).join(); + } + for (const v of message.reservedRange) { + DescriptorProto_ReservedRange.encode(v!, writer.uint32(74).fork()).join(); + } + for (const v of message.reservedName) { + writer.uint32(82).string(v!); + } + if (message.visibility !== undefined && message.visibility !== 0) { + writer.uint32(88).int32(message.visibility); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): DescriptorProto { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDescriptorProto(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.field.push(FieldDescriptorProto.decode(reader, reader.uint32())); + continue; + } + case 6: { + if (tag !== 50) { + break; + } + + message.extension.push(FieldDescriptorProto.decode(reader, reader.uint32())); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.nestedType.push(DescriptorProto.decode(reader, reader.uint32())); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.enumType.push(EnumDescriptorProto.decode(reader, reader.uint32())); + continue; + } + case 5: { + if (tag !== 42) { + break; + } + + message.extensionRange.push(DescriptorProto_ExtensionRange.decode(reader, reader.uint32())); + continue; + } + case 8: { + if (tag !== 66) { + break; + } + + message.oneofDecl.push(OneofDescriptorProto.decode(reader, reader.uint32())); + continue; + } + case 7: { + if (tag !== 58) { + break; + } + + message.options = MessageOptions.decode(reader, reader.uint32()); + continue; + } + case 9: { + if (tag !== 74) { + break; + } + + message.reservedRange.push(DescriptorProto_ReservedRange.decode(reader, reader.uint32())); + continue; + } + case 10: { + if (tag !== 82) { + break; + } + + message.reservedName.push(reader.string()); + continue; + } + case 11: { + if (tag !== 88) { + break; + } + + message.visibility = reader.int32() as any; + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): DescriptorProto { + return { + name: isSet(object.name) ? globalThis.String(object.name) : "", + field: globalThis.Array.isArray(object?.field) + ? object.field.map((e: any) => FieldDescriptorProto.fromJSON(e)) + : [], + extension: globalThis.Array.isArray(object?.extension) + ? object.extension.map((e: any) => FieldDescriptorProto.fromJSON(e)) + : [], + nestedType: globalThis.Array.isArray(object?.nestedType) + ? object.nestedType.map((e: any) => DescriptorProto.fromJSON(e)) + : [], + enumType: globalThis.Array.isArray(object?.enumType) + ? object.enumType.map((e: any) => EnumDescriptorProto.fromJSON(e)) + : [], + extensionRange: globalThis.Array.isArray(object?.extensionRange) + ? object.extensionRange.map((e: any) => DescriptorProto_ExtensionRange.fromJSON(e)) + : [], + oneofDecl: globalThis.Array.isArray(object?.oneofDecl) + ? object.oneofDecl.map((e: any) => OneofDescriptorProto.fromJSON(e)) + : [], + options: isSet(object.options) ? MessageOptions.fromJSON(object.options) : undefined, + reservedRange: globalThis.Array.isArray(object?.reservedRange) + ? object.reservedRange.map((e: any) => DescriptorProto_ReservedRange.fromJSON(e)) + : [], + reservedName: globalThis.Array.isArray(object?.reservedName) + ? object.reservedName.map((e: any) => globalThis.String(e)) + : [], + visibility: isSet(object.visibility) ? symbolVisibilityFromJSON(object.visibility) : 0, + }; + }, + + toJSON(message: DescriptorProto): unknown { + const obj: any = {}; + if (message.name !== undefined && message.name !== "") { + obj.name = message.name; + } + if (message.field?.length) { + obj.field = message.field.map((e) => FieldDescriptorProto.toJSON(e)); + } + if (message.extension?.length) { + obj.extension = message.extension.map((e) => FieldDescriptorProto.toJSON(e)); + } + if (message.nestedType?.length) { + obj.nestedType = message.nestedType.map((e) => DescriptorProto.toJSON(e)); + } + if (message.enumType?.length) { + obj.enumType = message.enumType.map((e) => EnumDescriptorProto.toJSON(e)); + } + if (message.extensionRange?.length) { + obj.extensionRange = message.extensionRange.map((e) => DescriptorProto_ExtensionRange.toJSON(e)); + } + if (message.oneofDecl?.length) { + obj.oneofDecl = message.oneofDecl.map((e) => OneofDescriptorProto.toJSON(e)); + } + if (message.options !== undefined) { + obj.options = MessageOptions.toJSON(message.options); + } + if (message.reservedRange?.length) { + obj.reservedRange = message.reservedRange.map((e) => DescriptorProto_ReservedRange.toJSON(e)); + } + if (message.reservedName?.length) { + obj.reservedName = message.reservedName; + } + if (message.visibility !== undefined && message.visibility !== 0) { + obj.visibility = symbolVisibilityToJSON(message.visibility); + } + return obj; + }, + + create, I>>(base?: I): DescriptorProto { + return DescriptorProto.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): DescriptorProto { + const message = createBaseDescriptorProto(); + message.name = object.name ?? ""; + message.field = object.field?.map((e) => FieldDescriptorProto.fromPartial(e)) || []; + message.extension = object.extension?.map((e) => FieldDescriptorProto.fromPartial(e)) || []; + message.nestedType = object.nestedType?.map((e) => DescriptorProto.fromPartial(e)) || []; + message.enumType = object.enumType?.map((e) => EnumDescriptorProto.fromPartial(e)) || []; + message.extensionRange = object.extensionRange?.map((e) => DescriptorProto_ExtensionRange.fromPartial(e)) || []; + message.oneofDecl = object.oneofDecl?.map((e) => OneofDescriptorProto.fromPartial(e)) || []; + message.options = (object.options !== undefined && object.options !== null) + ? MessageOptions.fromPartial(object.options) + : undefined; + message.reservedRange = object.reservedRange?.map((e) => DescriptorProto_ReservedRange.fromPartial(e)) || []; + message.reservedName = object.reservedName?.map((e) => e) || []; + message.visibility = object.visibility ?? 0; + return message; + }, +}; + +function createBaseDescriptorProto_ExtensionRange(): DescriptorProto_ExtensionRange { + return { start: 0, end: 0, options: undefined }; +} + +export const DescriptorProto_ExtensionRange: MessageFns = { + encode(message: DescriptorProto_ExtensionRange, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.start !== undefined && message.start !== 0) { + writer.uint32(8).int32(message.start); + } + if (message.end !== undefined && message.end !== 0) { + writer.uint32(16).int32(message.end); + } + if (message.options !== undefined) { + ExtensionRangeOptions.encode(message.options, writer.uint32(26).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): DescriptorProto_ExtensionRange { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDescriptorProto_ExtensionRange(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.start = reader.int32(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.end = reader.int32(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.options = ExtensionRangeOptions.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): DescriptorProto_ExtensionRange { + return { + start: isSet(object.start) ? globalThis.Number(object.start) : 0, + end: isSet(object.end) ? globalThis.Number(object.end) : 0, + options: isSet(object.options) ? ExtensionRangeOptions.fromJSON(object.options) : undefined, + }; + }, + + toJSON(message: DescriptorProto_ExtensionRange): unknown { + const obj: any = {}; + if (message.start !== undefined && message.start !== 0) { + obj.start = Math.round(message.start); + } + if (message.end !== undefined && message.end !== 0) { + obj.end = Math.round(message.end); + } + if (message.options !== undefined) { + obj.options = ExtensionRangeOptions.toJSON(message.options); + } + return obj; + }, + + create, I>>(base?: I): DescriptorProto_ExtensionRange { + return DescriptorProto_ExtensionRange.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): DescriptorProto_ExtensionRange { + const message = createBaseDescriptorProto_ExtensionRange(); + message.start = object.start ?? 0; + message.end = object.end ?? 0; + message.options = (object.options !== undefined && object.options !== null) + ? ExtensionRangeOptions.fromPartial(object.options) + : undefined; + return message; + }, +}; + +function createBaseDescriptorProto_ReservedRange(): DescriptorProto_ReservedRange { + return { start: 0, end: 0 }; +} + +export const DescriptorProto_ReservedRange: MessageFns = { + encode(message: DescriptorProto_ReservedRange, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.start !== undefined && message.start !== 0) { + writer.uint32(8).int32(message.start); + } + if (message.end !== undefined && message.end !== 0) { + writer.uint32(16).int32(message.end); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): DescriptorProto_ReservedRange { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDescriptorProto_ReservedRange(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.start = reader.int32(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.end = reader.int32(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): DescriptorProto_ReservedRange { + return { + start: isSet(object.start) ? globalThis.Number(object.start) : 0, + end: isSet(object.end) ? globalThis.Number(object.end) : 0, + }; + }, + + toJSON(message: DescriptorProto_ReservedRange): unknown { + const obj: any = {}; + if (message.start !== undefined && message.start !== 0) { + obj.start = Math.round(message.start); + } + if (message.end !== undefined && message.end !== 0) { + obj.end = Math.round(message.end); + } + return obj; + }, + + create, I>>(base?: I): DescriptorProto_ReservedRange { + return DescriptorProto_ReservedRange.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): DescriptorProto_ReservedRange { + const message = createBaseDescriptorProto_ReservedRange(); + message.start = object.start ?? 0; + message.end = object.end ?? 0; + return message; + }, +}; + +function createBaseExtensionRangeOptions(): ExtensionRangeOptions { + return { uninterpretedOption: [], declaration: [], features: undefined, verification: 1 }; +} + +export const ExtensionRangeOptions: MessageFns = { + encode(message: ExtensionRangeOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.uninterpretedOption) { + UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join(); + } + for (const v of message.declaration) { + ExtensionRangeOptions_Declaration.encode(v!, writer.uint32(18).fork()).join(); + } + if (message.features !== undefined) { + FeatureSet.encode(message.features, writer.uint32(402).fork()).join(); + } + if (message.verification !== undefined && message.verification !== 1) { + writer.uint32(24).int32(message.verification); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ExtensionRangeOptions { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseExtensionRangeOptions(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 999: { + if (tag !== 7994) { + break; + } + + message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32())); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.declaration.push(ExtensionRangeOptions_Declaration.decode(reader, reader.uint32())); + continue; + } + case 50: { + if (tag !== 402) { + break; + } + + message.features = FeatureSet.decode(reader, reader.uint32()); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.verification = reader.int32() as any; + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ExtensionRangeOptions { + return { + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) + ? object.uninterpretedOption.map((e: any) => UninterpretedOption.fromJSON(e)) + : [], + declaration: globalThis.Array.isArray(object?.declaration) + ? object.declaration.map((e: any) => ExtensionRangeOptions_Declaration.fromJSON(e)) + : [], + features: isSet(object.features) ? FeatureSet.fromJSON(object.features) : undefined, + verification: isSet(object.verification) + ? extensionRangeOptions_VerificationStateFromJSON(object.verification) + : 1, + }; + }, + + toJSON(message: ExtensionRangeOptions): unknown { + const obj: any = {}; + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => UninterpretedOption.toJSON(e)); + } + if (message.declaration?.length) { + obj.declaration = message.declaration.map((e) => ExtensionRangeOptions_Declaration.toJSON(e)); + } + if (message.features !== undefined) { + obj.features = FeatureSet.toJSON(message.features); + } + if (message.verification !== undefined && message.verification !== 1) { + obj.verification = extensionRangeOptions_VerificationStateToJSON(message.verification); + } + return obj; + }, + + create, I>>(base?: I): ExtensionRangeOptions { + return ExtensionRangeOptions.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ExtensionRangeOptions { + const message = createBaseExtensionRangeOptions(); + message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || []; + message.declaration = object.declaration?.map((e) => ExtensionRangeOptions_Declaration.fromPartial(e)) || []; + message.features = (object.features !== undefined && object.features !== null) + ? FeatureSet.fromPartial(object.features) + : undefined; + message.verification = object.verification ?? 1; + return message; + }, +}; + +function createBaseExtensionRangeOptions_Declaration(): ExtensionRangeOptions_Declaration { + return { number: 0, fullName: "", type: "", reserved: false, repeated: false }; +} + +export const ExtensionRangeOptions_Declaration: MessageFns = { + encode(message: ExtensionRangeOptions_Declaration, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.number !== undefined && message.number !== 0) { + writer.uint32(8).int32(message.number); + } + if (message.fullName !== undefined && message.fullName !== "") { + writer.uint32(18).string(message.fullName); + } + if (message.type !== undefined && message.type !== "") { + writer.uint32(26).string(message.type); + } + if (message.reserved !== undefined && message.reserved !== false) { + writer.uint32(40).bool(message.reserved); + } + if (message.repeated !== undefined && message.repeated !== false) { + writer.uint32(48).bool(message.repeated); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ExtensionRangeOptions_Declaration { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseExtensionRangeOptions_Declaration(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.number = reader.int32(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.fullName = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.type = reader.string(); + continue; + } + case 5: { + if (tag !== 40) { + break; + } + + message.reserved = reader.bool(); + continue; + } + case 6: { + if (tag !== 48) { + break; + } + + message.repeated = reader.bool(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ExtensionRangeOptions_Declaration { + return { + number: isSet(object.number) ? globalThis.Number(object.number) : 0, + fullName: isSet(object.fullName) ? globalThis.String(object.fullName) : "", + type: isSet(object.type) ? globalThis.String(object.type) : "", + reserved: isSet(object.reserved) ? globalThis.Boolean(object.reserved) : false, + repeated: isSet(object.repeated) ? globalThis.Boolean(object.repeated) : false, + }; + }, + + toJSON(message: ExtensionRangeOptions_Declaration): unknown { + const obj: any = {}; + if (message.number !== undefined && message.number !== 0) { + obj.number = Math.round(message.number); + } + if (message.fullName !== undefined && message.fullName !== "") { + obj.fullName = message.fullName; + } + if (message.type !== undefined && message.type !== "") { + obj.type = message.type; + } + if (message.reserved !== undefined && message.reserved !== false) { + obj.reserved = message.reserved; + } + if (message.repeated !== undefined && message.repeated !== false) { + obj.repeated = message.repeated; + } + return obj; + }, + + create, I>>( + base?: I, + ): ExtensionRangeOptions_Declaration { + return ExtensionRangeOptions_Declaration.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): ExtensionRangeOptions_Declaration { + const message = createBaseExtensionRangeOptions_Declaration(); + message.number = object.number ?? 0; + message.fullName = object.fullName ?? ""; + message.type = object.type ?? ""; + message.reserved = object.reserved ?? false; + message.repeated = object.repeated ?? false; + return message; + }, +}; + +function createBaseFieldDescriptorProto(): FieldDescriptorProto { + return { + name: "", + number: 0, + label: 1, + type: 1, + typeName: "", + extendee: "", + defaultValue: "", + oneofIndex: 0, + jsonName: "", + options: undefined, + proto3Optional: false, + }; +} + +export const FieldDescriptorProto: MessageFns = { + encode(message: FieldDescriptorProto, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.name !== undefined && message.name !== "") { + writer.uint32(10).string(message.name); + } + if (message.number !== undefined && message.number !== 0) { + writer.uint32(24).int32(message.number); + } + if (message.label !== undefined && message.label !== 1) { + writer.uint32(32).int32(message.label); + } + if (message.type !== undefined && message.type !== 1) { + writer.uint32(40).int32(message.type); + } + if (message.typeName !== undefined && message.typeName !== "") { + writer.uint32(50).string(message.typeName); + } + if (message.extendee !== undefined && message.extendee !== "") { + writer.uint32(18).string(message.extendee); + } + if (message.defaultValue !== undefined && message.defaultValue !== "") { + writer.uint32(58).string(message.defaultValue); + } + if (message.oneofIndex !== undefined && message.oneofIndex !== 0) { + writer.uint32(72).int32(message.oneofIndex); + } + if (message.jsonName !== undefined && message.jsonName !== "") { + writer.uint32(82).string(message.jsonName); + } + if (message.options !== undefined) { + FieldOptions.encode(message.options, writer.uint32(66).fork()).join(); + } + if (message.proto3Optional !== undefined && message.proto3Optional !== false) { + writer.uint32(136).bool(message.proto3Optional); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): FieldDescriptorProto { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFieldDescriptorProto(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.number = reader.int32(); + continue; + } + case 4: { + if (tag !== 32) { + break; + } + + message.label = reader.int32() as any; + continue; + } + case 5: { + if (tag !== 40) { + break; + } + + message.type = reader.int32() as any; + continue; + } + case 6: { + if (tag !== 50) { + break; + } + + message.typeName = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.extendee = reader.string(); + continue; + } + case 7: { + if (tag !== 58) { + break; + } + + message.defaultValue = reader.string(); + continue; + } + case 9: { + if (tag !== 72) { + break; + } + + message.oneofIndex = reader.int32(); + continue; + } + case 10: { + if (tag !== 82) { + break; + } + + message.jsonName = reader.string(); + continue; + } + case 8: { + if (tag !== 66) { + break; + } + + message.options = FieldOptions.decode(reader, reader.uint32()); + continue; + } + case 17: { + if (tag !== 136) { + break; + } + + message.proto3Optional = reader.bool(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): FieldDescriptorProto { + return { + name: isSet(object.name) ? globalThis.String(object.name) : "", + number: isSet(object.number) ? globalThis.Number(object.number) : 0, + label: isSet(object.label) ? fieldDescriptorProto_LabelFromJSON(object.label) : 1, + type: isSet(object.type) ? fieldDescriptorProto_TypeFromJSON(object.type) : 1, + typeName: isSet(object.typeName) ? globalThis.String(object.typeName) : "", + extendee: isSet(object.extendee) ? globalThis.String(object.extendee) : "", + defaultValue: isSet(object.defaultValue) ? globalThis.String(object.defaultValue) : "", + oneofIndex: isSet(object.oneofIndex) ? globalThis.Number(object.oneofIndex) : 0, + jsonName: isSet(object.jsonName) ? globalThis.String(object.jsonName) : "", + options: isSet(object.options) ? FieldOptions.fromJSON(object.options) : undefined, + proto3Optional: isSet(object.proto3Optional) ? globalThis.Boolean(object.proto3Optional) : false, + }; + }, + + toJSON(message: FieldDescriptorProto): unknown { + const obj: any = {}; + if (message.name !== undefined && message.name !== "") { + obj.name = message.name; + } + if (message.number !== undefined && message.number !== 0) { + obj.number = Math.round(message.number); + } + if (message.label !== undefined && message.label !== 1) { + obj.label = fieldDescriptorProto_LabelToJSON(message.label); + } + if (message.type !== undefined && message.type !== 1) { + obj.type = fieldDescriptorProto_TypeToJSON(message.type); + } + if (message.typeName !== undefined && message.typeName !== "") { + obj.typeName = message.typeName; + } + if (message.extendee !== undefined && message.extendee !== "") { + obj.extendee = message.extendee; + } + if (message.defaultValue !== undefined && message.defaultValue !== "") { + obj.defaultValue = message.defaultValue; + } + if (message.oneofIndex !== undefined && message.oneofIndex !== 0) { + obj.oneofIndex = Math.round(message.oneofIndex); + } + if (message.jsonName !== undefined && message.jsonName !== "") { + obj.jsonName = message.jsonName; + } + if (message.options !== undefined) { + obj.options = FieldOptions.toJSON(message.options); + } + if (message.proto3Optional !== undefined && message.proto3Optional !== false) { + obj.proto3Optional = message.proto3Optional; + } + return obj; + }, + + create, I>>(base?: I): FieldDescriptorProto { + return FieldDescriptorProto.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): FieldDescriptorProto { + const message = createBaseFieldDescriptorProto(); + message.name = object.name ?? ""; + message.number = object.number ?? 0; + message.label = object.label ?? 1; + message.type = object.type ?? 1; + message.typeName = object.typeName ?? ""; + message.extendee = object.extendee ?? ""; + message.defaultValue = object.defaultValue ?? ""; + message.oneofIndex = object.oneofIndex ?? 0; + message.jsonName = object.jsonName ?? ""; + message.options = (object.options !== undefined && object.options !== null) + ? FieldOptions.fromPartial(object.options) + : undefined; + message.proto3Optional = object.proto3Optional ?? false; + return message; + }, +}; + +function createBaseOneofDescriptorProto(): OneofDescriptorProto { + return { name: "", options: undefined }; +} + +export const OneofDescriptorProto: MessageFns = { + encode(message: OneofDescriptorProto, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.name !== undefined && message.name !== "") { + writer.uint32(10).string(message.name); + } + if (message.options !== undefined) { + OneofOptions.encode(message.options, writer.uint32(18).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): OneofDescriptorProto { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseOneofDescriptorProto(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.options = OneofOptions.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): OneofDescriptorProto { + return { + name: isSet(object.name) ? globalThis.String(object.name) : "", + options: isSet(object.options) ? OneofOptions.fromJSON(object.options) : undefined, + }; + }, + + toJSON(message: OneofDescriptorProto): unknown { + const obj: any = {}; + if (message.name !== undefined && message.name !== "") { + obj.name = message.name; + } + if (message.options !== undefined) { + obj.options = OneofOptions.toJSON(message.options); + } + return obj; + }, + + create, I>>(base?: I): OneofDescriptorProto { + return OneofDescriptorProto.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): OneofDescriptorProto { + const message = createBaseOneofDescriptorProto(); + message.name = object.name ?? ""; + message.options = (object.options !== undefined && object.options !== null) + ? OneofOptions.fromPartial(object.options) + : undefined; + return message; + }, +}; + +function createBaseEnumDescriptorProto(): EnumDescriptorProto { + return { name: "", value: [], options: undefined, reservedRange: [], reservedName: [], visibility: 0 }; +} + +export const EnumDescriptorProto: MessageFns = { + encode(message: EnumDescriptorProto, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.name !== undefined && message.name !== "") { + writer.uint32(10).string(message.name); + } + for (const v of message.value) { + EnumValueDescriptorProto.encode(v!, writer.uint32(18).fork()).join(); + } + if (message.options !== undefined) { + EnumOptions.encode(message.options, writer.uint32(26).fork()).join(); + } + for (const v of message.reservedRange) { + EnumDescriptorProto_EnumReservedRange.encode(v!, writer.uint32(34).fork()).join(); + } + for (const v of message.reservedName) { + writer.uint32(42).string(v!); + } + if (message.visibility !== undefined && message.visibility !== 0) { + writer.uint32(48).int32(message.visibility); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): EnumDescriptorProto { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEnumDescriptorProto(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value.push(EnumValueDescriptorProto.decode(reader, reader.uint32())); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.options = EnumOptions.decode(reader, reader.uint32()); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.reservedRange.push(EnumDescriptorProto_EnumReservedRange.decode(reader, reader.uint32())); + continue; + } + case 5: { + if (tag !== 42) { + break; + } + + message.reservedName.push(reader.string()); + continue; + } + case 6: { + if (tag !== 48) { + break; + } + + message.visibility = reader.int32() as any; + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): EnumDescriptorProto { + return { + name: isSet(object.name) ? globalThis.String(object.name) : "", + value: globalThis.Array.isArray(object?.value) + ? object.value.map((e: any) => EnumValueDescriptorProto.fromJSON(e)) + : [], + options: isSet(object.options) ? EnumOptions.fromJSON(object.options) : undefined, + reservedRange: globalThis.Array.isArray(object?.reservedRange) + ? object.reservedRange.map((e: any) => EnumDescriptorProto_EnumReservedRange.fromJSON(e)) + : [], + reservedName: globalThis.Array.isArray(object?.reservedName) + ? object.reservedName.map((e: any) => globalThis.String(e)) + : [], + visibility: isSet(object.visibility) ? symbolVisibilityFromJSON(object.visibility) : 0, + }; + }, + + toJSON(message: EnumDescriptorProto): unknown { + const obj: any = {}; + if (message.name !== undefined && message.name !== "") { + obj.name = message.name; + } + if (message.value?.length) { + obj.value = message.value.map((e) => EnumValueDescriptorProto.toJSON(e)); + } + if (message.options !== undefined) { + obj.options = EnumOptions.toJSON(message.options); + } + if (message.reservedRange?.length) { + obj.reservedRange = message.reservedRange.map((e) => EnumDescriptorProto_EnumReservedRange.toJSON(e)); + } + if (message.reservedName?.length) { + obj.reservedName = message.reservedName; + } + if (message.visibility !== undefined && message.visibility !== 0) { + obj.visibility = symbolVisibilityToJSON(message.visibility); + } + return obj; + }, + + create, I>>(base?: I): EnumDescriptorProto { + return EnumDescriptorProto.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): EnumDescriptorProto { + const message = createBaseEnumDescriptorProto(); + message.name = object.name ?? ""; + message.value = object.value?.map((e) => EnumValueDescriptorProto.fromPartial(e)) || []; + message.options = (object.options !== undefined && object.options !== null) + ? EnumOptions.fromPartial(object.options) + : undefined; + message.reservedRange = object.reservedRange?.map((e) => EnumDescriptorProto_EnumReservedRange.fromPartial(e)) || + []; + message.reservedName = object.reservedName?.map((e) => e) || []; + message.visibility = object.visibility ?? 0; + return message; + }, +}; + +function createBaseEnumDescriptorProto_EnumReservedRange(): EnumDescriptorProto_EnumReservedRange { + return { start: 0, end: 0 }; +} + +export const EnumDescriptorProto_EnumReservedRange: MessageFns = { + encode(message: EnumDescriptorProto_EnumReservedRange, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.start !== undefined && message.start !== 0) { + writer.uint32(8).int32(message.start); + } + if (message.end !== undefined && message.end !== 0) { + writer.uint32(16).int32(message.end); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): EnumDescriptorProto_EnumReservedRange { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEnumDescriptorProto_EnumReservedRange(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.start = reader.int32(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.end = reader.int32(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): EnumDescriptorProto_EnumReservedRange { + return { + start: isSet(object.start) ? globalThis.Number(object.start) : 0, + end: isSet(object.end) ? globalThis.Number(object.end) : 0, + }; + }, + + toJSON(message: EnumDescriptorProto_EnumReservedRange): unknown { + const obj: any = {}; + if (message.start !== undefined && message.start !== 0) { + obj.start = Math.round(message.start); + } + if (message.end !== undefined && message.end !== 0) { + obj.end = Math.round(message.end); + } + return obj; + }, + + create, I>>( + base?: I, + ): EnumDescriptorProto_EnumReservedRange { + return EnumDescriptorProto_EnumReservedRange.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): EnumDescriptorProto_EnumReservedRange { + const message = createBaseEnumDescriptorProto_EnumReservedRange(); + message.start = object.start ?? 0; + message.end = object.end ?? 0; + return message; + }, +}; + +function createBaseEnumValueDescriptorProto(): EnumValueDescriptorProto { + return { name: "", number: 0, options: undefined }; +} + +export const EnumValueDescriptorProto: MessageFns = { + encode(message: EnumValueDescriptorProto, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.name !== undefined && message.name !== "") { + writer.uint32(10).string(message.name); + } + if (message.number !== undefined && message.number !== 0) { + writer.uint32(16).int32(message.number); + } + if (message.options !== undefined) { + EnumValueOptions.encode(message.options, writer.uint32(26).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): EnumValueDescriptorProto { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEnumValueDescriptorProto(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.number = reader.int32(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.options = EnumValueOptions.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): EnumValueDescriptorProto { + return { + name: isSet(object.name) ? globalThis.String(object.name) : "", + number: isSet(object.number) ? globalThis.Number(object.number) : 0, + options: isSet(object.options) ? EnumValueOptions.fromJSON(object.options) : undefined, + }; + }, + + toJSON(message: EnumValueDescriptorProto): unknown { + const obj: any = {}; + if (message.name !== undefined && message.name !== "") { + obj.name = message.name; + } + if (message.number !== undefined && message.number !== 0) { + obj.number = Math.round(message.number); + } + if (message.options !== undefined) { + obj.options = EnumValueOptions.toJSON(message.options); + } + return obj; + }, + + create, I>>(base?: I): EnumValueDescriptorProto { + return EnumValueDescriptorProto.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): EnumValueDescriptorProto { + const message = createBaseEnumValueDescriptorProto(); + message.name = object.name ?? ""; + message.number = object.number ?? 0; + message.options = (object.options !== undefined && object.options !== null) + ? EnumValueOptions.fromPartial(object.options) + : undefined; + return message; + }, +}; + +function createBaseServiceDescriptorProto(): ServiceDescriptorProto { + return { name: "", method: [], options: undefined }; +} + +export const ServiceDescriptorProto: MessageFns = { + encode(message: ServiceDescriptorProto, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.name !== undefined && message.name !== "") { + writer.uint32(10).string(message.name); + } + for (const v of message.method) { + MethodDescriptorProto.encode(v!, writer.uint32(18).fork()).join(); + } + if (message.options !== undefined) { + ServiceOptions.encode(message.options, writer.uint32(26).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ServiceDescriptorProto { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseServiceDescriptorProto(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.method.push(MethodDescriptorProto.decode(reader, reader.uint32())); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.options = ServiceOptions.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ServiceDescriptorProto { + return { + name: isSet(object.name) ? globalThis.String(object.name) : "", + method: globalThis.Array.isArray(object?.method) + ? object.method.map((e: any) => MethodDescriptorProto.fromJSON(e)) + : [], + options: isSet(object.options) ? ServiceOptions.fromJSON(object.options) : undefined, + }; + }, + + toJSON(message: ServiceDescriptorProto): unknown { + const obj: any = {}; + if (message.name !== undefined && message.name !== "") { + obj.name = message.name; + } + if (message.method?.length) { + obj.method = message.method.map((e) => MethodDescriptorProto.toJSON(e)); + } + if (message.options !== undefined) { + obj.options = ServiceOptions.toJSON(message.options); + } + return obj; + }, + + create, I>>(base?: I): ServiceDescriptorProto { + return ServiceDescriptorProto.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ServiceDescriptorProto { + const message = createBaseServiceDescriptorProto(); + message.name = object.name ?? ""; + message.method = object.method?.map((e) => MethodDescriptorProto.fromPartial(e)) || []; + message.options = (object.options !== undefined && object.options !== null) + ? ServiceOptions.fromPartial(object.options) + : undefined; + return message; + }, +}; + +function createBaseMethodDescriptorProto(): MethodDescriptorProto { + return { + name: "", + inputType: "", + outputType: "", + options: undefined, + clientStreaming: false, + serverStreaming: false, + }; +} + +export const MethodDescriptorProto: MessageFns = { + encode(message: MethodDescriptorProto, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.name !== undefined && message.name !== "") { + writer.uint32(10).string(message.name); + } + if (message.inputType !== undefined && message.inputType !== "") { + writer.uint32(18).string(message.inputType); + } + if (message.outputType !== undefined && message.outputType !== "") { + writer.uint32(26).string(message.outputType); + } + if (message.options !== undefined) { + MethodOptions.encode(message.options, writer.uint32(34).fork()).join(); + } + if (message.clientStreaming !== undefined && message.clientStreaming !== false) { + writer.uint32(40).bool(message.clientStreaming); + } + if (message.serverStreaming !== undefined && message.serverStreaming !== false) { + writer.uint32(48).bool(message.serverStreaming); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): MethodDescriptorProto { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMethodDescriptorProto(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.name = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.inputType = reader.string(); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.outputType = reader.string(); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.options = MethodOptions.decode(reader, reader.uint32()); + continue; + } + case 5: { + if (tag !== 40) { + break; + } + + message.clientStreaming = reader.bool(); + continue; + } + case 6: { + if (tag !== 48) { + break; + } + + message.serverStreaming = reader.bool(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): MethodDescriptorProto { + return { + name: isSet(object.name) ? globalThis.String(object.name) : "", + inputType: isSet(object.inputType) ? globalThis.String(object.inputType) : "", + outputType: isSet(object.outputType) ? globalThis.String(object.outputType) : "", + options: isSet(object.options) ? MethodOptions.fromJSON(object.options) : undefined, + clientStreaming: isSet(object.clientStreaming) ? globalThis.Boolean(object.clientStreaming) : false, + serverStreaming: isSet(object.serverStreaming) ? globalThis.Boolean(object.serverStreaming) : false, + }; + }, + + toJSON(message: MethodDescriptorProto): unknown { + const obj: any = {}; + if (message.name !== undefined && message.name !== "") { + obj.name = message.name; + } + if (message.inputType !== undefined && message.inputType !== "") { + obj.inputType = message.inputType; + } + if (message.outputType !== undefined && message.outputType !== "") { + obj.outputType = message.outputType; + } + if (message.options !== undefined) { + obj.options = MethodOptions.toJSON(message.options); + } + if (message.clientStreaming !== undefined && message.clientStreaming !== false) { + obj.clientStreaming = message.clientStreaming; + } + if (message.serverStreaming !== undefined && message.serverStreaming !== false) { + obj.serverStreaming = message.serverStreaming; + } + return obj; + }, + + create, I>>(base?: I): MethodDescriptorProto { + return MethodDescriptorProto.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): MethodDescriptorProto { + const message = createBaseMethodDescriptorProto(); + message.name = object.name ?? ""; + message.inputType = object.inputType ?? ""; + message.outputType = object.outputType ?? ""; + message.options = (object.options !== undefined && object.options !== null) + ? MethodOptions.fromPartial(object.options) + : undefined; + message.clientStreaming = object.clientStreaming ?? false; + message.serverStreaming = object.serverStreaming ?? false; + return message; + }, +}; + +function createBaseFileOptions(): FileOptions { + return { + javaPackage: "", + javaOuterClassname: "", + javaMultipleFiles: false, + javaGenerateEqualsAndHash: false, + javaStringCheckUtf8: false, + optimizeFor: 1, + goPackage: "", + ccGenericServices: false, + javaGenericServices: false, + pyGenericServices: false, + deprecated: false, + ccEnableArenas: true, + objcClassPrefix: "", + csharpNamespace: "", + swiftPrefix: "", + phpClassPrefix: "", + phpNamespace: "", + phpMetadataNamespace: "", + rubyPackage: "", + features: undefined, + uninterpretedOption: [], + }; +} + +export const FileOptions: MessageFns = { + encode(message: FileOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.javaPackage !== undefined && message.javaPackage !== "") { + writer.uint32(10).string(message.javaPackage); + } + if (message.javaOuterClassname !== undefined && message.javaOuterClassname !== "") { + writer.uint32(66).string(message.javaOuterClassname); + } + if (message.javaMultipleFiles !== undefined && message.javaMultipleFiles !== false) { + writer.uint32(80).bool(message.javaMultipleFiles); + } + if (message.javaGenerateEqualsAndHash !== undefined && message.javaGenerateEqualsAndHash !== false) { + writer.uint32(160).bool(message.javaGenerateEqualsAndHash); + } + if (message.javaStringCheckUtf8 !== undefined && message.javaStringCheckUtf8 !== false) { + writer.uint32(216).bool(message.javaStringCheckUtf8); + } + if (message.optimizeFor !== undefined && message.optimizeFor !== 1) { + writer.uint32(72).int32(message.optimizeFor); + } + if (message.goPackage !== undefined && message.goPackage !== "") { + writer.uint32(90).string(message.goPackage); + } + if (message.ccGenericServices !== undefined && message.ccGenericServices !== false) { + writer.uint32(128).bool(message.ccGenericServices); + } + if (message.javaGenericServices !== undefined && message.javaGenericServices !== false) { + writer.uint32(136).bool(message.javaGenericServices); + } + if (message.pyGenericServices !== undefined && message.pyGenericServices !== false) { + writer.uint32(144).bool(message.pyGenericServices); + } + if (message.deprecated !== undefined && message.deprecated !== false) { + writer.uint32(184).bool(message.deprecated); + } + if (message.ccEnableArenas !== undefined && message.ccEnableArenas !== true) { + writer.uint32(248).bool(message.ccEnableArenas); + } + if (message.objcClassPrefix !== undefined && message.objcClassPrefix !== "") { + writer.uint32(290).string(message.objcClassPrefix); + } + if (message.csharpNamespace !== undefined && message.csharpNamespace !== "") { + writer.uint32(298).string(message.csharpNamespace); + } + if (message.swiftPrefix !== undefined && message.swiftPrefix !== "") { + writer.uint32(314).string(message.swiftPrefix); + } + if (message.phpClassPrefix !== undefined && message.phpClassPrefix !== "") { + writer.uint32(322).string(message.phpClassPrefix); + } + if (message.phpNamespace !== undefined && message.phpNamespace !== "") { + writer.uint32(330).string(message.phpNamespace); + } + if (message.phpMetadataNamespace !== undefined && message.phpMetadataNamespace !== "") { + writer.uint32(354).string(message.phpMetadataNamespace); + } + if (message.rubyPackage !== undefined && message.rubyPackage !== "") { + writer.uint32(362).string(message.rubyPackage); + } + if (message.features !== undefined) { + FeatureSet.encode(message.features, writer.uint32(402).fork()).join(); + } + for (const v of message.uninterpretedOption) { + UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): FileOptions { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFileOptions(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.javaPackage = reader.string(); + continue; + } + case 8: { + if (tag !== 66) { + break; + } + + message.javaOuterClassname = reader.string(); + continue; + } + case 10: { + if (tag !== 80) { + break; + } + + message.javaMultipleFiles = reader.bool(); + continue; + } + case 20: { + if (tag !== 160) { + break; + } + + message.javaGenerateEqualsAndHash = reader.bool(); + continue; + } + case 27: { + if (tag !== 216) { + break; + } + + message.javaStringCheckUtf8 = reader.bool(); + continue; + } + case 9: { + if (tag !== 72) { + break; + } + + message.optimizeFor = reader.int32() as any; + continue; + } + case 11: { + if (tag !== 90) { + break; + } + + message.goPackage = reader.string(); + continue; + } + case 16: { + if (tag !== 128) { + break; + } + + message.ccGenericServices = reader.bool(); + continue; + } + case 17: { + if (tag !== 136) { + break; + } + + message.javaGenericServices = reader.bool(); + continue; + } + case 18: { + if (tag !== 144) { + break; + } + + message.pyGenericServices = reader.bool(); + continue; + } + case 23: { + if (tag !== 184) { + break; + } + + message.deprecated = reader.bool(); + continue; + } + case 31: { + if (tag !== 248) { + break; + } + + message.ccEnableArenas = reader.bool(); + continue; + } + case 36: { + if (tag !== 290) { + break; + } + + message.objcClassPrefix = reader.string(); + continue; + } + case 37: { + if (tag !== 298) { + break; + } + + message.csharpNamespace = reader.string(); + continue; + } + case 39: { + if (tag !== 314) { + break; + } + + message.swiftPrefix = reader.string(); + continue; + } + case 40: { + if (tag !== 322) { + break; + } + + message.phpClassPrefix = reader.string(); + continue; + } + case 41: { + if (tag !== 330) { + break; + } + + message.phpNamespace = reader.string(); + continue; + } + case 44: { + if (tag !== 354) { + break; + } + + message.phpMetadataNamespace = reader.string(); + continue; + } + case 45: { + if (tag !== 362) { + break; + } + + message.rubyPackage = reader.string(); + continue; + } + case 50: { + if (tag !== 402) { + break; + } + + message.features = FeatureSet.decode(reader, reader.uint32()); + continue; + } + case 999: { + if (tag !== 7994) { + break; + } + + message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): FileOptions { + return { + javaPackage: isSet(object.javaPackage) ? globalThis.String(object.javaPackage) : "", + javaOuterClassname: isSet(object.javaOuterClassname) ? globalThis.String(object.javaOuterClassname) : "", + javaMultipleFiles: isSet(object.javaMultipleFiles) ? globalThis.Boolean(object.javaMultipleFiles) : false, + javaGenerateEqualsAndHash: isSet(object.javaGenerateEqualsAndHash) + ? globalThis.Boolean(object.javaGenerateEqualsAndHash) + : false, + javaStringCheckUtf8: isSet(object.javaStringCheckUtf8) ? globalThis.Boolean(object.javaStringCheckUtf8) : false, + optimizeFor: isSet(object.optimizeFor) ? fileOptions_OptimizeModeFromJSON(object.optimizeFor) : 1, + goPackage: isSet(object.goPackage) ? globalThis.String(object.goPackage) : "", + ccGenericServices: isSet(object.ccGenericServices) ? globalThis.Boolean(object.ccGenericServices) : false, + javaGenericServices: isSet(object.javaGenericServices) ? globalThis.Boolean(object.javaGenericServices) : false, + pyGenericServices: isSet(object.pyGenericServices) ? globalThis.Boolean(object.pyGenericServices) : false, + deprecated: isSet(object.deprecated) ? globalThis.Boolean(object.deprecated) : false, + ccEnableArenas: isSet(object.ccEnableArenas) ? globalThis.Boolean(object.ccEnableArenas) : true, + objcClassPrefix: isSet(object.objcClassPrefix) ? globalThis.String(object.objcClassPrefix) : "", + csharpNamespace: isSet(object.csharpNamespace) ? globalThis.String(object.csharpNamespace) : "", + swiftPrefix: isSet(object.swiftPrefix) ? globalThis.String(object.swiftPrefix) : "", + phpClassPrefix: isSet(object.phpClassPrefix) ? globalThis.String(object.phpClassPrefix) : "", + phpNamespace: isSet(object.phpNamespace) ? globalThis.String(object.phpNamespace) : "", + phpMetadataNamespace: isSet(object.phpMetadataNamespace) ? globalThis.String(object.phpMetadataNamespace) : "", + rubyPackage: isSet(object.rubyPackage) ? globalThis.String(object.rubyPackage) : "", + features: isSet(object.features) ? FeatureSet.fromJSON(object.features) : undefined, + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) + ? object.uninterpretedOption.map((e: any) => UninterpretedOption.fromJSON(e)) + : [], + }; + }, + + toJSON(message: FileOptions): unknown { + const obj: any = {}; + if (message.javaPackage !== undefined && message.javaPackage !== "") { + obj.javaPackage = message.javaPackage; + } + if (message.javaOuterClassname !== undefined && message.javaOuterClassname !== "") { + obj.javaOuterClassname = message.javaOuterClassname; + } + if (message.javaMultipleFiles !== undefined && message.javaMultipleFiles !== false) { + obj.javaMultipleFiles = message.javaMultipleFiles; + } + if (message.javaGenerateEqualsAndHash !== undefined && message.javaGenerateEqualsAndHash !== false) { + obj.javaGenerateEqualsAndHash = message.javaGenerateEqualsAndHash; + } + if (message.javaStringCheckUtf8 !== undefined && message.javaStringCheckUtf8 !== false) { + obj.javaStringCheckUtf8 = message.javaStringCheckUtf8; + } + if (message.optimizeFor !== undefined && message.optimizeFor !== 1) { + obj.optimizeFor = fileOptions_OptimizeModeToJSON(message.optimizeFor); + } + if (message.goPackage !== undefined && message.goPackage !== "") { + obj.goPackage = message.goPackage; + } + if (message.ccGenericServices !== undefined && message.ccGenericServices !== false) { + obj.ccGenericServices = message.ccGenericServices; + } + if (message.javaGenericServices !== undefined && message.javaGenericServices !== false) { + obj.javaGenericServices = message.javaGenericServices; + } + if (message.pyGenericServices !== undefined && message.pyGenericServices !== false) { + obj.pyGenericServices = message.pyGenericServices; + } + if (message.deprecated !== undefined && message.deprecated !== false) { + obj.deprecated = message.deprecated; + } + if (message.ccEnableArenas !== undefined && message.ccEnableArenas !== true) { + obj.ccEnableArenas = message.ccEnableArenas; + } + if (message.objcClassPrefix !== undefined && message.objcClassPrefix !== "") { + obj.objcClassPrefix = message.objcClassPrefix; + } + if (message.csharpNamespace !== undefined && message.csharpNamespace !== "") { + obj.csharpNamespace = message.csharpNamespace; + } + if (message.swiftPrefix !== undefined && message.swiftPrefix !== "") { + obj.swiftPrefix = message.swiftPrefix; + } + if (message.phpClassPrefix !== undefined && message.phpClassPrefix !== "") { + obj.phpClassPrefix = message.phpClassPrefix; + } + if (message.phpNamespace !== undefined && message.phpNamespace !== "") { + obj.phpNamespace = message.phpNamespace; + } + if (message.phpMetadataNamespace !== undefined && message.phpMetadataNamespace !== "") { + obj.phpMetadataNamespace = message.phpMetadataNamespace; + } + if (message.rubyPackage !== undefined && message.rubyPackage !== "") { + obj.rubyPackage = message.rubyPackage; + } + if (message.features !== undefined) { + obj.features = FeatureSet.toJSON(message.features); + } + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => UninterpretedOption.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): FileOptions { + return FileOptions.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): FileOptions { + const message = createBaseFileOptions(); + message.javaPackage = object.javaPackage ?? ""; + message.javaOuterClassname = object.javaOuterClassname ?? ""; + message.javaMultipleFiles = object.javaMultipleFiles ?? false; + message.javaGenerateEqualsAndHash = object.javaGenerateEqualsAndHash ?? false; + message.javaStringCheckUtf8 = object.javaStringCheckUtf8 ?? false; + message.optimizeFor = object.optimizeFor ?? 1; + message.goPackage = object.goPackage ?? ""; + message.ccGenericServices = object.ccGenericServices ?? false; + message.javaGenericServices = object.javaGenericServices ?? false; + message.pyGenericServices = object.pyGenericServices ?? false; + message.deprecated = object.deprecated ?? false; + message.ccEnableArenas = object.ccEnableArenas ?? true; + message.objcClassPrefix = object.objcClassPrefix ?? ""; + message.csharpNamespace = object.csharpNamespace ?? ""; + message.swiftPrefix = object.swiftPrefix ?? ""; + message.phpClassPrefix = object.phpClassPrefix ?? ""; + message.phpNamespace = object.phpNamespace ?? ""; + message.phpMetadataNamespace = object.phpMetadataNamespace ?? ""; + message.rubyPackage = object.rubyPackage ?? ""; + message.features = (object.features !== undefined && object.features !== null) + ? FeatureSet.fromPartial(object.features) + : undefined; + message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseMessageOptions(): MessageOptions { + return { + messageSetWireFormat: false, + noStandardDescriptorAccessor: false, + deprecated: false, + mapEntry: false, + deprecatedLegacyJsonFieldConflicts: false, + features: undefined, + uninterpretedOption: [], + }; +} + +export const MessageOptions: MessageFns = { + encode(message: MessageOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.messageSetWireFormat !== undefined && message.messageSetWireFormat !== false) { + writer.uint32(8).bool(message.messageSetWireFormat); + } + if (message.noStandardDescriptorAccessor !== undefined && message.noStandardDescriptorAccessor !== false) { + writer.uint32(16).bool(message.noStandardDescriptorAccessor); + } + if (message.deprecated !== undefined && message.deprecated !== false) { + writer.uint32(24).bool(message.deprecated); + } + if (message.mapEntry !== undefined && message.mapEntry !== false) { + writer.uint32(56).bool(message.mapEntry); + } + if ( + message.deprecatedLegacyJsonFieldConflicts !== undefined && message.deprecatedLegacyJsonFieldConflicts !== false + ) { + writer.uint32(88).bool(message.deprecatedLegacyJsonFieldConflicts); + } + if (message.features !== undefined) { + FeatureSet.encode(message.features, writer.uint32(98).fork()).join(); + } + for (const v of message.uninterpretedOption) { + UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): MessageOptions { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMessageOptions(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.messageSetWireFormat = reader.bool(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.noStandardDescriptorAccessor = reader.bool(); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.deprecated = reader.bool(); + continue; + } + case 7: { + if (tag !== 56) { + break; + } + + message.mapEntry = reader.bool(); + continue; + } + case 11: { + if (tag !== 88) { + break; + } + + message.deprecatedLegacyJsonFieldConflicts = reader.bool(); + continue; + } + case 12: { + if (tag !== 98) { + break; + } + + message.features = FeatureSet.decode(reader, reader.uint32()); + continue; + } + case 999: { + if (tag !== 7994) { + break; + } + + message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): MessageOptions { + return { + messageSetWireFormat: isSet(object.messageSetWireFormat) + ? globalThis.Boolean(object.messageSetWireFormat) + : false, + noStandardDescriptorAccessor: isSet(object.noStandardDescriptorAccessor) + ? globalThis.Boolean(object.noStandardDescriptorAccessor) + : false, + deprecated: isSet(object.deprecated) ? globalThis.Boolean(object.deprecated) : false, + mapEntry: isSet(object.mapEntry) ? globalThis.Boolean(object.mapEntry) : false, + deprecatedLegacyJsonFieldConflicts: isSet(object.deprecatedLegacyJsonFieldConflicts) + ? globalThis.Boolean(object.deprecatedLegacyJsonFieldConflicts) + : false, + features: isSet(object.features) ? FeatureSet.fromJSON(object.features) : undefined, + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) + ? object.uninterpretedOption.map((e: any) => UninterpretedOption.fromJSON(e)) + : [], + }; + }, + + toJSON(message: MessageOptions): unknown { + const obj: any = {}; + if (message.messageSetWireFormat !== undefined && message.messageSetWireFormat !== false) { + obj.messageSetWireFormat = message.messageSetWireFormat; + } + if (message.noStandardDescriptorAccessor !== undefined && message.noStandardDescriptorAccessor !== false) { + obj.noStandardDescriptorAccessor = message.noStandardDescriptorAccessor; + } + if (message.deprecated !== undefined && message.deprecated !== false) { + obj.deprecated = message.deprecated; + } + if (message.mapEntry !== undefined && message.mapEntry !== false) { + obj.mapEntry = message.mapEntry; + } + if ( + message.deprecatedLegacyJsonFieldConflicts !== undefined && message.deprecatedLegacyJsonFieldConflicts !== false + ) { + obj.deprecatedLegacyJsonFieldConflicts = message.deprecatedLegacyJsonFieldConflicts; + } + if (message.features !== undefined) { + obj.features = FeatureSet.toJSON(message.features); + } + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => UninterpretedOption.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): MessageOptions { + return MessageOptions.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): MessageOptions { + const message = createBaseMessageOptions(); + message.messageSetWireFormat = object.messageSetWireFormat ?? false; + message.noStandardDescriptorAccessor = object.noStandardDescriptorAccessor ?? false; + message.deprecated = object.deprecated ?? false; + message.mapEntry = object.mapEntry ?? false; + message.deprecatedLegacyJsonFieldConflicts = object.deprecatedLegacyJsonFieldConflicts ?? false; + message.features = (object.features !== undefined && object.features !== null) + ? FeatureSet.fromPartial(object.features) + : undefined; + message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseFieldOptions(): FieldOptions { + return { + ctype: 0, + packed: false, + jstype: 0, + lazy: false, + unverifiedLazy: false, + deprecated: false, + weak: false, + debugRedact: false, + retention: 0, + targets: [], + editionDefaults: [], + features: undefined, + featureSupport: undefined, + uninterpretedOption: [], + }; +} + +export const FieldOptions: MessageFns = { + encode(message: FieldOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.ctype !== undefined && message.ctype !== 0) { + writer.uint32(8).int32(message.ctype); + } + if (message.packed !== undefined && message.packed !== false) { + writer.uint32(16).bool(message.packed); + } + if (message.jstype !== undefined && message.jstype !== 0) { + writer.uint32(48).int32(message.jstype); + } + if (message.lazy !== undefined && message.lazy !== false) { + writer.uint32(40).bool(message.lazy); + } + if (message.unverifiedLazy !== undefined && message.unverifiedLazy !== false) { + writer.uint32(120).bool(message.unverifiedLazy); + } + if (message.deprecated !== undefined && message.deprecated !== false) { + writer.uint32(24).bool(message.deprecated); + } + if (message.weak !== undefined && message.weak !== false) { + writer.uint32(80).bool(message.weak); + } + if (message.debugRedact !== undefined && message.debugRedact !== false) { + writer.uint32(128).bool(message.debugRedact); + } + if (message.retention !== undefined && message.retention !== 0) { + writer.uint32(136).int32(message.retention); + } + for (const v of message.targets) { + writer.uint32(152).int32(v!); + } + for (const v of message.editionDefaults) { + FieldOptions_EditionDefault.encode(v!, writer.uint32(162).fork()).join(); + } + if (message.features !== undefined) { + FeatureSet.encode(message.features, writer.uint32(170).fork()).join(); + } + if (message.featureSupport !== undefined) { + FieldOptions_FeatureSupport.encode(message.featureSupport, writer.uint32(178).fork()).join(); + } + for (const v of message.uninterpretedOption) { + UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): FieldOptions { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFieldOptions(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.ctype = reader.int32() as any; + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.packed = reader.bool(); + continue; + } + case 6: { + if (tag !== 48) { + break; + } + + message.jstype = reader.int32() as any; + continue; + } + case 5: { + if (tag !== 40) { + break; + } + + message.lazy = reader.bool(); + continue; + } + case 15: { + if (tag !== 120) { + break; + } + + message.unverifiedLazy = reader.bool(); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.deprecated = reader.bool(); + continue; + } + case 10: { + if (tag !== 80) { + break; + } + + message.weak = reader.bool(); + continue; + } + case 16: { + if (tag !== 128) { + break; + } + + message.debugRedact = reader.bool(); + continue; + } + case 17: { + if (tag !== 136) { + break; + } + + message.retention = reader.int32() as any; + continue; + } + case 19: { + if (tag === 152) { + message.targets.push(reader.int32() as any); + + continue; + } + + if (tag === 154) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.targets.push(reader.int32() as any); + } + + continue; + } + + break; + } + case 20: { + if (tag !== 162) { + break; + } + + message.editionDefaults.push(FieldOptions_EditionDefault.decode(reader, reader.uint32())); + continue; + } + case 21: { + if (tag !== 170) { + break; + } + + message.features = FeatureSet.decode(reader, reader.uint32()); + continue; + } + case 22: { + if (tag !== 178) { + break; + } + + message.featureSupport = FieldOptions_FeatureSupport.decode(reader, reader.uint32()); + continue; + } + case 999: { + if (tag !== 7994) { + break; + } + + message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): FieldOptions { + return { + ctype: isSet(object.ctype) ? fieldOptions_CTypeFromJSON(object.ctype) : 0, + packed: isSet(object.packed) ? globalThis.Boolean(object.packed) : false, + jstype: isSet(object.jstype) ? fieldOptions_JSTypeFromJSON(object.jstype) : 0, + lazy: isSet(object.lazy) ? globalThis.Boolean(object.lazy) : false, + unverifiedLazy: isSet(object.unverifiedLazy) ? globalThis.Boolean(object.unverifiedLazy) : false, + deprecated: isSet(object.deprecated) ? globalThis.Boolean(object.deprecated) : false, + weak: isSet(object.weak) ? globalThis.Boolean(object.weak) : false, + debugRedact: isSet(object.debugRedact) ? globalThis.Boolean(object.debugRedact) : false, + retention: isSet(object.retention) ? fieldOptions_OptionRetentionFromJSON(object.retention) : 0, + targets: globalThis.Array.isArray(object?.targets) + ? object.targets.map((e: any) => fieldOptions_OptionTargetTypeFromJSON(e)) + : [], + editionDefaults: globalThis.Array.isArray(object?.editionDefaults) + ? object.editionDefaults.map((e: any) => FieldOptions_EditionDefault.fromJSON(e)) + : [], + features: isSet(object.features) ? FeatureSet.fromJSON(object.features) : undefined, + featureSupport: isSet(object.featureSupport) + ? FieldOptions_FeatureSupport.fromJSON(object.featureSupport) + : undefined, + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) + ? object.uninterpretedOption.map((e: any) => UninterpretedOption.fromJSON(e)) + : [], + }; + }, + + toJSON(message: FieldOptions): unknown { + const obj: any = {}; + if (message.ctype !== undefined && message.ctype !== 0) { + obj.ctype = fieldOptions_CTypeToJSON(message.ctype); + } + if (message.packed !== undefined && message.packed !== false) { + obj.packed = message.packed; + } + if (message.jstype !== undefined && message.jstype !== 0) { + obj.jstype = fieldOptions_JSTypeToJSON(message.jstype); + } + if (message.lazy !== undefined && message.lazy !== false) { + obj.lazy = message.lazy; + } + if (message.unverifiedLazy !== undefined && message.unverifiedLazy !== false) { + obj.unverifiedLazy = message.unverifiedLazy; + } + if (message.deprecated !== undefined && message.deprecated !== false) { + obj.deprecated = message.deprecated; + } + if (message.weak !== undefined && message.weak !== false) { + obj.weak = message.weak; + } + if (message.debugRedact !== undefined && message.debugRedact !== false) { + obj.debugRedact = message.debugRedact; + } + if (message.retention !== undefined && message.retention !== 0) { + obj.retention = fieldOptions_OptionRetentionToJSON(message.retention); + } + if (message.targets?.length) { + obj.targets = message.targets.map((e) => fieldOptions_OptionTargetTypeToJSON(e)); + } + if (message.editionDefaults?.length) { + obj.editionDefaults = message.editionDefaults.map((e) => FieldOptions_EditionDefault.toJSON(e)); + } + if (message.features !== undefined) { + obj.features = FeatureSet.toJSON(message.features); + } + if (message.featureSupport !== undefined) { + obj.featureSupport = FieldOptions_FeatureSupport.toJSON(message.featureSupport); + } + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => UninterpretedOption.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): FieldOptions { + return FieldOptions.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): FieldOptions { + const message = createBaseFieldOptions(); + message.ctype = object.ctype ?? 0; + message.packed = object.packed ?? false; + message.jstype = object.jstype ?? 0; + message.lazy = object.lazy ?? false; + message.unverifiedLazy = object.unverifiedLazy ?? false; + message.deprecated = object.deprecated ?? false; + message.weak = object.weak ?? false; + message.debugRedact = object.debugRedact ?? false; + message.retention = object.retention ?? 0; + message.targets = object.targets?.map((e) => e) || []; + message.editionDefaults = object.editionDefaults?.map((e) => FieldOptions_EditionDefault.fromPartial(e)) || []; + message.features = (object.features !== undefined && object.features !== null) + ? FeatureSet.fromPartial(object.features) + : undefined; + message.featureSupport = (object.featureSupport !== undefined && object.featureSupport !== null) + ? FieldOptions_FeatureSupport.fromPartial(object.featureSupport) + : undefined; + message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseFieldOptions_EditionDefault(): FieldOptions_EditionDefault { + return { edition: 0, value: "" }; +} + +export const FieldOptions_EditionDefault: MessageFns = { + encode(message: FieldOptions_EditionDefault, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.edition !== undefined && message.edition !== 0) { + writer.uint32(24).int32(message.edition); + } + if (message.value !== undefined && message.value !== "") { + writer.uint32(18).string(message.value); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): FieldOptions_EditionDefault { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFieldOptions_EditionDefault(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 3: { + if (tag !== 24) { + break; + } + + message.edition = reader.int32() as any; + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): FieldOptions_EditionDefault { + return { + edition: isSet(object.edition) ? editionFromJSON(object.edition) : 0, + value: isSet(object.value) ? globalThis.String(object.value) : "", + }; + }, + + toJSON(message: FieldOptions_EditionDefault): unknown { + const obj: any = {}; + if (message.edition !== undefined && message.edition !== 0) { + obj.edition = editionToJSON(message.edition); + } + if (message.value !== undefined && message.value !== "") { + obj.value = message.value; + } + return obj; + }, + + create, I>>(base?: I): FieldOptions_EditionDefault { + return FieldOptions_EditionDefault.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): FieldOptions_EditionDefault { + const message = createBaseFieldOptions_EditionDefault(); + message.edition = object.edition ?? 0; + message.value = object.value ?? ""; + return message; + }, +}; + +function createBaseFieldOptions_FeatureSupport(): FieldOptions_FeatureSupport { + return { editionIntroduced: 0, editionDeprecated: 0, deprecationWarning: "", editionRemoved: 0 }; +} + +export const FieldOptions_FeatureSupport: MessageFns = { + encode(message: FieldOptions_FeatureSupport, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.editionIntroduced !== undefined && message.editionIntroduced !== 0) { + writer.uint32(8).int32(message.editionIntroduced); + } + if (message.editionDeprecated !== undefined && message.editionDeprecated !== 0) { + writer.uint32(16).int32(message.editionDeprecated); + } + if (message.deprecationWarning !== undefined && message.deprecationWarning !== "") { + writer.uint32(26).string(message.deprecationWarning); + } + if (message.editionRemoved !== undefined && message.editionRemoved !== 0) { + writer.uint32(32).int32(message.editionRemoved); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): FieldOptions_FeatureSupport { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFieldOptions_FeatureSupport(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.editionIntroduced = reader.int32() as any; + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.editionDeprecated = reader.int32() as any; + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.deprecationWarning = reader.string(); + continue; + } + case 4: { + if (tag !== 32) { + break; + } + + message.editionRemoved = reader.int32() as any; + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): FieldOptions_FeatureSupport { + return { + editionIntroduced: isSet(object.editionIntroduced) ? editionFromJSON(object.editionIntroduced) : 0, + editionDeprecated: isSet(object.editionDeprecated) ? editionFromJSON(object.editionDeprecated) : 0, + deprecationWarning: isSet(object.deprecationWarning) ? globalThis.String(object.deprecationWarning) : "", + editionRemoved: isSet(object.editionRemoved) ? editionFromJSON(object.editionRemoved) : 0, + }; + }, + + toJSON(message: FieldOptions_FeatureSupport): unknown { + const obj: any = {}; + if (message.editionIntroduced !== undefined && message.editionIntroduced !== 0) { + obj.editionIntroduced = editionToJSON(message.editionIntroduced); + } + if (message.editionDeprecated !== undefined && message.editionDeprecated !== 0) { + obj.editionDeprecated = editionToJSON(message.editionDeprecated); + } + if (message.deprecationWarning !== undefined && message.deprecationWarning !== "") { + obj.deprecationWarning = message.deprecationWarning; + } + if (message.editionRemoved !== undefined && message.editionRemoved !== 0) { + obj.editionRemoved = editionToJSON(message.editionRemoved); + } + return obj; + }, + + create, I>>(base?: I): FieldOptions_FeatureSupport { + return FieldOptions_FeatureSupport.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): FieldOptions_FeatureSupport { + const message = createBaseFieldOptions_FeatureSupport(); + message.editionIntroduced = object.editionIntroduced ?? 0; + message.editionDeprecated = object.editionDeprecated ?? 0; + message.deprecationWarning = object.deprecationWarning ?? ""; + message.editionRemoved = object.editionRemoved ?? 0; + return message; + }, +}; + +function createBaseOneofOptions(): OneofOptions { + return { features: undefined, uninterpretedOption: [] }; +} + +export const OneofOptions: MessageFns = { + encode(message: OneofOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.features !== undefined) { + FeatureSet.encode(message.features, writer.uint32(10).fork()).join(); + } + for (const v of message.uninterpretedOption) { + UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): OneofOptions { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseOneofOptions(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.features = FeatureSet.decode(reader, reader.uint32()); + continue; + } + case 999: { + if (tag !== 7994) { + break; + } + + message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): OneofOptions { + return { + features: isSet(object.features) ? FeatureSet.fromJSON(object.features) : undefined, + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) + ? object.uninterpretedOption.map((e: any) => UninterpretedOption.fromJSON(e)) + : [], + }; + }, + + toJSON(message: OneofOptions): unknown { + const obj: any = {}; + if (message.features !== undefined) { + obj.features = FeatureSet.toJSON(message.features); + } + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => UninterpretedOption.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): OneofOptions { + return OneofOptions.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): OneofOptions { + const message = createBaseOneofOptions(); + message.features = (object.features !== undefined && object.features !== null) + ? FeatureSet.fromPartial(object.features) + : undefined; + message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseEnumOptions(): EnumOptions { + return { + allowAlias: false, + deprecated: false, + deprecatedLegacyJsonFieldConflicts: false, + features: undefined, + uninterpretedOption: [], + }; +} + +export const EnumOptions: MessageFns = { + encode(message: EnumOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.allowAlias !== undefined && message.allowAlias !== false) { + writer.uint32(16).bool(message.allowAlias); + } + if (message.deprecated !== undefined && message.deprecated !== false) { + writer.uint32(24).bool(message.deprecated); + } + if ( + message.deprecatedLegacyJsonFieldConflicts !== undefined && message.deprecatedLegacyJsonFieldConflicts !== false + ) { + writer.uint32(48).bool(message.deprecatedLegacyJsonFieldConflicts); + } + if (message.features !== undefined) { + FeatureSet.encode(message.features, writer.uint32(58).fork()).join(); + } + for (const v of message.uninterpretedOption) { + UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): EnumOptions { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEnumOptions(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 2: { + if (tag !== 16) { + break; + } + + message.allowAlias = reader.bool(); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.deprecated = reader.bool(); + continue; + } + case 6: { + if (tag !== 48) { + break; + } + + message.deprecatedLegacyJsonFieldConflicts = reader.bool(); + continue; + } + case 7: { + if (tag !== 58) { + break; + } + + message.features = FeatureSet.decode(reader, reader.uint32()); + continue; + } + case 999: { + if (tag !== 7994) { + break; + } + + message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): EnumOptions { + return { + allowAlias: isSet(object.allowAlias) ? globalThis.Boolean(object.allowAlias) : false, + deprecated: isSet(object.deprecated) ? globalThis.Boolean(object.deprecated) : false, + deprecatedLegacyJsonFieldConflicts: isSet(object.deprecatedLegacyJsonFieldConflicts) + ? globalThis.Boolean(object.deprecatedLegacyJsonFieldConflicts) + : false, + features: isSet(object.features) ? FeatureSet.fromJSON(object.features) : undefined, + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) + ? object.uninterpretedOption.map((e: any) => UninterpretedOption.fromJSON(e)) + : [], + }; + }, + + toJSON(message: EnumOptions): unknown { + const obj: any = {}; + if (message.allowAlias !== undefined && message.allowAlias !== false) { + obj.allowAlias = message.allowAlias; + } + if (message.deprecated !== undefined && message.deprecated !== false) { + obj.deprecated = message.deprecated; + } + if ( + message.deprecatedLegacyJsonFieldConflicts !== undefined && message.deprecatedLegacyJsonFieldConflicts !== false + ) { + obj.deprecatedLegacyJsonFieldConflicts = message.deprecatedLegacyJsonFieldConflicts; + } + if (message.features !== undefined) { + obj.features = FeatureSet.toJSON(message.features); + } + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => UninterpretedOption.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): EnumOptions { + return EnumOptions.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): EnumOptions { + const message = createBaseEnumOptions(); + message.allowAlias = object.allowAlias ?? false; + message.deprecated = object.deprecated ?? false; + message.deprecatedLegacyJsonFieldConflicts = object.deprecatedLegacyJsonFieldConflicts ?? false; + message.features = (object.features !== undefined && object.features !== null) + ? FeatureSet.fromPartial(object.features) + : undefined; + message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseEnumValueOptions(): EnumValueOptions { + return { + deprecated: false, + features: undefined, + debugRedact: false, + featureSupport: undefined, + uninterpretedOption: [], + }; +} + +export const EnumValueOptions: MessageFns = { + encode(message: EnumValueOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.deprecated !== undefined && message.deprecated !== false) { + writer.uint32(8).bool(message.deprecated); + } + if (message.features !== undefined) { + FeatureSet.encode(message.features, writer.uint32(18).fork()).join(); + } + if (message.debugRedact !== undefined && message.debugRedact !== false) { + writer.uint32(24).bool(message.debugRedact); + } + if (message.featureSupport !== undefined) { + FieldOptions_FeatureSupport.encode(message.featureSupport, writer.uint32(34).fork()).join(); + } + for (const v of message.uninterpretedOption) { + UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): EnumValueOptions { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEnumValueOptions(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.deprecated = reader.bool(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.features = FeatureSet.decode(reader, reader.uint32()); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.debugRedact = reader.bool(); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.featureSupport = FieldOptions_FeatureSupport.decode(reader, reader.uint32()); + continue; + } + case 999: { + if (tag !== 7994) { + break; + } + + message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): EnumValueOptions { + return { + deprecated: isSet(object.deprecated) ? globalThis.Boolean(object.deprecated) : false, + features: isSet(object.features) ? FeatureSet.fromJSON(object.features) : undefined, + debugRedact: isSet(object.debugRedact) ? globalThis.Boolean(object.debugRedact) : false, + featureSupport: isSet(object.featureSupport) + ? FieldOptions_FeatureSupport.fromJSON(object.featureSupport) + : undefined, + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) + ? object.uninterpretedOption.map((e: any) => UninterpretedOption.fromJSON(e)) + : [], + }; + }, + + toJSON(message: EnumValueOptions): unknown { + const obj: any = {}; + if (message.deprecated !== undefined && message.deprecated !== false) { + obj.deprecated = message.deprecated; + } + if (message.features !== undefined) { + obj.features = FeatureSet.toJSON(message.features); + } + if (message.debugRedact !== undefined && message.debugRedact !== false) { + obj.debugRedact = message.debugRedact; + } + if (message.featureSupport !== undefined) { + obj.featureSupport = FieldOptions_FeatureSupport.toJSON(message.featureSupport); + } + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => UninterpretedOption.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): EnumValueOptions { + return EnumValueOptions.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): EnumValueOptions { + const message = createBaseEnumValueOptions(); + message.deprecated = object.deprecated ?? false; + message.features = (object.features !== undefined && object.features !== null) + ? FeatureSet.fromPartial(object.features) + : undefined; + message.debugRedact = object.debugRedact ?? false; + message.featureSupport = (object.featureSupport !== undefined && object.featureSupport !== null) + ? FieldOptions_FeatureSupport.fromPartial(object.featureSupport) + : undefined; + message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseServiceOptions(): ServiceOptions { + return { features: undefined, deprecated: false, uninterpretedOption: [] }; +} + +export const ServiceOptions: MessageFns = { + encode(message: ServiceOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.features !== undefined) { + FeatureSet.encode(message.features, writer.uint32(274).fork()).join(); + } + if (message.deprecated !== undefined && message.deprecated !== false) { + writer.uint32(264).bool(message.deprecated); + } + for (const v of message.uninterpretedOption) { + UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ServiceOptions { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseServiceOptions(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 34: { + if (tag !== 274) { + break; + } + + message.features = FeatureSet.decode(reader, reader.uint32()); + continue; + } + case 33: { + if (tag !== 264) { + break; + } + + message.deprecated = reader.bool(); + continue; + } + case 999: { + if (tag !== 7994) { + break; + } + + message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ServiceOptions { + return { + features: isSet(object.features) ? FeatureSet.fromJSON(object.features) : undefined, + deprecated: isSet(object.deprecated) ? globalThis.Boolean(object.deprecated) : false, + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) + ? object.uninterpretedOption.map((e: any) => UninterpretedOption.fromJSON(e)) + : [], + }; + }, + + toJSON(message: ServiceOptions): unknown { + const obj: any = {}; + if (message.features !== undefined) { + obj.features = FeatureSet.toJSON(message.features); + } + if (message.deprecated !== undefined && message.deprecated !== false) { + obj.deprecated = message.deprecated; + } + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => UninterpretedOption.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): ServiceOptions { + return ServiceOptions.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ServiceOptions { + const message = createBaseServiceOptions(); + message.features = (object.features !== undefined && object.features !== null) + ? FeatureSet.fromPartial(object.features) + : undefined; + message.deprecated = object.deprecated ?? false; + message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseMethodOptions(): MethodOptions { + return { deprecated: false, idempotencyLevel: 0, features: undefined, uninterpretedOption: [] }; +} + +export const MethodOptions: MessageFns = { + encode(message: MethodOptions, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.deprecated !== undefined && message.deprecated !== false) { + writer.uint32(264).bool(message.deprecated); + } + if (message.idempotencyLevel !== undefined && message.idempotencyLevel !== 0) { + writer.uint32(272).int32(message.idempotencyLevel); + } + if (message.features !== undefined) { + FeatureSet.encode(message.features, writer.uint32(282).fork()).join(); + } + for (const v of message.uninterpretedOption) { + UninterpretedOption.encode(v!, writer.uint32(7994).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): MethodOptions { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseMethodOptions(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 33: { + if (tag !== 264) { + break; + } + + message.deprecated = reader.bool(); + continue; + } + case 34: { + if (tag !== 272) { + break; + } + + message.idempotencyLevel = reader.int32() as any; + continue; + } + case 35: { + if (tag !== 282) { + break; + } + + message.features = FeatureSet.decode(reader, reader.uint32()); + continue; + } + case 999: { + if (tag !== 7994) { + break; + } + + message.uninterpretedOption.push(UninterpretedOption.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): MethodOptions { + return { + deprecated: isSet(object.deprecated) ? globalThis.Boolean(object.deprecated) : false, + idempotencyLevel: isSet(object.idempotencyLevel) + ? methodOptions_IdempotencyLevelFromJSON(object.idempotencyLevel) + : 0, + features: isSet(object.features) ? FeatureSet.fromJSON(object.features) : undefined, + uninterpretedOption: globalThis.Array.isArray(object?.uninterpretedOption) + ? object.uninterpretedOption.map((e: any) => UninterpretedOption.fromJSON(e)) + : [], + }; + }, + + toJSON(message: MethodOptions): unknown { + const obj: any = {}; + if (message.deprecated !== undefined && message.deprecated !== false) { + obj.deprecated = message.deprecated; + } + if (message.idempotencyLevel !== undefined && message.idempotencyLevel !== 0) { + obj.idempotencyLevel = methodOptions_IdempotencyLevelToJSON(message.idempotencyLevel); + } + if (message.features !== undefined) { + obj.features = FeatureSet.toJSON(message.features); + } + if (message.uninterpretedOption?.length) { + obj.uninterpretedOption = message.uninterpretedOption.map((e) => UninterpretedOption.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): MethodOptions { + return MethodOptions.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): MethodOptions { + const message = createBaseMethodOptions(); + message.deprecated = object.deprecated ?? false; + message.idempotencyLevel = object.idempotencyLevel ?? 0; + message.features = (object.features !== undefined && object.features !== null) + ? FeatureSet.fromPartial(object.features) + : undefined; + message.uninterpretedOption = object.uninterpretedOption?.map((e) => UninterpretedOption.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseUninterpretedOption(): UninterpretedOption { + return { + name: [], + identifierValue: "", + positiveIntValue: 0, + negativeIntValue: 0, + doubleValue: 0, + stringValue: Buffer.alloc(0), + aggregateValue: "", + }; +} + +export const UninterpretedOption: MessageFns = { + encode(message: UninterpretedOption, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.name) { + UninterpretedOption_NamePart.encode(v!, writer.uint32(18).fork()).join(); + } + if (message.identifierValue !== undefined && message.identifierValue !== "") { + writer.uint32(26).string(message.identifierValue); + } + if (message.positiveIntValue !== undefined && message.positiveIntValue !== 0) { + writer.uint32(32).uint64(message.positiveIntValue); + } + if (message.negativeIntValue !== undefined && message.negativeIntValue !== 0) { + writer.uint32(40).int64(message.negativeIntValue); + } + if (message.doubleValue !== undefined && message.doubleValue !== 0) { + writer.uint32(49).double(message.doubleValue); + } + if (message.stringValue !== undefined && message.stringValue.length !== 0) { + writer.uint32(58).bytes(message.stringValue); + } + if (message.aggregateValue !== undefined && message.aggregateValue !== "") { + writer.uint32(66).string(message.aggregateValue); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): UninterpretedOption { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseUninterpretedOption(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 2: { + if (tag !== 18) { + break; + } + + message.name.push(UninterpretedOption_NamePart.decode(reader, reader.uint32())); + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.identifierValue = reader.string(); + continue; + } + case 4: { + if (tag !== 32) { + break; + } + + message.positiveIntValue = longToNumber(reader.uint64()); + continue; + } + case 5: { + if (tag !== 40) { + break; + } + + message.negativeIntValue = longToNumber(reader.int64()); + continue; + } + case 6: { + if (tag !== 49) { + break; + } + + message.doubleValue = reader.double(); + continue; + } + case 7: { + if (tag !== 58) { + break; + } + + message.stringValue = Buffer.from(reader.bytes()); + continue; + } + case 8: { + if (tag !== 66) { + break; + } + + message.aggregateValue = reader.string(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): UninterpretedOption { + return { + name: globalThis.Array.isArray(object?.name) + ? object.name.map((e: any) => UninterpretedOption_NamePart.fromJSON(e)) + : [], + identifierValue: isSet(object.identifierValue) ? globalThis.String(object.identifierValue) : "", + positiveIntValue: isSet(object.positiveIntValue) ? globalThis.Number(object.positiveIntValue) : 0, + negativeIntValue: isSet(object.negativeIntValue) ? globalThis.Number(object.negativeIntValue) : 0, + doubleValue: isSet(object.doubleValue) ? globalThis.Number(object.doubleValue) : 0, + stringValue: isSet(object.stringValue) ? Buffer.from(bytesFromBase64(object.stringValue)) : Buffer.alloc(0), + aggregateValue: isSet(object.aggregateValue) ? globalThis.String(object.aggregateValue) : "", + }; + }, + + toJSON(message: UninterpretedOption): unknown { + const obj: any = {}; + if (message.name?.length) { + obj.name = message.name.map((e) => UninterpretedOption_NamePart.toJSON(e)); + } + if (message.identifierValue !== undefined && message.identifierValue !== "") { + obj.identifierValue = message.identifierValue; + } + if (message.positiveIntValue !== undefined && message.positiveIntValue !== 0) { + obj.positiveIntValue = Math.round(message.positiveIntValue); + } + if (message.negativeIntValue !== undefined && message.negativeIntValue !== 0) { + obj.negativeIntValue = Math.round(message.negativeIntValue); + } + if (message.doubleValue !== undefined && message.doubleValue !== 0) { + obj.doubleValue = message.doubleValue; + } + if (message.stringValue !== undefined && message.stringValue.length !== 0) { + obj.stringValue = base64FromBytes(message.stringValue); + } + if (message.aggregateValue !== undefined && message.aggregateValue !== "") { + obj.aggregateValue = message.aggregateValue; + } + return obj; + }, + + create, I>>(base?: I): UninterpretedOption { + return UninterpretedOption.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): UninterpretedOption { + const message = createBaseUninterpretedOption(); + message.name = object.name?.map((e) => UninterpretedOption_NamePart.fromPartial(e)) || []; + message.identifierValue = object.identifierValue ?? ""; + message.positiveIntValue = object.positiveIntValue ?? 0; + message.negativeIntValue = object.negativeIntValue ?? 0; + message.doubleValue = object.doubleValue ?? 0; + message.stringValue = object.stringValue ?? Buffer.alloc(0); + message.aggregateValue = object.aggregateValue ?? ""; + return message; + }, +}; + +function createBaseUninterpretedOption_NamePart(): UninterpretedOption_NamePart { + return { namePart: "", isExtension: false }; +} + +export const UninterpretedOption_NamePart: MessageFns = { + encode(message: UninterpretedOption_NamePart, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.namePart !== "") { + writer.uint32(10).string(message.namePart); + } + if (message.isExtension !== false) { + writer.uint32(16).bool(message.isExtension); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): UninterpretedOption_NamePart { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseUninterpretedOption_NamePart(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.namePart = reader.string(); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.isExtension = reader.bool(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): UninterpretedOption_NamePart { + return { + namePart: isSet(object.namePart) ? globalThis.String(object.namePart) : "", + isExtension: isSet(object.isExtension) ? globalThis.Boolean(object.isExtension) : false, + }; + }, + + toJSON(message: UninterpretedOption_NamePart): unknown { + const obj: any = {}; + if (message.namePart !== "") { + obj.namePart = message.namePart; + } + if (message.isExtension !== false) { + obj.isExtension = message.isExtension; + } + return obj; + }, + + create, I>>(base?: I): UninterpretedOption_NamePart { + return UninterpretedOption_NamePart.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): UninterpretedOption_NamePart { + const message = createBaseUninterpretedOption_NamePart(); + message.namePart = object.namePart ?? ""; + message.isExtension = object.isExtension ?? false; + return message; + }, +}; + +function createBaseFeatureSet(): FeatureSet { + return { + fieldPresence: 0, + enumType: 0, + repeatedFieldEncoding: 0, + utf8Validation: 0, + messageEncoding: 0, + jsonFormat: 0, + enforceNamingStyle: 0, + defaultSymbolVisibility: 0, + }; +} + +export const FeatureSet: MessageFns = { + encode(message: FeatureSet, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.fieldPresence !== undefined && message.fieldPresence !== 0) { + writer.uint32(8).int32(message.fieldPresence); + } + if (message.enumType !== undefined && message.enumType !== 0) { + writer.uint32(16).int32(message.enumType); + } + if (message.repeatedFieldEncoding !== undefined && message.repeatedFieldEncoding !== 0) { + writer.uint32(24).int32(message.repeatedFieldEncoding); + } + if (message.utf8Validation !== undefined && message.utf8Validation !== 0) { + writer.uint32(32).int32(message.utf8Validation); + } + if (message.messageEncoding !== undefined && message.messageEncoding !== 0) { + writer.uint32(40).int32(message.messageEncoding); + } + if (message.jsonFormat !== undefined && message.jsonFormat !== 0) { + writer.uint32(48).int32(message.jsonFormat); + } + if (message.enforceNamingStyle !== undefined && message.enforceNamingStyle !== 0) { + writer.uint32(56).int32(message.enforceNamingStyle); + } + if (message.defaultSymbolVisibility !== undefined && message.defaultSymbolVisibility !== 0) { + writer.uint32(64).int32(message.defaultSymbolVisibility); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): FeatureSet { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFeatureSet(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.fieldPresence = reader.int32() as any; + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.enumType = reader.int32() as any; + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.repeatedFieldEncoding = reader.int32() as any; + continue; + } + case 4: { + if (tag !== 32) { + break; + } + + message.utf8Validation = reader.int32() as any; + continue; + } + case 5: { + if (tag !== 40) { + break; + } + + message.messageEncoding = reader.int32() as any; + continue; + } + case 6: { + if (tag !== 48) { + break; + } + + message.jsonFormat = reader.int32() as any; + continue; + } + case 7: { + if (tag !== 56) { + break; + } + + message.enforceNamingStyle = reader.int32() as any; + continue; + } + case 8: { + if (tag !== 64) { + break; + } + + message.defaultSymbolVisibility = reader.int32() as any; + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): FeatureSet { + return { + fieldPresence: isSet(object.fieldPresence) ? featureSet_FieldPresenceFromJSON(object.fieldPresence) : 0, + enumType: isSet(object.enumType) ? featureSet_EnumTypeFromJSON(object.enumType) : 0, + repeatedFieldEncoding: isSet(object.repeatedFieldEncoding) + ? featureSet_RepeatedFieldEncodingFromJSON(object.repeatedFieldEncoding) + : 0, + utf8Validation: isSet(object.utf8Validation) ? featureSet_Utf8ValidationFromJSON(object.utf8Validation) : 0, + messageEncoding: isSet(object.messageEncoding) ? featureSet_MessageEncodingFromJSON(object.messageEncoding) : 0, + jsonFormat: isSet(object.jsonFormat) ? featureSet_JsonFormatFromJSON(object.jsonFormat) : 0, + enforceNamingStyle: isSet(object.enforceNamingStyle) + ? featureSet_EnforceNamingStyleFromJSON(object.enforceNamingStyle) + : 0, + defaultSymbolVisibility: isSet(object.defaultSymbolVisibility) + ? featureSet_VisibilityFeature_DefaultSymbolVisibilityFromJSON(object.defaultSymbolVisibility) + : 0, + }; + }, + + toJSON(message: FeatureSet): unknown { + const obj: any = {}; + if (message.fieldPresence !== undefined && message.fieldPresence !== 0) { + obj.fieldPresence = featureSet_FieldPresenceToJSON(message.fieldPresence); + } + if (message.enumType !== undefined && message.enumType !== 0) { + obj.enumType = featureSet_EnumTypeToJSON(message.enumType); + } + if (message.repeatedFieldEncoding !== undefined && message.repeatedFieldEncoding !== 0) { + obj.repeatedFieldEncoding = featureSet_RepeatedFieldEncodingToJSON(message.repeatedFieldEncoding); + } + if (message.utf8Validation !== undefined && message.utf8Validation !== 0) { + obj.utf8Validation = featureSet_Utf8ValidationToJSON(message.utf8Validation); + } + if (message.messageEncoding !== undefined && message.messageEncoding !== 0) { + obj.messageEncoding = featureSet_MessageEncodingToJSON(message.messageEncoding); + } + if (message.jsonFormat !== undefined && message.jsonFormat !== 0) { + obj.jsonFormat = featureSet_JsonFormatToJSON(message.jsonFormat); + } + if (message.enforceNamingStyle !== undefined && message.enforceNamingStyle !== 0) { + obj.enforceNamingStyle = featureSet_EnforceNamingStyleToJSON(message.enforceNamingStyle); + } + if (message.defaultSymbolVisibility !== undefined && message.defaultSymbolVisibility !== 0) { + obj.defaultSymbolVisibility = featureSet_VisibilityFeature_DefaultSymbolVisibilityToJSON( + message.defaultSymbolVisibility, + ); + } + return obj; + }, + + create, I>>(base?: I): FeatureSet { + return FeatureSet.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): FeatureSet { + const message = createBaseFeatureSet(); + message.fieldPresence = object.fieldPresence ?? 0; + message.enumType = object.enumType ?? 0; + message.repeatedFieldEncoding = object.repeatedFieldEncoding ?? 0; + message.utf8Validation = object.utf8Validation ?? 0; + message.messageEncoding = object.messageEncoding ?? 0; + message.jsonFormat = object.jsonFormat ?? 0; + message.enforceNamingStyle = object.enforceNamingStyle ?? 0; + message.defaultSymbolVisibility = object.defaultSymbolVisibility ?? 0; + return message; + }, +}; + +function createBaseFeatureSet_VisibilityFeature(): FeatureSet_VisibilityFeature { + return {}; +} + +export const FeatureSet_VisibilityFeature: MessageFns = { + encode(_: FeatureSet_VisibilityFeature, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): FeatureSet_VisibilityFeature { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFeatureSet_VisibilityFeature(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(_: any): FeatureSet_VisibilityFeature { + return {}; + }, + + toJSON(_: FeatureSet_VisibilityFeature): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): FeatureSet_VisibilityFeature { + return FeatureSet_VisibilityFeature.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): FeatureSet_VisibilityFeature { + const message = createBaseFeatureSet_VisibilityFeature(); + return message; + }, +}; + +function createBaseFeatureSetDefaults(): FeatureSetDefaults { + return { defaults: [], minimumEdition: 0, maximumEdition: 0 }; +} + +export const FeatureSetDefaults: MessageFns = { + encode(message: FeatureSetDefaults, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.defaults) { + FeatureSetDefaults_FeatureSetEditionDefault.encode(v!, writer.uint32(10).fork()).join(); + } + if (message.minimumEdition !== undefined && message.minimumEdition !== 0) { + writer.uint32(32).int32(message.minimumEdition); + } + if (message.maximumEdition !== undefined && message.maximumEdition !== 0) { + writer.uint32(40).int32(message.maximumEdition); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): FeatureSetDefaults { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFeatureSetDefaults(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.defaults.push(FeatureSetDefaults_FeatureSetEditionDefault.decode(reader, reader.uint32())); + continue; + } + case 4: { + if (tag !== 32) { + break; + } + + message.minimumEdition = reader.int32() as any; + continue; + } + case 5: { + if (tag !== 40) { + break; + } + + message.maximumEdition = reader.int32() as any; + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): FeatureSetDefaults { + return { + defaults: globalThis.Array.isArray(object?.defaults) + ? object.defaults.map((e: any) => FeatureSetDefaults_FeatureSetEditionDefault.fromJSON(e)) + : [], + minimumEdition: isSet(object.minimumEdition) ? editionFromJSON(object.minimumEdition) : 0, + maximumEdition: isSet(object.maximumEdition) ? editionFromJSON(object.maximumEdition) : 0, + }; + }, + + toJSON(message: FeatureSetDefaults): unknown { + const obj: any = {}; + if (message.defaults?.length) { + obj.defaults = message.defaults.map((e) => FeatureSetDefaults_FeatureSetEditionDefault.toJSON(e)); + } + if (message.minimumEdition !== undefined && message.minimumEdition !== 0) { + obj.minimumEdition = editionToJSON(message.minimumEdition); + } + if (message.maximumEdition !== undefined && message.maximumEdition !== 0) { + obj.maximumEdition = editionToJSON(message.maximumEdition); + } + return obj; + }, + + create, I>>(base?: I): FeatureSetDefaults { + return FeatureSetDefaults.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): FeatureSetDefaults { + const message = createBaseFeatureSetDefaults(); + message.defaults = object.defaults?.map((e) => FeatureSetDefaults_FeatureSetEditionDefault.fromPartial(e)) || []; + message.minimumEdition = object.minimumEdition ?? 0; + message.maximumEdition = object.maximumEdition ?? 0; + return message; + }, +}; + +function createBaseFeatureSetDefaults_FeatureSetEditionDefault(): FeatureSetDefaults_FeatureSetEditionDefault { + return { edition: 0, overridableFeatures: undefined, fixedFeatures: undefined }; +} + +export const FeatureSetDefaults_FeatureSetEditionDefault: MessageFns = { + encode( + message: FeatureSetDefaults_FeatureSetEditionDefault, + writer: BinaryWriter = new BinaryWriter(), + ): BinaryWriter { + if (message.edition !== undefined && message.edition !== 0) { + writer.uint32(24).int32(message.edition); + } + if (message.overridableFeatures !== undefined) { + FeatureSet.encode(message.overridableFeatures, writer.uint32(34).fork()).join(); + } + if (message.fixedFeatures !== undefined) { + FeatureSet.encode(message.fixedFeatures, writer.uint32(42).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): FeatureSetDefaults_FeatureSetEditionDefault { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseFeatureSetDefaults_FeatureSetEditionDefault(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 3: { + if (tag !== 24) { + break; + } + + message.edition = reader.int32() as any; + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.overridableFeatures = FeatureSet.decode(reader, reader.uint32()); + continue; + } + case 5: { + if (tag !== 42) { + break; + } + + message.fixedFeatures = FeatureSet.decode(reader, reader.uint32()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): FeatureSetDefaults_FeatureSetEditionDefault { + return { + edition: isSet(object.edition) ? editionFromJSON(object.edition) : 0, + overridableFeatures: isSet(object.overridableFeatures) + ? FeatureSet.fromJSON(object.overridableFeatures) + : undefined, + fixedFeatures: isSet(object.fixedFeatures) ? FeatureSet.fromJSON(object.fixedFeatures) : undefined, + }; + }, + + toJSON(message: FeatureSetDefaults_FeatureSetEditionDefault): unknown { + const obj: any = {}; + if (message.edition !== undefined && message.edition !== 0) { + obj.edition = editionToJSON(message.edition); + } + if (message.overridableFeatures !== undefined) { + obj.overridableFeatures = FeatureSet.toJSON(message.overridableFeatures); + } + if (message.fixedFeatures !== undefined) { + obj.fixedFeatures = FeatureSet.toJSON(message.fixedFeatures); + } + return obj; + }, + + create, I>>( + base?: I, + ): FeatureSetDefaults_FeatureSetEditionDefault { + return FeatureSetDefaults_FeatureSetEditionDefault.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>( + object: I, + ): FeatureSetDefaults_FeatureSetEditionDefault { + const message = createBaseFeatureSetDefaults_FeatureSetEditionDefault(); + message.edition = object.edition ?? 0; + message.overridableFeatures = (object.overridableFeatures !== undefined && object.overridableFeatures !== null) + ? FeatureSet.fromPartial(object.overridableFeatures) + : undefined; + message.fixedFeatures = (object.fixedFeatures !== undefined && object.fixedFeatures !== null) + ? FeatureSet.fromPartial(object.fixedFeatures) + : undefined; + return message; + }, +}; + +function createBaseSourceCodeInfo(): SourceCodeInfo { + return { location: [] }; +} + +export const SourceCodeInfo: MessageFns = { + encode(message: SourceCodeInfo, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.location) { + SourceCodeInfo_Location.encode(v!, writer.uint32(10).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): SourceCodeInfo { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSourceCodeInfo(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.location.push(SourceCodeInfo_Location.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): SourceCodeInfo { + return { + location: globalThis.Array.isArray(object?.location) + ? object.location.map((e: any) => SourceCodeInfo_Location.fromJSON(e)) + : [], + }; + }, + + toJSON(message: SourceCodeInfo): unknown { + const obj: any = {}; + if (message.location?.length) { + obj.location = message.location.map((e) => SourceCodeInfo_Location.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): SourceCodeInfo { + return SourceCodeInfo.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): SourceCodeInfo { + const message = createBaseSourceCodeInfo(); + message.location = object.location?.map((e) => SourceCodeInfo_Location.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseSourceCodeInfo_Location(): SourceCodeInfo_Location { + return { path: [], span: [], leadingComments: "", trailingComments: "", leadingDetachedComments: [] }; +} + +export const SourceCodeInfo_Location: MessageFns = { + encode(message: SourceCodeInfo_Location, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + writer.uint32(10).fork(); + for (const v of message.path) { + writer.int32(v); + } + writer.join(); + writer.uint32(18).fork(); + for (const v of message.span) { + writer.int32(v); + } + writer.join(); + if (message.leadingComments !== undefined && message.leadingComments !== "") { + writer.uint32(26).string(message.leadingComments); + } + if (message.trailingComments !== undefined && message.trailingComments !== "") { + writer.uint32(34).string(message.trailingComments); + } + for (const v of message.leadingDetachedComments) { + writer.uint32(50).string(v!); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): SourceCodeInfo_Location { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseSourceCodeInfo_Location(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag === 8) { + message.path.push(reader.int32()); + + continue; + } + + if (tag === 10) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.path.push(reader.int32()); + } + + continue; + } + + break; + } + case 2: { + if (tag === 16) { + message.span.push(reader.int32()); + + continue; + } + + if (tag === 18) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.span.push(reader.int32()); + } + + continue; + } + + break; + } + case 3: { + if (tag !== 26) { + break; + } + + message.leadingComments = reader.string(); + continue; + } + case 4: { + if (tag !== 34) { + break; + } + + message.trailingComments = reader.string(); + continue; + } + case 6: { + if (tag !== 50) { + break; + } + + message.leadingDetachedComments.push(reader.string()); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): SourceCodeInfo_Location { + return { + path: globalThis.Array.isArray(object?.path) ? object.path.map((e: any) => globalThis.Number(e)) : [], + span: globalThis.Array.isArray(object?.span) ? object.span.map((e: any) => globalThis.Number(e)) : [], + leadingComments: isSet(object.leadingComments) ? globalThis.String(object.leadingComments) : "", + trailingComments: isSet(object.trailingComments) ? globalThis.String(object.trailingComments) : "", + leadingDetachedComments: globalThis.Array.isArray(object?.leadingDetachedComments) + ? object.leadingDetachedComments.map((e: any) => globalThis.String(e)) + : [], + }; + }, + + toJSON(message: SourceCodeInfo_Location): unknown { + const obj: any = {}; + if (message.path?.length) { + obj.path = message.path.map((e) => Math.round(e)); + } + if (message.span?.length) { + obj.span = message.span.map((e) => Math.round(e)); + } + if (message.leadingComments !== undefined && message.leadingComments !== "") { + obj.leadingComments = message.leadingComments; + } + if (message.trailingComments !== undefined && message.trailingComments !== "") { + obj.trailingComments = message.trailingComments; + } + if (message.leadingDetachedComments?.length) { + obj.leadingDetachedComments = message.leadingDetachedComments; + } + return obj; + }, + + create, I>>(base?: I): SourceCodeInfo_Location { + return SourceCodeInfo_Location.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): SourceCodeInfo_Location { + const message = createBaseSourceCodeInfo_Location(); + message.path = object.path?.map((e) => e) || []; + message.span = object.span?.map((e) => e) || []; + message.leadingComments = object.leadingComments ?? ""; + message.trailingComments = object.trailingComments ?? ""; + message.leadingDetachedComments = object.leadingDetachedComments?.map((e) => e) || []; + return message; + }, +}; + +function createBaseGeneratedCodeInfo(): GeneratedCodeInfo { + return { annotation: [] }; +} + +export const GeneratedCodeInfo: MessageFns = { + encode(message: GeneratedCodeInfo, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.annotation) { + GeneratedCodeInfo_Annotation.encode(v!, writer.uint32(10).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): GeneratedCodeInfo { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGeneratedCodeInfo(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.annotation.push(GeneratedCodeInfo_Annotation.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): GeneratedCodeInfo { + return { + annotation: globalThis.Array.isArray(object?.annotation) + ? object.annotation.map((e: any) => GeneratedCodeInfo_Annotation.fromJSON(e)) + : [], + }; + }, + + toJSON(message: GeneratedCodeInfo): unknown { + const obj: any = {}; + if (message.annotation?.length) { + obj.annotation = message.annotation.map((e) => GeneratedCodeInfo_Annotation.toJSON(e)); + } + return obj; + }, + + create, I>>(base?: I): GeneratedCodeInfo { + return GeneratedCodeInfo.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): GeneratedCodeInfo { + const message = createBaseGeneratedCodeInfo(); + message.annotation = object.annotation?.map((e) => GeneratedCodeInfo_Annotation.fromPartial(e)) || []; + return message; + }, +}; + +function createBaseGeneratedCodeInfo_Annotation(): GeneratedCodeInfo_Annotation { + return { path: [], sourceFile: "", begin: 0, end: 0, semantic: 0 }; +} + +export const GeneratedCodeInfo_Annotation: MessageFns = { + encode(message: GeneratedCodeInfo_Annotation, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + writer.uint32(10).fork(); + for (const v of message.path) { + writer.int32(v); + } + writer.join(); + if (message.sourceFile !== undefined && message.sourceFile !== "") { + writer.uint32(18).string(message.sourceFile); + } + if (message.begin !== undefined && message.begin !== 0) { + writer.uint32(24).int32(message.begin); + } + if (message.end !== undefined && message.end !== 0) { + writer.uint32(32).int32(message.end); + } + if (message.semantic !== undefined && message.semantic !== 0) { + writer.uint32(40).int32(message.semantic); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): GeneratedCodeInfo_Annotation { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseGeneratedCodeInfo_Annotation(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag === 8) { + message.path.push(reader.int32()); + + continue; + } + + if (tag === 10) { + const end2 = reader.uint32() + reader.pos; + while (reader.pos < end2) { + message.path.push(reader.int32()); + } + + continue; + } + + break; + } + case 2: { + if (tag !== 18) { + break; + } + + message.sourceFile = reader.string(); + continue; + } + case 3: { + if (tag !== 24) { + break; + } + + message.begin = reader.int32(); + continue; + } + case 4: { + if (tag !== 32) { + break; + } + + message.end = reader.int32(); + continue; + } + case 5: { + if (tag !== 40) { + break; + } + + message.semantic = reader.int32() as any; + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): GeneratedCodeInfo_Annotation { + return { + path: globalThis.Array.isArray(object?.path) ? object.path.map((e: any) => globalThis.Number(e)) : [], + sourceFile: isSet(object.sourceFile) ? globalThis.String(object.sourceFile) : "", + begin: isSet(object.begin) ? globalThis.Number(object.begin) : 0, + end: isSet(object.end) ? globalThis.Number(object.end) : 0, + semantic: isSet(object.semantic) ? generatedCodeInfo_Annotation_SemanticFromJSON(object.semantic) : 0, + }; + }, + + toJSON(message: GeneratedCodeInfo_Annotation): unknown { + const obj: any = {}; + if (message.path?.length) { + obj.path = message.path.map((e) => Math.round(e)); + } + if (message.sourceFile !== undefined && message.sourceFile !== "") { + obj.sourceFile = message.sourceFile; + } + if (message.begin !== undefined && message.begin !== 0) { + obj.begin = Math.round(message.begin); + } + if (message.end !== undefined && message.end !== 0) { + obj.end = Math.round(message.end); + } + if (message.semantic !== undefined && message.semantic !== 0) { + obj.semantic = generatedCodeInfo_Annotation_SemanticToJSON(message.semantic); + } + return obj; + }, + + create, I>>(base?: I): GeneratedCodeInfo_Annotation { + return GeneratedCodeInfo_Annotation.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): GeneratedCodeInfo_Annotation { + const message = createBaseGeneratedCodeInfo_Annotation(); + message.path = object.path?.map((e) => e) || []; + message.sourceFile = object.sourceFile ?? ""; + message.begin = object.begin ?? 0; + message.end = object.end ?? 0; + message.semantic = object.semantic ?? 0; + return message; + }, +}; + +function bytesFromBase64(b64: string): Uint8Array { + return Uint8Array.from(globalThis.Buffer.from(b64, "base64")); +} + +function base64FromBytes(arr: Uint8Array): string { + return globalThis.Buffer.from(arr).toString("base64"); +} + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends { $case: string; value: unknown } ? { $case: T["$case"]; value?: DeepPartial } + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToNumber(int64: { toString(): string }): number { + const num = globalThis.Number(int64.toString()); + if (num > globalThis.Number.MAX_SAFE_INTEGER) { + throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); + } + if (num < globalThis.Number.MIN_SAFE_INTEGER) { + throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); + } + return num; +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} diff --git a/src/grpc/google/protobuf/duration.ts b/src/grpc/google/protobuf/duration.ts new file mode 100644 index 00000000..ccbeed8b --- /dev/null +++ b/src/grpc/google/protobuf/duration.ts @@ -0,0 +1,201 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.8.3 +// protoc v3.21.12 +// source: google/protobuf/duration.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; + +export const protobufPackage = "google.protobuf"; + +/** + * A Duration represents a signed, fixed-length span of time represented + * as a count of seconds and fractions of seconds at nanosecond + * resolution. It is independent of any calendar and concepts like "day" + * or "month". It is related to Timestamp in that the difference between + * two Timestamp values is a Duration and it can be added or subtracted + * from a Timestamp. Range is approximately +-10,000 years. + * + * # Examples + * + * Example 1: Compute Duration from two Timestamps in pseudo code. + * + * Timestamp start = ...; + * Timestamp end = ...; + * Duration duration = ...; + * + * duration.seconds = end.seconds - start.seconds; + * duration.nanos = end.nanos - start.nanos; + * + * if (duration.seconds < 0 && duration.nanos > 0) { + * duration.seconds += 1; + * duration.nanos -= 1000000000; + * } else if (duration.seconds > 0 && duration.nanos < 0) { + * duration.seconds -= 1; + * duration.nanos += 1000000000; + * } + * + * Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. + * + * Timestamp start = ...; + * Duration duration = ...; + * Timestamp end = ...; + * + * end.seconds = start.seconds + duration.seconds; + * end.nanos = start.nanos + duration.nanos; + * + * if (end.nanos < 0) { + * end.seconds -= 1; + * end.nanos += 1000000000; + * } else if (end.nanos >= 1000000000) { + * end.seconds += 1; + * end.nanos -= 1000000000; + * } + * + * Example 3: Compute Duration from datetime.timedelta in Python. + * + * td = datetime.timedelta(days=3, minutes=10) + * duration = Duration() + * duration.FromTimedelta(td) + * + * # JSON Mapping + * + * In JSON format, the Duration type is encoded as a string rather than an + * object, where the string ends in the suffix "s" (indicating seconds) and + * is preceded by the number of seconds, with nanoseconds expressed as + * fractional seconds. For example, 3 seconds with 0 nanoseconds should be + * encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should + * be expressed in JSON format as "3.000000001s", and 3 seconds and 1 + * microsecond should be expressed in JSON format as "3.000001s". + */ +export interface Duration { + /** + * Signed seconds of the span of time. Must be from -315,576,000,000 + * to +315,576,000,000 inclusive. Note: these bounds are computed from: + * 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years + */ + seconds: number; + /** + * Signed fractions of a second at nanosecond resolution of the span + * of time. Durations less than one second are represented with a 0 + * `seconds` field and a positive or negative `nanos` field. For durations + * of one second or more, a non-zero value for the `nanos` field must be + * of the same sign as the `seconds` field. Must be from -999,999,999 + * to +999,999,999 inclusive. + */ + nanos: number; +} + +function createBaseDuration(): Duration { + return { seconds: 0, nanos: 0 }; +} + +export const Duration: MessageFns = { + encode(message: Duration, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.seconds !== 0) { + writer.uint32(8).int64(message.seconds); + } + if (message.nanos !== 0) { + writer.uint32(16).int32(message.nanos); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Duration { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseDuration(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.seconds = longToNumber(reader.int64()); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.nanos = reader.int32(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Duration { + return { + seconds: isSet(object.seconds) ? globalThis.Number(object.seconds) : 0, + nanos: isSet(object.nanos) ? globalThis.Number(object.nanos) : 0, + }; + }, + + toJSON(message: Duration): unknown { + const obj: any = {}; + if (message.seconds !== 0) { + obj.seconds = Math.round(message.seconds); + } + if (message.nanos !== 0) { + obj.nanos = Math.round(message.nanos); + } + return obj; + }, + + create, I>>(base?: I): Duration { + return Duration.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Duration { + const message = createBaseDuration(); + message.seconds = object.seconds ?? 0; + message.nanos = object.nanos ?? 0; + return message; + }, +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends { $case: string; value: unknown } ? { $case: T["$case"]; value?: DeepPartial } + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToNumber(int64: { toString(): string }): number { + const num = globalThis.Number(int64.toString()); + if (num > globalThis.Number.MAX_SAFE_INTEGER) { + throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); + } + if (num < globalThis.Number.MIN_SAFE_INTEGER) { + throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); + } + return num; +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} diff --git a/src/grpc/google/protobuf/empty.ts b/src/grpc/google/protobuf/empty.ts new file mode 100644 index 00000000..d87dde0d --- /dev/null +++ b/src/grpc/google/protobuf/empty.ts @@ -0,0 +1,87 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.8.3 +// protoc v3.21.12 +// source: google/protobuf/empty.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; + +export const protobufPackage = "google.protobuf"; + +/** + * A generic empty message that you can re-use to avoid defining duplicated + * empty messages in your APIs. A typical example is to use it as the request + * or the response type of an API method. For instance: + * + * service Foo { + * rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); + * } + */ +export interface Empty { +} + +function createBaseEmpty(): Empty { + return {}; +} + +export const Empty: MessageFns = { + encode(_: Empty, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Empty { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseEmpty(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(_: any): Empty { + return {}; + }, + + toJSON(_: Empty): unknown { + const obj: any = {}; + return obj; + }, + + create, I>>(base?: I): Empty { + return Empty.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(_: I): Empty { + const message = createBaseEmpty(); + return message; + }, +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends { $case: string; value: unknown } ? { $case: T["$case"]; value?: DeepPartial } + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} diff --git a/src/grpc/google/protobuf/struct.ts b/src/grpc/google/protobuf/struct.ts new file mode 100644 index 00000000..4671bacd --- /dev/null +++ b/src/grpc/google/protobuf/struct.ts @@ -0,0 +1,604 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.8.3 +// protoc v3.21.12 +// source: google/protobuf/struct.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; + +export const protobufPackage = "google.protobuf"; + +/** + * `NullValue` is a singleton enumeration to represent the null value for the + * `Value` type union. + * + * The JSON representation for `NullValue` is JSON `null`. + */ +export enum NullValue { + /** NULL_VALUE - Null value. */ + NULL_VALUE = 0, + UNRECOGNIZED = -1, +} + +export function nullValueFromJSON(object: any): NullValue { + switch (object) { + case 0: + case "NULL_VALUE": + return NullValue.NULL_VALUE; + case -1: + case "UNRECOGNIZED": + default: + return NullValue.UNRECOGNIZED; + } +} + +export function nullValueToJSON(object: NullValue): string { + switch (object) { + case NullValue.NULL_VALUE: + return "NULL_VALUE"; + case NullValue.UNRECOGNIZED: + default: + return "UNRECOGNIZED"; + } +} + +/** + * `Struct` represents a structured data value, consisting of fields + * which map to dynamically typed values. In some languages, `Struct` + * might be supported by a native representation. For example, in + * scripting languages like JS a struct is represented as an + * object. The details of that representation are described together + * with the proto support for the language. + * + * The JSON representation for `Struct` is JSON object. + */ +export interface Struct { + /** Unordered map of dynamically typed values. */ + fields: { [key: string]: any | undefined }; +} + +export interface Struct_FieldsEntry { + key: string; + value: any | undefined; +} + +/** + * `Value` represents a dynamically typed value which can be either + * null, a number, a string, a boolean, a recursive struct value, or a + * list of values. A producer of value is expected to set one of these + * variants. Absence of any variant indicates an error. + * + * The JSON representation for `Value` is JSON value. + */ +export interface Value { + /** The kind of value. */ + kind?: + | // + /** Represents a null value. */ + { $case: "nullValue"; value: NullValue } + | // + /** Represents a double value. */ + { $case: "numberValue"; value: number } + | // + /** Represents a string value. */ + { $case: "stringValue"; value: string } + | // + /** Represents a boolean value. */ + { $case: "boolValue"; value: boolean } + | // + /** Represents a structured value. */ + { $case: "structValue"; value: { [key: string]: any } | undefined } + | // + /** Represents a repeated `Value`. */ + { $case: "listValue"; value: Array | undefined } + | undefined; +} + +/** + * `ListValue` is a wrapper around a repeated field of values. + * + * The JSON representation for `ListValue` is JSON array. + */ +export interface ListValue { + /** Repeated field of dynamically typed values. */ + values: any[]; +} + +function createBaseStruct(): Struct { + return { fields: {} }; +} + +export const Struct: MessageFns & StructWrapperFns = { + encode(message: Struct, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + Object.entries(message.fields).forEach(([key, value]) => { + if (value !== undefined) { + Struct_FieldsEntry.encode({ key: key as any, value }, writer.uint32(10).fork()).join(); + } + }); + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Struct { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseStruct(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + const entry1 = Struct_FieldsEntry.decode(reader, reader.uint32()); + if (entry1.value !== undefined) { + message.fields[entry1.key] = entry1.value; + } + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Struct { + return { + fields: isObject(object.fields) + ? Object.entries(object.fields).reduce<{ [key: string]: any | undefined }>((acc, [key, value]) => { + acc[key] = value as any | undefined; + return acc; + }, {}) + : {}, + }; + }, + + toJSON(message: Struct): unknown { + const obj: any = {}; + if (message.fields) { + const entries = Object.entries(message.fields); + if (entries.length > 0) { + obj.fields = {}; + entries.forEach(([k, v]) => { + obj.fields[k] = v; + }); + } + } + return obj; + }, + + create, I>>(base?: I): Struct { + return Struct.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Struct { + const message = createBaseStruct(); + message.fields = Object.entries(object.fields ?? {}).reduce<{ [key: string]: any | undefined }>( + (acc, [key, value]) => { + if (value !== undefined) { + acc[key] = value; + } + return acc; + }, + {}, + ); + return message; + }, + + wrap(object: { [key: string]: any } | undefined): Struct { + const struct = createBaseStruct(); + + if (object !== undefined) { + for (const key of Object.keys(object)) { + struct.fields[key] = object[key]; + } + } + return struct; + }, + + unwrap(message: Struct): { [key: string]: any } { + const object: { [key: string]: any } = {}; + if (message.fields) { + for (const key of Object.keys(message.fields)) { + object[key] = message.fields[key]; + } + } + return object; + }, +}; + +function createBaseStruct_FieldsEntry(): Struct_FieldsEntry { + return { key: "", value: undefined }; +} + +export const Struct_FieldsEntry: MessageFns = { + encode(message: Struct_FieldsEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.key !== "") { + writer.uint32(10).string(message.key); + } + if (message.value !== undefined) { + Value.encode(Value.wrap(message.value), writer.uint32(18).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Struct_FieldsEntry { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseStruct_FieldsEntry(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.key = reader.string(); + continue; + } + case 2: { + if (tag !== 18) { + break; + } + + message.value = Value.unwrap(Value.decode(reader, reader.uint32())); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Struct_FieldsEntry { + return { + key: isSet(object.key) ? globalThis.String(object.key) : "", + value: isSet(object?.value) ? object.value : undefined, + }; + }, + + toJSON(message: Struct_FieldsEntry): unknown { + const obj: any = {}; + if (message.key !== "") { + obj.key = message.key; + } + if (message.value !== undefined) { + obj.value = message.value; + } + return obj; + }, + + create, I>>(base?: I): Struct_FieldsEntry { + return Struct_FieldsEntry.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Struct_FieldsEntry { + const message = createBaseStruct_FieldsEntry(); + message.key = object.key ?? ""; + message.value = object.value ?? undefined; + return message; + }, +}; + +function createBaseValue(): Value { + return { kind: undefined }; +} + +export const Value: MessageFns & AnyValueWrapperFns = { + encode(message: Value, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + switch (message.kind?.$case) { + case "nullValue": + writer.uint32(8).int32(message.kind.value); + break; + case "numberValue": + writer.uint32(17).double(message.kind.value); + break; + case "stringValue": + writer.uint32(26).string(message.kind.value); + break; + case "boolValue": + writer.uint32(32).bool(message.kind.value); + break; + case "structValue": + Struct.encode(Struct.wrap(message.kind.value), writer.uint32(42).fork()).join(); + break; + case "listValue": + ListValue.encode(ListValue.wrap(message.kind.value), writer.uint32(50).fork()).join(); + break; + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Value { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseValue(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.kind = { $case: "nullValue", value: reader.int32() as any }; + continue; + } + case 2: { + if (tag !== 17) { + break; + } + + message.kind = { $case: "numberValue", value: reader.double() }; + continue; + } + case 3: { + if (tag !== 26) { + break; + } + + message.kind = { $case: "stringValue", value: reader.string() }; + continue; + } + case 4: { + if (tag !== 32) { + break; + } + + message.kind = { $case: "boolValue", value: reader.bool() }; + continue; + } + case 5: { + if (tag !== 42) { + break; + } + + message.kind = { $case: "structValue", value: Struct.unwrap(Struct.decode(reader, reader.uint32())) }; + continue; + } + case 6: { + if (tag !== 50) { + break; + } + + message.kind = { $case: "listValue", value: ListValue.unwrap(ListValue.decode(reader, reader.uint32())) }; + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Value { + return { + kind: isSet(object.nullValue) + ? { $case: "nullValue", value: nullValueFromJSON(object.nullValue) } + : isSet(object.numberValue) + ? { $case: "numberValue", value: globalThis.Number(object.numberValue) } + : isSet(object.stringValue) + ? { $case: "stringValue", value: globalThis.String(object.stringValue) } + : isSet(object.boolValue) + ? { $case: "boolValue", value: globalThis.Boolean(object.boolValue) } + : isSet(object.structValue) + ? { $case: "structValue", value: object.structValue } + : isSet(object.listValue) + ? { $case: "listValue", value: [...object.listValue] } + : undefined, + }; + }, + + toJSON(message: Value): unknown { + const obj: any = {}; + if (message.kind?.$case === "nullValue") { + obj.nullValue = nullValueToJSON(message.kind.value); + } else if (message.kind?.$case === "numberValue") { + obj.numberValue = message.kind.value; + } else if (message.kind?.$case === "stringValue") { + obj.stringValue = message.kind.value; + } else if (message.kind?.$case === "boolValue") { + obj.boolValue = message.kind.value; + } else if (message.kind?.$case === "structValue") { + obj.structValue = message.kind.value; + } else if (message.kind?.$case === "listValue") { + obj.listValue = message.kind.value; + } + return obj; + }, + + create, I>>(base?: I): Value { + return Value.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Value { + const message = createBaseValue(); + switch (object.kind?.$case) { + case "nullValue": { + if (object.kind?.value !== undefined && object.kind?.value !== null) { + message.kind = { $case: "nullValue", value: object.kind.value }; + } + break; + } + case "numberValue": { + if (object.kind?.value !== undefined && object.kind?.value !== null) { + message.kind = { $case: "numberValue", value: object.kind.value }; + } + break; + } + case "stringValue": { + if (object.kind?.value !== undefined && object.kind?.value !== null) { + message.kind = { $case: "stringValue", value: object.kind.value }; + } + break; + } + case "boolValue": { + if (object.kind?.value !== undefined && object.kind?.value !== null) { + message.kind = { $case: "boolValue", value: object.kind.value }; + } + break; + } + case "structValue": { + if (object.kind?.value !== undefined && object.kind?.value !== null) { + message.kind = { $case: "structValue", value: object.kind.value }; + } + break; + } + case "listValue": { + if (object.kind?.value !== undefined && object.kind?.value !== null) { + message.kind = { $case: "listValue", value: object.kind.value }; + } + break; + } + } + return message; + }, + + wrap(value: any): Value { + const result = createBaseValue(); + if (value === null) { + result.kind = { $case: "nullValue", value: NullValue.NULL_VALUE }; + } else if (typeof value === "boolean") { + result.kind = { $case: "boolValue", value }; + } else if (typeof value === "number") { + result.kind = { $case: "numberValue", value }; + } else if (typeof value === "string") { + result.kind = { $case: "stringValue", value }; + } else if (globalThis.Array.isArray(value)) { + result.kind = { $case: "listValue", value }; + } else if (typeof value === "object") { + result.kind = { $case: "structValue", value }; + } else if (typeof value !== "undefined") { + throw new globalThis.Error("Unsupported any value type: " + typeof value); + } + return result; + }, + + unwrap(message: Value): string | number | boolean | Object | null | Array | undefined { + return (message.kind?.$case === "nullValue") ? null : message.kind?.value; + }, +}; + +function createBaseListValue(): ListValue { + return { values: [] }; +} + +export const ListValue: MessageFns & ListValueWrapperFns = { + encode(message: ListValue, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + for (const v of message.values) { + Value.encode(Value.wrap(v!), writer.uint32(10).fork()).join(); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): ListValue { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseListValue(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 10) { + break; + } + + message.values.push(Value.unwrap(Value.decode(reader, reader.uint32()))); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): ListValue { + return { values: globalThis.Array.isArray(object?.values) ? [...object.values] : [] }; + }, + + toJSON(message: ListValue): unknown { + const obj: any = {}; + if (message.values?.length) { + obj.values = message.values; + } + return obj; + }, + + create, I>>(base?: I): ListValue { + return ListValue.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): ListValue { + const message = createBaseListValue(); + message.values = object.values?.map((e) => e) || []; + return message; + }, + + wrap(array: Array | undefined): ListValue { + const result = createBaseListValue(); + result.values = array ?? []; + return result; + }, + + unwrap(message: ListValue): Array { + if (message?.hasOwnProperty("values") && globalThis.Array.isArray(message.values)) { + return message.values; + } else { + return message as any; + } + }, +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends { $case: string; value: unknown } ? { $case: T["$case"]; value?: DeepPartial } + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function isObject(value: any): boolean { + return typeof value === "object" && value !== null; +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} + +export interface StructWrapperFns { + wrap(object: { [key: string]: any } | undefined): Struct; + unwrap(message: Struct): { [key: string]: any }; +} + +export interface AnyValueWrapperFns { + wrap(value: any): Value; + unwrap(message: any): string | number | boolean | Object | null | Array | undefined; +} + +export interface ListValueWrapperFns { + wrap(array: Array | undefined): ListValue; + unwrap(message: ListValue): Array; +} diff --git a/src/grpc/google/protobuf/timestamp.ts b/src/grpc/google/protobuf/timestamp.ts new file mode 100644 index 00000000..99c0e94d --- /dev/null +++ b/src/grpc/google/protobuf/timestamp.ts @@ -0,0 +1,230 @@ +// Code generated by protoc-gen-ts_proto. DO NOT EDIT. +// versions: +// protoc-gen-ts_proto v2.8.3 +// protoc v3.21.12 +// source: google/protobuf/timestamp.proto + +/* eslint-disable */ +import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; + +export const protobufPackage = "google.protobuf"; + +/** + * A Timestamp represents a point in time independent of any time zone or local + * calendar, encoded as a count of seconds and fractions of seconds at + * nanosecond resolution. The count is relative to an epoch at UTC midnight on + * January 1, 1970, in the proleptic Gregorian calendar which extends the + * Gregorian calendar backwards to year one. + * + * All minutes are 60 seconds long. Leap seconds are "smeared" so that no leap + * second table is needed for interpretation, using a [24-hour linear + * smear](https://developers.google.com/time/smear). + * + * The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By + * restricting to that range, we ensure that we can convert to and from [RFC + * 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings. + * + * # Examples + * + * Example 1: Compute Timestamp from POSIX `time()`. + * + * Timestamp timestamp; + * timestamp.set_seconds(time(NULL)); + * timestamp.set_nanos(0); + * + * Example 2: Compute Timestamp from POSIX `gettimeofday()`. + * + * struct timeval tv; + * gettimeofday(&tv, NULL); + * + * Timestamp timestamp; + * timestamp.set_seconds(tv.tv_sec); + * timestamp.set_nanos(tv.tv_usec * 1000); + * + * Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. + * + * FILETIME ft; + * GetSystemTimeAsFileTime(&ft); + * UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; + * + * // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z + * // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. + * Timestamp timestamp; + * timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); + * timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); + * + * Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. + * + * long millis = System.currentTimeMillis(); + * + * Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) + * .setNanos((int) ((millis % 1000) * 1000000)).build(); + * + * Example 5: Compute Timestamp from Java `Instant.now()`. + * + * Instant now = Instant.now(); + * + * Timestamp timestamp = + * Timestamp.newBuilder().setSeconds(now.getEpochSecond()) + * .setNanos(now.getNano()).build(); + * + * Example 6: Compute Timestamp from current time in Python. + * + * timestamp = Timestamp() + * timestamp.GetCurrentTime() + * + * # JSON Mapping + * + * In JSON format, the Timestamp type is encoded as a string in the + * [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the + * format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" + * where {year} is always expressed using four digits while {month}, {day}, + * {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional + * seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), + * are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone + * is required. A proto3 JSON serializer should always use UTC (as indicated by + * "Z") when printing the Timestamp type and a proto3 JSON parser should be + * able to accept both UTC and other timezones (as indicated by an offset). + * + * For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past + * 01:30 UTC on January 15, 2017. + * + * In JavaScript, one can convert a Date object to this format using the + * standard + * [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString) + * method. In Python, a standard `datetime.datetime` object can be converted + * to this format using + * [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with + * the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use + * the Joda Time's [`ISODateTimeFormat.dateTime()`]( + * http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime() + * ) to obtain a formatter capable of generating timestamps in this format. + */ +export interface Timestamp { + /** + * Represents seconds of UTC time since Unix epoch + * 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to + * 9999-12-31T23:59:59Z inclusive. + */ + seconds: number; + /** + * Non-negative fractions of a second at nanosecond resolution. Negative + * second values with fractions must still have non-negative nanos values + * that count forward in time. Must be from 0 to 999,999,999 + * inclusive. + */ + nanos: number; +} + +function createBaseTimestamp(): Timestamp { + return { seconds: 0, nanos: 0 }; +} + +export const Timestamp: MessageFns = { + encode(message: Timestamp, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { + if (message.seconds !== 0) { + writer.uint32(8).int64(message.seconds); + } + if (message.nanos !== 0) { + writer.uint32(16).int32(message.nanos); + } + return writer; + }, + + decode(input: BinaryReader | Uint8Array, length?: number): Timestamp { + const reader = input instanceof BinaryReader ? input : new BinaryReader(input); + const end = length === undefined ? reader.len : reader.pos + length; + const message = createBaseTimestamp(); + while (reader.pos < end) { + const tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + if (tag !== 8) { + break; + } + + message.seconds = longToNumber(reader.int64()); + continue; + } + case 2: { + if (tag !== 16) { + break; + } + + message.nanos = reader.int32(); + continue; + } + } + if ((tag & 7) === 4 || tag === 0) { + break; + } + reader.skip(tag & 7); + } + return message; + }, + + fromJSON(object: any): Timestamp { + return { + seconds: isSet(object.seconds) ? globalThis.Number(object.seconds) : 0, + nanos: isSet(object.nanos) ? globalThis.Number(object.nanos) : 0, + }; + }, + + toJSON(message: Timestamp): unknown { + const obj: any = {}; + if (message.seconds !== 0) { + obj.seconds = Math.round(message.seconds); + } + if (message.nanos !== 0) { + obj.nanos = Math.round(message.nanos); + } + return obj; + }, + + create, I>>(base?: I): Timestamp { + return Timestamp.fromPartial(base ?? ({} as any)); + }, + fromPartial, I>>(object: I): Timestamp { + const message = createBaseTimestamp(); + message.seconds = object.seconds ?? 0; + message.nanos = object.nanos ?? 0; + return message; + }, +}; + +type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined; + +export type DeepPartial = T extends Builtin ? T + : T extends globalThis.Array ? globalThis.Array> + : T extends ReadonlyArray ? ReadonlyArray> + : T extends { $case: string; value: unknown } ? { $case: T["$case"]; value?: DeepPartial } + : T extends {} ? { [K in keyof T]?: DeepPartial } + : Partial; + +type KeysOfUnion = T extends T ? keyof T : never; +export type Exact = P extends Builtin ? P + : P & { [K in keyof P]: Exact } & { [K in Exclude>]: never }; + +function longToNumber(int64: { toString(): string }): number { + const num = globalThis.Number(int64.toString()); + if (num > globalThis.Number.MAX_SAFE_INTEGER) { + throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); + } + if (num < globalThis.Number.MIN_SAFE_INTEGER) { + throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); + } + return num; +} + +function isSet(value: any): boolean { + return value !== null && value !== undefined; +} + +export interface MessageFns { + encode(message: T, writer?: BinaryWriter): BinaryWriter; + decode(input: BinaryReader | Uint8Array, length?: number): T; + fromJSON(object: any): T; + toJSON(message: T): unknown; + create, I>>(base?: I): T; + fromPartial, I>>(object: I): T; +} diff --git a/src/grpc/utils/proto_type_converter.ts b/src/grpc/utils/proto_type_converter.ts new file mode 100644 index 00000000..3312b191 --- /dev/null +++ b/src/grpc/utils/proto_type_converter.ts @@ -0,0 +1,124 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import * as types from '../../types.js'; +import { + AgentCard, + AgentCardSignature, + AgentCapabilities, + AgentExtension, + AgentInterface, + AgentProvider, + APIKeySecurityScheme, + Artifact, + AuthenticationInfo, + AuthorizationCodeOAuthFlow, + CancelTaskRequest, + ClientCredentialsOAuthFlow, + DataPart as ProtoDataPart, + FilePart as ProtoFilePart, + GetTaskPushNotificationConfigRequest, + GetTaskRequest, + HTTPAuthSecurityScheme, + ImplicitOAuthFlow, + Message, + MutualTlsSecurityScheme, + OAuth2SecurityScheme, + OAuthFlows, + OpenIdConnectSecurityScheme, + Part, + PasswordOAuthFlow, + PushNotificationConfig, + Role, + Security, + SecurityScheme, + SendMessageConfiguration, + SendMessageRequest, + SendMessageResponse, + StreamResponse, + StringList, + SubscribeToTaskRequest, + Task, + TaskArtifactUpdateEvent, + TaskPushNotificationConfig, + TaskState, + TaskStatus, + TaskStatusUpdateEvent, +} from '../a2a.js'; +import { Struct } from '../google/protobuf/struct.js'; +import { ServerError, InvalidParamsError } from '../../server/errors.js'; + +// Regexp patterns for matching +const _TASK_NAME_MATCH = /tasks\/([^/]+)/; +const _TASK_PUSH_CONFIG_NAME_MATCH = /tasks\/([^/]+)\/pushNotificationConfigs\/([^/]+)/; + + +/** + * Converts proto types to internal types. + */ +export class FromProto { + static message(message: Message): types.Message { + return { + kind: 'message', + messageId: message.messageId, + parts: message.parts.map(p => this.part(p)), + contextId: message.contextId || null, + taskId: message.taskId || null, + role: this.role(message.role), + metadata: message.metadata, + extensions: message.extensions.length > 0 ? messages.extensions : null, + }; + } + + static parts(part: Part): types.Part { + + if (part.part?.$case === "text") { + return { + kind: "text", + text: part.part.value, + metadata: { ...part.metadata }, + } as types.TextPart; + } + + if (part.part?.$case === "file") { + const filePart = part.part.value; + if (filePart.file?.$case === "fileWithUri") { + return { + kind: "file", + file: { + uri: filePart.file.value, + }, + metadata: { ...part.metadata }, + } as types.FilePart; + } else if (filePart.file?.$case === "fileWithBytes") { + return { + kind: "file", + file: { + bytes: filePart.file.value.toString(), + }, + metadata: { ...part.metadata }, + } as types.FilePart; + } + throw new Error("Invalid file part type"); + } + + if (part.part?.$case === "data") { + return { + kind: "data", + data: part.part.value.data, + metadata: { ...part.metadata }, + } as types.DataPart; + } + + throw new Error("Invalid part type"); + } + + static messageSendParams(request: SendMessageRequest): types.MessageSendParams { + if (!request.request) { + throw new Error("SendMessageRequest is missing 'request' field."); + } + return { + configuration: this.messageSendConfiguration(request.configuration), + message: this.message(request.request), + metadata: this.metadata(request.metadata), + }; + } +} \ No newline at end of file diff --git a/src/server/transports/grpc/grpc_transport_handler.ts b/src/server/transports/grpc/grpc_transport_handler.ts new file mode 100644 index 00000000..6db032a1 --- /dev/null +++ b/src/server/transports/grpc/grpc_transport_handler.ts @@ -0,0 +1,61 @@ +import * as grpc from '@grpc/grpc-js'; +import { A2AServiceServer, A2AServiceService, AgentCard, CancelTaskRequest, DeleteTaskPushNotificationConfigRequest, GetExtendedAgentCardRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, ListTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigResponse, ListTasksRequest, ListTasksResponse, Message, SendMessageRequest, SendMessageResponse, SetTaskPushNotificationConfigRequest, StreamResponse, SubscribeToTaskRequest, Task, TaskPushNotificationConfig } from '../../../grpc/a2a.js'; +import { Task as A2ATask, MessageSendParams} from '../../../types.js'; +import { Empty } from '../../../grpc/google/protobuf/empty.js'; +import { A2ARequestHandler } from '../../request_handler/a2a_request_handler.js'; + +export function createGRPCHandler(requestHandler: A2ARequestHandler): A2AServiceServer { + return { + sendMessage(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { + const request: SendMessageRequest = call.request; + + console.log("Received message:", request); + + const params: MessageSendParams = { + message: {...request.request, kind: 'message'}, + configuration: request.configuration, + metadata: request.metadata + } + const task = requestHandler.sendMessage(params); + + const response: SendMessageResponse = { + 'task': Task.fromJSON(task) + }; + + callback(null, response); + }, + sendStreamingMessage(call: grpc.ServerWritableStream): void { + throw new Error("Method not implemented."); + }, + subscribeToTask(call: grpc.ServerWritableStream): void { + throw new Error("Method not implemented."); + }, + deleteTaskPushNotificationConfig(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { + throw new Error("Method not implemented."); + }, + getAgentCard(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { + throw new Error("Method not implemented."); + }, + listTaskPushNotificationConfig(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { + throw new Error("Method not implemented."); + }, + listTasks(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { + throw new Error("Method not implemented."); + }, + getTask(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { + throw new Error("Method not implemented."); + }, + cancelTask(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { + throw new Error("Method not implemented."); + }, + setTaskPushNotificationConfig(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { + throw new Error("Method not implemented."); + }, + getTaskPushNotificationConfig(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { + throw new Error("Method not implemented."); + }, + getExtendedAgentCard(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { + throw new Error("Method not implemented."); + } + }; +} \ No newline at end of file From 8f549aead86b3ca27f5ae5f4311b0a3d7ea63f16 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Tue, 16 Dec 2025 18:30:17 +0000 Subject: [PATCH 02/64] wip --- src/grpc/utils/proto_type_converter.ts | 18 +- src/samples/agents/sample-agent/client.ts | 44 + src/samples/agents/sample-agent/grpc.ts | 65 + src/samples/package-lock.json | 6627 ----------------- src/samples/package.json | 25 - .../transports/grpc/grpc_transport_handler.ts | 24 +- 6 files changed, 129 insertions(+), 6674 deletions(-) create mode 100644 src/samples/agents/sample-agent/client.ts create mode 100644 src/samples/agents/sample-agent/grpc.ts delete mode 100644 src/samples/package-lock.json delete mode 100644 src/samples/package.json diff --git a/src/grpc/utils/proto_type_converter.ts b/src/grpc/utils/proto_type_converter.ts index 3312b191..aba97ba9 100644 --- a/src/grpc/utils/proto_type_converter.ts +++ b/src/grpc/utils/proto_type_converter.ts @@ -43,14 +43,6 @@ import { TaskStatus, TaskStatusUpdateEvent, } from '../a2a.js'; -import { Struct } from '../google/protobuf/struct.js'; -import { ServerError, InvalidParamsError } from '../../server/errors.js'; - -// Regexp patterns for matching -const _TASK_NAME_MATCH = /tasks\/([^/]+)/; -const _TASK_PUSH_CONFIG_NAME_MATCH = /tasks\/([^/]+)\/pushNotificationConfigs\/([^/]+)/; - - /** * Converts proto types to internal types. */ @@ -59,12 +51,12 @@ export class FromProto { return { kind: 'message', messageId: message.messageId, - parts: message.parts.map(p => this.part(p)), + parts: message.parts.map(p => this.parts(p)), contextId: message.contextId || null, taskId: message.taskId || null, - role: this.role(message.role), + role: message.role === Role.ROLE_AGENT ? "agent" : "user", metadata: message.metadata, - extensions: message.extensions.length > 0 ? messages.extensions : null, + extensions: message.extensions.length > 0 ? message.extensions : null, }; } @@ -116,9 +108,9 @@ export class FromProto { throw new Error("SendMessageRequest is missing 'request' field."); } return { - configuration: this.messageSendConfiguration(request.configuration), + configuration: request.configuration, message: this.message(request.request), - metadata: this.metadata(request.metadata), + metadata: request.metadata, }; } } \ No newline at end of file diff --git a/src/samples/agents/sample-agent/client.ts b/src/samples/agents/sample-agent/client.ts new file mode 100644 index 00000000..19d95ffd --- /dev/null +++ b/src/samples/agents/sample-agent/client.ts @@ -0,0 +1,44 @@ +import { ServiceError, credentials } from "@grpc/grpc-js"; +import { A2AServiceClient, SendMessageRequest, Role, SendMessageResponse} from "../../../grpc/a2a.js"; + +const client = new A2AServiceClient( + "localhost:8080", + credentials.createInsecure() +); + +function sendMessageExample() { + const request: SendMessageRequest = { + tenant: "sample-tenant", + configuration: { + blocking: true, + acceptedOutputModes: ["text"], + pushNotificationConfig: undefined, + }, + metadata: {}, + request: { + messageId: "msg-1", + parts: [ + { + part: { $case: "text", value: "Hello, Agent!" }, + metadata: {}, + }, + ], + role: Role.ROLE_USER, + contextId: "context-1", + taskId: undefined, + metadata: {}, + extensions: [], + referenceTaskIds: [], + }, + }; + + client.sendMessage(request, (error: ServiceError | null, response: SendMessageResponse) => { + if (error) { + console.error("Error sending message:", error); + } else { + console.log("Received response:", response); + } + }); +} + +sendMessageExample(); \ No newline at end of file diff --git a/src/samples/agents/sample-agent/grpc.ts b/src/samples/agents/sample-agent/grpc.ts new file mode 100644 index 00000000..79e6f5e1 --- /dev/null +++ b/src/samples/agents/sample-agent/grpc.ts @@ -0,0 +1,65 @@ +import * as grpc from '@grpc/grpc-js'; +import { AgentCard, AGENT_CARD_PATH } from '../../../index.js'; +import { + InMemoryTaskStore, + TaskStore, + AgentExecutor, + DefaultRequestHandler, +} from '../../../server/index.js'; +import { agentCardHandler, jsonRpcHandler, UserBuilder } from '../../../server/express/index.js'; +import { SampleAgentExecutor } from './agent_executor.js'; +import { A2AServiceService } from '../../../grpc/a2a.js'; +import { createGRPCHandler } from '../../../server/transports/grpc/grpc_transport_handler.js'; + +// --- Server Setup --- + +const sampleAgentCard: AgentCard = { + name: 'Sample Agent', + description: + 'A sample agent to test the stream functionality and simulate the flow of tasks statuses.', + url: 'http://localhost:41241/', + provider: { + organization: 'A2A Samples', + url: 'https://example.com/a2a-samples', // Added provider URL + }, + version: '1.0.0', // Incremented version + protocolVersion: '0.3.0', + capabilities: { + streaming: true, // The new framework supports streaming + pushNotifications: false, // Assuming not implemented for this agent yet + stateTransitionHistory: true, // Agent uses history + }, + defaultInputModes: ['text'], + defaultOutputModes: ['text', 'task-status'], // task-status is a common output mode + skills: [ + { + id: 'sample_agent', + name: 'Sample Agent', + description: 'Simulate the general flow of a streaming agent.', + tags: ['sample'], + examples: ['hi', 'hello world', 'how are you', 'goodbye'], + inputModes: ['text'], // Explicitly defining for skill + outputModes: ['text', 'task-status'], // Explicitly defining for skill + }, + ], + supportsAuthenticatedExtendedCard: false, +}; + +async function main() { + // 1. Create TaskStore + const taskStore: TaskStore = new InMemoryTaskStore(); + + // 2. Create AgentExecutor + const agentExecutor: AgentExecutor = new SampleAgentExecutor(); + + // 3. Create DefaultRequestHandler + const requestHandler = new DefaultRequestHandler(sampleAgentCard, taskStore, agentExecutor); + + const server = new grpc.Server(); + server.addService(A2AServiceService, createGRPCHandler(requestHandler)); + server.bindAsync("localhost:8080", grpc.ServerCredentials.createInsecure(), () => { + console.log("Server running at http://localhost:8080"); +}); +} + +main().catch(console.error); diff --git a/src/samples/package-lock.json b/src/samples/package-lock.json deleted file mode 100644 index abbbef80..00000000 --- a/src/samples/package-lock.json +++ /dev/null @@ -1,6627 +0,0 @@ -{ - "name": "samples", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "dependencies": { - "uuid": "^11.1.0" - }, - "devDependencies": { - "@genkit-ai/googleai": "^1.8.0", - "@types/express": "^5.0.5", - "@types/passport": "^1.0.17", - "@types/passport-jwt": "^4.0.1", - "express": "^5.1.0", - "genkit": "^1.8.0", - "passport": "^0.7.0", - "passport-jwt": "^4.0.1", - "tsx": "^4.19.3" - } - }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", - "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@so-ric/colorspace": "^1.1.6", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@fastify/busboy": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", - "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz", - "integrity": "sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true - }, - "node_modules/@firebase/app-types": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", - "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true - }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz", - "integrity": "sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true - }, - "node_modules/@firebase/component": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.7.0.tgz", - "integrity": "sha512-wR9En2A+WESUHexjmRHkqtaVH94WLNKt6rmeqZhSLBybg4Wyf0Umk04SZsS6sBq4102ZsDBFwoqMqJYj2IoDSg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/database": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.1.0.tgz", - "integrity": "sha512-gM6MJFae3pTyNLoc9VcJNuaUDej0ctdjn3cVtILo3D5lpp0dmUHHLFN/pUKe7ImyeB1KAvRlEYxvIHNF04Filg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.7.0", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/database-compat": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.1.0.tgz", - "integrity": "sha512-8nYc43RqxScsePVd1qe1xxvWNf0OBnbwHxmXJ7MHSuuTVYFO3eLyLW3PiCKJ9fHnmIz4p4LbieXwz+qtr9PZDg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/database": "1.1.0", - "@firebase/database-types": "1.0.16", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/database-types": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.16.tgz", - "integrity": "sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@firebase/app-types": "0.9.3", - "@firebase/util": "1.13.0" - } - }, - "node_modules/@firebase/logger": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.5.0.tgz", - "integrity": "sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/util": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.13.0.tgz", - "integrity": "sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@genkit-ai/ai": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/ai/-/ai-1.24.0.tgz", - "integrity": "sha512-Rv2eZqvJA8awIfLKiZL+P1hlBPGFiBFk1r01hRk0BSp1HmpZmlzSx+MM+X2H54xMgRXBRAelzU6xUXXzN5U57Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@genkit-ai/core": "1.24.0", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.11.19", - "colorette": "^2.0.20", - "dotprompt": "^1.1.1", - "json5": "^2.2.3", - "node-fetch": "^3.3.2", - "partial-json": "^0.1.7", - "uri-templates": "^0.2.0", - "uuid": "^10.0.0" - } - }, - "node_modules/@genkit-ai/ai/node_modules/@types/node": { - "version": "20.19.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", - "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@genkit-ai/ai/node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@genkit-ai/ai/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@genkit-ai/core": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/core/-/core-1.24.0.tgz", - "integrity": "sha512-JGmwdcC066OpbwShXeOOwvinj9b4yA0BKfKjPrVqqbWt9hvu81I60UNNiZC5y8dx+TvEhdEPUAXRvoOup2vC0w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/context-async-hooks": "~1.25.0", - "@opentelemetry/core": "~1.25.0", - "@opentelemetry/exporter-jaeger": "^1.25.0", - "@opentelemetry/sdk-metrics": "~1.25.0", - "@opentelemetry/sdk-node": "^0.52.0", - "@opentelemetry/sdk-trace-base": "~1.25.0", - "@types/json-schema": "^7.0.15", - "ajv": "^8.12.0", - "ajv-formats": "^3.0.1", - "async-mutex": "^0.5.0", - "body-parser": "^1.20.3", - "cors": "^2.8.5", - "dotprompt": "^1.1.1", - "express": "^4.21.0", - "get-port": "^5.1.0", - "json-schema": "^0.4.0", - "zod": "^3.23.8", - "zod-to-json-schema": "^3.22.4" - }, - "optionalDependencies": { - "@genkit-ai/firebase": "^1.16.1" - } - }, - "node_modules/@genkit-ai/core/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@genkit-ai/core/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/@genkit-ai/core/node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@genkit-ai/core/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@genkit-ai/core/node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@genkit-ai/core/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@genkit-ai/core/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", - "proxy-addr": "~2.0.7", - "qs": "6.13.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@genkit-ai/core/node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@genkit-ai/core/node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@genkit-ai/core/node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@genkit-ai/core/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@genkit-ai/core/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@genkit-ai/core/node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@genkit-ai/core/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@genkit-ai/core/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@genkit-ai/core/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@genkit-ai/core/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true, - "license": "MIT" - }, - "node_modules/@genkit-ai/core/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@genkit-ai/core/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@genkit-ai/core/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@genkit-ai/core/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@genkit-ai/core/node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@genkit-ai/core/node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@genkit-ai/core/node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@genkit-ai/core/node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/@genkit-ai/core/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@genkit-ai/core/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@genkit-ai/firebase": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/firebase/-/firebase-1.24.0.tgz", - "integrity": "sha512-6DZ612qNV4OUsAa0L40gYx0rIzcANAjv3u9R08wGK/twdOvANJuMOUWBRTIVPA0IZL2WiHLcm6Ss+GOdZOdvpg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@genkit-ai/google-cloud": "^1.24.0" - }, - "peerDependencies": { - "@google-cloud/firestore": "^7.11.0", - "firebase": ">=11.5.0", - "firebase-admin": ">=12.2", - "genkit": "^1.24.0" - }, - "peerDependenciesMeta": { - "firebase": { - "optional": true - } - } - }, - "node_modules/@genkit-ai/google-cloud": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/google-cloud/-/google-cloud-1.24.0.tgz", - "integrity": "sha512-SrNCuo7UC1c7BRRk4F6IRAM9ZSBbpLUUWgpP9xUUQ3sozVzPwWwI5Eps32WCa52ljrbhSiQQRi4sRm36glDBiA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@google-cloud/logging-winston": "^6.0.0", - "@google-cloud/opentelemetry-cloud-monitoring-exporter": "^0.19.0", - "@google-cloud/opentelemetry-cloud-trace-exporter": "^2.4.1", - "@google-cloud/opentelemetry-resource-util": "^2.4.0", - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/auto-instrumentations-node": "^0.49.1", - "@opentelemetry/core": "~1.25.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/instrumentation-pino": "^0.41.0", - "@opentelemetry/instrumentation-winston": "^0.39.0", - "@opentelemetry/resources": "~1.25.0", - "@opentelemetry/sdk-metrics": "~1.25.0", - "@opentelemetry/sdk-node": "^0.52.0", - "@opentelemetry/sdk-trace-base": "~1.25.0", - "google-auth-library": "^9.6.3", - "node-fetch": "^3.3.2", - "winston": "^3.12.0" - }, - "peerDependencies": { - "genkit": "^1.24.0" - } - }, - "node_modules/@genkit-ai/googleai": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/googleai/-/googleai-1.24.0.tgz", - "integrity": "sha512-TI4QC4nIkk/8JVccMmZZ6wO9ekhFtBhc69370A/CJRSw9jN7nJeIwQd5bo2JOyVT+BR2hQI8Upsoc1LTYAkLbw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@google/generative-ai": "^0.24.0", - "google-auth-library": "^9.6.3", - "node-fetch": "^3.3.2" - }, - "peerDependencies": { - "genkit": "^1.24.0" - } - }, - "node_modules/@google-cloud/common": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.2.tgz", - "integrity": "sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "^4.0.0", - "arrify": "^2.0.1", - "duplexify": "^4.1.1", - "extend": "^3.0.2", - "google-auth-library": "^9.0.0", - "html-entities": "^2.5.2", - "retry-request": "^7.0.0", - "teeny-request": "^9.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/firestore": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.6.tgz", - "integrity": "sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@opentelemetry/api": "^1.3.0", - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^4.3.3", - "protobufjs": "^7.2.6" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/logging": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@google-cloud/logging/-/logging-11.2.1.tgz", - "integrity": "sha512-2h9HBJG3OAsvzXmb81qXmaTPfXYU7KJTQUxunoOKFGnY293YQ/eCkW1Y5mHLocwpEqeqQYT/Qvl6Tk+Q7PfStw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@google-cloud/common": "^5.0.0", - "@google-cloud/paginator": "^5.0.0", - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "4.0.0", - "@opentelemetry/api": "^1.7.0", - "arrify": "^2.0.1", - "dot-prop": "^6.0.0", - "eventid": "^2.0.0", - "extend": "^3.0.2", - "gcp-metadata": "^6.0.0", - "google-auth-library": "^9.0.0", - "google-gax": "^4.0.3", - "on-finished": "^2.3.0", - "pumpify": "^2.0.1", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/logging-winston": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@google-cloud/logging-winston/-/logging-winston-6.0.1.tgz", - "integrity": "sha512-tgA/qe/aGZITMrJ/5Tuykv234pLb/Qo6iDZ8SDkjbsiIy69mLQmbphrUd/IqnE17BSDfrwDUckvWdghiy8b+Qg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@google-cloud/logging": "^11.0.0", - "google-auth-library": "^9.0.0", - "lodash.mapvalues": "^4.6.0", - "winston-transport": "^4.3.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "winston": ">=3.2.1" - } - }, - "node_modules/@google-cloud/logging/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@google-cloud/opentelemetry-cloud-monitoring-exporter": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-cloud-monitoring-exporter/-/opentelemetry-cloud-monitoring-exporter-0.19.0.tgz", - "integrity": "sha512-5SOPXwC6RET4ZvXxw5D97dp8fWpqWEunHrzrUUGXhG4UAeedQe1KvYV8CK+fnaAbN2l2ha6QDYspT6z40TVY0g==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@google-cloud/opentelemetry-resource-util": "^2.3.0", - "@google-cloud/precise-date": "^4.0.0", - "google-auth-library": "^9.0.0", - "googleapis": "^137.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0", - "@opentelemetry/core": "^1.0.0", - "@opentelemetry/resources": "^1.0.0", - "@opentelemetry/sdk-metrics": "^1.0.0" - } - }, - "node_modules/@google-cloud/opentelemetry-cloud-trace-exporter": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-cloud-trace-exporter/-/opentelemetry-cloud-trace-exporter-2.4.1.tgz", - "integrity": "sha512-Dq2IyAyA9PCjbjLOn86i2byjkYPC59b5ic8k/L4q5bBWH0Jro8lzMs8C0G5pJfqh2druj8HF+oAIAlSdWQ+Z9Q==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@google-cloud/opentelemetry-resource-util": "^2.4.0", - "@grpc/grpc-js": "^1.1.8", - "@grpc/proto-loader": "^0.7.0", - "google-auth-library": "^9.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0", - "@opentelemetry/core": "^1.0.0", - "@opentelemetry/resources": "^1.0.0", - "@opentelemetry/sdk-trace-base": "^1.0.0" - } - }, - "node_modules/@google-cloud/opentelemetry-resource-util": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-resource-util/-/opentelemetry-resource-util-2.4.0.tgz", - "integrity": "sha512-/7ujlMoKtDtrbQlJihCjQnm31n2s2RTlvJqcSbt2jV3OkCzPAdo3u31Q13HNugqtIRUSk7bUoLx6AzhURkhW4w==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.22.0", - "gcp-metadata": "^6.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/resources": "^1.0.0" - } - }, - "node_modules/@google-cloud/paginator": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz", - "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "arrify": "^2.0.0", - "extend": "^3.0.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/precise-date": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/precise-date/-/precise-date-4.0.0.tgz", - "integrity": "sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/projectify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", - "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/promisify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", - "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage": { - "version": "7.17.3", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.17.3.tgz", - "integrity": "sha512-gOnCAbFgAYKRozywLsxagdevTF7Gm+2Ncz5u5CQAuOv/2VCa0rdGJWvJFDOftPx1tc+q8TXiC2pEJfFKu+yeMQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@google-cloud/paginator": "^5.0.0", - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "<4.1.0", - "abort-controller": "^3.0.0", - "async-retry": "^1.3.3", - "duplexify": "^4.1.3", - "fast-xml-parser": "^4.4.1", - "gaxios": "^6.0.2", - "google-auth-library": "^9.6.3", - "html-entities": "^2.5.2", - "mime": "^3.0.0", - "p-limit": "^3.0.1", - "retry-request": "^7.0.0", - "teeny-request": "^9.0.0", - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@google-cloud/storage/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@google/generative-ai": { - "version": "0.24.1", - "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.24.1.tgz", - "integrity": "sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@grpc/grpc-js": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.1.tgz", - "integrity": "sha512-sPxgEWtPUR3EnRJCEtbGZG2iX8LQDUls2wUS3o27jg07KqJFMq6YDeWvMo1wfpmy3rqRdS0rivpLwhqQtEyCuQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@grpc/proto-loader": "^0.8.0", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", - "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.5.3", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", - "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/api-logs": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", - "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/auto-instrumentations-node": { - "version": "0.49.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.49.2.tgz", - "integrity": "sha512-xtETEPmAby/3MMmedv8Z/873sdLTWg+Vq98rtm4wbwvAiXBB/ao8qRyzRlvR2MR6puEr+vIB/CXeyJnzNA3cyw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/instrumentation-amqplib": "^0.41.0", - "@opentelemetry/instrumentation-aws-lambda": "^0.43.0", - "@opentelemetry/instrumentation-aws-sdk": "^0.43.1", - "@opentelemetry/instrumentation-bunyan": "^0.40.0", - "@opentelemetry/instrumentation-cassandra-driver": "^0.40.0", - "@opentelemetry/instrumentation-connect": "^0.38.0", - "@opentelemetry/instrumentation-cucumber": "^0.8.0", - "@opentelemetry/instrumentation-dataloader": "^0.11.0", - "@opentelemetry/instrumentation-dns": "^0.38.0", - "@opentelemetry/instrumentation-express": "^0.41.1", - "@opentelemetry/instrumentation-fastify": "^0.38.0", - "@opentelemetry/instrumentation-fs": "^0.14.0", - "@opentelemetry/instrumentation-generic-pool": "^0.38.1", - "@opentelemetry/instrumentation-graphql": "^0.42.0", - "@opentelemetry/instrumentation-grpc": "^0.52.0", - "@opentelemetry/instrumentation-hapi": "^0.40.0", - "@opentelemetry/instrumentation-http": "^0.52.0", - "@opentelemetry/instrumentation-ioredis": "^0.42.0", - "@opentelemetry/instrumentation-kafkajs": "^0.2.0", - "@opentelemetry/instrumentation-knex": "^0.39.0", - "@opentelemetry/instrumentation-koa": "^0.42.0", - "@opentelemetry/instrumentation-lru-memoizer": "^0.39.0", - "@opentelemetry/instrumentation-memcached": "^0.38.0", - "@opentelemetry/instrumentation-mongodb": "^0.46.0", - "@opentelemetry/instrumentation-mongoose": "^0.41.0", - "@opentelemetry/instrumentation-mysql": "^0.40.0", - "@opentelemetry/instrumentation-mysql2": "^0.40.0", - "@opentelemetry/instrumentation-nestjs-core": "^0.39.0", - "@opentelemetry/instrumentation-net": "^0.38.0", - "@opentelemetry/instrumentation-pg": "^0.43.0", - "@opentelemetry/instrumentation-pino": "^0.41.0", - "@opentelemetry/instrumentation-redis": "^0.41.0", - "@opentelemetry/instrumentation-redis-4": "^0.41.1", - "@opentelemetry/instrumentation-restify": "^0.40.0", - "@opentelemetry/instrumentation-router": "^0.39.0", - "@opentelemetry/instrumentation-socket.io": "^0.41.0", - "@opentelemetry/instrumentation-tedious": "^0.13.0", - "@opentelemetry/instrumentation-undici": "^0.5.0", - "@opentelemetry/instrumentation-winston": "^0.39.0", - "@opentelemetry/resource-detector-alibaba-cloud": "^0.29.0", - "@opentelemetry/resource-detector-aws": "^1.6.0", - "@opentelemetry/resource-detector-azure": "^0.2.10", - "@opentelemetry/resource-detector-container": "^0.4.0", - "@opentelemetry/resource-detector-gcp": "^0.29.10", - "@opentelemetry/resources": "^1.24.0", - "@opentelemetry/sdk-node": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.4.1" - } - }, - "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz", - "integrity": "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/exporter-jaeger": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-jaeger/-/exporter-jaeger-1.30.1.tgz", - "integrity": "sha512-7Ki+x7cZ/PEQxp3UyB+CWkWBqLk22yRGQ4AWIGwZlEs6rpCOdWwIFOyQDO9DdeyWtTPTvO3An/7chPZcRHOgzQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/sdk-trace-base": "1.30.1", - "@opentelemetry/semantic-conventions": "1.28.0", - "jaeger-client": "^3.15.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/exporter-jaeger/node_modules/@opentelemetry/core": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-jaeger/node_modules/@opentelemetry/resources": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", - "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-jaeger/node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.1.tgz", - "integrity": "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.30.1", - "@opentelemetry/resources": "1.30.1", - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/exporter-jaeger/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.52.1.tgz", - "integrity": "sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-grpc-exporter-base": "0.52.1", - "@opentelemetry/otlp-transformer": "0.52.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-http": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.52.1.tgz", - "integrity": "sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-exporter-base": "0.52.1", - "@opentelemetry/otlp-transformer": "0.52.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/exporter-trace-otlp-proto": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.52.1.tgz", - "integrity": "sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-exporter-base": "0.52.1", - "@opentelemetry/otlp-transformer": "0.52.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/exporter-zipkin": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.25.1.tgz", - "integrity": "sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", - "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@types/shimmer": "^1.0.2", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-amqplib": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.41.0.tgz", - "integrity": "sha512-00Oi6N20BxJVcqETjgNzCmVKN+I5bJH/61IlHiIWd00snj1FdgiIKlpE4hYVacTB2sjIBB3nTbHskttdZEE2eg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-lambda": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.43.0.tgz", - "integrity": "sha512-pSxcWlsE/pCWQRIw92sV2C+LmKXelYkjkA7C5s39iPUi4pZ2lA1nIiw+1R/y2pDEhUHcaKkNyljQr3cx9ZpVlQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/propagator-aws-xray": "^1.3.1", - "@opentelemetry/resources": "^1.8.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@types/aws-lambda": "8.10.122" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-aws-sdk": { - "version": "0.43.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.43.1.tgz", - "integrity": "sha512-qLT2cCniJ5W+6PFzKbksnoIQuq9pS83nmgaExfUwXVvlwi0ILc50dea0tWBHZMkdIDa/zZdcuFrJ7+fUcSnRow==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/propagation-utils": "^0.30.10", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-bunyan": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.40.0.tgz", - "integrity": "sha512-aZ4cXaGWwj79ZXSYrgFVsrDlE4mmf2wfvP9bViwRc0j75A6eN6GaHYHqufFGMTCqASQn5pIjjP+Bx+PWTGiofw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/api-logs": "^0.52.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@types/bunyan": "1.8.9" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-cassandra-driver": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.40.0.tgz", - "integrity": "sha512-JxbM39JU7HxE9MTKKwi6y5Z3mokjZB2BjwfqYi4B3Y29YO3I42Z7eopG6qq06yWZc+nQli386UDQe0d9xKmw0A==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-connect": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.38.0.tgz", - "integrity": "sha512-2/nRnx3pjYEmdPIaBwtgtSviTKHWnDZN3R+TkRUnhIVrvBKVcq+I5B2rtd6mr6Fe9cHlZ9Ojcuh7pkNh/xdWWg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@types/connect": "3.4.36" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-connect/node_modules/@types/connect": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", - "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@opentelemetry/instrumentation-cucumber": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.8.0.tgz", - "integrity": "sha512-ieTm4RBIlZt2brPwtX5aEZYtYnkyqhAVXJI9RIohiBVMe5DxiwCwt+2Exep/nDVqGPX8zRBZUl4AEw423OxJig==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/instrumentation-dataloader": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.11.0.tgz", - "integrity": "sha512-27urJmwkH4KDaMJtEv1uy2S7Apk4XbN4AgWMdfMJbi7DnOduJmeuA+DpJCwXB72tEWXo89z5T3hUVJIDiSNmNw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-dns": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.38.0.tgz", - "integrity": "sha512-Um07I0TQXDWa+ZbEAKDFUxFH40dLtejtExDOMLNJ1CL8VmOmA71qx93Qi/QG4tGkiI1XWqr7gF/oiMCJ4m8buQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-express": { - "version": "0.41.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.41.1.tgz", - "integrity": "sha512-uRx0V3LPGzjn2bxAnV8eUsDT82vT7NTwI0ezEuPMBOTOsnPpGhWdhcdNdhH80sM4TrWrOfXm9HGEdfWE3TRIww==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fastify": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.38.0.tgz", - "integrity": "sha512-HBVLpTSYpkQZ87/Df3N0gAw7VzYZV3n28THIBrJWfuqw3Or7UqdhnjeuMIPQ04BKk3aZc0cWn2naSQObbh5vXw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fs": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.14.0.tgz", - "integrity": "sha512-pVc8P5AgliC1DphyyBUgsxXlm2XaPH4BpYvt7rAZDMIqUpRk8gs19SioABtKqqxvFzg5jPtgJfJsdxq0Y+maLw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-generic-pool": { - "version": "0.38.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.38.1.tgz", - "integrity": "sha512-WvssuKCuavu/hlq661u82UWkc248cyI/sT+c2dEIj6yCk0BUkErY1D+9XOO+PmHdJNE+76i2NdcvQX5rJrOe/w==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-graphql": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.42.0.tgz", - "integrity": "sha512-N8SOwoKL9KQSX7z3gOaw5UaTeVQcfDO1c21csVHnmnmGUoqsXbArK2B8VuwPWcv6/BC/i3io+xTo7QGRZ/z28Q==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.52.1.tgz", - "integrity": "sha512-EdSDiDSAO+XRXk/ZN128qQpBo1I51+Uay/LUPcPQhSRGf7fBPIEUBeOLQiItguGsug5MGOYjql2w/1wCQF3fdQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "0.52.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-hapi": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.40.0.tgz", - "integrity": "sha512-8U/w7Ifumtd2bSN1OLaSwAAFhb9FyqWUki3lMMB0ds+1+HdSxYBe9aspEJEgvxAqOkrQnVniAPTEGf1pGM7SOw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.52.1.tgz", - "integrity": "sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/instrumentation": "0.52.1", - "@opentelemetry/semantic-conventions": "1.25.1", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/instrumentation-ioredis": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.42.0.tgz", - "integrity": "sha512-P11H168EKvBB9TUSasNDOGJCSkpT44XgoM6d3gRIWAa9ghLpYhl0uRkS8//MqPzcJVHr3h3RmfXIpiYLjyIZTw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.23.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-kafkajs": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.2.0.tgz", - "integrity": "sha512-uKKmhEFd0zR280tJovuiBG7cfnNZT4kvVTvqtHPxQP7nOmRbJstCYHFH13YzjVcKjkmoArmxiSulmZmF7SLIlg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.24.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-knex": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.39.0.tgz", - "integrity": "sha512-lRwTqIKQecPWDkH1KEcAUcFhCaNssbKSpxf4sxRTAROCwrCEnYkjOuqJHV+q1/CApjMTaKu0Er4LBv/6bDpoxA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-koa": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.42.0.tgz", - "integrity": "sha512-H1BEmnMhho8o8HuNRq5zEI4+SIHDIglNB7BPKohZyWG4fWNuR7yM4GTlR01Syq21vODAS7z5omblScJD/eZdKw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-lru-memoizer": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.39.0.tgz", - "integrity": "sha512-eU1Wx1RRTR/2wYXFzH9gcpB8EPmhYlNDIUHzUXjyUE0CAXEJhBLkYNlzdaVCoQDw2neDqS+Woshiia6+emWK9A==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-memcached": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.38.0.tgz", - "integrity": "sha512-tPmyqQEZNyrvg6G+iItdlguQEcGzfE+bJkpQifmBXmWBnoS5oU3UxqtyYuXGL2zI9qQM5yMBHH4nRXWALzy7WA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.23.0", - "@types/memcached": "^2.2.6" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mongodb": { - "version": "0.46.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.46.0.tgz", - "integrity": "sha512-VF/MicZ5UOBiXrqBslzwxhN7TVqzu1/LN/QDpkskqM0Zm0aZ4CVRbUygL8d7lrjLn15x5kGIe8VsSphMfPJzlA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/sdk-metrics": "^1.9.1", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mongoose": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.41.0.tgz", - "integrity": "sha512-ivJg4QnnabFxxoI7K8D+in7hfikjte38sYzJB9v1641xJk9Esa7jM3hmbPB7lxwcgWJLVEDvfPwobt1if0tXxA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mysql": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.40.0.tgz", - "integrity": "sha512-d7ja8yizsOCNMYIJt5PH/fKZXjb/mS48zLROO4BzZTtDfhNCl2UM/9VIomP2qkGIFVouSJrGr/T00EzY7bPtKA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@types/mysql": "2.15.22" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mysql2": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.40.0.tgz", - "integrity": "sha512-0xfS1xcqUmY7WE1uWjlmI67Xg3QsSUlNT+AcXHeA4BDUPwZtWqF4ezIwLgpVZfHOnkAEheqGfNSWd1PIu3Wnfg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@opentelemetry/sql-common": "^0.40.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-nestjs-core": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.39.0.tgz", - "integrity": "sha512-mewVhEXdikyvIZoMIUry8eb8l3HUjuQjSjVbmLVTt4NQi35tkpnHQrG9bTRBrl3403LoWZ2njMPJyg4l6HfKvA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.23.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-net": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.38.0.tgz", - "integrity": "sha512-stjow1PijcmUquSmRD/fSihm/H61DbjPlJuJhWUe7P22LFPjFhsrSeiB5vGj3vn+QGceNAs+kioUTzMGPbNxtg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.23.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pg": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.43.0.tgz", - "integrity": "sha512-og23KLyoxdnAeFs1UWqzSonuCkePUzCX30keSYigIzJe/6WSYA8rnEI5lobcxPEzg+GcU06J7jzokuEHbjVJNw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@opentelemetry/sql-common": "^0.40.1", - "@types/pg": "8.6.1", - "@types/pg-pool": "2.0.4" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pino": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.41.0.tgz", - "integrity": "sha512-Kpv0fJRk/8iMzMk5Ue5BsUJfHkBJ2wQoIi/qduU1a1Wjx9GLj6J2G17PHjPK5mnZjPNzkFOXFADZMfgDioliQw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/api-logs": "^0.52.0", - "@opentelemetry/core": "^1.25.0", - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-redis": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.41.0.tgz", - "integrity": "sha512-RJ1pwI3btykp67ts+5qZbaFSAAzacucwBet5/5EsKYtWBpHbWwV/qbGN/kIBzXg5WEZBhXLrR/RUq0EpEUpL3A==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-redis-4": { - "version": "0.41.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.41.1.tgz", - "integrity": "sha512-UqJAbxraBk7s7pQTlFi5ND4sAUs4r/Ai7gsAVZTQDbHl2kSsOp7gpHcpIuN5dpcI2xnuhM2tkH4SmEhbrv2S6Q==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-restify": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.40.0.tgz", - "integrity": "sha512-sm/rH/GysY/KOEvZqYBZSLYFeXlBkHCgqPDgWc07tz+bHCN6mPs9P3otGOSTe7o3KAIM8Nc6ncCO59vL+jb2cA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-router": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.39.0.tgz", - "integrity": "sha512-LaXnVmD69WPC4hNeLzKexCCS19hRLrUw3xicneAMkzJSzNJvPyk7G6I7lz7VjQh1cooObPBt9gNyd3hhTCUrag==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-socket.io": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.41.0.tgz", - "integrity": "sha512-7fzDe9/FpO6NFizC/wnzXXX7bF9oRchsD//wFqy5g5hVEgXZCQ70IhxjrKdBvgjyIejR9T9zTvfQ6PfVKfkCAw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-tedious": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.13.0.tgz", - "integrity": "sha512-Pob0+0R62AqXH50pjazTeGBy/1+SK4CYpFUBV5t7xpbpeuQezkkgVGvLca84QqjBqQizcXedjpUJLgHQDixPQg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@types/tedious": "^4.0.14" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-undici": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.5.0.tgz", - "integrity": "sha512-aNTeSrFAVcM9qco5DfZ9DNXu6hpMRe8Kt8nCDHfMWDB3pwgGVUE76jTdohc+H/7eLRqh4L7jqs5NSQoHw7S6ww==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.7.0" - } - }, - "node_modules/@opentelemetry/instrumentation-winston": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.39.0.tgz", - "integrity": "sha512-v/1xziLJ9CyB3YDjBSBzbB70Qd0JwWTo36EqWK5m3AR0CzsyMQQmf3ZIZM6sgx7hXMcRQ0pnEYhg6nhrUQPm9A==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/api-logs": "^0.52.0", - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/otlp-exporter-base": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.52.1.tgz", - "integrity": "sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-transformer": "0.52.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/otlp-grpc-exporter-base": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.52.1.tgz", - "integrity": "sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "^1.7.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/otlp-exporter-base": "0.52.1", - "@opentelemetry/otlp-transformer": "0.52.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/otlp-transformer": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.52.1.tgz", - "integrity": "sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-logs": "0.52.1", - "@opentelemetry/sdk-metrics": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1", - "protobufjs": "^7.3.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/propagation-utils": { - "version": "0.30.16", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.16.tgz", - "integrity": "sha512-ZVQ3Z/PQ+2GQlrBfbMMMT0U7MzvYZLCPP800+ooyaBqm4hMvuQHfP028gB9/db0mwkmyEAMad9houukUVxhwcw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/propagator-aws-xray": { - "version": "1.26.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.26.2.tgz", - "integrity": "sha512-k43wxTjKYvwfce9L4eT8fFYy/ATmCfPHZPZsyT/6ABimf2KE1HafoOsIcxLOtmNSZt6dCvBIYCrXaOWta20xJg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/propagator-b3": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.25.1.tgz", - "integrity": "sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/propagator-jaeger": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.25.1.tgz", - "integrity": "sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/redis-common": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", - "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { - "version": "0.29.7", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.29.7.tgz", - "integrity": "sha512-PExUl/R+reSQI6Y/eNtgAsk6RHk1ElYSzOa8/FHfdc/nLmx9sqMasBEpLMkETkzDP7t27ORuXe4F9vwkV2uwwg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.26.0", - "@opentelemetry/resources": "^1.10.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/resource-detector-alibaba-cloud/node_modules/@opentelemetry/core": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/resource-detector-alibaba-cloud/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/resource-detector-aws": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.12.0.tgz", - "integrity": "sha512-Cvi7ckOqiiuWlHBdA1IjS0ufr3sltex2Uws2RK6loVp4gzIJyOijsddAI6IZ5kiO8h/LgCWe8gxPmwkTKImd+Q==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.0.0", - "@opentelemetry/resources": "^1.10.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/resource-detector-azure": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.2.12.tgz", - "integrity": "sha512-iIarQu6MiCjEEp8dOzmBvCSlRITPFTinFB2oNKAjU6xhx8d7eUcjNOKhBGQTvuCriZrxrEvDaEEY9NfrPQ6uYQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.25.1", - "@opentelemetry/resources": "^1.10.1", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/resource-detector-container": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.4.4.tgz", - "integrity": "sha512-ZEN2mq7lIjQWJ8NTt1umtr6oT/Kb89856BOmESLSvgSHbIwOFYs7cSfSRH5bfiVw6dXTQAVbZA/wLgCHKrebJA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.26.0", - "@opentelemetry/resources": "^1.10.0", - "@opentelemetry/semantic-conventions": "^1.27.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/resource-detector-container/node_modules/@opentelemetry/core": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", - "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/semantic-conventions": "1.28.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/resource-detector-container/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", - "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/resource-detector-gcp": { - "version": "0.29.13", - "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.13.tgz", - "integrity": "sha512-vdotx+l3Q+89PeyXMgKEGnZ/CwzwMtuMi/ddgD9/5tKZ08DfDGB2Npz9m2oXPHRCjc4Ro6ifMqFlRyzIvgOjhg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.0.0", - "@opentelemetry/resources": "^1.10.0", - "@opentelemetry/semantic-conventions": "^1.27.0", - "gcp-metadata": "^6.0.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.0.0" - } - }, - "node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sdk-logs": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.52.1.tgz", - "integrity": "sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.4.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", - "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "lodash.merge": "^4.6.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.52.1.tgz", - "integrity": "sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/exporter-trace-otlp-grpc": "0.52.1", - "@opentelemetry/exporter-trace-otlp-http": "0.52.1", - "@opentelemetry/exporter-trace-otlp-proto": "0.52.1", - "@opentelemetry/exporter-zipkin": "1.25.1", - "@opentelemetry/instrumentation": "0.52.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-logs": "0.52.1", - "@opentelemetry/sdk-metrics": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1", - "@opentelemetry/sdk-trace-node": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sdk-trace-node": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.25.1.tgz", - "integrity": "sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@opentelemetry/context-async-hooks": "1.25.1", - "@opentelemetry/core": "1.25.1", - "@opentelemetry/propagator-b3": "1.25.1", - "@opentelemetry/propagator-jaeger": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.38.0.tgz", - "integrity": "sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sql-common": { - "version": "0.40.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", - "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@opentelemetry/core": "^1.1.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0" - } - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@so-ric/colorspace": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", - "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "color": "^5.0.2", - "text-hex": "1.0.x" - } - }, - "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/aws-lambda": { - "version": "8.10.122", - "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.122.tgz", - "integrity": "sha512-vBkIh9AY22kVOCEKo5CJlyCgmSWvasC+SWUxL/x/vOwRobMpI/HG1xp/Ae3AqmSiZeLUbOhW0FCD3ZjqqUxmXw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bunyan": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.9.tgz", - "integrity": "sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/caseless": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", - "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.5.tgz", - "integrity": "sha512-LuIQOcb6UmnF7C1PCFmEU1u2hmiHL43fgFQX67sN3H4Z+0Yk0Neo++mFsBjhOAuLzvlQeqAAkeDOZrJs9rzumQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^1" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", - "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", - "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*", - "@types/node": "*" - } - }, - "node_modules/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@types/memcached": { - "version": "2.2.10", - "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", - "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mysql": { - "version": "2.15.22", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz", - "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "24.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", - "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~7.16.0" - } - }, - "node_modules/@types/passport": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz", - "integrity": "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/passport-jwt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-4.0.1.tgz", - "integrity": "sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/jsonwebtoken": "*", - "@types/passport-strategy": "*" - } - }, - "node_modules/@types/passport-strategy": { - "version": "0.2.38", - "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz", - "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*", - "@types/passport": "*" - } - }, - "node_modules/@types/pg": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", - "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" - } - }, - "node_modules/@types/pg-pool": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz", - "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/pg": "*" - } - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/request": { - "version": "2.48.13", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.13.tgz", - "integrity": "sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/caseless": "*", - "@types/node": "*", - "@types/tough-cookie": "*", - "form-data": "^2.5.5" - } - }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "<1" - } - }, - "node_modules/@types/serve-static/node_modules/@types/send": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/shimmer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", - "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/tedious": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", - "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/tough-cookie": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "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", - "optional": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ansi-color": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/ansi-color/-/ansi-color-0.2.1.tgz", - "integrity": "sha512-bF6xLaZBLpOQzgYUtYEhJx090nPSZk1BQ/q2oyBK9aMMcJHzx9uXGCjI2Y+LebsN4Jwoykr0V9whbPiogdyHoQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansi-styles/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ansi-styles/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/async-mutex": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", - "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/async-retry": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", - "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "retry": "0.13.1" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT", - "optional": true - }, - "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/bignumber.js": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", - "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/body-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/bufrw": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/bufrw/-/bufrw-1.4.0.tgz", - "integrity": "sha512-sWm8iPbqvL9+5SiYxXH73UOkyEbGQg7kyHQmReF89WJHQJw2eV4P/yZ0E+b71cczJ4pPobVhXxgQcmfSTgGHxQ==", - "dev": true, - "dependencies": { - "ansi-color": "^0.2.1", - "error": "^7.0.0", - "hexer": "^1.5.0", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.10.x" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", - "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "color-convert": "^3.1.3", - "color-string": "^2.1.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/color-convert": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", - "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=14.6" - } - }, - "node_modules/color-name": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", - "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/color-string": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", - "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "color-name": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/data-uri-to-buffer": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", - "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/dot-prop": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", - "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dotprompt": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/dotprompt/-/dotprompt-1.1.2.tgz", - "integrity": "sha512-24EU+eORQbPywBicIP44BiqykzEXFwZq1ZQKO5TEr9KrrENyDA7I1NzqhtmmEdQVfAXka0DEbSLPN5nerCqJ8A==", - "dev": true, - "license": "ISC", - "dependencies": { - "handlebars": "^4.7.8", - "yaml": "^2.8.0" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexify": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", - "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.2" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true, - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/error": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", - "integrity": "sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw==", - "dev": true, - "dependencies": { - "string-template": "~0.2.1", - "xtend": "~4.0.0" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true, - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "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", - "optional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eventid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/eventid/-/eventid-2.0.1.tgz", - "integrity": "sha512-sPNTqiMokAvV048P2c9+foqVJzk49o6d4e0D/sq5jog3pw+4kBgyR0gaM1FM7Mx6Kzd9dztesh9oYz1LWWOpzw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "uuid": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eventid/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true, - "license": "MIT" - }, - "node_modules/farmhash-modern": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/farmhash-modern/-/farmhash-modern-1.1.0.tgz", - "integrity": "sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/fast-xml-parser": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", - "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "strnum": "^1.1.1" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/fetch-blob": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", - "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "paypal", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "dependencies": { - "node-domexception": "^1.0.0", - "web-streams-polyfill": "^3.0.3" - }, - "engines": { - "node": "^12.20 || >= 14.13" - } - }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/firebase-admin": { - "version": "13.6.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-13.6.0.tgz", - "integrity": "sha512-GdPA/t0+Cq8p1JnjFRBmxRxAGvF/kl2yfdhALl38PrRp325YxyQ5aNaHui0XmaKcKiGRFIJ/EgBNWFoDP0onjw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@fastify/busboy": "^3.0.0", - "@firebase/database-compat": "^2.0.0", - "@firebase/database-types": "^1.0.6", - "@types/node": "^22.8.7", - "farmhash-modern": "^1.1.0", - "fast-deep-equal": "^3.1.1", - "google-auth-library": "^9.14.2", - "jsonwebtoken": "^9.0.0", - "jwks-rsa": "^3.1.0", - "node-forge": "^1.3.1", - "uuid": "^11.0.2" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@google-cloud/firestore": "^7.11.0", - "@google-cloud/storage": "^7.14.0" - } - }, - "node_modules/firebase-admin/node_modules/@types/node": { - "version": "22.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", - "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/firebase-admin/node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/form-data": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", - "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.35", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/formdata-polyfill": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", - "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fetch-blob": "^3.1.2" - }, - "engines": { - "node": ">=12.20.0" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/gaxios": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", - "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "is-stream": "^2.0.0", - "node-fetch": "^2.6.9", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/gaxios/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/gaxios/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/gcp-metadata": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", - "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "gaxios": "^6.1.1", - "google-logging-utils": "^0.0.2", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/genkit": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/genkit/-/genkit-1.24.0.tgz", - "integrity": "sha512-9BjPrLULfWdzauibKkbZcCf2LVu0mW2EW6EXHK/cTber6QdiP/guA5mXahaaDWBo+qdIKpInXAYDEzcRUmCVSA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@genkit-ai/ai": "1.24.0", - "@genkit-ai/core": "1.24.0", - "uuid": "^10.0.0" - } - }, - "node_modules/genkit/node_modules/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-port": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", - "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/google-auth-library": { - "version": "9.15.1", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", - "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^6.1.1", - "gcp-metadata": "^6.1.0", - "gtoken": "^7.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.6.1.tgz", - "integrity": "sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@grpc/grpc-js": "^1.10.9", - "@grpc/proto-loader": "^0.7.13", - "@types/long": "^4.0.0", - "abort-controller": "^3.0.0", - "duplexify": "^4.0.0", - "google-auth-library": "^9.3.0", - "node-fetch": "^2.7.0", - "object-hash": "^3.0.0", - "proto3-json-serializer": "^2.0.2", - "protobufjs": "^7.3.2", - "retry-request": "^7.0.0", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/google-gax/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/google-gax/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/google-logging-utils": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", - "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14" - } - }, - "node_modules/googleapis": { - "version": "137.1.0", - "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-137.1.0.tgz", - "integrity": "sha512-2L7SzN0FLHyQtFmyIxrcXhgust77067pkkduqkbIpDuj9JzVnByxsRrcRfUMFQam3rQkWW2B0f1i40IwKDWIVQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "google-auth-library": "^9.0.0", - "googleapis-common": "^7.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/googleapis-common": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-7.2.0.tgz", - "integrity": "sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "extend": "^3.0.2", - "gaxios": "^6.0.3", - "google-auth-library": "^9.7.0", - "qs": "^6.7.0", - "url-template": "^2.0.8", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/googleapis-common/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gtoken": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", - "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "gaxios": "^6.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hexer": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/hexer/-/hexer-1.5.0.tgz", - "integrity": "sha512-dyrPC8KzBzUJ19QTIo1gXNqIISRXQ0NwteW6OeQHRN4ZuZeHkdODfj0zHBdOlHbRY8GqbqK57C9oWSvQZizFsg==", - "dev": true, - "dependencies": { - "ansi-color": "^0.2.1", - "minimist": "^1.1.0", - "process": "^0.10.0", - "xtend": "^4.0.0" - }, - "bin": { - "hexer": "cli.js" - }, - "engines": { - "node": ">= 0.10.x" - } - }, - "node_modules/html-entities": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", - "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ], - "license": "MIT", - "optional": true - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/import-in-the-middle": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", - "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "acorn": "^8.14.0", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jaeger-client": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/jaeger-client/-/jaeger-client-3.19.0.tgz", - "integrity": "sha512-M0c7cKHmdyEUtjemnJyx/y9uX16XHocL46yQvyqDlPdvAcwPDbHrIbKjQdBqtiE4apQ/9dmr+ZLJYYPGnurgpw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0", - "opentracing": "^0.14.4", - "thriftrw": "^3.5.0", - "uuid": "^8.3.2", - "xorshift": "^1.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jaeger-client/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/jose": { - "version": "4.15.9", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", - "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", - "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "dev": true, - "license": "(AFL-2.1 OR BSD-3-Clause)" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jsonwebtoken/node_modules/jwa": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", - "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jsonwebtoken/node_modules/jws": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz", - "integrity": "sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "jwa": "^1.4.2", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jwks-rsa": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.2.0.tgz", - "integrity": "sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/express": "^4.17.20", - "@types/jsonwebtoken": "^9.0.4", - "debug": "^4.3.4", - "jose": "^4.15.4", - "limiter": "^1.1.5", - "lru-memoizer": "^2.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/jwks-rsa/node_modules/@types/express": { - "version": "4.17.25", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", - "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "^1" - } - }, - "node_modules/jwks-rsa/node_modules/@types/express-serve-static-core": { - "version": "4.19.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", - "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "dev": true, - "license": "MIT", - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/limiter": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", - "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", - "dev": true, - "optional": true, - "peer": true - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.mapvalues": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", - "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true, - "license": "MIT" - }, - "node_modules/logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/lru-memoizer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", - "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "lodash.clonedeep": "^4.5.0", - "lru-cache": "6.0.0" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/module-details-from-path": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", - "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", - "dev": true, - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", - "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", - "deprecated": "Use your platform's native DOMException instead", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/jimmywarting" - }, - { - "type": "github", - "url": "https://paypal.me/jimmywarting" - } - ], - "license": "MIT", - "engines": { - "node": ">=10.5.0" - } - }, - "node_modules/node-fetch": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", - "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", - "dev": true, - "license": "MIT", - "dependencies": { - "data-uri-to-buffer": "^4.0.0", - "fetch-blob": "^3.1.4", - "formdata-polyfill": "^4.0.10" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/node-fetch" - } - }, - "node_modules/node-forge": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz", - "integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==", - "dev": true, - "license": "(BSD-3-Clause OR GPL-2.0)", - "optional": true, - "peer": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/opentracing": { - "version": "0.14.7", - "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz", - "integrity": "sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/partial-json": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/partial-json/-/partial-json-0.1.7.tgz", - "integrity": "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==", - "dev": true, - "license": "MIT" - }, - "node_modules/passport": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", - "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "passport-strategy": "1.x.x", - "pause": "0.0.1", - "utils-merge": "^1.0.1" - }, - "engines": { - "node": ">= 0.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jaredhanson" - } - }, - "node_modules/passport-jwt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz", - "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsonwebtoken": "^9.0.0", - "passport-strategy": "^1.0.0" - } - }, - "node_modules/passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==", - "dev": true - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "dev": true, - "license": "ISC", - "optional": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", - "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/process": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/process/-/process-0.10.1.tgz", - "integrity": "sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/proto3-json-serializer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz", - "integrity": "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "protobufjs": "^7.2.5" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/protobufjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", - "dev": true, - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", - "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "duplexify": "^4.1.1", - "inherits": "^2.0.3", - "pump": "^3.0.0" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-in-the-middle": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", - "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/retry-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", - "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/request": "^2.48.8", - "extend": "^3.0.2", - "teeny-request": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "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/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true, - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true, - "license": "ISC" - }, - "node_modules/shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-events": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", - "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "stubs": "^3.0.0" - } - }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "dev": true, - "license": "MIT", - "optional": true - }, - "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", - "optional": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strnum": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/stubs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", - "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/teeny-request": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", - "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.9", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/teeny-request/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/teeny-request/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/teeny-request/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/teeny-request/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/thriftrw": { - "version": "3.11.4", - "resolved": "https://registry.npmjs.org/thriftrw/-/thriftrw-3.11.4.tgz", - "integrity": "sha512-UcuBd3eanB3T10nXWRRMwfwoaC6VMk7qe3/5YIWP2Jtw+EbHqJ0p1/K3x8ixiR5dozKSSfcg1W+0e33G1Di3XA==", - "dev": true, - "dependencies": { - "bufrw": "^1.2.1", - "error": "7.0.2", - "long": "^2.4.0" - }, - "bin": { - "thrift2json": "thrift2json.js" - }, - "engines": { - "node": ">= 0.10.x" - } - }, - "node_modules/thriftrw/node_modules/long": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/long/-/long-2.4.0.tgz", - "integrity": "sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsx": { - "version": "4.20.6", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", - "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "~0.25.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undici-types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", - "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", - "dev": true, - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/uri-templates": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/uri-templates/-/uri-templates-0.2.0.tgz", - "integrity": "sha512-EWkjYEN0L6KOfEoOH6Wj4ghQqU7eBZMJqRHQnxQAq+dSEzRPClkWjf8557HkWQXF6BrAUoLSAyy9i3RVTliaNg==", - "dev": true, - "license": "http://geraintluff.github.io/tv4/LICENSE.txt" - }, - "node_modules/url-template": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", - "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", - "dev": true, - "license": "BSD", - "optional": true - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/winston": { - "version": "3.18.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", - "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.8", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.7.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.9.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/xorshift": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/xorshift/-/xorshift-1.2.0.tgz", - "integrity": "sha512-iYgNnGyeeJ4t6U11NpA/QiKy+PXn5Aa3Azg5qkwIFz1tBLllQrjjsk9yzD7IAK0naNU4JxdeDgqW9ov4u/hc4g==", - "dev": true, - "license": "MIT" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true - }, - "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.25.0", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz", - "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==", - "dev": true, - "license": "ISC", - "peerDependencies": { - "zod": "^3.25 || ^4" - } - } - } -} diff --git a/src/samples/package.json b/src/samples/package.json deleted file mode 100644 index 88d2b9ee..00000000 --- a/src/samples/package.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "module", - "private": true, - "scripts": { - "a2a:cli": "tsx cli.ts", - "agents:movie-agent": "tsx agents/movie-agent/index.ts", - "agents:sample-agent": "tsx agents/sample-agent/index.ts", - "agents:extension-agent": "tsx extensions/index.ts", - "agents:authentication-agent": "tsx authentication/index.ts" - }, - "devDependencies": { - "@genkit-ai/googleai": "^1.8.0", - "@types/express": "^5.0.5", - "@types/passport": "^1.0.17", - "@types/passport-jwt": "^4.0.1", - "express": "^5.1.0", - "genkit": "^1.8.0", - "passport": "^0.7.0", - "passport-jwt": "^4.0.1", - "tsx": "^4.19.3" - }, - "dependencies": { - "uuid": "^11.1.0" - } -} diff --git a/src/server/transports/grpc/grpc_transport_handler.ts b/src/server/transports/grpc/grpc_transport_handler.ts index 6db032a1..00cd61e4 100644 --- a/src/server/transports/grpc/grpc_transport_handler.ts +++ b/src/server/transports/grpc/grpc_transport_handler.ts @@ -3,25 +3,31 @@ import { A2AServiceServer, A2AServiceService, AgentCard, CancelTaskRequest, Dele import { Task as A2ATask, MessageSendParams} from '../../../types.js'; import { Empty } from '../../../grpc/google/protobuf/empty.js'; import { A2ARequestHandler } from '../../request_handler/a2a_request_handler.js'; +import { FromProto } from '../../../grpc/utils/proto_type_converter.js'; export function createGRPCHandler(requestHandler: A2ARequestHandler): A2AServiceServer { return { - sendMessage(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { + async sendMessage(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): Promise { const request: SendMessageRequest = call.request; console.log("Received message:", request); - const params: MessageSendParams = { - message: {...request.request, kind: 'message'}, - configuration: request.configuration, - metadata: request.metadata - } - const task = requestHandler.sendMessage(params); + const params: MessageSendParams = FromProto.messageSendParams(request); + const task = await requestHandler.sendMessage(params); const response: SendMessageResponse = { - 'task': Task.fromJSON(task) + payload: { + $case: 'task', + value: { + id: (task as A2ATask).id, + contextId: task.contextId, + status: undefined, + artifacts: [], + history: [], + metadata: {}, + }, + }, }; - callback(null, response); }, sendStreamingMessage(call: grpc.ServerWritableStream): void { From 9b60ee7b6b8ce31e1815155a74803ec704d55fa5 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Wed, 17 Dec 2025 13:37:56 +0000 Subject: [PATCH 03/64] wip --- src/samples/agents/sample-agent/grpc.ts | 2 +- src/server/grpc/grpc_handler.ts | 120 ++++++++++ .../transports/grpc/grpc_transport_handler.ts | 211 +++++++++++++----- 3 files changed, 270 insertions(+), 63 deletions(-) create mode 100644 src/server/grpc/grpc_handler.ts diff --git a/src/samples/agents/sample-agent/grpc.ts b/src/samples/agents/sample-agent/grpc.ts index 79e6f5e1..8f8d9ff2 100644 --- a/src/samples/agents/sample-agent/grpc.ts +++ b/src/samples/agents/sample-agent/grpc.ts @@ -9,7 +9,7 @@ import { import { agentCardHandler, jsonRpcHandler, UserBuilder } from '../../../server/express/index.js'; import { SampleAgentExecutor } from './agent_executor.js'; import { A2AServiceService } from '../../../grpc/a2a.js'; -import { createGRPCHandler } from '../../../server/transports/grpc/grpc_transport_handler.js'; +import { createGRPCHandler } from '../../../server/grpc/grpc_handler.js'; // --- Server Setup --- diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts new file mode 100644 index 00000000..f5015852 --- /dev/null +++ b/src/server/grpc/grpc_handler.ts @@ -0,0 +1,120 @@ +import * as grpc from '@grpc/grpc-js'; +import { A2AServiceServer, A2AServiceService, AgentCard, CancelTaskRequest, DeleteTaskPushNotificationConfigRequest, GetExtendedAgentCardRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, ListTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigResponse, ListTasksRequest, ListTasksResponse, Message, SendMessageRequest, SendMessageResponse, SetTaskPushNotificationConfigRequest, StreamResponse, SubscribeToTaskRequest, Task, TaskPushNotificationConfig } from '../../grpc/a2a.js'; +import { Task as A2ATask, MessageSendParams} from '../../types.js'; +import { Empty } from '../../grpc/google/protobuf/empty.js'; +import { A2ARequestHandler } from '../request_handler/a2a_request_handler.js'; +import { FromProto } from '../../grpc/utils/proto_type_converter.js'; +import { UserBuilder } from '../express/common.js'; +import { gRpcTransportHandler } from '../transports/grpc/grpc_transport_handler.js'; +import { ServerCallContext } from '../context.js'; +import { Extensions } from '../../extensions.js'; +import { User, UnauthenticatedUser } from '../authentication/user.js'; + +/** + * Options for configuring the gRPC handler. + */ +export interface gRpcHandlerOptions { + requestHandler: A2ARequestHandler; + userBuilder: (call: grpc.ServerUnaryCall | grpc.ServerWritableStream) => Promise; +} + +/** + * Creates a gRPC transport handler. + * This handler implements the A2A gRPC service definition and acts as an + * adapter between the gRPC transport layer and the core A2A request handler. + * + * @param requestHandler - The core A2A request handler for business logic. + * @returns An object that implements the A2AServiceServer interface. + */ +export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { + const grpcTransportHandler = new gRpcTransportHandler(options.requestHandler); + + return { + async sendMessage( + call: grpc.ServerUnaryCall, + callback: grpc.sendUnaryData + ): Promise { + try { + const context = await buildContext(call, options.userBuilder); + const params: MessageSendParams = FromProto.messageSendParams(call.request); + const task = await grpcTransportHandler.sendMessage(params, context); + const response = ToProto.sendMessageResponse(task); + callback(null, response); + } catch (error) { + callback({ + code: grpc.status.INTERNAL, + message: error instanceof Error ? error.message : 'Internal Server Error', + }); + } + }, + + sendStreamingMessage(call: grpc.ServerWritableStream): void { + throw new Error('Method not implemented.'); + }, + subscribeToTask(call: grpc.ServerWritableStream): void { + throw new Error('Method not implemented.'); + }, + deleteTaskPushNotificationConfig( + call: grpc.ServerUnaryCall, + callback: grpc.sendUnaryData + ): void { + throw new Error('Method not implemented.'); + }, + getAgentCard(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { + throw new Error('Method not implemented.'); + }, + listTaskPushNotificationConfig( + call: grpc.ServerUnaryCall< + ListTaskPushNotificationConfigRequest, + ListTaskPushNotificationConfigResponse + >, + callback: grpc.sendUnaryData + ): void { + throw new Error('Method not implemented.'); + }, + listTasks( + call: grpc.ServerUnaryCall, + callback: grpc.sendUnaryData + ): void { + throw new Error('Method not implemented.'); + }, + getTask(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { + throw new Error('Method not implemented.'); + }, + cancelTask(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { + throw new Error('Method not implemented.'); + }, + setTaskPushNotificationConfig( + call: grpc.ServerUnaryCall, + callback: grpc.sendUnaryData + ): void { + throw new Error('Method not implemented.'); + }, + getTaskPushNotificationConfig( + call: grpc.ServerUnaryCall, + callback: grpc.sendUnaryData + ): void { + throw new Error('Method not implemented.'); + }, + getExtendedAgentCard( + call: grpc.ServerUnaryCall, + callback: grpc.sendUnaryData + ): void { + throw new Error('Method not implemented.'); + }, + }; +} + +const buildContext = async ( + call: grpc.ServerUnaryCall | grpc.ServerWritableStream, + userBuilder: (call: grpc.ServerUnaryCall | grpc.ServerWritableStream) => Promise + ): Promise => { + const user = await userBuilder(call); + const extensionHeader = call.metadata.get('x-a2a-extensions'); + const extensionString = Array.isArray(extensionHeader) ? extensionHeader.join('') : extensionHeader; + + return new ServerCallContext( + Extensions.parseServiceParameter(extensionString), + user ?? new UnauthenticatedUser() + ); + } \ No newline at end of file diff --git a/src/server/transports/grpc/grpc_transport_handler.ts b/src/server/transports/grpc/grpc_transport_handler.ts index 00cd61e4..ab05d6d1 100644 --- a/src/server/transports/grpc/grpc_transport_handler.ts +++ b/src/server/transports/grpc/grpc_transport_handler.ts @@ -1,67 +1,154 @@ -import * as grpc from '@grpc/grpc-js'; -import { A2AServiceServer, A2AServiceService, AgentCard, CancelTaskRequest, DeleteTaskPushNotificationConfigRequest, GetExtendedAgentCardRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, ListTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigResponse, ListTasksRequest, ListTasksResponse, Message, SendMessageRequest, SendMessageResponse, SetTaskPushNotificationConfigRequest, StreamResponse, SubscribeToTaskRequest, Task, TaskPushNotificationConfig } from '../../../grpc/a2a.js'; -import { Task as A2ATask, MessageSendParams} from '../../../types.js'; -import { Empty } from '../../../grpc/google/protobuf/empty.js'; +import { A2AError } from '../../error.js'; import { A2ARequestHandler } from '../../request_handler/a2a_request_handler.js'; -import { FromProto } from '../../../grpc/utils/proto_type_converter.js'; +import { ServerCallContext } from '../../context.js'; +import { + Message, + Task, + TaskStatusUpdateEvent, + TaskArtifactUpdateEvent, + MessageSendParams, + TaskPushNotificationConfig, + TaskQueryParams, + TaskIdParams, + Part, + AgentCard, + FileWithBytes, + FileWithUri, +} from '../../../types.js'; -export function createGRPCHandler(requestHandler: A2ARequestHandler): A2AServiceServer { - return { - async sendMessage(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): Promise { - const request: SendMessageRequest = call.request; +export class gRpcTransportHandler { + private requestHandler: A2ARequestHandler; - console.log("Received message:", request); - - const params: MessageSendParams = FromProto.messageSendParams(request); - const task = await requestHandler.sendMessage(params); - - const response: SendMessageResponse = { - payload: { - $case: 'task', - value: { - id: (task as A2ATask).id, - contextId: task.contextId, - status: undefined, - artifacts: [], - history: [], - metadata: {}, - }, - }, - }; - callback(null, response); - }, - sendStreamingMessage(call: grpc.ServerWritableStream): void { - throw new Error("Method not implemented."); - }, - subscribeToTask(call: grpc.ServerWritableStream): void { - throw new Error("Method not implemented."); - }, - deleteTaskPushNotificationConfig(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { - throw new Error("Method not implemented."); - }, - getAgentCard(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { - throw new Error("Method not implemented."); - }, - listTaskPushNotificationConfig(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { - throw new Error("Method not implemented."); - }, - listTasks(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { - throw new Error("Method not implemented."); - }, - getTask(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { - throw new Error("Method not implemented."); - }, - cancelTask(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { - throw new Error("Method not implemented."); - }, - setTaskPushNotificationConfig(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { - throw new Error("Method not implemented."); - }, - getTaskPushNotificationConfig(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { - throw new Error("Method not implemented."); - }, - getExtendedAgentCard(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { - throw new Error("Method not implemented."); + constructor(requestHandler: A2ARequestHandler) { + this.requestHandler = requestHandler; } - }; + + /** + * Gets the agent card (for capability checks). + */ + async getAgentCard(): Promise { + return this.requestHandler.getAgentCard(); + } + + /** + * Gets the authenticated extended agent card. + */ + async getAuthenticatedExtendedAgentCard(): Promise { + return this.requestHandler.getAuthenticatedExtendedAgentCard(); + } + + /** + * Sends a message to the agent. + * Accepts both snake_case and camelCase input, returns camelCase. + */ + async sendMessage( + params: MessageSendParams, + context: ServerCallContext + ): Promise { + return this.requestHandler.sendMessage(params, context); + } + + /** + * Sends a message with streaming response. + * Accepts both snake_case and camelCase input, returns camelCase stream. + * @throws {A2AError} UnsupportedOperation if streaming not supported + */ + async sendMessageStream( + params: MessageSendParams, + context: ServerCallContext + ): Promise< + AsyncGenerator< + Message | Task | TaskStatusUpdateEvent | TaskArtifactUpdateEvent, + void, + undefined + > + > { + return this.requestHandler.sendMessageStream(params, context); + } + + /** + * Gets a task by ID. + * Validates historyLength parameter if provided. + */ + async getTask( + taskId: string, + context: ServerCallContext, + historyLength?: unknown + ): Promise { + const params: TaskQueryParams = { id: taskId }; + return this.requestHandler.getTask(params, context); + } + + /** + * Cancels a task. + */ + async cancelTask(taskId: string, context: ServerCallContext): Promise { + const params: TaskIdParams = { id: taskId }; + return this.requestHandler.cancelTask(params, context); + } + + /** + * Resubscribes to task updates. + * Returns camelCase stream of task updates. + * @throws {A2AError} UnsupportedOperation if streaming not supported + */ + async resubscribe( + taskId: string, + context: ServerCallContext + ): Promise< + AsyncGenerator + > { + const params: TaskIdParams = { id: taskId }; + return this.requestHandler.resubscribe(params, context); + } + + /** + * Sets a push notification configuration. + * Accepts both snake_case and camelCase input, returns camelCase. + * @throws {A2AError} PushNotificationNotSupported if push notifications not supported + */ + async setTaskPushNotificationConfig( + config: TaskPushNotificationConfig, + context: ServerCallContext + ): Promise { + return this.requestHandler.setTaskPushNotificationConfig(config, context); + } + + /** + * Lists all push notification configurations for a task. + */ + async listTaskPushNotificationConfigs( + taskId: string, + context: ServerCallContext + ): Promise { + return this.requestHandler.listTaskPushNotificationConfigs({ id: taskId }, context); + } + + /** + * Gets a specific push notification configuration. + */ + async getTaskPushNotificationConfig( + taskId: string, + configId: string, + context: ServerCallContext + ): Promise { + return this.requestHandler.getTaskPushNotificationConfig( + { id: taskId, pushNotificationConfigId: configId }, + context + ); + } + + /** + * Deletes a push notification configuration. + */ + async deleteTaskPushNotificationConfig( + taskId: string, + configId: string, + context: ServerCallContext + ): Promise { + await this.requestHandler.deleteTaskPushNotificationConfig( + { id: taskId, pushNotificationConfigId: configId }, + context + ); + } } \ No newline at end of file From ed3c51faf048afbc4de70fcc4e722ea599841d20 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Wed, 17 Dec 2025 15:17:38 +0000 Subject: [PATCH 04/64] wip --- src/grpc/utils/proto_type_converter.ts | 163 +++++++++++++++++++++++-- src/server/grpc/grpc_handler.ts | 4 +- src/types.ts | 2 +- 3 files changed, 159 insertions(+), 10 deletions(-) diff --git a/src/grpc/utils/proto_type_converter.ts b/src/grpc/utils/proto_type_converter.ts index aba97ba9..24220e9d 100644 --- a/src/grpc/utils/proto_type_converter.ts +++ b/src/grpc/utils/proto_type_converter.ts @@ -47,16 +47,45 @@ import { * Converts proto types to internal types. */ export class FromProto { + static message(message: Message): types.Message { return { kind: 'message', messageId: message.messageId, parts: message.parts.map(p => this.parts(p)), - contextId: message.contextId || null, - taskId: message.taskId || null, + contextId: message.contextId ?? undefined, + taskId: message.taskId ?? undefined, role: message.role === Role.ROLE_AGENT ? "agent" : "user", metadata: message.metadata, - extensions: message.extensions.length > 0 ? message.extensions : null, + extensions: message.extensions.length > 0 ? message.extensions : undefined, + }; + } + + static configuration(configuration: SendMessageConfiguration): types.MessageSendConfiguration { + return { + blocking: configuration.blocking, + acceptedOutputModes: configuration.acceptedOutputModes, + pushNotificationConfig: configuration.pushNotificationConfig + ? this.pushNotificationConfig(configuration.pushNotificationConfig) + : undefined, + }; + } + + static pushNotificationConfig(config: PushNotificationConfig): types.PushNotificationConfig { + return { + id: config.id, + url: config.url, + token: config.token, + authentication: config.authentication + ? this.authenticationInfo(config.authentication) + : undefined + }; + } + + static authenticationInfo(authInfo: AuthenticationInfo): types.PushNotificationAuthenticationInfo { + return { + schemes: authInfo.schemes, + credentials: authInfo.credentials, }; } @@ -104,13 +133,133 @@ export class FromProto { } static messageSendParams(request: SendMessageRequest): types.MessageSendParams { - if (!request.request) { - throw new Error("SendMessageRequest is missing 'request' field."); - } return { - configuration: request.configuration, message: this.message(request.request), + configuration: request.configuration ? this.configuration(request.configuration) : undefined, metadata: request.metadata, }; } +} + +export class ToProto { + + static messageSendResult(params: types.Message | types.Task): SendMessageResponse { + if (params.kind === "message") { + return { + payload: { + $case: 'msg', + value: this.message(params), + }, + }; + } else if (params.kind === "task") { + return { + payload: { + $case: 'task', + value: this.task(params), + }, + }; + } + } + + static message(message: types.Message): Message { + return { + messageId: message.messageId, + parts: message.parts.map(p => this.parts(p)), + contextId: message.contextId ?? '', + taskId: message.taskId ?? '', + role: message.role === 'agent' ? Role.ROLE_AGENT : Role.ROLE_USER, + metadata: message.metadata, + extensions: message.extensions ? message.extensions : [], + referenceTaskIds: message.referenceTaskIds ? message.referenceTaskIds : [], + }; + } + + static task(task: types.Task): Task { + return { + id: task.id, + contextId: task.contextId, + status: this.taskStatus(task.status), + artifacts: task.artifacts.map(a => this.artifact(a)), + history: task.history.map(m => this.message(m)), + metadata: task.metadata, + }; + } + + static taskStatus(status: types.TaskStatus): TaskStatus { + return { + state: this.taskState(status.state), + message: status.message ? this.message(status.message) : undefined, + timestamp: status.timestamp ? new Date(status.timestamp) : undefined, + }; + } + + static artifact(artifact: types.Artifact): Artifact { + return { + artifactId: artifact.artifactId, + name: artifact.name ?? '', + description: artifact.description ?? '', + parts: artifact.parts.map(p => this.parts(p)), + metadata: artifact.metadata, + extensions: artifact.extensions ? artifact.extensions : [], + }; + } + + static taskState(state: types.TaskState): TaskState { + switch (state) { + case "submitted": + return TaskState.TASK_STATE_SUBMITTED; + case "working": + return TaskState.TASK_STATE_WORKING; + case "input-required": + return TaskState.TASK_STATE_INPUT_REQUIRED; + case "rejected": + return TaskState.TASK_STATE_REJECTED; + case "auth-required": + return TaskState.TASK_STATE_AUTH_REQUIRED; + case "completed": + return TaskState.TASK_STATE_COMPLETED; + case "failed": + return TaskState.TASK_STATE_FAILED; + case "canceled": + return TaskState.TASK_STATE_CANCELLED; + case "unknown": + return TaskState.TASK_STATE_UNSPECIFIED; + default: + return TaskState.UNRECOGNIZED; + } + } + + static parts(part: types.Part): Part { + + if (part.kind === "text") { + return { + part: { $case: "text", value: part.text }, + metadata: { ...part.metadata }, + } as Part; + } + + if (part.kind === "file") { + let filePart: ProtoFilePart; + if ('uri' in part.file) { + filePart = { file: { $case: "fileWithUri", value: part.file.uri }, mediaType: undefined, name: part.file.name ?? '' }; + } else if ('bytes' in part.file) { + filePart = { file: { $case: "fileWithBytes", value: Buffer.from(part.file.bytes) }, mediaType: undefined, name: part.file.name ?? '' }; + } else { + throw new Error("Invalid file part"); + } + return { + part: { $case: "file", value: filePart }, + metadata: { ...part.metadata }, + } as Part; + } + + if (part.kind === "data") { + return { + part: { $case: "data", value: { data: part.data } }, + metadata: { ...part.metadata }, + } as Part; + } + + throw new Error("Invalid part type"); + } } \ No newline at end of file diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index f5015852..38aa11da 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -3,7 +3,7 @@ import { A2AServiceServer, A2AServiceService, AgentCard, CancelTaskRequest, Dele import { Task as A2ATask, MessageSendParams} from '../../types.js'; import { Empty } from '../../grpc/google/protobuf/empty.js'; import { A2ARequestHandler } from '../request_handler/a2a_request_handler.js'; -import { FromProto } from '../../grpc/utils/proto_type_converter.js'; +import { FromProto, ToProto } from '../../grpc/utils/proto_type_converter.js'; import { UserBuilder } from '../express/common.js'; import { gRpcTransportHandler } from '../transports/grpc/grpc_transport_handler.js'; import { ServerCallContext } from '../context.js'; @@ -38,7 +38,7 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { const context = await buildContext(call, options.userBuilder); const params: MessageSendParams = FromProto.messageSendParams(call.request); const task = await grpcTransportHandler.sendMessage(params, context); - const response = ToProto.sendMessageResponse(task); + const response = ToProto.messageSendResult(task); callback(null, response); } catch (error) { callback({ diff --git a/src/types.ts b/src/types.ts index 4c6d5f5a..4f332f94 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1764,7 +1764,7 @@ export interface Message1 { * The current status of the task, including its state and a descriptive message. */ export interface TaskStatus { - message?: Message2; + message?: Message; /** * The current state of the task's lifecycle. */ From 9cbf7de57463163c374701cc53473d68da0739d2 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Wed, 17 Dec 2025 17:52:45 +0000 Subject: [PATCH 05/64] wip --- src/grpc/utils/proto_type_converter.ts | 74 ++++++++++++++++ src/server/grpc/grpc_handler.ts | 88 ++++++++++++++++--- .../transports/grpc/grpc_transport_handler.ts | 6 +- 3 files changed, 154 insertions(+), 14 deletions(-) diff --git a/src/grpc/utils/proto_type_converter.ts b/src/grpc/utils/proto_type_converter.ts index 24220e9d..9eb179c6 100644 --- a/src/grpc/utils/proto_type_converter.ts +++ b/src/grpc/utils/proto_type_converter.ts @@ -42,11 +42,30 @@ import { TaskState, TaskStatus, TaskStatusUpdateEvent, + DeleteTaskPushNotificationConfigRequest, } from '../a2a.js'; /** * Converts proto types to internal types. */ export class FromProto { + static deleteTaskPushNotificationConfigParams( + request: DeleteTaskPushNotificationConfigRequest + ): types.DeleteTaskPushNotificationConfigParams { + const name = request.name; + const regex = /^tasks\/([^/]+)\/pushNotificationConfigs\/([^/]+)$/; + const match = name.match(regex); + + if (!match) { + throw new Error( + `Invalid name format for DeleteTaskPushNotificationConfigRequest: ${name}. Expected format: tasks/{task_id}/pushNotificationConfigs/{config_id}` + ); + } + + return { + id: match[1], + pushNotificationConfigId: match[2], + }; + } static message(message: Message): types.Message { return { @@ -143,6 +162,61 @@ export class FromProto { export class ToProto { + static messageStreamResult(event: types.Message | types.Task | types.TaskStatusUpdateEvent | types.TaskArtifactUpdateEvent): StreamResponse { + if (event.kind === "message") { + return { + payload: { + $case: 'msg', + value: this.message(event), + }, + }; + } else if (event.kind === "task") { + return { + payload: { + $case: 'task', + value: this.task(event), + }, + }; + } else if (event.kind === "status-update") { + return { + payload: { + $case: 'statusUpdate', + value: this.taskStatusUpdate(event), + }, + }; + } else if (event.kind === "artifact-update") { + return { + payload: { + $case: 'artifactUpdate', + value: this.taskArtifactUpdate(event), + }, + }; + } else { + throw new Error("Invalid event type"); + } + } + + static taskStatusUpdate(event: types.TaskStatusUpdateEvent): TaskStatusUpdateEvent { + return { + taskId: event.taskId, + status: this.taskStatus(event.status), + contextId: event.contextId, + metadata: event.metadata, + final: event.final, + }; + } + + static taskArtifactUpdate(event: types.TaskArtifactUpdateEvent): TaskArtifactUpdateEvent { + return { + taskId: event.taskId, + artifact: this.artifact(event.artifact), + contextId: event.contextId, + metadata: event.metadata, + append: event.append ?? false, + lastChunk: event.lastChunk ?? false, + }; + } + static messageSendResult(params: types.Message | types.Task): SendMessageResponse { if (params.kind === "message") { return { diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index 38aa11da..7a9e5abf 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -1,6 +1,6 @@ import * as grpc from '@grpc/grpc-js'; import { A2AServiceServer, A2AServiceService, AgentCard, CancelTaskRequest, DeleteTaskPushNotificationConfigRequest, GetExtendedAgentCardRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, ListTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigResponse, ListTasksRequest, ListTasksResponse, Message, SendMessageRequest, SendMessageResponse, SetTaskPushNotificationConfigRequest, StreamResponse, SubscribeToTaskRequest, Task, TaskPushNotificationConfig } from '../../grpc/a2a.js'; -import { Task as A2ATask, MessageSendParams} from '../../types.js'; +import { Task as A2ATask, DeleteTaskPushNotificationConfigParams, MessageSendParams} from '../../types.js'; import { Empty } from '../../grpc/google/protobuf/empty.js'; import { A2ARequestHandler } from '../request_handler/a2a_request_handler.js'; import { FromProto, ToProto } from '../../grpc/utils/proto_type_converter.js'; @@ -9,6 +9,8 @@ import { gRpcTransportHandler } from '../transports/grpc/grpc_transport_handler. import { ServerCallContext } from '../context.js'; import { Extensions } from '../../extensions.js'; import { User, UnauthenticatedUser } from '../authentication/user.js'; +import { HTTP_EXTENSION_HEADER } from '../../constants.js'; +import { A2AError } from '../error.js'; /** * Options for configuring the gRPC handler. @@ -41,24 +43,46 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { const response = ToProto.messageSendResult(task); callback(null, response); } catch (error) { - callback({ - code: grpc.status.INTERNAL, - message: error instanceof Error ? error.message : 'Internal Server Error', - }); + const a2aError = error instanceof A2AError ? error + : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + callback(a2aError, null); } }, - sendStreamingMessage(call: grpc.ServerWritableStream): void { - throw new Error('Method not implemented.'); + async sendStreamingMessage(call: grpc.ServerWritableStream): Promise { + try { + const context = await buildContext(call, options.userBuilder); + const params: MessageSendParams = FromProto.messageSendParams(call.request); + const stream = await grpcTransportHandler.sendMessageStream(params, context); + for await (const responsePart of stream) { + const response = ToProto.messageStreamResult(responsePart); + call.write(response); + } + } catch (error) { + const a2aError = error instanceof A2AError ? error + : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + call.emit('error', a2aError); + } finally { + call.end(); + } }, subscribeToTask(call: grpc.ServerWritableStream): void { throw new Error('Method not implemented.'); }, - deleteTaskPushNotificationConfig( + async deleteTaskPushNotificationConfig( call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData - ): void { - throw new Error('Method not implemented.'); + ): Promise { + try { + const context = await buildContext(call, options.userBuilder); + const params: DeleteTaskPushNotificationConfigParams = FromProto.deleteTaskPushNotificationConfigParams(call.request); + await grpcTransportHandler.deleteTaskPushNotificationConfig(params, context); + callback(null, null); + } catch (error) { + const a2aError = error instanceof A2AError ? error + : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + callback(a2aError, null); + } }, getAgentCard(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { throw new Error('Method not implemented.'); @@ -105,12 +129,54 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { }; } +const mapToError = (error: A2AError): Partial => { + grpc.status + switch (error.code) { + case -32001: + return { + code: grpc.status.NOT_FOUND, + details: error.message, + metadata: undefined, + }; + case -32002 || -32007 || -32008: + return { + code: grpc.status.FAILED_PRECONDITION, + details: error.message, + metadata: undefined, + }; + case -32003 || -32004 || -32009: + return { + code: grpc.status.UNIMPLEMENTED, + details: error.message, + metadata: undefined, + }; + case -32005: + return { + code: grpc.status.INVALID_ARGUMENT, + details: error.message, + metadata: undefined, + }; + case -32006: + return { + code: grpc.status.INTERNAL, + details: error.message, + metadata: undefined, + }; + case -32009: + return { + code: grpc.status.UNIMPLEMENTED, + details: error.message, + metadata: undefined, + }; + } +} + const buildContext = async ( call: grpc.ServerUnaryCall | grpc.ServerWritableStream, userBuilder: (call: grpc.ServerUnaryCall | grpc.ServerWritableStream) => Promise ): Promise => { const user = await userBuilder(call); - const extensionHeader = call.metadata.get('x-a2a-extensions'); + const extensionHeader = call.metadata.get(HTTP_EXTENSION_HEADER.toLowerCase()); const extensionString = Array.isArray(extensionHeader) ? extensionHeader.join('') : extensionHeader; return new ServerCallContext( diff --git a/src/server/transports/grpc/grpc_transport_handler.ts b/src/server/transports/grpc/grpc_transport_handler.ts index ab05d6d1..ea2e4ebe 100644 --- a/src/server/transports/grpc/grpc_transport_handler.ts +++ b/src/server/transports/grpc/grpc_transport_handler.ts @@ -14,6 +14,7 @@ import { AgentCard, FileWithBytes, FileWithUri, + DeleteTaskPushNotificationConfigParams, } from '../../../types.js'; export class gRpcTransportHandler { @@ -142,12 +143,11 @@ export class gRpcTransportHandler { * Deletes a push notification configuration. */ async deleteTaskPushNotificationConfig( - taskId: string, - configId: string, + params: DeleteTaskPushNotificationConfigParams, context: ServerCallContext ): Promise { await this.requestHandler.deleteTaskPushNotificationConfig( - { id: taskId, pushNotificationConfigId: configId }, + params, context ); } From 5bb7a8379d6a5b06c1768c7491bcba6d7442962a Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Wed, 17 Dec 2025 19:04:16 +0000 Subject: [PATCH 06/64] wip --- src/grpc/utils/proto_type_converter.ts | 96 +++++++++++++++++-- src/server/grpc/grpc_handler.ts | 65 +++++++++---- .../transports/grpc/grpc_transport_handler.ts | 11 ++- 3 files changed, 138 insertions(+), 34 deletions(-) diff --git a/src/grpc/utils/proto_type_converter.ts b/src/grpc/utils/proto_type_converter.ts index 9eb179c6..8efe05ba 100644 --- a/src/grpc/utils/proto_type_converter.ts +++ b/src/grpc/utils/proto_type_converter.ts @@ -43,27 +43,71 @@ import { TaskStatus, TaskStatusUpdateEvent, DeleteTaskPushNotificationConfigRequest, + ListTaskPushNotificationConfigRequest, + SetTaskPushNotificationConfigRequest, + ListTaskPushNotificationConfigResponse, } from '../a2a.js'; + +const TASK_ID_REGEX = /tasks\/([^/]+)/; +const CONFIG_ID_REGEX = /pushNotificationConfigs\/([^/]*)/; + /** * Converts proto types to internal types. */ export class FromProto { - static deleteTaskPushNotificationConfigParams( - request: DeleteTaskPushNotificationConfigRequest - ): types.DeleteTaskPushNotificationConfigParams { - const name = request.name; - const regex = /^tasks\/([^/]+)\/pushNotificationConfigs\/([^/]+)$/; - const match = name.match(regex); - + private static _getTaskIdFromName(name: string): string { + const match = name.match(TASK_ID_REGEX); if (!match) { throw new Error( - `Invalid name format for DeleteTaskPushNotificationConfigRequest: ${name}. Expected format: tasks/{task_id}/pushNotificationConfigs/{config_id}` + `Invalid or missing task ID in name: "${name}"` ); } + return match[1]; + } + + private static _getPushNotificationConfigIdFromName(name: string): string { + const match = name.match(CONFIG_ID_REGEX); + if (!match || match.length < 2) { + throw new Error( + `Invalid or missing config ID in name: "${name}"` + ); + } + return match[1]; + } + + static getTaskPushNotificationConfigParams( + request: GetTaskPushNotificationConfigRequest + ): types.GetTaskPushNotificationConfigParams { + return { + id: this._getTaskIdFromName(request.name), + pushNotificationConfigId: this._getPushNotificationConfigIdFromName(request.name), + }; + } + + static listTaskPushNotificationConfigParams( + request: ListTaskPushNotificationConfigRequest + ): types.ListTaskPushNotificationConfigParams { + return { + id: this._getTaskIdFromName(request.parent), + }; + } + + static setTaskPushNotificationConfigParams( + request: SetTaskPushNotificationConfigRequest + ): types.TaskPushNotificationConfig { + return { + taskId: this._getTaskIdFromName(request.parent), + pushNotificationConfig: this.pushNotificationConfig(request.config.pushNotificationConfig), + }; + } + static deleteTaskPushNotificationConfigParams( + request: DeleteTaskPushNotificationConfigRequest + ): types.DeleteTaskPushNotificationConfigParams { + const name = request.name; return { - id: match[1], - pushNotificationConfigId: match[2], + id: this._getTaskIdFromName(name), + pushNotificationConfigId: this._getPushNotificationConfigIdFromName(name), }; } @@ -162,6 +206,38 @@ export class FromProto { export class ToProto { + static listTaskPushNotificationConfigs(config: types.TaskPushNotificationConfig[]): ListTaskPushNotificationConfigResponse { + return { + configs: config.map(c => this.taskPushNotificationConfig(c)), + nextPageToken: '', + }; + } + + static taskPushNotificationConfig(config: types.TaskPushNotificationConfig): TaskPushNotificationConfig { + return { + name: `tasks/${config.taskId}/pushNotificationConfigs/${config.pushNotificationConfig.id || ''}`, + pushNotificationConfig: this.pushNotificationConfig(config.pushNotificationConfig) + }; + } + + static pushNotificationConfig(config: types.PushNotificationConfig): PushNotificationConfig { + return { + id: config.id ?? '', + url: config.url, + token: config.token ?? '', + authentication: config.authentication + ? this.authenticationInfo(config.authentication) + : undefined + }; + } + + static authenticationInfo(authInfo: types.PushNotificationAuthenticationInfo): AuthenticationInfo { + return { + schemes: authInfo.schemes, + credentials: authInfo.credentials ?? '', + }; + } + static messageStreamResult(event: types.Message | types.Task | types.TaskStatusUpdateEvent | types.TaskArtifactUpdateEvent): StreamResponse { if (event.kind === "message") { return { diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index 7a9e5abf..3af160f6 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -1,6 +1,6 @@ import * as grpc from '@grpc/grpc-js'; import { A2AServiceServer, A2AServiceService, AgentCard, CancelTaskRequest, DeleteTaskPushNotificationConfigRequest, GetExtendedAgentCardRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, ListTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigResponse, ListTasksRequest, ListTasksResponse, Message, SendMessageRequest, SendMessageResponse, SetTaskPushNotificationConfigRequest, StreamResponse, SubscribeToTaskRequest, Task, TaskPushNotificationConfig } from '../../grpc/a2a.js'; -import { Task as A2ATask, DeleteTaskPushNotificationConfigParams, MessageSendParams} from '../../types.js'; +import { Task as A2ATask, DeleteTaskPushNotificationConfigParams, GetTaskPushNotificationConfigParams, ListTaskPushNotificationConfigParams, MessageSendParams, TaskPushNotificationConfig as TaskPushNotificationConfigInternal } from '../../types.js'; import { Empty } from '../../grpc/google/protobuf/empty.js'; import { A2ARequestHandler } from '../request_handler/a2a_request_handler.js'; import { FromProto, ToProto } from '../../grpc/utils/proto_type_converter.js'; @@ -84,17 +84,56 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { callback(a2aError, null); } }, - getAgentCard(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { - throw new Error('Method not implemented.'); - }, - listTaskPushNotificationConfig( + async listTaskPushNotificationConfig( call: grpc.ServerUnaryCall< ListTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigResponse >, callback: grpc.sendUnaryData - ): void { - throw new Error('Method not implemented.'); + ): Promise { + try { + const context = await buildContext(call, options.userBuilder); + const params: ListTaskPushNotificationConfigParams = FromProto.listTaskPushNotificationConfigParams(call.request); + const listTaskPushNotificationConfigs = await grpcTransportHandler.listTaskPushNotificationConfigs(params, context); + const response = ToProto.listTaskPushNotificationConfigs(listTaskPushNotificationConfigs); + callback(null, response); + } catch (error) { + const a2aError = error instanceof A2AError ? error + : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + callback(a2aError, null); + } + }, + async setTaskPushNotificationConfig( + call: grpc.ServerUnaryCall, + callback: grpc.sendUnaryData + ): Promise { + try { + const context = await buildContext(call, options.userBuilder); + const params: TaskPushNotificationConfigInternal = FromProto.setTaskPushNotificationConfigParams(call.request); + const taskPushNotificationConfig = await grpcTransportHandler.setTaskPushNotificationConfig(params, context); + const response = ToProto.taskPushNotificationConfig(taskPushNotificationConfig); + callback(null, response); + } catch (error) { + const a2aError = error instanceof A2AError ? error + : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + callback(a2aError, null); + } + }, + async getTaskPushNotificationConfig( + call: grpc.ServerUnaryCall, + callback: grpc.sendUnaryData + ): Promise { + try { + const context = await buildContext(call, options.userBuilder); + const params: GetTaskPushNotificationConfigParams = FromProto.getTaskPushNotificationConfigParams(call.request); + const taskPushNotificationConfig = await grpcTransportHandler.getTaskPushNotificationConfig(params, context); + const response = ToProto.taskPushNotificationConfig(taskPushNotificationConfig); + callback(null, response); + } catch (error) { + const a2aError = error instanceof A2AError ? error + : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + callback(a2aError, null); + } }, listTasks( call: grpc.ServerUnaryCall, @@ -108,18 +147,6 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { cancelTask(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { throw new Error('Method not implemented.'); }, - setTaskPushNotificationConfig( - call: grpc.ServerUnaryCall, - callback: grpc.sendUnaryData - ): void { - throw new Error('Method not implemented.'); - }, - getTaskPushNotificationConfig( - call: grpc.ServerUnaryCall, - callback: grpc.sendUnaryData - ): void { - throw new Error('Method not implemented.'); - }, getExtendedAgentCard( call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData diff --git a/src/server/transports/grpc/grpc_transport_handler.ts b/src/server/transports/grpc/grpc_transport_handler.ts index ea2e4ebe..eedf591d 100644 --- a/src/server/transports/grpc/grpc_transport_handler.ts +++ b/src/server/transports/grpc/grpc_transport_handler.ts @@ -15,6 +15,8 @@ import { FileWithBytes, FileWithUri, DeleteTaskPushNotificationConfigParams, + ListTaskPushNotificationConfigParams, + GetTaskPushNotificationConfigParams, } from '../../../types.js'; export class gRpcTransportHandler { @@ -119,22 +121,21 @@ export class gRpcTransportHandler { * Lists all push notification configurations for a task. */ async listTaskPushNotificationConfigs( - taskId: string, + params: ListTaskPushNotificationConfigParams, context: ServerCallContext ): Promise { - return this.requestHandler.listTaskPushNotificationConfigs({ id: taskId }, context); + return this.requestHandler.listTaskPushNotificationConfigs(params, context); } /** * Gets a specific push notification configuration. */ async getTaskPushNotificationConfig( - taskId: string, - configId: string, + params: GetTaskPushNotificationConfigParams, context: ServerCallContext ): Promise { return this.requestHandler.getTaskPushNotificationConfig( - { id: taskId, pushNotificationConfigId: configId }, + params, context ); } From fd6e0c0f6d7c0054f42b9360c85897c6efaf7b92 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Thu, 18 Dec 2025 09:34:35 +0000 Subject: [PATCH 07/64] wip --- package.json | 2 +- src/grpc/a2a.ts | 1805 +++++------------ src/grpc/utils/proto_type_converter.ts | 172 ++ src/server/grpc/grpc_handler.ts | 47 +- .../transports/grpc/grpc_transport_handler.ts | 11 +- 5 files changed, 732 insertions(+), 1305 deletions(-) diff --git a/package.json b/package.json index 7e5f6927..b0657806 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "format:readme": "prettier --write ./README.md", "lint:fix": "npx eslint . --fix", "coverage": "vitest run --coverage", - "ts-proto": "curl -o ./src/grpc/a2a.proto https://raw.githubusercontent.com/a2aproject/A2A/main/specification/grpc/a2a.proto && protoc --plugin=./node_modules/.bin/protoc-gen-ts_proto --ts_proto_out=./src/grpc --ts_proto_opt=oneof=unions-value,importSuffix=.js,outputServices=grpc-js,env=node,esModuleInterop=true --proto_path=./src/grpc ./src/grpc/a2a.proto -I ./node_modules/google-proto-files && rm ./src/grpc/a2a.proto", + "ts-proto": "curl -o ./src/grpc/a2a.proto https://raw.githubusercontent.com/a2aproject/A2A/v0.3.0/specification/grpc/a2a.proto && protoc --plugin=./node_modules/.bin/protoc-gen-ts_proto --ts_proto_out=./src/grpc --ts_proto_opt=oneof=unions-value,importSuffix=.js,outputServices=grpc-js,env=node,esModuleInterop=true --proto_path=./src/grpc ./src/grpc/a2a.proto -I ./node_modules/google-proto-files && rm ./src/grpc/a2a.proto", "generate": "curl https://raw.githubusercontent.com/google-a2a/A2A/refs/heads/main/specification/json/a2a.json > spec.json && node scripts/generateTypes.js && rm spec.json", "test-build:browser": "esbuild ./dist/client/index.js ./dist/index.js --bundle --platform=browser --outdir=dist/tmp-checks --outbase=./dist" }, diff --git a/src/grpc/a2a.ts b/src/grpc/a2a.ts index be83eb2d..c2c32834 100644 --- a/src/grpc/a2a.ts +++ b/src/grpc/a2a.ts @@ -28,20 +28,16 @@ export const protobufPackage = "a2a.v1"; /** Older protoc compilers don't understand edition yet. */ -/** - * --8<-- [start:TaskState] - * Defines the possible lifecycle states of a Task. - */ +/** The set of states a Task can be in. */ export enum TaskState { - /** TASK_STATE_UNSPECIFIED - The task is in an unknown or indeterminate state. */ TASK_STATE_UNSPECIFIED = 0, - /** TASK_STATE_SUBMITTED - Represents the status that acknowledges a task is created. */ + /** TASK_STATE_SUBMITTED - Represents the status that acknowledges a task is created */ TASK_STATE_SUBMITTED = 1, - /** TASK_STATE_WORKING - Represents the status that a task is actively being processed. */ + /** TASK_STATE_WORKING - Represents the status that a task is actively being processed */ TASK_STATE_WORKING = 2, - /** TASK_STATE_COMPLETED - Represents the status a task is finished. This is a terminal state. */ + /** TASK_STATE_COMPLETED - Represents the status a task is finished. This is a terminal state */ TASK_STATE_COMPLETED = 3, - /** TASK_STATE_FAILED - Represents the status a task is done but failed. This is a terminal state. */ + /** TASK_STATE_FAILED - Represents the status a task is done but failed. This is a terminal state */ TASK_STATE_FAILED = 4, /** * TASK_STATE_CANCELLED - Represents the status a task was cancelled before it finished. @@ -130,10 +126,6 @@ export function taskStateToJSON(object: TaskState): string { } } -/** - * --8<-- [start:Role] - * Defines the sender of a message in A2A protocol communication. - */ export enum Role { ROLE_UNSPECIFIED = 0, /** ROLE_USER - USER role refers to communication from the client to the server. */ @@ -175,41 +167,40 @@ export function roleToJSON(object: Role): string { } } -/** - * --8<-- [start:SendMessageConfiguration] - * Configuration of a send message request. - */ +/** Configuration of a send message request. */ export interface SendMessageConfiguration { - /** A list of media types the client is prepared to accept for response parts. Agents SHOULD use this to tailor their output. */ + /** The output modes that the agent is expected to respond with. */ acceptedOutputModes: string[]; - /** Configuration for the agent to send push notifications for task updates. */ - pushNotificationConfig: + /** A configuration of a webhook that can be used to receive updates */ + pushNotification: | PushNotificationConfig | undefined; - /** The maximum number of messages to include in the history. */ - historyLength?: - | number - | undefined; - /** If true, the operation waits until the task reaches a terminal state before returning. Default is false. */ + /** + * The maximum number of messages to include in the history. if 0, the + * history will be unlimited. + */ + historyLength: number; + /** + * If true, the message will be blocking until the task is completed. If + * false, the message will be non-blocking and the task will be returned + * immediately. It is the caller's responsibility to check for any task + * updates. + */ blocking: boolean; } /** - * --8<-- [start:Task] * Task is the core unit of action for A2A. It has a current status * and when results are created for the task they are stored in the * artifact. If there are multiple turns for a task, these are stored in * history. */ export interface Task { - /** - * Unique identifier (e.g. UUID) for the task, generated by the server for a - * new task. - */ + /** Unique identifier for a task, created by the A2A server. */ id: string; /** - * Unique identifier (e.g. UUID) for the contextual collection of interactions - * (tasks and messages). Created by the A2A server. + * Unique identifier for the contextual collection of interactions (tasks + * and messages). Created by the A2A server. */ contextId: string; /** The current status of a Task, including state and a message. */ @@ -230,79 +221,51 @@ export interface Task { metadata: { [key: string]: any } | undefined; } -/** - * --8<-- [start:TaskStatus] - * A container for the status of a task - */ +/** A container for the status of a task */ export interface TaskStatus { - /** The current state of this task. */ + /** The current state of this task */ state: TaskState; /** A message associated with the status. */ - message: + update: | Message | undefined; /** - * ISO 8601 Timestamp when the status was recorded. + * Timestamp when the status was recorded. * Example: "2023-10-27T10:00:00Z" */ timestamp: Date | undefined; } /** - * --8<-- [start:Part] * Part represents a container for a section of communication content. * Parts can be purely textual, some sort of file (image, video, etc) or * a structured data blob (i.e. JSON). */ export interface Part { part?: - | // - /** The string content of the text part. */ - { $case: "text"; value: string } - | // - /** The file content, represented as either a URI or as base64-encoded bytes. */ - { $case: "file"; value: FilePart } - | // - /** The structured data content. */ - { $case: "data"; value: DataPart } + | { $case: "text"; value: string } + | { $case: "file"; value: FilePart } + | { $case: "data"; value: DataPart } | undefined; - /** Optional metadata associated with this part. */ - metadata: { [key: string]: any } | undefined; } /** - * --8<-- [start:FilePart] * FilePart represents the different ways files can be provided. If files are * small, directly feeding the bytes is supported via file_with_bytes. If the * file is large, the agent should read the content as appropriate directly * from the file_with_uri source. */ export interface FilePart { - file?: - | // - /** A URL pointing to the file's content. */ - { $case: "fileWithUri"; value: string } - | // - /** The base64-encoded content of the file. */ - { $case: "fileWithBytes"; value: Buffer } - | undefined; - /** The media type of the file (e.g., "application/pdf"). */ - mediaType: string; - /** An optional name for the file (e.g., "document.pdf"). */ - name: string; + file?: { $case: "fileWithUri"; value: string } | { $case: "fileWithBytes"; value: Buffer } | undefined; + mimeType: string; } -/** - * --8<-- [start:DataPart] - * DataPart represents a structured blob. - */ +/** DataPart represents a structured blob. This is most commonly a JSON payload. */ export interface DataPart { - /** A JSON object containing arbitrary data. */ data: { [key: string]: any } | undefined; } /** - * --8<-- [start:Message] * Message is one unit of communication between client and server. It is * associated with a context and optionally a task. Since the server is * responsible for the context definition, it must always provide a context_id @@ -313,8 +276,8 @@ export interface DataPart { */ export interface Message { /** - * The unique identifier (e.g. UUID) of the message. This is required and - * created by the message creator. + * The message id of the message. This is required and created by the + * message creator. */ messageId: string; /** @@ -327,13 +290,13 @@ export interface Message { * will be associated with the given task. */ taskId: string; - /** Identifies the sender of the message. */ + /** A role for the message. */ role: Role; /** * protolint:disable REPEATED_FIELD_NAMES_PLURALIZED - * Parts is the container of the message content. + * Content is the container of the message content. */ - parts: Part[]; + content: Part[]; /** * protolint:enable REPEATED_FIELD_NAMES_PLURALIZED * Any optional metadata to provide along with the message. @@ -343,25 +306,21 @@ export interface Message { | undefined; /** The URIs of extensions that are present or contributed to this Message. */ extensions: string[]; - /** A list of task IDs that this message references for additional context. */ - referenceTaskIds: string[]; } /** - * --8<-- [start:Artifact] - * Artifacts represent task outputs. + * Artifacts are the container for task completed results. These are similar + * to Messages but are intended to be the product of a task, as opposed to + * point-to-point communication. */ export interface Artifact { - /** - * Unique identifier (e.g. UUID) for the artifact. It must be at least unique - * within a task. - */ + /** Unique id for the artifact. It must be at least unique within a task. */ artifactId: string; /** A human readable name for the artifact. */ name: string; /** A human readable description of the artifact, optional. */ description: string; - /** The content of the artifact. Must contain at least one part. */ + /** The content of the artifact. */ parts: Part[]; /** Optional metadata included with the artifact. */ metadata: @@ -372,9 +331,8 @@ export interface Artifact { } /** - * --8<-- [start:TaskStatusUpdateEvent] - * An event sent by the agent to notify the client of a change in a task's - * status. + * TaskStatusUpdateEvent is a delta even on a task indicating that a task + * has changed. */ export interface TaskStatusUpdateEvent { /** The id of the task that is changed */ @@ -385,43 +343,36 @@ export interface TaskStatusUpdateEvent { status: | TaskStatus | undefined; - /** If true, this is the final event in the stream for this interaction. */ + /** Whether this is the last status update expected for this task. */ final: boolean; /** Optional metadata to associate with the task update. */ metadata: { [key: string]: any } | undefined; } /** - * --8<-- [start:TaskArtifactUpdateEvent] * TaskArtifactUpdateEvent represents a task delta where an artifact has * been generated. */ export interface TaskArtifactUpdateEvent { - /** The id of the task for this artifact. */ + /** The id of the task for this artifact */ taskId: string; - /** The id of the context that this task belongs to. */ + /** The id of the context that this task belongs too */ contextId: string; - /** The artifact that was generated or updated. */ + /** The artifact itself */ artifact: | Artifact | undefined; - /** - * If true, the content of this artifact should be appended to a previously - * sent artifact with the same ID. - */ + /** Whether this should be appended to a prior one produced */ append: boolean; - /** If true, this is the final chunk of the artifact. */ + /** Whether this represents the last part of an artifact */ lastChunk: boolean; /** Optional metadata associated with the artifact update. */ metadata: { [key: string]: any } | undefined; } -/** - * --8<-- [start:PushNotificationConfig] - * Configuration for setting up push notifications for task updates. - */ +/** Configuration for setting up push notifications for task updates. */ export interface PushNotificationConfig { - /** A unique identifier (e.g. UUID) for this push notification. */ + /** A unique id for this push notification. */ id: string; /** Url to send the notification too */ url: string; @@ -431,86 +382,57 @@ export interface PushNotificationConfig { authentication: AuthenticationInfo | undefined; } -/** - * --8<-- [start:PushNotificationAuthenticationInfo] - * Defines authentication details, used for push notifications. - */ +/** Defines authentication details, used for push notifications. */ export interface AuthenticationInfo { - /** A list of supported authentication schemes (e.g., 'Basic', 'Bearer'). */ + /** Supported authentication schemes - e.g. Basic, Bearer, etc */ schemes: string[]; /** Optional credentials */ credentials: string; } -/** - * --8<-- [start:AgentInterface] - * Declares a combination of a target URL and a transport protocol for interacting with the agent. - * This allows agents to expose the same functionality over multiple protocol binding mechanisms. - */ +/** Defines additional transport information for the agent. */ export interface AgentInterface { - /** - * The URL where this interface is available. Must be a valid absolute HTTPS URL in production. - * Example: "https://api.example.com/a2a/v1", "https://grpc.example.com/a2a" - */ + /** The url this interface is found at. */ url: string; /** - * The protocol binding supported at this URL. This is an open form string, to be - * easily extended for other protocol bindings. The core ones officially - * supported are `JSONRPC`, `GRPC` and `HTTP+JSON`. + * The transport supported this url. This is an open form string, to be + * easily extended for many transport protocols. The core ones officially + * supported are JSONRPC, GRPC and HTTP+JSON. */ - protocolBinding: string; - /** Tenant to be set in the request when calling the agent. */ - tenant: string; + transport: string; } /** - * --8<-- [start:AgentCard] - * AgentCard is a self-describing manifest for an agent. It provides essential - * metadata including the agent's identity, capabilities, skills, supported - * communication methods, and security requirements. - * Next ID: 20 + * AgentCard conveys key information: + * - Overall details (version, name, description, uses) + * - Skills; a set of actions/solutions the agent can perform + * - Default modalities/content types supported by the agent. + * - Authentication requirements + * Next ID: 18 */ export interface AgentCard { - /** - * The version of the A2A protocol this agent supports. - * Default: "1.0" - */ - protocolVersion?: - | string - | undefined; + /** The version of the A2A protocol this agent supports. */ + protocolVersion: string; /** * A human readable name for the agent. * Example: "Recipe Agent" */ name: string; /** - * A human-readable description of the agent, assisting users and other agents - * in understanding its purpose. + * A description of the agent's domain of action/solution space. * Example: "Agent that helps users with recipes and cooking." */ description: string; - /** Ordered list of supported interfaces. First entry is preferred. */ - supportedInterfaces: AgentInterface[]; /** - * DEPRECATED: Use 'supported_interfaces' instead. - * - * @deprecated + * A URL to the address the agent is hosted at. This represents the + * preferred endpoint as declared by the agent. */ - url?: - | string - | undefined; - /** - * DEPRECATED: Use 'supported_interfaces' instead. - * - * @deprecated - */ - preferredTransport?: - | string - | undefined; + url: string; + /** The transport of the preferred endpoint. If empty, defaults to JSONRPC. */ + preferredTransport: string; /** - * DEPRECATED: Use 'supported_interfaces' instead. - * - * @deprecated + * Announcement of additional supported transports. Client can use any of + * the supported transports. */ additionalInterfaces: AgentInterface[]; /** The service provider of the agent. */ @@ -523,9 +445,7 @@ export interface AgentCard { */ version: string; /** A url to provide additional documentation about the agent. */ - documentationUrl?: - | string - | undefined; + documentationUrl: string; /** A2A Capability set supported by the agent. */ capabilities: | AgentCapabilities @@ -535,30 +455,42 @@ export interface AgentCard { /** * protolint:disable REPEATED_FIELD_NAMES_PLURALIZED * Security requirements for contacting the agent. + * This list can be seen as an OR of ANDs. Each object in the list describes + * one possible set of security requirements that must be present on a + * request. This allows specifying, for example, "callers must either use + * OAuth OR an API Key AND mTLS." + * Example: + * security { + * schemes { key: "oauth" value { list: ["read"] } } + * } + * security { + * schemes { key: "api-key" } + * schemes { key: "mtls" } + * } */ security: Security[]; /** * protolint:enable REPEATED_FIELD_NAMES_PLURALIZED * The set of interaction modes that the agent supports across all skills. - * This can be overridden per skill. Defined as media types. + * This can be overridden per skill. Defined as mime types. */ defaultInputModes: string[]; - /** The media types supported as outputs from this agent. */ + /** The mime types supported as outputs from this agent. */ defaultOutputModes: string[]; /** - * Skills represent an ability of an agent. It is largely - * a descriptive concept but represents a more focused set of behaviors that the - * agent is likely to succeed at. + * Skills represent a unit of ability an agent can perform. This may + * somewhat abstract but represents a more focused set of actions that the + * agent is highly likely to succeed at. */ skills: AgentSkill[]; - /** Whether the agent supports providing an extended agent card when authenticated. */ - supportsExtendedAgentCard?: - | boolean - | undefined; + /** + * Whether the agent supports providing an extended agent card when + * the user is authenticated, i.e. is the card from .well-known + * different than the card from GetAgentCard. + */ + supportsAuthenticatedExtendedCard: boolean; /** JSON Web Signatures computed for this AgentCard. */ signatures: AgentCardSignature[]; - /** An optional URL to an icon for the agent. */ - iconUrl?: string | undefined; } export interface AgentCard_SecuritySchemesEntry { @@ -566,85 +498,95 @@ export interface AgentCard_SecuritySchemesEntry { value: SecurityScheme | undefined; } -/** - * --8<-- [start:AgentProvider] - * Represents the service provider of an agent. - */ +/** Represents information about the service provider of an agent. */ export interface AgentProvider { /** - * A URL for the agent provider's website or relevant documentation. + * The providers reference url * Example: "https://ai.google.dev" */ url: string; /** - * The name of the agent provider's organization. + * The providers organization name * Example: "Google" */ organization: string; } -/** - * --8<-- [start:AgentCapabilities] - * Defines optional capabilities supported by an agent. - */ +/** Defines the A2A feature set supported by the agent */ export interface AgentCapabilities { - /** Indicates if the agent supports streaming responses. */ - streaming?: - | boolean - | undefined; - /** Indicates if the agent supports sending push notifications for asynchronous task updates. */ - pushNotifications?: - | boolean - | undefined; - /** A list of protocol extensions supported by the agent. */ + /** If the agent will support streaming responses */ + streaming: boolean; + /** If the agent can send push notifications to the clients webhook */ + pushNotifications: boolean; + /** Extensions supported by this agent. */ extensions: AgentExtension[]; - /** Indicates if the agent provides a history of state transitions for a task. */ - stateTransitionHistory?: boolean | undefined; } -/** - * --8<-- [start:AgentExtension] - * A declaration of a protocol extension supported by an Agent. - */ +/** A declaration of an extension supported by an Agent. */ export interface AgentExtension { - /** The unique URI identifying the extension. */ + /** + * The URI of the extension. + * Example: "https://developers.google.com/identity/protocols/oauth2" + */ uri: string; - /** A human-readable description of how this agent uses the extension. */ + /** + * A description of how this agent uses this extension. + * Example: "Google OAuth 2.0 authentication" + */ description: string; - /** If true, the client must understand and comply with the extension's requirements. */ + /** + * Whether the client must follow specific requirements of the extension. + * Example: false + */ required: boolean; - /** Optional, extension-specific configuration parameters. */ + /** Optional configuration for the extension. */ params: { [key: string]: any } | undefined; } /** - * --8<-- [start:AgentSkill] - * Represents a distinct capability or function that an agent can perform. + * AgentSkill represents a unit of action/solution that the agent can perform. + * One can think of this as a type of highly reliable solution that an agent + * can be tasked to provide. Agents have the autonomy to choose how and when + * to use specific skills, but clients should have confidence that if the + * skill is defined that unit of action can be reliably performed. */ export interface AgentSkill { - /** A unique identifier for the agent's skill. */ + /** Unique id of the skill within this agent. */ id: string; - /** A human-readable name for the skill. */ + /** A human readable name for the skill. */ name: string; - /** A detailed description of the skill. */ + /** + * A human (or llm) readable description of the skill + * details and behaviors. + */ description: string; - /** A set of keywords describing the skill's capabilities. */ + /** + * A set of tags for the skill to enhance categorization/utilization. + * Example: ["cooking", "customer support", "billing"] + */ tags: string[]; - /** Example prompts or scenarios that this skill can handle. */ + /** + * A set of example queries that this skill is designed to address. + * These examples should help the caller to understand how to craft requests + * to the agent to achieve specific goals. + * Example: ["I need a recipe for bread"] + */ examples: string[]; - /** The set of supported input media types for this skill, overriding the agent's defaults. */ + /** Possible input modalities supported. */ inputModes: string[]; - /** The set of supported output media types for this skill, overriding the agent's defaults. */ + /** Possible output modalities produced */ outputModes: string[]; /** * protolint:disable REPEATED_FIELD_NAMES_PLURALIZED - * Security schemes necessary for this skill. + * Security schemes necessary for the agent to leverage this skill. + * As in the overall AgentCard.security, this list represents a logical OR of + * security requirement objects. Each object is a set of security schemes + * that must be used together (a logical AND). */ security: Security[]; } /** - * --8<-- [start:AgentCardSignature] * AgentCardSignature represents a JWS signature of an AgentCard. * This follows the JSON format of an RFC 7515 JSON Web Signature (JWS). */ @@ -660,18 +602,9 @@ export interface AgentCardSignature { header: { [key: string]: any } | undefined; } -/** - * --8<-- [start:TaskPushNotificationConfig] - * A container associating a push notification configuration with a specific - * task. - */ export interface TaskPushNotificationConfig { - /** - * The resource name of the config. - * Format: tasks/{task_id}/pushNotificationConfigs/{config_id} - */ + /** name=tasks/{id}/pushNotificationConfigs/{id} */ name: string; - /** The push notification configuration details. */ pushNotificationConfig: PushNotificationConfig | undefined; } @@ -689,139 +622,101 @@ export interface Security_SchemesEntry { value: StringList | undefined; } -/** - * --8<-- [start:SecurityScheme] - * Defines a security scheme that can be used to secure an agent's endpoints. - * This is a discriminated union type based on the OpenAPI 3.2 Security Scheme Object. - * See: https://spec.openapis.org/oas/v3.2.0.html#security-scheme-object - */ export interface SecurityScheme { scheme?: - | // - /** API key-based authentication. */ - { $case: "apiKeySecurityScheme"; value: APIKeySecurityScheme } - | // - /** HTTP authentication (Basic, Bearer, etc.). */ - { $case: "httpAuthSecurityScheme"; value: HTTPAuthSecurityScheme } - | // - /** OAuth 2.0 authentication. */ - { $case: "oauth2SecurityScheme"; value: OAuth2SecurityScheme } - | // - /** OpenID Connect authentication. */ - { $case: "openIdConnectSecurityScheme"; value: OpenIdConnectSecurityScheme } - | // - /** Mutual TLS authentication. */ - { $case: "mtlsSecurityScheme"; value: MutualTlsSecurityScheme } + | { $case: "apiKeySecurityScheme"; value: APIKeySecurityScheme } + | { $case: "httpAuthSecurityScheme"; value: HTTPAuthSecurityScheme } + | { $case: "oauth2SecurityScheme"; value: OAuth2SecurityScheme } + | { $case: "openIdConnectSecurityScheme"; value: OpenIdConnectSecurityScheme } + | { $case: "mtlsSecurityScheme"; value: MutualTlsSecurityScheme } | undefined; } -/** - * --8<-- [start:APIKeySecurityScheme] - * Defines a security scheme using an API key. - */ export interface APIKeySecurityScheme { - /** An optional description for the security scheme. */ + /** Description of this security scheme. */ description: string; - /** The location of the API key. Valid values are "query", "header", or "cookie". */ + /** Location of the API key, valid values are "query", "header", or "cookie" */ location: string; - /** The name of the header, query, or cookie parameter to be used. */ + /** Name of the header, query or cookie parameter to be used. */ name: string; } -/** - * --8<-- [start:HTTPAuthSecurityScheme] - * Defines a security scheme using HTTP authentication. - */ export interface HTTPAuthSecurityScheme { - /** An optional description for the security scheme. */ + /** Description of this security scheme. */ description: string; /** - * The name of the HTTP Authentication scheme to be used in the Authorization header, - * as defined in RFC7235 (e.g., "Bearer"). - * This value should be registered in the IANA Authentication Scheme registry. + * The name of the HTTP Authentication scheme to be used in the + * Authorization header as defined in RFC7235. The values used SHOULD be + * registered in the IANA Authentication Scheme registry. + * The value is case-insensitive, as defined in RFC7235. */ scheme: string; /** - * A hint to the client to identify how the bearer token is formatted (e.g., "JWT"). - * This is primarily for documentation purposes. + * A hint to the client to identify how the bearer token is formatted. + * Bearer tokens are usually generated by an authorization server, so + * this information is primarily for documentation purposes. */ bearerFormat: string; } -/** - * --8<-- [start:OAuth2SecurityScheme] - * Defines a security scheme using OAuth 2.0. - */ export interface OAuth2SecurityScheme { - /** An optional description for the security scheme. */ + /** Description of this security scheme. */ description: string; - /** An object containing configuration information for the supported OAuth 2.0 flows. */ + /** An object containing configuration information for the flow types supported */ flows: | OAuthFlows | undefined; /** * URL to the oauth2 authorization server metadata - * RFC8414 (https://datatracker.ietf.org/doc/html/rfc8414). TLS is required. + * [RFC8414](https://datatracker.ietf.org/doc/html/rfc8414). TLS is required. */ oauth2MetadataUrl: string; } -/** - * --8<-- [start:OpenIdConnectSecurityScheme] - * Defines a security scheme using OpenID Connect. - */ export interface OpenIdConnectSecurityScheme { - /** An optional description for the security scheme. */ + /** Description of this security scheme. */ description: string; /** - * The OpenID Connect Discovery URL for the OIDC provider's metadata. - * See: https://openid.net/specs/openid-connect-discovery-1_0.html + * Well-known URL to discover the [[OpenID-Connect-Discovery]] provider + * metadata. */ openIdConnectUrl: string; } -/** - * --8<-- [start:MutualTLSSecurityScheme] - * Defines a security scheme using mTLS authentication. - */ export interface MutualTlsSecurityScheme { - /** An optional description for the security scheme. */ + /** Description of this security scheme. */ description: string; } -/** - * --8<-- [start:OAuthFlows] - * Defines the configuration for the supported OAuth 2.0 flows. - */ export interface OAuthFlows { flow?: - | // - /** Configuration for the OAuth Authorization Code flow. */ - { $case: "authorizationCode"; value: AuthorizationCodeOAuthFlow } - | // - /** Configuration for the OAuth Client Credentials flow. */ - { $case: "clientCredentials"; value: ClientCredentialsOAuthFlow } - | // - /** Configuration for the OAuth Implicit flow. */ - { $case: "implicit"; value: ImplicitOAuthFlow } - | // - /** Configuration for the OAuth Resource Owner Password flow. */ - { $case: "password"; value: PasswordOAuthFlow } + | { $case: "authorizationCode"; value: AuthorizationCodeOAuthFlow } + | { $case: "clientCredentials"; value: ClientCredentialsOAuthFlow } + | { $case: "implicit"; value: ImplicitOAuthFlow } + | { $case: "password"; value: PasswordOAuthFlow } | undefined; } -/** - * --8<-- [start:AuthorizationCodeOAuthFlow] - * Defines configuration details for the OAuth 2.0 Authorization Code flow. - */ export interface AuthorizationCodeOAuthFlow { - /** The authorization URL to be used for this flow. */ + /** + * The authorization URL to be used for this flow. This MUST be in the + * form of a URL. The OAuth2 standard requires the use of TLS + */ authorizationUrl: string; - /** The token URL to be used for this flow. */ + /** + * The token URL to be used for this flow. This MUST be in the form of a URL. + * The OAuth2 standard requires the use of TLS. + */ tokenUrl: string; - /** The URL to be used for obtaining refresh tokens. */ + /** + * The URL to be used for obtaining refresh tokens. This MUST be in the + * form of a URL. The OAuth2 standard requires the use of TLS. + */ refreshUrl: string; - /** The available scopes for the OAuth2 security scheme. */ + /** + * The available scopes for the OAuth2 security scheme. A map between the + * scope name and a short description for it. The map MAY be empty. + */ scopes: { [key: string]: string }; } @@ -830,16 +725,21 @@ export interface AuthorizationCodeOAuthFlow_ScopesEntry { value: string; } -/** - * --8<-- [start:ClientCredentialsOAuthFlow] - * Defines configuration details for the OAuth 2.0 Client Credentials flow. - */ export interface ClientCredentialsOAuthFlow { - /** The token URL to be used for this flow. */ + /** + * The token URL to be used for this flow. This MUST be in the form of a URL. + * The OAuth2 standard requires the use of TLS. + */ tokenUrl: string; - /** The URL to be used for obtaining refresh tokens. */ + /** + * The URL to be used for obtaining refresh tokens. This MUST be in the + * form of a URL. The OAuth2 standard requires the use of TLS. + */ refreshUrl: string; - /** The available scopes for the OAuth2 security scheme. */ + /** + * The available scopes for the OAuth2 security scheme. A map between the + * scope name and a short description for it. The map MAY be empty. + */ scopes: { [key: string]: string }; } @@ -848,16 +748,21 @@ export interface ClientCredentialsOAuthFlow_ScopesEntry { value: string; } -/** - * --8<-- [start:ImplicitOAuthFlow] - * Defines configuration details for the OAuth 2.0 Implicit flow. - */ export interface ImplicitOAuthFlow { - /** The authorization URL to be used for this flow. */ + /** + * The authorization URL to be used for this flow. This MUST be in the + * form of a URL. The OAuth2 standard requires the use of TLS + */ authorizationUrl: string; - /** The URL to be used for obtaining refresh tokens. */ + /** + * The URL to be used for obtaining refresh tokens. This MUST be in the + * form of a URL. The OAuth2 standard requires the use of TLS. + */ refreshUrl: string; - /** The available scopes for the OAuth2 security scheme. */ + /** + * The available scopes for the OAuth2 security scheme. A map between the + * scope name and a short description for it. The map MAY be empty. + */ scopes: { [key: string]: string }; } @@ -866,16 +771,21 @@ export interface ImplicitOAuthFlow_ScopesEntry { value: string; } -/** - * --8<-- [start:PasswordOAuthFlow] - * Defines configuration details for the OAuth 2.0 Resource Owner Password flow. - */ export interface PasswordOAuthFlow { - /** The token URL to be used for this flow. */ + /** + * The token URL to be used for this flow. This MUST be in the form of a URL. + * The OAuth2 standard requires the use of TLS. + */ tokenUrl: string; - /** The URL to be used for obtaining refresh tokens. */ + /** + * The URL to be used for obtaining refresh tokens. This MUST be in the + * form of a URL. The OAuth2 standard requires the use of TLS. + */ refreshUrl: string; - /** The available scopes for the OAuth2 security scheme. */ + /** + * The available scopes for the OAuth2 security scheme. A map between the + * scope name and a short description for it. The map MAY be empty. + */ scopes: { [key: string]: string }; } @@ -884,218 +794,99 @@ export interface PasswordOAuthFlow_ScopesEntry { value: string; } -/** - * /////////// Request Messages /////////// - * --8<-- [start:SendMessageRequest] - * Represents a request for the `message/send` method. - */ +/** /////////// Request Messages /////////// */ export interface SendMessageRequest { - /** Optional tenant, provided as a path parameter. */ - tenant: string; - /** The message to send to the agent. */ - request: - | Message - | undefined; - /** Configuration for the send request. */ - configuration: - | SendMessageConfiguration - | undefined; - /** A flexible key-value map for passing additional context or parameters. */ + request: Message | undefined; + configuration: SendMessageConfiguration | undefined; metadata: { [key: string]: any } | undefined; } -/** - * --8<-- [start:GetTaskRequest] - * Represents a request for the `tasks/get` method. - */ export interface GetTaskRequest { - /** Optional tenant, provided as a path parameter. */ - tenant: string; - /** - * The resource name of the task. - * Format: tasks/{task_id} - */ + /** name=tasks/{id} */ name: string; - /** The maximum number of messages to include in the history. */ - historyLength?: number | undefined; -} - -/** - * --8<-- [start:ListTasksRequest] - * Parameters for listing tasks with optional filtering criteria. - */ -export interface ListTasksRequest { - /** Optional tenant, provided as a path parameter. */ - tenant: string; - /** Filter tasks by context ID to get tasks from a specific conversation or session. */ - contextId: string; - /** Filter tasks by their current status state. */ - status: TaskState; - /** - * Maximum number of tasks to return. Must be between 1 and 100. - * Defaults to 50 if not specified. - */ - pageSize?: - | number - | undefined; - /** Token for pagination. Use the next_page_token from a previous ListTasksResponse. */ - pageToken: string; - /** The maximum number of messages to include in each task's history. */ - historyLength?: - | number - | undefined; - /** - * Filter tasks updated after this timestamp (milliseconds since epoch). - * Only tasks with a last updated time greater than or equal to this value will be returned. - */ - lastUpdatedAfter: number; - /** - * Whether to include artifacts in the returned tasks. - * Defaults to false to reduce payload size. - */ - includeArtifacts?: boolean | undefined; -} - -/** - * --8<-- [start:ListTasksResponse] - * Result object for tasks/list method containing an array of tasks and pagination information. - */ -export interface ListTasksResponse { - /** Array of tasks matching the specified criteria. */ - tasks: Task[]; - /** Token for retrieving the next page. Empty string if no more results. */ - nextPageToken: string; - /** The size of page requested. */ - pageSize: number; - /** Total number of tasks available (before pagination). */ - totalSize: number; + historyLength: number; } -/** - * --8<-- [start:CancelTaskRequest] - * Represents a request for the `tasks/cancel` method. - */ export interface CancelTaskRequest { - /** Optional tenant, provided as a path parameter. */ - tenant: string; - /** - * The resource name of the task to cancel. - * Format: tasks/{task_id} - */ + /** name=tasks/{id} */ name: string; } -/** --8<-- [start:GetTaskPushNotificationConfigRequest] */ export interface GetTaskPushNotificationConfigRequest { - /** Optional tenant, provided as a path parameter. */ - tenant: string; - /** - * The resource name of the config to retrieve. - * Format: tasks/{task_id}/pushNotificationConfigs/{config_id} - */ + /** name=tasks/{id}/pushNotificationConfigs/{push_id} */ name: string; } -/** - * --8<-- [start:DeleteTaskPushNotificationConfigRequest] - * Represents a request for the `tasks/pushNotificationConfig/delete` method. - */ export interface DeleteTaskPushNotificationConfigRequest { - /** Optional tenant, provided as a path parameter. */ - tenant: string; - /** - * The resource name of the config to delete. - * Format: tasks/{task_id}/pushNotificationConfigs/{config_id} - */ + /** name=tasks/{id}/pushNotificationConfigs/{push_id} */ name: string; } -/** - * --8<-- [start:SetTaskPushNotificationConfigRequest] - * Represents a request for the `tasks/pushNotificationConfig/set` method. - */ -export interface SetTaskPushNotificationConfigRequest { - /** Optional tenant, provided as a path parameter. */ - tenant: string; +export interface CreateTaskPushNotificationConfigRequest { /** - * The parent task resource for this config. - * Format: tasks/{task_id} + * The task resource for this config. + * Format: tasks/{id} */ parent: string; - /** The ID for the new config. */ configId: string; - /** The configuration to create. */ config: TaskPushNotificationConfig | undefined; } -/** --8<-- [start:SubscribeToTaskRequest] */ -export interface SubscribeToTaskRequest { - /** Optional tenant, provided as a path parameter. */ - tenant: string; - /** - * The resource name of the task to subscribe to. - * Format: tasks/{task_id} - */ +export interface TaskSubscriptionRequest { + /** name=tasks/{id} */ name: string; } -/** --8<-- [start:ListTaskPushNotificationConfigRequest] */ export interface ListTaskPushNotificationConfigRequest { - /** Optional tenant, provided as a path parameter. */ - tenant: string; + /** parent=tasks/{id} */ + parent: string; /** - * The parent task resource. - * Format: tasks/{task_id} + * For AIP-158 these fields are present. Usually not used/needed. + * The maximum number of configurations to return. + * If unspecified, all configs will be returned. */ - parent: string; - /** The maximum number of configurations to return. */ pageSize: number; - /** A page token received from a previous ListTaskPushNotificationConfigRequest call. */ + /** + * A page token received from a previous + * ListTaskPushNotificationConfigRequest call. + * Provide this to retrieve the subsequent page. + * When paginating, all other parameters provided to + * `ListTaskPushNotificationConfigRequest` must match the call that provided + * the page token. + */ pageToken: string; } -/** --8<-- [start:GetExtendedAgentCardRequest] */ -export interface GetExtendedAgentCardRequest { - /** Optional tenant, provided as a path parameter. */ - tenant: string; +/** Empty. Added to fix linter violation. */ +export interface GetAgentCardRequest { } -/** - * ////// Response Messages /////////// - * --8<-- [start:SendMessageResponse] - */ +/** ////// Response Messages /////////// */ export interface SendMessageResponse { payload?: { $case: "task"; value: Task } | { $case: "msg"; value: Message } | undefined; } /** - * --8<-- [start:StreamResponse] - * A wrapper object used in streaming operations to encapsulate different types of response data. + * The stream response for a message. The stream should be one of the following + * sequences: + * If the response is a message, the stream should contain one, and only one, + * message and then close + * If the response is a task lifecycle, the first response should be a Task + * object followed by zero or more TaskStatusUpdateEvents and + * TaskArtifactUpdateEvents. The stream should complete when the Task + * if in an interrupted or terminal state. A stream that ends before these + * conditions are met are */ export interface StreamResponse { payload?: - | // - /** A Task object containing the current state of the task. */ - { $case: "task"; value: Task } - | // - /** A Message object containing a message from the agent. */ - { $case: "msg"; value: Message } - | // - /** An event indicating a task status update. */ - { $case: "statusUpdate"; value: TaskStatusUpdateEvent } - | // - /** An event indicating a task artifact update. */ - { $case: "artifactUpdate"; value: TaskArtifactUpdateEvent } + | { $case: "task"; value: Task } + | { $case: "msg"; value: Message } + | { $case: "statusUpdate"; value: TaskStatusUpdateEvent } + | { $case: "artifactUpdate"; value: TaskArtifactUpdateEvent } | undefined; } -/** - * --8<-- [start:ListTaskPushNotificationConfigResponse] - * Represents a successful response for the `tasks/pushNotificationConfig/list` - * method. - */ export interface ListTaskPushNotificationConfigResponse { - /** The list of push notification configurations. */ configs: TaskPushNotificationConfig[]; /** * A token, which can be sent as `page_token` to retrieve the next page. @@ -1105,7 +896,7 @@ export interface ListTaskPushNotificationConfigResponse { } function createBaseSendMessageConfiguration(): SendMessageConfiguration { - return { acceptedOutputModes: [], pushNotificationConfig: undefined, historyLength: undefined, blocking: false }; + return { acceptedOutputModes: [], pushNotification: undefined, historyLength: 0, blocking: false }; } export const SendMessageConfiguration: MessageFns = { @@ -1113,10 +904,10 @@ export const SendMessageConfiguration: MessageFns = { for (const v of message.acceptedOutputModes) { writer.uint32(10).string(v!); } - if (message.pushNotificationConfig !== undefined) { - PushNotificationConfig.encode(message.pushNotificationConfig, writer.uint32(18).fork()).join(); + if (message.pushNotification !== undefined) { + PushNotificationConfig.encode(message.pushNotification, writer.uint32(18).fork()).join(); } - if (message.historyLength !== undefined) { + if (message.historyLength !== 0) { writer.uint32(24).int32(message.historyLength); } if (message.blocking !== false) { @@ -1145,7 +936,7 @@ export const SendMessageConfiguration: MessageFns = { break; } - message.pushNotificationConfig = PushNotificationConfig.decode(reader, reader.uint32()); + message.pushNotification = PushNotificationConfig.decode(reader, reader.uint32()); continue; } case 3: { @@ -1178,10 +969,10 @@ export const SendMessageConfiguration: MessageFns = { acceptedOutputModes: globalThis.Array.isArray(object?.acceptedOutputModes) ? object.acceptedOutputModes.map((e: any) => globalThis.String(e)) : [], - pushNotificationConfig: isSet(object.pushNotificationConfig) - ? PushNotificationConfig.fromJSON(object.pushNotificationConfig) + pushNotification: isSet(object.pushNotification) + ? PushNotificationConfig.fromJSON(object.pushNotification) : undefined, - historyLength: isSet(object.historyLength) ? globalThis.Number(object.historyLength) : undefined, + historyLength: isSet(object.historyLength) ? globalThis.Number(object.historyLength) : 0, blocking: isSet(object.blocking) ? globalThis.Boolean(object.blocking) : false, }; }, @@ -1191,10 +982,10 @@ export const SendMessageConfiguration: MessageFns = { if (message.acceptedOutputModes?.length) { obj.acceptedOutputModes = message.acceptedOutputModes; } - if (message.pushNotificationConfig !== undefined) { - obj.pushNotificationConfig = PushNotificationConfig.toJSON(message.pushNotificationConfig); + if (message.pushNotification !== undefined) { + obj.pushNotification = PushNotificationConfig.toJSON(message.pushNotification); } - if (message.historyLength !== undefined) { + if (message.historyLength !== 0) { obj.historyLength = Math.round(message.historyLength); } if (message.blocking !== false) { @@ -1209,11 +1000,10 @@ export const SendMessageConfiguration: MessageFns = { fromPartial, I>>(object: I): SendMessageConfiguration { const message = createBaseSendMessageConfiguration(); message.acceptedOutputModes = object.acceptedOutputModes?.map((e) => e) || []; - message.pushNotificationConfig = - (object.pushNotificationConfig !== undefined && object.pushNotificationConfig !== null) - ? PushNotificationConfig.fromPartial(object.pushNotificationConfig) - : undefined; - message.historyLength = object.historyLength ?? undefined; + message.pushNotification = (object.pushNotification !== undefined && object.pushNotification !== null) + ? PushNotificationConfig.fromPartial(object.pushNotification) + : undefined; + message.historyLength = object.historyLength ?? 0; message.blocking = object.blocking ?? false; return message; }, @@ -1364,7 +1154,7 @@ export const Task: MessageFns = { }; function createBaseTaskStatus(): TaskStatus { - return { state: 0, message: undefined, timestamp: undefined }; + return { state: 0, update: undefined, timestamp: undefined }; } export const TaskStatus: MessageFns = { @@ -1372,8 +1162,8 @@ export const TaskStatus: MessageFns = { if (message.state !== 0) { writer.uint32(8).int32(message.state); } - if (message.message !== undefined) { - Message.encode(message.message, writer.uint32(18).fork()).join(); + if (message.update !== undefined) { + Message.encode(message.update, writer.uint32(18).fork()).join(); } if (message.timestamp !== undefined) { Timestamp.encode(toTimestamp(message.timestamp), writer.uint32(26).fork()).join(); @@ -1401,7 +1191,7 @@ export const TaskStatus: MessageFns = { break; } - message.message = Message.decode(reader, reader.uint32()); + message.update = Message.decode(reader, reader.uint32()); continue; } case 3: { @@ -1424,7 +1214,7 @@ export const TaskStatus: MessageFns = { fromJSON(object: any): TaskStatus { return { state: isSet(object.state) ? taskStateFromJSON(object.state) : 0, - message: isSet(object.message) ? Message.fromJSON(object.message) : undefined, + update: isSet(object.message) ? Message.fromJSON(object.message) : undefined, timestamp: isSet(object.timestamp) ? fromJsonTimestamp(object.timestamp) : undefined, }; }, @@ -1434,8 +1224,8 @@ export const TaskStatus: MessageFns = { if (message.state !== 0) { obj.state = taskStateToJSON(message.state); } - if (message.message !== undefined) { - obj.message = Message.toJSON(message.message); + if (message.update !== undefined) { + obj.message = Message.toJSON(message.update); } if (message.timestamp !== undefined) { obj.timestamp = message.timestamp.toISOString(); @@ -1449,8 +1239,8 @@ export const TaskStatus: MessageFns = { fromPartial, I>>(object: I): TaskStatus { const message = createBaseTaskStatus(); message.state = object.state ?? 0; - message.message = (object.message !== undefined && object.message !== null) - ? Message.fromPartial(object.message) + message.update = (object.update !== undefined && object.update !== null) + ? Message.fromPartial(object.update) : undefined; message.timestamp = object.timestamp ?? undefined; return message; @@ -1458,7 +1248,7 @@ export const TaskStatus: MessageFns = { }; function createBasePart(): Part { - return { part: undefined, metadata: undefined }; + return { part: undefined }; } export const Part: MessageFns = { @@ -1474,9 +1264,6 @@ export const Part: MessageFns = { DataPart.encode(message.part.value, writer.uint32(26).fork()).join(); break; } - if (message.metadata !== undefined) { - Struct.encode(Struct.wrap(message.metadata), writer.uint32(34).fork()).join(); - } return writer; }, @@ -1511,14 +1298,6 @@ export const Part: MessageFns = { message.part = { $case: "data", value: DataPart.decode(reader, reader.uint32()) }; continue; } - case 4: { - if (tag !== 34) { - break; - } - - message.metadata = Struct.unwrap(Struct.decode(reader, reader.uint32())); - continue; - } } if ((tag & 7) === 4 || tag === 0) { break; @@ -1537,7 +1316,6 @@ export const Part: MessageFns = { : isSet(object.data) ? { $case: "data", value: DataPart.fromJSON(object.data) } : undefined, - metadata: isObject(object.metadata) ? object.metadata : undefined, }; }, @@ -1550,9 +1328,6 @@ export const Part: MessageFns = { } else if (message.part?.$case === "data") { obj.data = DataPart.toJSON(message.part.value); } - if (message.metadata !== undefined) { - obj.metadata = message.metadata; - } return obj; }, @@ -1581,13 +1356,12 @@ export const Part: MessageFns = { break; } } - message.metadata = object.metadata ?? undefined; return message; }, }; function createBaseFilePart(): FilePart { - return { file: undefined, mediaType: "", name: "" }; + return { file: undefined, mimeType: "" }; } export const FilePart: MessageFns = { @@ -1600,11 +1374,8 @@ export const FilePart: MessageFns = { writer.uint32(18).bytes(message.file.value); break; } - if (message.mediaType !== "") { - writer.uint32(26).string(message.mediaType); - } - if (message.name !== "") { - writer.uint32(34).string(message.name); + if (message.mimeType !== "") { + writer.uint32(26).string(message.mimeType); } return writer; }, @@ -1637,15 +1408,7 @@ export const FilePart: MessageFns = { break; } - message.mediaType = reader.string(); - continue; - } - case 4: { - if (tag !== 34) { - break; - } - - message.name = reader.string(); + message.mimeType = reader.string(); continue; } } @@ -1664,8 +1427,7 @@ export const FilePart: MessageFns = { : isSet(object.fileWithBytes) ? { $case: "fileWithBytes", value: Buffer.from(bytesFromBase64(object.fileWithBytes)) } : undefined, - mediaType: isSet(object.mediaType) ? globalThis.String(object.mediaType) : "", - name: isSet(object.name) ? globalThis.String(object.name) : "", + mimeType: isSet(object.mimeType) ? globalThis.String(object.mimeType) : "", }; }, @@ -1676,11 +1438,8 @@ export const FilePart: MessageFns = { } else if (message.file?.$case === "fileWithBytes") { obj.fileWithBytes = base64FromBytes(message.file.value); } - if (message.mediaType !== "") { - obj.mediaType = message.mediaType; - } - if (message.name !== "") { - obj.name = message.name; + if (message.mimeType !== "") { + obj.mimeType = message.mimeType; } return obj; }, @@ -1704,8 +1463,7 @@ export const FilePart: MessageFns = { break; } } - message.mediaType = object.mediaType ?? ""; - message.name = object.name ?? ""; + message.mimeType = object.mimeType ?? ""; return message; }, }; @@ -1769,16 +1527,7 @@ export const DataPart: MessageFns = { }; function createBaseMessage(): Message { - return { - messageId: "", - contextId: "", - taskId: "", - role: 0, - parts: [], - metadata: undefined, - extensions: [], - referenceTaskIds: [], - }; + return { messageId: "", contextId: "", taskId: "", role: 0, content: [], metadata: undefined, extensions: [] }; } export const Message: MessageFns = { @@ -1795,7 +1544,7 @@ export const Message: MessageFns = { if (message.role !== 0) { writer.uint32(32).int32(message.role); } - for (const v of message.parts) { + for (const v of message.content) { Part.encode(v!, writer.uint32(42).fork()).join(); } if (message.metadata !== undefined) { @@ -1804,9 +1553,6 @@ export const Message: MessageFns = { for (const v of message.extensions) { writer.uint32(58).string(v!); } - for (const v of message.referenceTaskIds) { - writer.uint32(66).string(v!); - } return writer; }, @@ -1854,7 +1600,7 @@ export const Message: MessageFns = { break; } - message.parts.push(Part.decode(reader, reader.uint32())); + message.content.push(Part.decode(reader, reader.uint32())); continue; } case 6: { @@ -1873,14 +1619,6 @@ export const Message: MessageFns = { message.extensions.push(reader.string()); continue; } - case 8: { - if (tag !== 66) { - break; - } - - message.referenceTaskIds.push(reader.string()); - continue; - } } if ((tag & 7) === 4 || tag === 0) { break; @@ -1896,14 +1634,11 @@ export const Message: MessageFns = { contextId: isSet(object.contextId) ? globalThis.String(object.contextId) : "", taskId: isSet(object.taskId) ? globalThis.String(object.taskId) : "", role: isSet(object.role) ? roleFromJSON(object.role) : 0, - parts: globalThis.Array.isArray(object?.parts) ? object.parts.map((e: any) => Part.fromJSON(e)) : [], + content: globalThis.Array.isArray(object?.content) ? object.content.map((e: any) => Part.fromJSON(e)) : [], metadata: isObject(object.metadata) ? object.metadata : undefined, extensions: globalThis.Array.isArray(object?.extensions) ? object.extensions.map((e: any) => globalThis.String(e)) : [], - referenceTaskIds: globalThis.Array.isArray(object?.referenceTaskIds) - ? object.referenceTaskIds.map((e: any) => globalThis.String(e)) - : [], }; }, @@ -1921,8 +1656,8 @@ export const Message: MessageFns = { if (message.role !== 0) { obj.role = roleToJSON(message.role); } - if (message.parts?.length) { - obj.parts = message.parts.map((e) => Part.toJSON(e)); + if (message.content?.length) { + obj.content = message.content.map((e) => Part.toJSON(e)); } if (message.metadata !== undefined) { obj.metadata = message.metadata; @@ -1930,9 +1665,6 @@ export const Message: MessageFns = { if (message.extensions?.length) { obj.extensions = message.extensions; } - if (message.referenceTaskIds?.length) { - obj.referenceTaskIds = message.referenceTaskIds; - } return obj; }, @@ -1945,10 +1677,9 @@ export const Message: MessageFns = { message.contextId = object.contextId ?? ""; message.taskId = object.taskId ?? ""; message.role = object.role ?? 0; - message.parts = object.parts?.map((e) => Part.fromPartial(e)) || []; + message.content = object.content?.map((e) => Part.fromPartial(e)) || []; message.metadata = object.metadata ?? undefined; message.extensions = object.extensions?.map((e) => e) || []; - message.referenceTaskIds = object.referenceTaskIds?.map((e) => e) || []; return message; }, }; @@ -2550,7 +2281,7 @@ export const AuthenticationInfo: MessageFns = { }; function createBaseAgentInterface(): AgentInterface { - return { url: "", protocolBinding: "", tenant: "" }; + return { url: "", transport: "" }; } export const AgentInterface: MessageFns = { @@ -2558,11 +2289,8 @@ export const AgentInterface: MessageFns = { if (message.url !== "") { writer.uint32(10).string(message.url); } - if (message.protocolBinding !== "") { - writer.uint32(18).string(message.protocolBinding); - } - if (message.tenant !== "") { - writer.uint32(26).string(message.tenant); + if (message.transport !== "") { + writer.uint32(18).string(message.transport); } return writer; }, @@ -2587,15 +2315,7 @@ export const AgentInterface: MessageFns = { break; } - message.protocolBinding = reader.string(); - continue; - } - case 3: { - if (tag !== 26) { - break; - } - - message.tenant = reader.string(); + message.transport = reader.string(); continue; } } @@ -2610,8 +2330,7 @@ export const AgentInterface: MessageFns = { fromJSON(object: any): AgentInterface { return { url: isSet(object.url) ? globalThis.String(object.url) : "", - protocolBinding: isSet(object.protocolBinding) ? globalThis.String(object.protocolBinding) : "", - tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "", + transport: isSet(object.transport) ? globalThis.String(object.transport) : "", }; }, @@ -2620,11 +2339,8 @@ export const AgentInterface: MessageFns = { if (message.url !== "") { obj.url = message.url; } - if (message.protocolBinding !== "") { - obj.protocolBinding = message.protocolBinding; - } - if (message.tenant !== "") { - obj.tenant = message.tenant; + if (message.transport !== "") { + obj.transport = message.transport; } return obj; }, @@ -2635,39 +2351,36 @@ export const AgentInterface: MessageFns = { fromPartial, I>>(object: I): AgentInterface { const message = createBaseAgentInterface(); message.url = object.url ?? ""; - message.protocolBinding = object.protocolBinding ?? ""; - message.tenant = object.tenant ?? ""; + message.transport = object.transport ?? ""; return message; }, }; function createBaseAgentCard(): AgentCard { return { - protocolVersion: undefined, + protocolVersion: "", name: "", description: "", - supportedInterfaces: [], - url: undefined, - preferredTransport: undefined, + url: "", + preferredTransport: "", additionalInterfaces: [], provider: undefined, version: "", - documentationUrl: undefined, + documentationUrl: "", capabilities: undefined, securitySchemes: {}, security: [], defaultInputModes: [], defaultOutputModes: [], skills: [], - supportsExtendedAgentCard: undefined, + supportsAuthenticatedExtendedCard: false, signatures: [], - iconUrl: undefined, }; } export const AgentCard: MessageFns = { encode(message: AgentCard, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.protocolVersion !== undefined) { + if (message.protocolVersion !== "") { writer.uint32(130).string(message.protocolVersion); } if (message.name !== "") { @@ -2676,13 +2389,10 @@ export const AgentCard: MessageFns = { if (message.description !== "") { writer.uint32(18).string(message.description); } - for (const v of message.supportedInterfaces) { - AgentInterface.encode(v!, writer.uint32(154).fork()).join(); - } - if (message.url !== undefined) { + if (message.url !== "") { writer.uint32(26).string(message.url); } - if (message.preferredTransport !== undefined) { + if (message.preferredTransport !== "") { writer.uint32(114).string(message.preferredTransport); } for (const v of message.additionalInterfaces) { @@ -2694,7 +2404,7 @@ export const AgentCard: MessageFns = { if (message.version !== "") { writer.uint32(42).string(message.version); } - if (message.documentationUrl !== undefined) { + if (message.documentationUrl !== "") { writer.uint32(50).string(message.documentationUrl); } if (message.capabilities !== undefined) { @@ -2715,15 +2425,12 @@ export const AgentCard: MessageFns = { for (const v of message.skills) { AgentSkill.encode(v!, writer.uint32(98).fork()).join(); } - if (message.supportsExtendedAgentCard !== undefined) { - writer.uint32(104).bool(message.supportsExtendedAgentCard); + if (message.supportsAuthenticatedExtendedCard !== false) { + writer.uint32(104).bool(message.supportsAuthenticatedExtendedCard); } for (const v of message.signatures) { AgentCardSignature.encode(v!, writer.uint32(138).fork()).join(); } - if (message.iconUrl !== undefined) { - writer.uint32(146).string(message.iconUrl); - } return writer; }, @@ -2758,14 +2465,6 @@ export const AgentCard: MessageFns = { message.description = reader.string(); continue; } - case 19: { - if (tag !== 154) { - break; - } - - message.supportedInterfaces.push(AgentInterface.decode(reader, reader.uint32())); - continue; - } case 3: { if (tag !== 26) { break; @@ -2870,7 +2569,7 @@ export const AgentCard: MessageFns = { break; } - message.supportsExtendedAgentCard = reader.bool(); + message.supportsAuthenticatedExtendedCard = reader.bool(); continue; } case 17: { @@ -2881,14 +2580,6 @@ export const AgentCard: MessageFns = { message.signatures.push(AgentCardSignature.decode(reader, reader.uint32())); continue; } - case 18: { - if (tag !== 146) { - break; - } - - message.iconUrl = reader.string(); - continue; - } } if ((tag & 7) === 4 || tag === 0) { break; @@ -2900,20 +2591,17 @@ export const AgentCard: MessageFns = { fromJSON(object: any): AgentCard { return { - protocolVersion: isSet(object.protocolVersion) ? globalThis.String(object.protocolVersion) : undefined, + protocolVersion: isSet(object.protocolVersion) ? globalThis.String(object.protocolVersion) : "", name: isSet(object.name) ? globalThis.String(object.name) : "", description: isSet(object.description) ? globalThis.String(object.description) : "", - supportedInterfaces: globalThis.Array.isArray(object?.supportedInterfaces) - ? object.supportedInterfaces.map((e: any) => AgentInterface.fromJSON(e)) - : [], - url: isSet(object.url) ? globalThis.String(object.url) : undefined, - preferredTransport: isSet(object.preferredTransport) ? globalThis.String(object.preferredTransport) : undefined, + url: isSet(object.url) ? globalThis.String(object.url) : "", + preferredTransport: isSet(object.preferredTransport) ? globalThis.String(object.preferredTransport) : "", additionalInterfaces: globalThis.Array.isArray(object?.additionalInterfaces) ? object.additionalInterfaces.map((e: any) => AgentInterface.fromJSON(e)) : [], provider: isSet(object.provider) ? AgentProvider.fromJSON(object.provider) : undefined, version: isSet(object.version) ? globalThis.String(object.version) : "", - documentationUrl: isSet(object.documentationUrl) ? globalThis.String(object.documentationUrl) : undefined, + documentationUrl: isSet(object.documentationUrl) ? globalThis.String(object.documentationUrl) : "", capabilities: isSet(object.capabilities) ? AgentCapabilities.fromJSON(object.capabilities) : undefined, securitySchemes: isObject(object.securitySchemes) ? Object.entries(object.securitySchemes).reduce<{ [key: string]: SecurityScheme }>((acc, [key, value]) => { @@ -2928,22 +2616,19 @@ export const AgentCard: MessageFns = { defaultOutputModes: globalThis.Array.isArray(object?.defaultOutputModes) ? object.defaultOutputModes.map((e: any) => globalThis.String(e)) : [], - skills: globalThis.Array.isArray(object?.skills) - ? object.skills.map((e: any) => AgentSkill.fromJSON(e)) - : [], - supportsExtendedAgentCard: isSet(object.supportsExtendedAgentCard) - ? globalThis.Boolean(object.supportsExtendedAgentCard) - : undefined, + skills: globalThis.Array.isArray(object?.skills) ? object.skills.map((e: any) => AgentSkill.fromJSON(e)) : [], + supportsAuthenticatedExtendedCard: isSet(object.supportsAuthenticatedExtendedCard) + ? globalThis.Boolean(object.supportsAuthenticatedExtendedCard) + : false, signatures: globalThis.Array.isArray(object?.signatures) ? object.signatures.map((e: any) => AgentCardSignature.fromJSON(e)) : [], - iconUrl: isSet(object.iconUrl) ? globalThis.String(object.iconUrl) : undefined, }; }, toJSON(message: AgentCard): unknown { const obj: any = {}; - if (message.protocolVersion !== undefined) { + if (message.protocolVersion !== "") { obj.protocolVersion = message.protocolVersion; } if (message.name !== "") { @@ -2952,13 +2637,10 @@ export const AgentCard: MessageFns = { if (message.description !== "") { obj.description = message.description; } - if (message.supportedInterfaces?.length) { - obj.supportedInterfaces = message.supportedInterfaces.map((e) => AgentInterface.toJSON(e)); - } - if (message.url !== undefined) { + if (message.url !== "") { obj.url = message.url; } - if (message.preferredTransport !== undefined) { + if (message.preferredTransport !== "") { obj.preferredTransport = message.preferredTransport; } if (message.additionalInterfaces?.length) { @@ -2970,7 +2652,7 @@ export const AgentCard: MessageFns = { if (message.version !== "") { obj.version = message.version; } - if (message.documentationUrl !== undefined) { + if (message.documentationUrl !== "") { obj.documentationUrl = message.documentationUrl; } if (message.capabilities !== undefined) { @@ -2997,15 +2679,12 @@ export const AgentCard: MessageFns = { if (message.skills?.length) { obj.skills = message.skills.map((e) => AgentSkill.toJSON(e)); } - if (message.supportsExtendedAgentCard !== undefined) { - obj.supportsExtendedAgentCard = message.supportsExtendedAgentCard; + if (message.supportsAuthenticatedExtendedCard !== false) { + obj.supportsAuthenticatedExtendedCard = message.supportsAuthenticatedExtendedCard; } if (message.signatures?.length) { obj.signatures = message.signatures.map((e) => AgentCardSignature.toJSON(e)); } - if (message.iconUrl !== undefined) { - obj.iconUrl = message.iconUrl; - } return obj; }, @@ -3014,18 +2693,17 @@ export const AgentCard: MessageFns = { }, fromPartial, I>>(object: I): AgentCard { const message = createBaseAgentCard(); - message.protocolVersion = object.protocolVersion ?? undefined; + message.protocolVersion = object.protocolVersion ?? ""; message.name = object.name ?? ""; message.description = object.description ?? ""; - message.supportedInterfaces = object.supportedInterfaces?.map((e) => AgentInterface.fromPartial(e)) || []; - message.url = object.url ?? undefined; - message.preferredTransport = object.preferredTransport ?? undefined; + message.url = object.url ?? ""; + message.preferredTransport = object.preferredTransport ?? ""; message.additionalInterfaces = object.additionalInterfaces?.map((e) => AgentInterface.fromPartial(e)) || []; message.provider = (object.provider !== undefined && object.provider !== null) ? AgentProvider.fromPartial(object.provider) : undefined; message.version = object.version ?? ""; - message.documentationUrl = object.documentationUrl ?? undefined; + message.documentationUrl = object.documentationUrl ?? ""; message.capabilities = (object.capabilities !== undefined && object.capabilities !== null) ? AgentCapabilities.fromPartial(object.capabilities) : undefined; @@ -3042,9 +2720,8 @@ export const AgentCard: MessageFns = { message.defaultInputModes = object.defaultInputModes?.map((e) => e) || []; message.defaultOutputModes = object.defaultOutputModes?.map((e) => e) || []; message.skills = object.skills?.map((e) => AgentSkill.fromPartial(e)) || []; - message.supportsExtendedAgentCard = object.supportsExtendedAgentCard ?? undefined; + message.supportsAuthenticatedExtendedCard = object.supportsAuthenticatedExtendedCard ?? false; message.signatures = object.signatures?.map((e) => AgentCardSignature.fromPartial(e)) || []; - message.iconUrl = object.iconUrl ?? undefined; return message; }, }; @@ -3206,23 +2883,20 @@ export const AgentProvider: MessageFns = { }; function createBaseAgentCapabilities(): AgentCapabilities { - return { streaming: undefined, pushNotifications: undefined, extensions: [], stateTransitionHistory: undefined }; + return { streaming: false, pushNotifications: false, extensions: [] }; } export const AgentCapabilities: MessageFns = { encode(message: AgentCapabilities, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.streaming !== undefined) { + if (message.streaming !== false) { writer.uint32(8).bool(message.streaming); } - if (message.pushNotifications !== undefined) { + if (message.pushNotifications !== false) { writer.uint32(16).bool(message.pushNotifications); } for (const v of message.extensions) { AgentExtension.encode(v!, writer.uint32(26).fork()).join(); } - if (message.stateTransitionHistory !== undefined) { - writer.uint32(32).bool(message.stateTransitionHistory); - } return writer; }, @@ -3257,14 +2931,6 @@ export const AgentCapabilities: MessageFns = { message.extensions.push(AgentExtension.decode(reader, reader.uint32())); continue; } - case 4: { - if (tag !== 32) { - break; - } - - message.stateTransitionHistory = reader.bool(); - continue; - } } if ((tag & 7) === 4 || tag === 0) { break; @@ -3276,31 +2942,25 @@ export const AgentCapabilities: MessageFns = { fromJSON(object: any): AgentCapabilities { return { - streaming: isSet(object.streaming) ? globalThis.Boolean(object.streaming) : undefined, - pushNotifications: isSet(object.pushNotifications) ? globalThis.Boolean(object.pushNotifications) : undefined, + streaming: isSet(object.streaming) ? globalThis.Boolean(object.streaming) : false, + pushNotifications: isSet(object.pushNotifications) ? globalThis.Boolean(object.pushNotifications) : false, extensions: globalThis.Array.isArray(object?.extensions) ? object.extensions.map((e: any) => AgentExtension.fromJSON(e)) : [], - stateTransitionHistory: isSet(object.stateTransitionHistory) - ? globalThis.Boolean(object.stateTransitionHistory) - : undefined, }; }, toJSON(message: AgentCapabilities): unknown { const obj: any = {}; - if (message.streaming !== undefined) { + if (message.streaming !== false) { obj.streaming = message.streaming; } - if (message.pushNotifications !== undefined) { + if (message.pushNotifications !== false) { obj.pushNotifications = message.pushNotifications; } if (message.extensions?.length) { obj.extensions = message.extensions.map((e) => AgentExtension.toJSON(e)); } - if (message.stateTransitionHistory !== undefined) { - obj.stateTransitionHistory = message.stateTransitionHistory; - } return obj; }, @@ -3309,10 +2969,9 @@ export const AgentCapabilities: MessageFns = { }, fromPartial, I>>(object: I): AgentCapabilities { const message = createBaseAgentCapabilities(); - message.streaming = object.streaming ?? undefined; - message.pushNotifications = object.pushNotifications ?? undefined; + message.streaming = object.streaming ?? false; + message.pushNotifications = object.pushNotifications ?? false; message.extensions = object.extensions?.map((e) => AgentExtension.fromPartial(e)) || []; - message.stateTransitionHistory = object.stateTransitionHistory ?? undefined; return message; }, }; @@ -5515,14 +5174,11 @@ export const PasswordOAuthFlow_ScopesEntry: MessageFns = { encode(message: SendMessageRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.tenant !== "") { - writer.uint32(34).string(message.tenant); - } if (message.request !== undefined) { Message.encode(message.request, writer.uint32(10).fork()).join(); } @@ -5542,14 +5198,6 @@ export const SendMessageRequest: MessageFns = { while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 4: { - if (tag !== 34) { - break; - } - - message.tenant = reader.string(); - continue; - } case 1: { if (tag !== 10) { break; @@ -5585,7 +5233,6 @@ export const SendMessageRequest: MessageFns = { fromJSON(object: any): SendMessageRequest { return { - tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "", request: isSet(object.message) ? Message.fromJSON(object.message) : undefined, configuration: isSet(object.configuration) ? SendMessageConfiguration.fromJSON(object.configuration) : undefined, metadata: isObject(object.metadata) ? object.metadata : undefined, @@ -5594,9 +5241,6 @@ export const SendMessageRequest: MessageFns = { toJSON(message: SendMessageRequest): unknown { const obj: any = {}; - if (message.tenant !== "") { - obj.tenant = message.tenant; - } if (message.request !== undefined) { obj.message = Message.toJSON(message.request); } @@ -5614,7 +5258,6 @@ export const SendMessageRequest: MessageFns = { }, fromPartial, I>>(object: I): SendMessageRequest { const message = createBaseSendMessageRequest(); - message.tenant = object.tenant ?? ""; message.request = (object.request !== undefined && object.request !== null) ? Message.fromPartial(object.request) : undefined; @@ -5627,18 +5270,15 @@ export const SendMessageRequest: MessageFns = { }; function createBaseGetTaskRequest(): GetTaskRequest { - return { tenant: "", name: "", historyLength: undefined }; + return { name: "", historyLength: 0 }; } export const GetTaskRequest: MessageFns = { encode(message: GetTaskRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.tenant !== "") { - writer.uint32(26).string(message.tenant); - } if (message.name !== "") { writer.uint32(10).string(message.name); } - if (message.historyLength !== undefined) { + if (message.historyLength !== 0) { writer.uint32(16).int32(message.historyLength); } return writer; @@ -5651,14 +5291,6 @@ export const GetTaskRequest: MessageFns = { while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 3: { - if (tag !== 26) { - break; - } - - message.tenant = reader.string(); - continue; - } case 1: { if (tag !== 10) { break; @@ -5686,21 +5318,17 @@ export const GetTaskRequest: MessageFns = { fromJSON(object: any): GetTaskRequest { return { - tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "", name: isSet(object.name) ? globalThis.String(object.name) : "", - historyLength: isSet(object.historyLength) ? globalThis.Number(object.historyLength) : undefined, + historyLength: isSet(object.historyLength) ? globalThis.Number(object.historyLength) : 0, }; }, toJSON(message: GetTaskRequest): unknown { const obj: any = {}; - if (message.tenant !== "") { - obj.tenant = message.tenant; - } if (message.name !== "") { obj.name = message.name; } - if (message.historyLength !== undefined) { + if (message.historyLength !== 0) { obj.historyLength = Math.round(message.historyLength); } return obj; @@ -5711,311 +5339,18 @@ export const GetTaskRequest: MessageFns = { }, fromPartial, I>>(object: I): GetTaskRequest { const message = createBaseGetTaskRequest(); - message.tenant = object.tenant ?? ""; message.name = object.name ?? ""; - message.historyLength = object.historyLength ?? undefined; - return message; - }, -}; - -function createBaseListTasksRequest(): ListTasksRequest { - return { - tenant: "", - contextId: "", - status: 0, - pageSize: undefined, - pageToken: "", - historyLength: undefined, - lastUpdatedAfter: 0, - includeArtifacts: undefined, - }; -} - -export const ListTasksRequest: MessageFns = { - encode(message: ListTasksRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.tenant !== "") { - writer.uint32(74).string(message.tenant); - } - if (message.contextId !== "") { - writer.uint32(10).string(message.contextId); - } - if (message.status !== 0) { - writer.uint32(16).int32(message.status); - } - if (message.pageSize !== undefined) { - writer.uint32(24).int32(message.pageSize); - } - if (message.pageToken !== "") { - writer.uint32(34).string(message.pageToken); - } - if (message.historyLength !== undefined) { - writer.uint32(40).int32(message.historyLength); - } - if (message.lastUpdatedAfter !== 0) { - writer.uint32(48).int64(message.lastUpdatedAfter); - } - if (message.includeArtifacts !== undefined) { - writer.uint32(56).bool(message.includeArtifacts); - } - return writer; - }, - - decode(input: BinaryReader | Uint8Array, length?: number): ListTasksRequest { - const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseListTasksRequest(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 9: { - if (tag !== 74) { - break; - } - - message.tenant = reader.string(); - continue; - } - case 1: { - if (tag !== 10) { - break; - } - - message.contextId = reader.string(); - continue; - } - case 2: { - if (tag !== 16) { - break; - } - - message.status = reader.int32() as any; - continue; - } - case 3: { - if (tag !== 24) { - break; - } - - message.pageSize = reader.int32(); - continue; - } - case 4: { - if (tag !== 34) { - break; - } - - message.pageToken = reader.string(); - continue; - } - case 5: { - if (tag !== 40) { - break; - } - - message.historyLength = reader.int32(); - continue; - } - case 6: { - if (tag !== 48) { - break; - } - - message.lastUpdatedAfter = longToNumber(reader.int64()); - continue; - } - case 7: { - if (tag !== 56) { - break; - } - - message.includeArtifacts = reader.bool(); - continue; - } - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skip(tag & 7); - } - return message; - }, - - fromJSON(object: any): ListTasksRequest { - return { - tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "", - contextId: isSet(object.contextId) ? globalThis.String(object.contextId) : "", - status: isSet(object.status) ? taskStateFromJSON(object.status) : 0, - pageSize: isSet(object.pageSize) ? globalThis.Number(object.pageSize) : undefined, - pageToken: isSet(object.pageToken) ? globalThis.String(object.pageToken) : "", - historyLength: isSet(object.historyLength) ? globalThis.Number(object.historyLength) : undefined, - lastUpdatedAfter: isSet(object.lastUpdatedAfter) ? globalThis.Number(object.lastUpdatedAfter) : 0, - includeArtifacts: isSet(object.includeArtifacts) ? globalThis.Boolean(object.includeArtifacts) : undefined, - }; - }, - - toJSON(message: ListTasksRequest): unknown { - const obj: any = {}; - if (message.tenant !== "") { - obj.tenant = message.tenant; - } - if (message.contextId !== "") { - obj.contextId = message.contextId; - } - if (message.status !== 0) { - obj.status = taskStateToJSON(message.status); - } - if (message.pageSize !== undefined) { - obj.pageSize = Math.round(message.pageSize); - } - if (message.pageToken !== "") { - obj.pageToken = message.pageToken; - } - if (message.historyLength !== undefined) { - obj.historyLength = Math.round(message.historyLength); - } - if (message.lastUpdatedAfter !== 0) { - obj.lastUpdatedAfter = Math.round(message.lastUpdatedAfter); - } - if (message.includeArtifacts !== undefined) { - obj.includeArtifacts = message.includeArtifacts; - } - return obj; - }, - - create, I>>(base?: I): ListTasksRequest { - return ListTasksRequest.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ListTasksRequest { - const message = createBaseListTasksRequest(); - message.tenant = object.tenant ?? ""; - message.contextId = object.contextId ?? ""; - message.status = object.status ?? 0; - message.pageSize = object.pageSize ?? undefined; - message.pageToken = object.pageToken ?? ""; - message.historyLength = object.historyLength ?? undefined; - message.lastUpdatedAfter = object.lastUpdatedAfter ?? 0; - message.includeArtifacts = object.includeArtifacts ?? undefined; - return message; - }, -}; - -function createBaseListTasksResponse(): ListTasksResponse { - return { tasks: [], nextPageToken: "", pageSize: 0, totalSize: 0 }; -} - -export const ListTasksResponse: MessageFns = { - encode(message: ListTasksResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - for (const v of message.tasks) { - Task.encode(v!, writer.uint32(10).fork()).join(); - } - if (message.nextPageToken !== "") { - writer.uint32(18).string(message.nextPageToken); - } - if (message.pageSize !== 0) { - writer.uint32(24).int32(message.pageSize); - } - if (message.totalSize !== 0) { - writer.uint32(32).int32(message.totalSize); - } - return writer; - }, - - decode(input: BinaryReader | Uint8Array, length?: number): ListTasksResponse { - const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseListTasksResponse(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: { - if (tag !== 10) { - break; - } - - message.tasks.push(Task.decode(reader, reader.uint32())); - continue; - } - case 2: { - if (tag !== 18) { - break; - } - - message.nextPageToken = reader.string(); - continue; - } - case 3: { - if (tag !== 24) { - break; - } - - message.pageSize = reader.int32(); - continue; - } - case 4: { - if (tag !== 32) { - break; - } - - message.totalSize = reader.int32(); - continue; - } - } - if ((tag & 7) === 4 || tag === 0) { - break; - } - reader.skip(tag & 7); - } - return message; - }, - - fromJSON(object: any): ListTasksResponse { - return { - tasks: globalThis.Array.isArray(object?.tasks) ? object.tasks.map((e: any) => Task.fromJSON(e)) : [], - nextPageToken: isSet(object.nextPageToken) ? globalThis.String(object.nextPageToken) : "", - pageSize: isSet(object.pageSize) ? globalThis.Number(object.pageSize) : 0, - totalSize: isSet(object.totalSize) ? globalThis.Number(object.totalSize) : 0, - }; - }, - - toJSON(message: ListTasksResponse): unknown { - const obj: any = {}; - if (message.tasks?.length) { - obj.tasks = message.tasks.map((e) => Task.toJSON(e)); - } - if (message.nextPageToken !== "") { - obj.nextPageToken = message.nextPageToken; - } - if (message.pageSize !== 0) { - obj.pageSize = Math.round(message.pageSize); - } - if (message.totalSize !== 0) { - obj.totalSize = Math.round(message.totalSize); - } - return obj; - }, - - create, I>>(base?: I): ListTasksResponse { - return ListTasksResponse.fromPartial(base ?? ({} as any)); - }, - fromPartial, I>>(object: I): ListTasksResponse { - const message = createBaseListTasksResponse(); - message.tasks = object.tasks?.map((e) => Task.fromPartial(e)) || []; - message.nextPageToken = object.nextPageToken ?? ""; - message.pageSize = object.pageSize ?? 0; - message.totalSize = object.totalSize ?? 0; + message.historyLength = object.historyLength ?? 0; return message; }, }; function createBaseCancelTaskRequest(): CancelTaskRequest { - return { tenant: "", name: "" }; + return { name: "" }; } export const CancelTaskRequest: MessageFns = { encode(message: CancelTaskRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.tenant !== "") { - writer.uint32(18).string(message.tenant); - } if (message.name !== "") { writer.uint32(10).string(message.name); } @@ -6029,14 +5364,6 @@ export const CancelTaskRequest: MessageFns = { while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 2: { - if (tag !== 18) { - break; - } - - message.tenant = reader.string(); - continue; - } case 1: { if (tag !== 10) { break; @@ -6055,17 +5382,11 @@ export const CancelTaskRequest: MessageFns = { }, fromJSON(object: any): CancelTaskRequest { - return { - tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "", - name: isSet(object.name) ? globalThis.String(object.name) : "", - }; + return { name: isSet(object.name) ? globalThis.String(object.name) : "" }; }, toJSON(message: CancelTaskRequest): unknown { const obj: any = {}; - if (message.tenant !== "") { - obj.tenant = message.tenant; - } if (message.name !== "") { obj.name = message.name; } @@ -6077,21 +5398,17 @@ export const CancelTaskRequest: MessageFns = { }, fromPartial, I>>(object: I): CancelTaskRequest { const message = createBaseCancelTaskRequest(); - message.tenant = object.tenant ?? ""; message.name = object.name ?? ""; return message; }, }; function createBaseGetTaskPushNotificationConfigRequest(): GetTaskPushNotificationConfigRequest { - return { tenant: "", name: "" }; + return { name: "" }; } export const GetTaskPushNotificationConfigRequest: MessageFns = { encode(message: GetTaskPushNotificationConfigRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.tenant !== "") { - writer.uint32(18).string(message.tenant); - } if (message.name !== "") { writer.uint32(10).string(message.name); } @@ -6105,14 +5422,6 @@ export const GetTaskPushNotificationConfigRequest: MessageFns>> 3) { - case 2: { - if (tag !== 18) { - break; - } - - message.tenant = reader.string(); - continue; - } case 1: { if (tag !== 10) { break; @@ -6131,17 +5440,11 @@ export const GetTaskPushNotificationConfigRequest: MessageFns = { encode(message: DeleteTaskPushNotificationConfigRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.tenant !== "") { - writer.uint32(18).string(message.tenant); - } if (message.name !== "") { writer.uint32(10).string(message.name); } @@ -6185,14 +5484,6 @@ export const DeleteTaskPushNotificationConfigRequest: MessageFns>> 3) { - case 2: { - if (tag !== 18) { - break; - } - - message.tenant = reader.string(); - continue; - } case 1: { if (tag !== 10) { break; @@ -6211,17 +5502,11 @@ export const DeleteTaskPushNotificationConfigRequest: MessageFns = { - encode(message: SetTaskPushNotificationConfigRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.tenant !== "") { - writer.uint32(34).string(message.tenant); - } +export const CreateTaskPushNotificationConfigRequest: MessageFns = { + encode(message: CreateTaskPushNotificationConfigRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.parent !== "") { writer.uint32(10).string(message.parent); } @@ -6264,21 +5545,13 @@ export const SetTaskPushNotificationConfigRequest: MessageFns>> 3) { - case 4: { - if (tag !== 34) { - break; - } - - message.tenant = reader.string(); - continue; - } case 1: { if (tag !== 10) { break; @@ -6312,20 +5585,16 @@ export const SetTaskPushNotificationConfigRequest: MessageFns, I>>( + create, I>>( base?: I, - ): SetTaskPushNotificationConfigRequest { - return SetTaskPushNotificationConfigRequest.fromPartial(base ?? ({} as any)); + ): CreateTaskPushNotificationConfigRequest { + return CreateTaskPushNotificationConfigRequest.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>( + fromPartial, I>>( object: I, - ): SetTaskPushNotificationConfigRequest { - const message = createBaseSetTaskPushNotificationConfigRequest(); - message.tenant = object.tenant ?? ""; + ): CreateTaskPushNotificationConfigRequest { + const message = createBaseCreateTaskPushNotificationConfigRequest(); message.parent = object.parent ?? ""; message.configId = object.configId ?? ""; message.config = (object.config !== undefined && object.config !== null) @@ -6357,36 +5625,25 @@ export const SetTaskPushNotificationConfigRequest: MessageFns = { - encode(message: SubscribeToTaskRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.tenant !== "") { - writer.uint32(18).string(message.tenant); - } +export const TaskSubscriptionRequest: MessageFns = { + encode(message: TaskSubscriptionRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { if (message.name !== "") { writer.uint32(10).string(message.name); } return writer; }, - decode(input: BinaryReader | Uint8Array, length?: number): SubscribeToTaskRequest { + decode(input: BinaryReader | Uint8Array, length?: number): TaskSubscriptionRequest { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); const end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseSubscribeToTaskRequest(); + const message = createBaseTaskSubscriptionRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 2: { - if (tag !== 18) { - break; - } - - message.tenant = reader.string(); - continue; - } case 1: { if (tag !== 10) { break; @@ -6404,44 +5661,34 @@ export const SubscribeToTaskRequest: MessageFns = { return message; }, - fromJSON(object: any): SubscribeToTaskRequest { - return { - tenant: isSet(object.tenant) ? globalThis.String(object.tenant) : "", - name: isSet(object.name) ? globalThis.String(object.name) : "", - }; + fromJSON(object: any): TaskSubscriptionRequest { + return { name: isSet(object.name) ? globalThis.String(object.name) : "" }; }, - toJSON(message: SubscribeToTaskRequest): unknown { + toJSON(message: TaskSubscriptionRequest): unknown { const obj: any = {}; - if (message.tenant !== "") { - obj.tenant = message.tenant; - } if (message.name !== "") { obj.name = message.name; } return obj; }, - create, I>>(base?: I): SubscribeToTaskRequest { - return SubscribeToTaskRequest.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): TaskSubscriptionRequest { + return TaskSubscriptionRequest.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): SubscribeToTaskRequest { - const message = createBaseSubscribeToTaskRequest(); - message.tenant = object.tenant ?? ""; + fromPartial, I>>(object: I): TaskSubscriptionRequest { + const message = createBaseTaskSubscriptionRequest(); message.name = object.name ?? ""; return message; }, }; function createBaseListTaskPushNotificationConfigRequest(): ListTaskPushNotificationConfigRequest { - return { tenant: "", parent: "", pageSize: 0, pageToken: "" }; + return { parent: "", pageSize: 0, pageToken: "" }; } export const ListTaskPushNotificationConfigRequest: MessageFns = { encode(message: ListTaskPushNotificationConfigRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.tenant !== "") { - writer.uint32(34).string(message.tenant); - } if (message.parent !== "") { writer.uint32(10).string(message.parent); } @@ -6461,14 +5708,6 @@ export const ListTaskPushNotificationConfigRequest: MessageFns>> 3) { - case 4: { - if (tag !== 34) { - break; - } - - message.tenant = reader.string(); - continue; - } case 1: { if (tag !== 10) { break; @@ -6504,7 +5743,6 @@ export const ListTaskPushNotificationConfigRequest: MessageFns = { - encode(message: GetExtendedAgentCardRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { - if (message.tenant !== "") { - writer.uint32(10).string(message.tenant); - } +export const GetAgentCardRequest: MessageFns = { + encode(_: GetAgentCardRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter { return writer; }, - decode(input: BinaryReader | Uint8Array, length?: number): GetExtendedAgentCardRequest { + decode(input: BinaryReader | Uint8Array, length?: number): GetAgentCardRequest { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); const end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseGetExtendedAgentCardRequest(); + const message = createBaseGetAgentCardRequest(); while (reader.pos < end) { const tag = reader.uint32(); switch (tag >>> 3) { - case 1: { - if (tag !== 10) { - break; - } - - message.tenant = reader.string(); - continue; - } } if ((tag & 7) === 4 || tag === 0) { break; @@ -6581,24 +5804,20 @@ export const GetExtendedAgentCardRequest: MessageFns, I>>(base?: I): GetExtendedAgentCardRequest { - return GetExtendedAgentCardRequest.fromPartial(base ?? ({} as any)); + create, I>>(base?: I): GetAgentCardRequest { + return GetAgentCardRequest.fromPartial(base ?? ({} as any)); }, - fromPartial, I>>(object: I): GetExtendedAgentCardRequest { - const message = createBaseGetExtendedAgentCardRequest(); - message.tenant = object.tenant ?? ""; + fromPartial, I>>(_: I): GetAgentCardRequest { + const message = createBaseGetAgentCardRequest(); return message; }, }; @@ -6914,10 +6133,27 @@ export const ListTaskPushNotificationConfigResponse: MessageFns Buffer.from(SendMessageResponse.encode(value).finish()), responseDeserialize: (value: Buffer): SendMessageResponse => SendMessageResponse.decode(value), }, - /** SendStreamingMessage is a streaming version of SendMessage. */ + /** + * SendStreamingMessage is a streaming call that will return a stream of + * task update events until the Task is in an interrupted or terminal state. + */ sendStreamingMessage: { path: "/a2a.v1.A2AService/SendStreamingMessage", requestStream: false, @@ -6947,17 +6186,10 @@ export const A2AServiceService = { responseSerialize: (value: Task): Buffer => Buffer.from(Task.encode(value).finish()), responseDeserialize: (value: Buffer): Task => Task.decode(value), }, - /** List tasks with optional filtering and pagination. */ - listTasks: { - path: "/a2a.v1.A2AService/ListTasks", - requestStream: false, - responseStream: false, - requestSerialize: (value: ListTasksRequest): Buffer => Buffer.from(ListTasksRequest.encode(value).finish()), - requestDeserialize: (value: Buffer): ListTasksRequest => ListTasksRequest.decode(value), - responseSerialize: (value: ListTasksResponse): Buffer => Buffer.from(ListTasksResponse.encode(value).finish()), - responseDeserialize: (value: Buffer): ListTasksResponse => ListTasksResponse.decode(value), - }, - /** Cancel a task. */ + /** + * Cancel a task from the agent. If supported one should expect no + * more task updates for the task. + */ cancelTask: { path: "/a2a.v1.A2AService/CancelTask", requestStream: false, @@ -6968,28 +6200,30 @@ export const A2AServiceService = { responseDeserialize: (value: Buffer): Task => Task.decode(value), }, /** - * SubscribeToTask allows subscribing to task updates for tasks not in terminal state. - * Returns UnsupportedOperationError if task is in terminal state (completed, failed, cancelled, rejected). + * TaskSubscription is a streaming call that will return a stream of task + * update events. This attaches the stream to an existing in process task. + * If the task is complete the stream will return the completed task (like + * GetTask) and close the stream. */ - subscribeToTask: { - path: "/a2a.v1.A2AService/SubscribeToTask", + taskSubscription: { + path: "/a2a.v1.A2AService/TaskSubscription", requestStream: false, responseStream: true, - requestSerialize: (value: SubscribeToTaskRequest): Buffer => - Buffer.from(SubscribeToTaskRequest.encode(value).finish()), - requestDeserialize: (value: Buffer): SubscribeToTaskRequest => SubscribeToTaskRequest.decode(value), + requestSerialize: (value: TaskSubscriptionRequest): Buffer => + Buffer.from(TaskSubscriptionRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): TaskSubscriptionRequest => TaskSubscriptionRequest.decode(value), responseSerialize: (value: StreamResponse): Buffer => Buffer.from(StreamResponse.encode(value).finish()), responseDeserialize: (value: Buffer): StreamResponse => StreamResponse.decode(value), }, /** Set a push notification config for a task. */ - setTaskPushNotificationConfig: { - path: "/a2a.v1.A2AService/SetTaskPushNotificationConfig", + createTaskPushNotificationConfig: { + path: "/a2a.v1.A2AService/CreateTaskPushNotificationConfig", requestStream: false, responseStream: false, - requestSerialize: (value: SetTaskPushNotificationConfigRequest): Buffer => - Buffer.from(SetTaskPushNotificationConfigRequest.encode(value).finish()), - requestDeserialize: (value: Buffer): SetTaskPushNotificationConfigRequest => - SetTaskPushNotificationConfigRequest.decode(value), + requestSerialize: (value: CreateTaskPushNotificationConfigRequest): Buffer => + Buffer.from(CreateTaskPushNotificationConfigRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): CreateTaskPushNotificationConfigRequest => + CreateTaskPushNotificationConfigRequest.decode(value), responseSerialize: (value: TaskPushNotificationConfig): Buffer => Buffer.from(TaskPushNotificationConfig.encode(value).finish()), responseDeserialize: (value: Buffer): TaskPushNotificationConfig => TaskPushNotificationConfig.decode(value), @@ -7021,14 +6255,13 @@ export const A2AServiceService = { responseDeserialize: (value: Buffer): ListTaskPushNotificationConfigResponse => ListTaskPushNotificationConfigResponse.decode(value), }, - /** GetExtendedAgentCard returns the extended agent card for authenticated agents. */ - getExtendedAgentCard: { - path: "/a2a.v1.A2AService/GetExtendedAgentCard", + /** GetAgentCard returns the agent card for the agent. */ + getAgentCard: { + path: "/a2a.v1.A2AService/GetAgentCard", requestStream: false, responseStream: false, - requestSerialize: (value: GetExtendedAgentCardRequest): Buffer => - Buffer.from(GetExtendedAgentCardRequest.encode(value).finish()), - requestDeserialize: (value: Buffer): GetExtendedAgentCardRequest => GetExtendedAgentCardRequest.decode(value), + requestSerialize: (value: GetAgentCardRequest): Buffer => Buffer.from(GetAgentCardRequest.encode(value).finish()), + requestDeserialize: (value: Buffer): GetAgentCardRequest => GetAgentCardRequest.decode(value), responseSerialize: (value: AgentCard): Buffer => Buffer.from(AgentCard.encode(value).finish()), responseDeserialize: (value: Buffer): AgentCard => AgentCard.decode(value), }, @@ -7047,23 +6280,35 @@ export const A2AServiceService = { } as const; export interface A2AServiceServer extends UntypedServiceImplementation { - /** Send a message to the agent. */ + /** + * Send a message to the agent. This is a blocking call that will return the + * task once it is completed, or a LRO if requested. + */ sendMessage: handleUnaryCall; - /** SendStreamingMessage is a streaming version of SendMessage. */ + /** + * SendStreamingMessage is a streaming call that will return a stream of + * task update events until the Task is in an interrupted or terminal state. + */ sendStreamingMessage: handleServerStreamingCall; /** Get the current state of a task from the agent. */ getTask: handleUnaryCall; - /** List tasks with optional filtering and pagination. */ - listTasks: handleUnaryCall; - /** Cancel a task. */ + /** + * Cancel a task from the agent. If supported one should expect no + * more task updates for the task. + */ cancelTask: handleUnaryCall; /** - * SubscribeToTask allows subscribing to task updates for tasks not in terminal state. - * Returns UnsupportedOperationError if task is in terminal state (completed, failed, cancelled, rejected). + * TaskSubscription is a streaming call that will return a stream of task + * update events. This attaches the stream to an existing in process task. + * If the task is complete the stream will return the completed task (like + * GetTask) and close the stream. */ - subscribeToTask: handleServerStreamingCall; + taskSubscription: handleServerStreamingCall; /** Set a push notification config for a task. */ - setTaskPushNotificationConfig: handleUnaryCall; + createTaskPushNotificationConfig: handleUnaryCall< + CreateTaskPushNotificationConfigRequest, + TaskPushNotificationConfig + >; /** Get a push notification config for a task. */ getTaskPushNotificationConfig: handleUnaryCall; /** Get a list of push notifications configured for a task. */ @@ -7071,14 +6316,17 @@ export interface A2AServiceServer extends UntypedServiceImplementation { ListTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigResponse >; - /** GetExtendedAgentCard returns the extended agent card for authenticated agents. */ - getExtendedAgentCard: handleUnaryCall; + /** GetAgentCard returns the agent card for the agent. */ + getAgentCard: handleUnaryCall; /** Delete a push notification config for a task. */ deleteTaskPushNotificationConfig: handleUnaryCall; } export interface A2AServiceClient extends Client { - /** Send a message to the agent. */ + /** + * Send a message to the agent. This is a blocking call that will return the + * task once it is completed, or a LRO if requested. + */ sendMessage( request: SendMessageRequest, callback: (error: ServiceError | null, response: SendMessageResponse) => void, @@ -7094,7 +6342,10 @@ export interface A2AServiceClient extends Client { options: Partial, callback: (error: ServiceError | null, response: SendMessageResponse) => void, ): ClientUnaryCall; - /** SendStreamingMessage is a streaming version of SendMessage. */ + /** + * SendStreamingMessage is a streaming call that will return a stream of + * task update events until the Task is in an interrupted or terminal state. + */ sendStreamingMessage( request: SendMessageRequest, options?: Partial, @@ -7117,23 +6368,10 @@ export interface A2AServiceClient extends Client { options: Partial, callback: (error: ServiceError | null, response: Task) => void, ): ClientUnaryCall; - /** List tasks with optional filtering and pagination. */ - listTasks( - request: ListTasksRequest, - callback: (error: ServiceError | null, response: ListTasksResponse) => void, - ): ClientUnaryCall; - listTasks( - request: ListTasksRequest, - metadata: Metadata, - callback: (error: ServiceError | null, response: ListTasksResponse) => void, - ): ClientUnaryCall; - listTasks( - request: ListTasksRequest, - metadata: Metadata, - options: Partial, - callback: (error: ServiceError | null, response: ListTasksResponse) => void, - ): ClientUnaryCall; - /** Cancel a task. */ + /** + * Cancel a task from the agent. If supported one should expect no + * more task updates for the task. + */ cancelTask( request: CancelTaskRequest, callback: (error: ServiceError | null, response: Task) => void, @@ -7150,30 +6388,32 @@ export interface A2AServiceClient extends Client { callback: (error: ServiceError | null, response: Task) => void, ): ClientUnaryCall; /** - * SubscribeToTask allows subscribing to task updates for tasks not in terminal state. - * Returns UnsupportedOperationError if task is in terminal state (completed, failed, cancelled, rejected). + * TaskSubscription is a streaming call that will return a stream of task + * update events. This attaches the stream to an existing in process task. + * If the task is complete the stream will return the completed task (like + * GetTask) and close the stream. */ - subscribeToTask( - request: SubscribeToTaskRequest, + taskSubscription( + request: TaskSubscriptionRequest, options?: Partial, ): ClientReadableStream; - subscribeToTask( - request: SubscribeToTaskRequest, + taskSubscription( + request: TaskSubscriptionRequest, metadata?: Metadata, options?: Partial, ): ClientReadableStream; /** Set a push notification config for a task. */ - setTaskPushNotificationConfig( - request: SetTaskPushNotificationConfigRequest, + createTaskPushNotificationConfig( + request: CreateTaskPushNotificationConfigRequest, callback: (error: ServiceError | null, response: TaskPushNotificationConfig) => void, ): ClientUnaryCall; - setTaskPushNotificationConfig( - request: SetTaskPushNotificationConfigRequest, + createTaskPushNotificationConfig( + request: CreateTaskPushNotificationConfigRequest, metadata: Metadata, callback: (error: ServiceError | null, response: TaskPushNotificationConfig) => void, ): ClientUnaryCall; - setTaskPushNotificationConfig( - request: SetTaskPushNotificationConfigRequest, + createTaskPushNotificationConfig( + request: CreateTaskPushNotificationConfigRequest, metadata: Metadata, options: Partial, callback: (error: ServiceError | null, response: TaskPushNotificationConfig) => void, @@ -7210,18 +6450,18 @@ export interface A2AServiceClient extends Client { options: Partial, callback: (error: ServiceError | null, response: ListTaskPushNotificationConfigResponse) => void, ): ClientUnaryCall; - /** GetExtendedAgentCard returns the extended agent card for authenticated agents. */ - getExtendedAgentCard( - request: GetExtendedAgentCardRequest, + /** GetAgentCard returns the agent card for the agent. */ + getAgentCard( + request: GetAgentCardRequest, callback: (error: ServiceError | null, response: AgentCard) => void, ): ClientUnaryCall; - getExtendedAgentCard( - request: GetExtendedAgentCardRequest, + getAgentCard( + request: GetAgentCardRequest, metadata: Metadata, callback: (error: ServiceError | null, response: AgentCard) => void, ): ClientUnaryCall; - getExtendedAgentCard( - request: GetExtendedAgentCardRequest, + getAgentCard( + request: GetAgentCardRequest, metadata: Metadata, options: Partial, callback: (error: ServiceError | null, response: AgentCard) => void, @@ -7293,17 +6533,6 @@ function fromJsonTimestamp(o: any): Date { } } -function longToNumber(int64: { toString(): string }): number { - const num = globalThis.Number(int64.toString()); - if (num > globalThis.Number.MAX_SAFE_INTEGER) { - throw new globalThis.Error("Value is larger than Number.MAX_SAFE_INTEGER"); - } - if (num < globalThis.Number.MIN_SAFE_INTEGER) { - throw new globalThis.Error("Value is smaller than Number.MIN_SAFE_INTEGER"); - } - return num; -} - function isObject(value: any): boolean { return typeof value === "object" && value !== null; } diff --git a/src/grpc/utils/proto_type_converter.ts b/src/grpc/utils/proto_type_converter.ts index 8efe05ba..ee059ee4 100644 --- a/src/grpc/utils/proto_type_converter.ts +++ b/src/grpc/utils/proto_type_converter.ts @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ +import { agent } from 'supertest'; import * as types from '../../types.js'; import { AgentCard, @@ -46,6 +47,7 @@ import { ListTaskPushNotificationConfigRequest, SetTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigResponse, + AgentSkill, } from '../a2a.js'; const TASK_ID_REGEX = /tasks\/([^/]+)/; @@ -75,6 +77,19 @@ export class FromProto { return match[1]; } + static taskQueryParams(request: GetTaskRequest): types.TaskQueryParams { + return { + id: this._getTaskIdFromName(request.name), + historyLength: request.historyLength, + }; + } + + static taskIdParams(request: CancelTaskRequest): types.TaskIdParams { + return { + id: this._getTaskIdFromName(request.name), + }; + } + static getTaskPushNotificationConfigParams( request: GetTaskPushNotificationConfigRequest ): types.GetTaskPushNotificationConfigParams { @@ -206,6 +221,163 @@ export class FromProto { export class ToProto { + static agentCard(agentCard: types.AgentCard): AgentCard { + return { + protocolVersion: agentCard.protocolVersion, + name: agentCard.name, + description: agentCard.description, + url: agentCard.url, + preferredTransport: agentCard.preferredTransport ?? '', + additionalInterfaces: agentCard.additionalInterfaces.map(i => this.agentInterface(i)), + provider: this.agentProvider(agentCard.provider), + version: agentCard.version, + documentationUrl: agentCard.documentationUrl ?? '', + capabilities: this.agentCapabilities(agentCard.capabilities), + securitySchemes: this.securitySchemes(Object.values(agentCard.securitySchemes)), + security: agentCard.security.map(s => this.security(s)), + defaultInputModes: agentCard.defaultInputModes, + defaultOutputModes: agentCard.defaultOutputModes, + skills: agentCard.skills.map(s => this.agentSkill(s)), + supportsAuthenticatedExtendedCard: agentCard.supportsAuthenticatedExtendedCard ?? false, + signatures: this.signatures(agentCard.signatures), + }; + } + + static agentSkill(skill: types.AgentSkill): AgentSkill { + return { + id: skill.id, + name: skill.name, + description: skill.description ?? '', + tags: skill.tags ?? [], + examples: skill.examples ?? [], + inputModes: skill.inputModes ?? [], + outputModes: skill.outputModes ?? [], + security: skill.security.map(s => this.security(s)), + }; + } + + static security(security: {[k: string]: string[]}): Security { + return { + schemes: Object.fromEntries( + Object.entries(security).map(([key, value]) => { + return [key, { list: value } as StringList]; + }) + ), + }; + } + + static securitySchemes(schemes: types.SecurityScheme[]): SecurityScheme[] { + return schemes.map(scheme => { + switch (scheme.type) { + case "apiKey": + return { + $case: "apiKeySecurityScheme", + value: { + name: scheme.name, + location: scheme.in, + description: scheme.description ?? '', + } as APIKeySecurityScheme, + }; + case "http": + return { + $case: "httpAuthSecurityScheme", + value: { + description: scheme.description ?? '', + scheme: scheme.scheme, + bearerFormat: scheme.bearerFormat ?? '', + } as HTTPAuthSecurityScheme, + }; + case "mutualTLS": + return { + $case: "mtlsSecurityScheme", + value: { + description: scheme.description ?? '', + } as MutualTlsSecurityScheme, + }; + case "oauth2": + return { + $case: "oauth2SecurityScheme", + value: { + description: scheme.description ?? '', + flows: { + implicit: scheme.flows.implicit + ? { + authorizationUrl: scheme.flows.implicit.authorizationUrl, + refreshUrl: scheme.flows.implicit.refreshUrl ?? '', + scopes: scheme.flows.implicit.scopes, + } as ImplicitOAuthFlow + : undefined, + password: scheme.flows.password + ? { + tokenUrl: scheme.flows.password.tokenUrl, + refreshUrl: scheme.flows.password.refreshUrl ?? '', + scopes: scheme.flows.password.scopes, + } as PasswordOAuthFlow + : undefined, + clientCredentials: scheme.flows.clientCredentials + ? { + tokenUrl: scheme.flows.clientCredentials.tokenUrl, + refreshUrl: scheme.flows.clientCredentials.refreshUrl ?? '', + scopes: scheme.flows.clientCredentials.scopes, + } as ClientCredentialsOAuthFlow + : undefined, + authorizationCode: scheme.flows.authorizationCode + ? { + authorizationUrl: scheme.flows.authorizationCode.authorizationUrl, + tokenUrl: scheme.flows.authorizationCode.tokenUrl, + refreshUrl: scheme.flows.authorizationCode.refreshUrl ?? '', + scopes: scheme.flows.authorizationCode.scopes, + } as AuthorizationCodeOAuthFlow + : undefined, + } as OAuthFlows, + oauth2MetadataUrl: scheme.oauth2MetadataUrl ?? '', + } as OAuth2SecurityScheme, + }; + case "openIdConnect": + return { + $case: "openIdConnectSecurityScheme", + value: { + description: scheme.description ?? '', + openIdConnectUrl: scheme.openIdConnectUrl, + } as OpenIdConnectSecurityScheme, + }; + default: + return undefined; + } + }); + } + + static agentInterface(agentInterface: types.AgentInterface): AgentInterface { + return { + transport: agentInterface.transport, + url: agentInterface.url, + }; + } + + static agentProvider(agentProvider: types.AgentProvider): AgentProvider { + return { + url: agentProvider.url, + organization: agentProvider.organization, + }; + } + + static agentCapabilities(capabilities: types.AgentCapabilities): AgentCapabilities { + return { + streaming: capabilities.streaming ?? false, + pushNotifications: capabilities.pushNotifications ?? false, + extensions: capabilities.extensions.map(e => this.extension(e)), + }; + } + + static extension(extension: types.AgentExtension): AgentExtension { + return { + uri: extension.uri, + description: extension.description ?? '', + required: extension.required ?? false, + params: extension.params, + }; + } + static listTaskPushNotificationConfigs(config: types.TaskPushNotificationConfig[]): ListTaskPushNotificationConfigResponse { return { configs: config.map(c => this.taskPushNotificationConfig(c)), diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index 3af160f6..96fa9dbe 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -1,6 +1,6 @@ import * as grpc from '@grpc/grpc-js'; import { A2AServiceServer, A2AServiceService, AgentCard, CancelTaskRequest, DeleteTaskPushNotificationConfigRequest, GetExtendedAgentCardRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, ListTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigResponse, ListTasksRequest, ListTasksResponse, Message, SendMessageRequest, SendMessageResponse, SetTaskPushNotificationConfigRequest, StreamResponse, SubscribeToTaskRequest, Task, TaskPushNotificationConfig } from '../../grpc/a2a.js'; -import { Task as A2ATask, DeleteTaskPushNotificationConfigParams, GetTaskPushNotificationConfigParams, ListTaskPushNotificationConfigParams, MessageSendParams, TaskPushNotificationConfig as TaskPushNotificationConfigInternal } from '../../types.js'; +import { Task as A2ATask, DeleteTaskPushNotificationConfigParams, GetTaskPushNotificationConfigParams, ListTaskPushNotificationConfigParams, MessageSendParams, TaskIdParams, TaskPushNotificationConfig as TaskPushNotificationConfigInternal, TaskQueryParams } from '../../types.js'; import { Empty } from '../../grpc/google/protobuf/empty.js'; import { A2ARequestHandler } from '../request_handler/a2a_request_handler.js'; import { FromProto, ToProto } from '../../grpc/utils/proto_type_converter.js'; @@ -45,7 +45,7 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { } catch (error) { const a2aError = error instanceof A2AError ? error : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); - callback(a2aError, null); + callback(mapToError(a2aError), null); } }, @@ -141,17 +141,46 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { ): void { throw new Error('Method not implemented.'); }, - getTask(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { - throw new Error('Method not implemented.'); + async getTask(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): Promise { + try { + const context = await buildContext(call, options.userBuilder); + const params: TaskQueryParams = FromProto.taskQueryParams(call.request); + const task = await grpcTransportHandler.getTask(params, context); + const response = ToProto.task(task); + callback(null, response); + } catch (error) { + const a2aError = error instanceof A2AError ? error + : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + callback(a2aError, null); + } }, - cancelTask(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): void { - throw new Error('Method not implemented.'); + async cancelTask(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): Promise { + try { + const context = await buildContext(call, options.userBuilder); + const params: TaskIdParams = FromProto.taskQueryParams(call.request); + const task = await grpcTransportHandler.cancelTask(params, context); + const response = ToProto.task(task); + callback(null, response); + } catch (error) { + const a2aError = error instanceof A2AError ? error + : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + callback(a2aError, null); + } }, - getExtendedAgentCard( + async getExtendedAgentCard( call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData - ): void { - throw new Error('Method not implemented.'); + ): Promise { + try { + const context = await buildContext(call, options.userBuilder); + const agentCard = await grpcTransportHandler.getAuthenticatedExtendedAgentCard(context); + const response = ToProto.agentCard(agentCard); + callback(null, response); + } catch (error) { + const a2aError = error instanceof A2AError ? error + : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + callback(a2aError, null); + } }, }; } diff --git a/src/server/transports/grpc/grpc_transport_handler.ts b/src/server/transports/grpc/grpc_transport_handler.ts index eedf591d..72ab8c67 100644 --- a/src/server/transports/grpc/grpc_transport_handler.ts +++ b/src/server/transports/grpc/grpc_transport_handler.ts @@ -36,8 +36,8 @@ export class gRpcTransportHandler { /** * Gets the authenticated extended agent card. */ - async getAuthenticatedExtendedAgentCard(): Promise { - return this.requestHandler.getAuthenticatedExtendedAgentCard(); + async getAuthenticatedExtendedAgentCard(context: ServerCallContext): Promise { + return this.requestHandler.getAuthenticatedExtendedAgentCard(context); } /** @@ -74,19 +74,16 @@ export class gRpcTransportHandler { * Validates historyLength parameter if provided. */ async getTask( - taskId: string, + params: TaskQueryParams, context: ServerCallContext, - historyLength?: unknown ): Promise { - const params: TaskQueryParams = { id: taskId }; return this.requestHandler.getTask(params, context); } /** * Cancels a task. */ - async cancelTask(taskId: string, context: ServerCallContext): Promise { - const params: TaskIdParams = { id: taskId }; + async cancelTask(params: TaskIdParams, context: ServerCallContext): Promise { return this.requestHandler.cancelTask(params, context); } From 583319d8d0722fdae431e8d4787a7368b6b350e8 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Thu, 18 Dec 2025 10:06:21 +0000 Subject: [PATCH 08/64] wip --- src/grpc/utils/proto_type_converter.ts | 104 ++++++++++++++----------- src/server/grpc/grpc_handler.ts | 25 +++--- 2 files changed, 68 insertions(+), 61 deletions(-) diff --git a/src/grpc/utils/proto_type_converter.ts b/src/grpc/utils/proto_type_converter.ts index ee059ee4..c3741ea8 100644 --- a/src/grpc/utils/proto_type_converter.ts +++ b/src/grpc/utils/proto_type_converter.ts @@ -1,5 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { agent } from 'supertest'; import * as types from '../../types.js'; import { AgentCard, @@ -36,7 +34,6 @@ import { SendMessageResponse, StreamResponse, StringList, - SubscribeToTaskRequest, Task, TaskArtifactUpdateEvent, TaskPushNotificationConfig, @@ -45,9 +42,9 @@ import { TaskStatusUpdateEvent, DeleteTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigRequest, - SetTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigResponse, AgentSkill, + CreateTaskPushNotificationConfigRequest, } from '../a2a.js'; const TASK_ID_REGEX = /tasks\/([^/]+)/; @@ -108,7 +105,7 @@ export class FromProto { } static setTaskPushNotificationConfigParams( - request: SetTaskPushNotificationConfigRequest + request: CreateTaskPushNotificationConfigRequest ): types.TaskPushNotificationConfig { return { taskId: this._getTaskIdFromName(request.parent), @@ -130,7 +127,7 @@ export class FromProto { return { kind: 'message', messageId: message.messageId, - parts: message.parts.map(p => this.parts(p)), + parts: message.content.map(p => this.parts(p)), contextId: message.contextId ?? undefined, taskId: message.taskId ?? undefined, role: message.role === Role.ROLE_AGENT ? "agent" : "user", @@ -143,8 +140,8 @@ export class FromProto { return { blocking: configuration.blocking, acceptedOutputModes: configuration.acceptedOutputModes, - pushNotificationConfig: configuration.pushNotificationConfig - ? this.pushNotificationConfig(configuration.pushNotificationConfig) + pushNotificationConfig: configuration.pushNotification + ? this.pushNotificationConfig(configuration.pushNotification) : undefined, }; } @@ -173,7 +170,6 @@ export class FromProto { return { kind: "text", text: part.part.value, - metadata: { ...part.metadata }, } as types.TextPart; } @@ -185,7 +181,6 @@ export class FromProto { file: { uri: filePart.file.value, }, - metadata: { ...part.metadata }, } as types.FilePart; } else if (filePart.file?.$case === "fileWithBytes") { return { @@ -193,7 +188,6 @@ export class FromProto { file: { bytes: filePart.file.value.toString(), }, - metadata: { ...part.metadata }, } as types.FilePart; } throw new Error("Invalid file part type"); @@ -203,7 +197,6 @@ export class FromProto { return { kind: "data", data: part.part.value.data, - metadata: { ...part.metadata }, } as types.DataPart; } @@ -233,13 +226,23 @@ export class ToProto { version: agentCard.version, documentationUrl: agentCard.documentationUrl ?? '', capabilities: this.agentCapabilities(agentCard.capabilities), - securitySchemes: this.securitySchemes(Object.values(agentCard.securitySchemes)), + securitySchemes: Object.fromEntries( + Object.entries(agentCard.securitySchemes).map(([key, value]) => [key, this.securityScheme(value)]) + ), security: agentCard.security.map(s => this.security(s)), defaultInputModes: agentCard.defaultInputModes, defaultOutputModes: agentCard.defaultOutputModes, skills: agentCard.skills.map(s => this.agentSkill(s)), supportsAuthenticatedExtendedCard: agentCard.supportsAuthenticatedExtendedCard ?? false, - signatures: this.signatures(agentCard.signatures), + signatures: agentCard.signatures.map(s => this.signatures(s)), + }; + } + + static signatures(signatures: types.AgentCardSignature): AgentCardSignature { + return { + protected: signatures.protected, + signature: signatures.signature, + header: signatures.header, }; } @@ -266,36 +269,42 @@ export class ToProto { }; } - static securitySchemes(schemes: types.SecurityScheme[]): SecurityScheme[] { - return schemes.map(scheme => { - switch (scheme.type) { - case "apiKey": - return { - $case: "apiKeySecurityScheme", - value: { - name: scheme.name, - location: scheme.in, - description: scheme.description ?? '', - } as APIKeySecurityScheme, - }; - case "http": - return { + static securityScheme(scheme: types.SecurityScheme): SecurityScheme { + switch (scheme.type) { + case "apiKey": + return { + scheme: { + $case: "apiKeySecurityScheme", + value: { + name: scheme.name, + location: scheme.in, + description: scheme.description ?? '', + } as APIKeySecurityScheme, + } + }; + case "http": + return { + scheme: { $case: "httpAuthSecurityScheme", value: { description: scheme.description ?? '', scheme: scheme.scheme, bearerFormat: scheme.bearerFormat ?? '', } as HTTPAuthSecurityScheme, - }; - case "mutualTLS": - return { + } + }; + case "mutualTLS": + return { + scheme: { $case: "mtlsSecurityScheme", value: { description: scheme.description ?? '', } as MutualTlsSecurityScheme, - }; - case "oauth2": - return { + } + }; + case "oauth2": + return { + scheme: { $case: "oauth2SecurityScheme", value: { description: scheme.description ?? '', @@ -332,19 +341,21 @@ export class ToProto { } as OAuthFlows, oauth2MetadataUrl: scheme.oauth2MetadataUrl ?? '', } as OAuth2SecurityScheme, - }; - case "openIdConnect": - return { + } + }; + case "openIdConnect": + return { + scheme: { $case: "openIdConnectSecurityScheme", value: { description: scheme.description ?? '', openIdConnectUrl: scheme.openIdConnectUrl, } as OpenIdConnectSecurityScheme, - }; - default: - return undefined; - } - }); + } + }; + default: + throw new Error(`Unknown security scheme type: ${(scheme as any).type}`); + } } static agentInterface(agentInterface: types.AgentInterface): AgentInterface { @@ -486,13 +497,12 @@ export class ToProto { static message(message: types.Message): Message { return { messageId: message.messageId, - parts: message.parts.map(p => this.parts(p)), + content: message.parts.map(p => this.parts(p)), contextId: message.contextId ?? '', taskId: message.taskId ?? '', role: message.role === 'agent' ? Role.ROLE_AGENT : Role.ROLE_USER, metadata: message.metadata, extensions: message.extensions ? message.extensions : [], - referenceTaskIds: message.referenceTaskIds ? message.referenceTaskIds : [], }; } @@ -510,7 +520,7 @@ export class ToProto { static taskStatus(status: types.TaskStatus): TaskStatus { return { state: this.taskState(status.state), - message: status.message ? this.message(status.message) : undefined, + update: status.message ? this.message(status.message) : undefined, timestamp: status.timestamp ? new Date(status.timestamp) : undefined, }; } @@ -563,9 +573,9 @@ export class ToProto { if (part.kind === "file") { let filePart: ProtoFilePart; if ('uri' in part.file) { - filePart = { file: { $case: "fileWithUri", value: part.file.uri }, mediaType: undefined, name: part.file.name ?? '' }; + filePart = { file: { $case: "fileWithUri", value: part.file.uri }, mimeType: part.file.mimeType ?? '' }; } else if ('bytes' in part.file) { - filePart = { file: { $case: "fileWithBytes", value: Buffer.from(part.file.bytes) }, mediaType: undefined, name: part.file.name ?? '' }; + filePart = { file: { $case: "fileWithBytes", value: Buffer.from(part.file.bytes) }, mimeType: part.file.mimeType ?? '' }; } else { throw new Error("Invalid file part"); } diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index 96fa9dbe..5835d338 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -1,5 +1,5 @@ import * as grpc from '@grpc/grpc-js'; -import { A2AServiceServer, A2AServiceService, AgentCard, CancelTaskRequest, DeleteTaskPushNotificationConfigRequest, GetExtendedAgentCardRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, ListTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigResponse, ListTasksRequest, ListTasksResponse, Message, SendMessageRequest, SendMessageResponse, SetTaskPushNotificationConfigRequest, StreamResponse, SubscribeToTaskRequest, Task, TaskPushNotificationConfig } from '../../grpc/a2a.js'; +import { A2AServiceServer, A2AServiceService, AgentCard, CancelTaskRequest, CreateTaskPushNotificationConfigRequest, DeleteTaskPushNotificationConfigRequest, GetAgentCardRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, ListTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigResponse, Message, SendMessageRequest, SendMessageResponse, StreamResponse, Task, TaskPushNotificationConfig, TaskSubscriptionRequest } from '../../grpc/a2a.js'; import { Task as A2ATask, DeleteTaskPushNotificationConfigParams, GetTaskPushNotificationConfigParams, ListTaskPushNotificationConfigParams, MessageSendParams, TaskIdParams, TaskPushNotificationConfig as TaskPushNotificationConfigInternal, TaskQueryParams } from '../../types.js'; import { Empty } from '../../grpc/google/protobuf/empty.js'; import { A2ARequestHandler } from '../request_handler/a2a_request_handler.js'; @@ -66,9 +66,12 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { call.end(); } }, - subscribeToTask(call: grpc.ServerWritableStream): void { - throw new Error('Method not implemented.'); + + taskSubscription(call: grpc.ServerWritableStream): void { + call.emit('error', A2AError.unsupportedOperation('Streaming not supported.')); + call.end(); }, + async deleteTaskPushNotificationConfig( call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData @@ -103,8 +106,8 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { callback(a2aError, null); } }, - async setTaskPushNotificationConfig( - call: grpc.ServerUnaryCall, + async createTaskPushNotificationConfig( + call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData ): Promise { try { @@ -135,12 +138,6 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { callback(a2aError, null); } }, - listTasks( - call: grpc.ServerUnaryCall, - callback: grpc.sendUnaryData - ): void { - throw new Error('Method not implemented.'); - }, async getTask(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): Promise { try { const context = await buildContext(call, options.userBuilder); @@ -157,7 +154,7 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { async cancelTask(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): Promise { try { const context = await buildContext(call, options.userBuilder); - const params: TaskIdParams = FromProto.taskQueryParams(call.request); + const params: TaskIdParams = FromProto.taskIdParams(call.request); const task = await grpcTransportHandler.cancelTask(params, context); const response = ToProto.task(task); callback(null, response); @@ -167,8 +164,8 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { callback(a2aError, null); } }, - async getExtendedAgentCard( - call: grpc.ServerUnaryCall, + async getAgentCard( + call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData ): Promise { try { From 16d00dd81ba5793dc7a3480d147bc8b361c131f7 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Thu, 18 Dec 2025 11:33:19 +0000 Subject: [PATCH 09/64] wip --- src/grpc/utils/proto_type_converter.ts | 1141 +++++++++-------- src/samples/agents/sample-agent/client.ts | 42 +- src/samples/agents/sample-agent/grpc.ts | 9 +- src/server/grpc/grpc_handler.ts | 256 ++-- .../transports/grpc/grpc_transport_handler.ts | 271 ++-- 5 files changed, 911 insertions(+), 808 deletions(-) diff --git a/src/grpc/utils/proto_type_converter.ts b/src/grpc/utils/proto_type_converter.ts index c3741ea8..5d13fd23 100644 --- a/src/grpc/utils/proto_type_converter.ts +++ b/src/grpc/utils/proto_type_converter.ts @@ -1,50 +1,49 @@ import * as types from '../../types.js'; import { - AgentCard, - AgentCardSignature, - AgentCapabilities, - AgentExtension, - AgentInterface, - AgentProvider, - APIKeySecurityScheme, - Artifact, - AuthenticationInfo, - AuthorizationCodeOAuthFlow, - CancelTaskRequest, - ClientCredentialsOAuthFlow, - DataPart as ProtoDataPart, - FilePart as ProtoFilePart, - GetTaskPushNotificationConfigRequest, - GetTaskRequest, - HTTPAuthSecurityScheme, - ImplicitOAuthFlow, - Message, - MutualTlsSecurityScheme, - OAuth2SecurityScheme, - OAuthFlows, - OpenIdConnectSecurityScheme, - Part, - PasswordOAuthFlow, - PushNotificationConfig, - Role, - Security, - SecurityScheme, - SendMessageConfiguration, - SendMessageRequest, - SendMessageResponse, - StreamResponse, - StringList, - Task, - TaskArtifactUpdateEvent, - TaskPushNotificationConfig, - TaskState, - TaskStatus, - TaskStatusUpdateEvent, - DeleteTaskPushNotificationConfigRequest, - ListTaskPushNotificationConfigRequest, - ListTaskPushNotificationConfigResponse, - AgentSkill, - CreateTaskPushNotificationConfigRequest, + AgentCard, + AgentCardSignature, + AgentCapabilities, + AgentExtension, + AgentInterface, + AgentProvider, + APIKeySecurityScheme, + Artifact, + AuthenticationInfo, + AuthorizationCodeOAuthFlow, + CancelTaskRequest, + ClientCredentialsOAuthFlow, + FilePart as ProtoFilePart, + GetTaskPushNotificationConfigRequest, + GetTaskRequest, + HTTPAuthSecurityScheme, + ImplicitOAuthFlow, + Message, + MutualTlsSecurityScheme, + OAuth2SecurityScheme, + OAuthFlows, + OpenIdConnectSecurityScheme, + Part, + PasswordOAuthFlow, + PushNotificationConfig, + Role, + Security, + SecurityScheme, + SendMessageConfiguration, + SendMessageRequest, + SendMessageResponse, + StreamResponse, + StringList, + Task, + TaskArtifactUpdateEvent, + TaskPushNotificationConfig, + TaskState, + TaskStatus, + TaskStatusUpdateEvent, + DeleteTaskPushNotificationConfigRequest, + ListTaskPushNotificationConfigRequest, + ListTaskPushNotificationConfigResponse, + AgentSkill, + CreateTaskPushNotificationConfigRequest, } from '../a2a.js'; const TASK_ID_REGEX = /tasks\/([^/]+)/; @@ -54,544 +53,556 @@ const CONFIG_ID_REGEX = /pushNotificationConfigs\/([^/]*)/; * Converts proto types to internal types. */ export class FromProto { - private static _getTaskIdFromName(name: string): string { - const match = name.match(TASK_ID_REGEX); - if (!match) { - throw new Error( - `Invalid or missing task ID in name: "${name}"` - ); - } - return match[1]; - } - - private static _getPushNotificationConfigIdFromName(name: string): string { - const match = name.match(CONFIG_ID_REGEX); - if (!match || match.length < 2) { - throw new Error( - `Invalid or missing config ID in name: "${name}"` - ); - } - return match[1]; - } - - static taskQueryParams(request: GetTaskRequest): types.TaskQueryParams { - return { - id: this._getTaskIdFromName(request.name), - historyLength: request.historyLength, - }; - } - - static taskIdParams(request: CancelTaskRequest): types.TaskIdParams { - return { - id: this._getTaskIdFromName(request.name), - }; - } - - static getTaskPushNotificationConfigParams( - request: GetTaskPushNotificationConfigRequest - ): types.GetTaskPushNotificationConfigParams { - return { - id: this._getTaskIdFromName(request.name), - pushNotificationConfigId: this._getPushNotificationConfigIdFromName(request.name), - }; - } - - static listTaskPushNotificationConfigParams( - request: ListTaskPushNotificationConfigRequest - ): types.ListTaskPushNotificationConfigParams { + private static _getTaskIdFromName(name: string): string { + const match = name.match(TASK_ID_REGEX); + if (!match) { + throw new Error(`Invalid or missing task ID in name: "${name}"`); + } + return match[1]; + } + + private static _getPushNotificationConfigIdFromName(name: string): string { + const match = name.match(CONFIG_ID_REGEX); + if (!match || match.length < 2) { + throw new Error(`Invalid or missing config ID in name: "${name}"`); + } + return match[1]; + } + + static taskQueryParams(request: GetTaskRequest): types.TaskQueryParams { + return { + id: this._getTaskIdFromName(request.name), + historyLength: request.historyLength, + }; + } + + static taskIdParams(request: CancelTaskRequest): types.TaskIdParams { + return { + id: this._getTaskIdFromName(request.name), + }; + } + + static getTaskPushNotificationConfigParams( + request: GetTaskPushNotificationConfigRequest + ): types.GetTaskPushNotificationConfigParams { + return { + id: this._getTaskIdFromName(request.name), + pushNotificationConfigId: this._getPushNotificationConfigIdFromName(request.name), + }; + } + + static listTaskPushNotificationConfigParams( + request: ListTaskPushNotificationConfigRequest + ): types.ListTaskPushNotificationConfigParams { + return { + id: this._getTaskIdFromName(request.parent), + }; + } + + static setTaskPushNotificationConfigParams( + request: CreateTaskPushNotificationConfigRequest + ): types.TaskPushNotificationConfig { + return { + taskId: this._getTaskIdFromName(request.parent), + pushNotificationConfig: this.pushNotificationConfig(request.config.pushNotificationConfig), + }; + } + + static deleteTaskPushNotificationConfigParams( + request: DeleteTaskPushNotificationConfigRequest + ): types.DeleteTaskPushNotificationConfigParams { + const name = request.name; + return { + id: this._getTaskIdFromName(name), + pushNotificationConfigId: this._getPushNotificationConfigIdFromName(name), + }; + } + + static message(message: Message): types.Message { + return { + kind: 'message', + messageId: message.messageId, + parts: message.content.map((p) => this.parts(p)), + contextId: message.contextId, + taskId: message.taskId, + role: message.role === Role.ROLE_AGENT ? 'agent' : 'user', + metadata: message.metadata, + extensions: message.extensions.length > 0 ? message.extensions : undefined, + }; + } + + static configuration(configuration: SendMessageConfiguration): types.MessageSendConfiguration { + return { + blocking: configuration.blocking, + acceptedOutputModes: configuration.acceptedOutputModes, + pushNotificationConfig: configuration.pushNotification + ? this.pushNotificationConfig(configuration.pushNotification) + : undefined, + }; + } + + static pushNotificationConfig(config: PushNotificationConfig): types.PushNotificationConfig { + return { + id: config.id, + url: config.url, + token: config.token, + authentication: config.authentication + ? this.authenticationInfo(config.authentication) + : undefined, + }; + } + + static authenticationInfo( + authInfo: AuthenticationInfo + ): types.PushNotificationAuthenticationInfo { + return { + schemes: authInfo.schemes, + credentials: authInfo.credentials, + }; + } + + static parts(part: Part): types.Part { + if (part.part?.$case === 'text') { + return { + kind: 'text', + text: part.part.value, + } as types.TextPart; + } + + if (part.part?.$case === 'file') { + const filePart = part.part.value; + if (filePart.file?.$case === 'fileWithUri') { return { - id: this._getTaskIdFromName(request.parent), - }; - } - - static setTaskPushNotificationConfigParams( - request: CreateTaskPushNotificationConfigRequest - ): types.TaskPushNotificationConfig { - return { - taskId: this._getTaskIdFromName(request.parent), - pushNotificationConfig: this.pushNotificationConfig(request.config.pushNotificationConfig), - }; - } - - static deleteTaskPushNotificationConfigParams( - request: DeleteTaskPushNotificationConfigRequest - ): types.DeleteTaskPushNotificationConfigParams { - const name = request.name; - return { - id: this._getTaskIdFromName(name), - pushNotificationConfigId: this._getPushNotificationConfigIdFromName(name), - }; - } - - static message(message: Message): types.Message { - return { - kind: 'message', - messageId: message.messageId, - parts: message.content.map(p => this.parts(p)), - contextId: message.contextId ?? undefined, - taskId: message.taskId ?? undefined, - role: message.role === Role.ROLE_AGENT ? "agent" : "user", - metadata: message.metadata, - extensions: message.extensions.length > 0 ? message.extensions : undefined, - }; - } - - static configuration(configuration: SendMessageConfiguration): types.MessageSendConfiguration { + kind: 'file', + file: { + uri: filePart.file.value, + }, + } as types.FilePart; + } else if (filePart.file?.$case === 'fileWithBytes') { return { - blocking: configuration.blocking, - acceptedOutputModes: configuration.acceptedOutputModes, - pushNotificationConfig: configuration.pushNotification - ? this.pushNotificationConfig(configuration.pushNotification) - : undefined, - }; - } - - static pushNotificationConfig(config: PushNotificationConfig): types.PushNotificationConfig { - return { - id: config.id, - url: config.url, - token: config.token, - authentication: config.authentication - ? this.authenticationInfo(config.authentication) - : undefined - }; - } - - static authenticationInfo(authInfo: AuthenticationInfo): types.PushNotificationAuthenticationInfo { - return { - schemes: authInfo.schemes, - credentials: authInfo.credentials, - }; - } - - static parts(part: Part): types.Part { - - if (part.part?.$case === "text") { - return { - kind: "text", - text: part.part.value, - } as types.TextPart; - } - - if (part.part?.$case === "file") { - const filePart = part.part.value; - if (filePart.file?.$case === "fileWithUri") { - return { - kind: "file", - file: { - uri: filePart.file.value, - }, - } as types.FilePart; - } else if (filePart.file?.$case === "fileWithBytes") { - return { - kind: "file", - file: { - bytes: filePart.file.value.toString(), - }, - } as types.FilePart; - } - throw new Error("Invalid file part type"); - } - - if (part.part?.$case === "data") { - return { - kind: "data", - data: part.part.value.data, - } as types.DataPart; - } - - throw new Error("Invalid part type"); - } - - static messageSendParams(request: SendMessageRequest): types.MessageSendParams { - return { - message: this.message(request.request), - configuration: request.configuration ? this.configuration(request.configuration) : undefined, - metadata: request.metadata, - }; - } + kind: 'file', + file: { + bytes: filePart.file.value.toString('base64'), + }, + } as types.FilePart; + } + throw new Error('Invalid file part type'); + } + + if (part.part?.$case === 'data') { + return { + kind: 'data', + data: part.part.value.data, + } as types.DataPart; + } + + throw new Error('Invalid part type'); + } + + static messageSendParams(request: SendMessageRequest): types.MessageSendParams { + return { + message: this.message(request.request), + configuration: request.configuration ? this.configuration(request.configuration) : undefined, + metadata: request.metadata, + }; + } } export class ToProto { - - static agentCard(agentCard: types.AgentCard): AgentCard { - return { - protocolVersion: agentCard.protocolVersion, - name: agentCard.name, - description: agentCard.description, - url: agentCard.url, - preferredTransport: agentCard.preferredTransport ?? '', - additionalInterfaces: agentCard.additionalInterfaces.map(i => this.agentInterface(i)), - provider: this.agentProvider(agentCard.provider), - version: agentCard.version, - documentationUrl: agentCard.documentationUrl ?? '', - capabilities: this.agentCapabilities(agentCard.capabilities), - securitySchemes: Object.fromEntries( - Object.entries(agentCard.securitySchemes).map(([key, value]) => [key, this.securityScheme(value)]) - ), - security: agentCard.security.map(s => this.security(s)), - defaultInputModes: agentCard.defaultInputModes, - defaultOutputModes: agentCard.defaultOutputModes, - skills: agentCard.skills.map(s => this.agentSkill(s)), - supportsAuthenticatedExtendedCard: agentCard.supportsAuthenticatedExtendedCard ?? false, - signatures: agentCard.signatures.map(s => this.signatures(s)), - }; - } - - static signatures(signatures: types.AgentCardSignature): AgentCardSignature { - return { - protected: signatures.protected, - signature: signatures.signature, - header: signatures.header, - }; - } - - static agentSkill(skill: types.AgentSkill): AgentSkill { + static agentCard(agentCard: types.AgentCard): AgentCard { + return { + protocolVersion: agentCard.protocolVersion, + name: agentCard.name, + description: agentCard.description, + url: agentCard.url, + preferredTransport: agentCard.preferredTransport ?? '', + additionalInterfaces: agentCard.additionalInterfaces.map((i) => this.agentInterface(i)), + provider: this.agentProvider(agentCard.provider), + version: agentCard.version, + documentationUrl: agentCard.documentationUrl ?? '', + capabilities: this.agentCapabilities(agentCard.capabilities), + securitySchemes: Object.fromEntries( + Object.entries(agentCard.securitySchemes).map(([key, value]) => [ + key, + this.securityScheme(value), + ]) + ), + security: agentCard.security.map((s) => this.security(s)), + defaultInputModes: agentCard.defaultInputModes, + defaultOutputModes: agentCard.defaultOutputModes, + skills: agentCard.skills.map((s) => this.agentSkill(s)), + supportsAuthenticatedExtendedCard: agentCard.supportsAuthenticatedExtendedCard ?? false, + signatures: agentCard.signatures.map((s) => this.signatures(s)), + }; + } + + static signatures(signatures: types.AgentCardSignature): AgentCardSignature { + return { + protected: signatures.protected, + signature: signatures.signature, + header: signatures.header, + }; + } + + static agentSkill(skill: types.AgentSkill): AgentSkill { + return { + id: skill.id, + name: skill.name, + description: skill.description ?? '', + tags: skill.tags ?? [], + examples: skill.examples ?? [], + inputModes: skill.inputModes ?? [], + outputModes: skill.outputModes ?? [], + security: skill.security.map((s) => this.security(s)), + }; + } + + static security(security: { [k: string]: string[] }): Security { + return { + schemes: Object.fromEntries( + Object.entries(security).map(([key, value]) => { + return [key, { list: value } as StringList]; + }) + ), + }; + } + + static securityScheme(scheme: types.SecurityScheme): SecurityScheme { + switch (scheme.type) { + case 'apiKey': return { - id: skill.id, - name: skill.name, - description: skill.description ?? '', - tags: skill.tags ?? [], - examples: skill.examples ?? [], - inputModes: skill.inputModes ?? [], - outputModes: skill.outputModes ?? [], - security: skill.security.map(s => this.security(s)), + scheme: { + $case: 'apiKeySecurityScheme', + value: { + name: scheme.name, + location: scheme.in, + description: scheme.description ?? '', + } as APIKeySecurityScheme, + }, }; - } - - static security(security: {[k: string]: string[]}): Security { + case 'http': return { - schemes: Object.fromEntries( - Object.entries(security).map(([key, value]) => { - return [key, { list: value } as StringList]; - }) - ), + scheme: { + $case: 'httpAuthSecurityScheme', + value: { + description: scheme.description ?? '', + scheme: scheme.scheme, + bearerFormat: scheme.bearerFormat ?? '', + } as HTTPAuthSecurityScheme, + }, }; - } - - static securityScheme(scheme: types.SecurityScheme): SecurityScheme { - switch (scheme.type) { - case "apiKey": - return { - scheme: { - $case: "apiKeySecurityScheme", - value: { - name: scheme.name, - location: scheme.in, - description: scheme.description ?? '', - } as APIKeySecurityScheme, - } - }; - case "http": - return { - scheme: { - $case: "httpAuthSecurityScheme", - value: { - description: scheme.description ?? '', - scheme: scheme.scheme, - bearerFormat: scheme.bearerFormat ?? '', - } as HTTPAuthSecurityScheme, - } - }; - case "mutualTLS": - return { - scheme: { - $case: "mtlsSecurityScheme", - value: { - description: scheme.description ?? '', - } as MutualTlsSecurityScheme, - } - }; - case "oauth2": - return { - scheme: { - $case: "oauth2SecurityScheme", - value: { - description: scheme.description ?? '', - flows: { - implicit: scheme.flows.implicit - ? { - authorizationUrl: scheme.flows.implicit.authorizationUrl, - refreshUrl: scheme.flows.implicit.refreshUrl ?? '', - scopes: scheme.flows.implicit.scopes, - } as ImplicitOAuthFlow - : undefined, - password: scheme.flows.password - ? { - tokenUrl: scheme.flows.password.tokenUrl, - refreshUrl: scheme.flows.password.refreshUrl ?? '', - scopes: scheme.flows.password.scopes, - } as PasswordOAuthFlow - : undefined, - clientCredentials: scheme.flows.clientCredentials - ? { - tokenUrl: scheme.flows.clientCredentials.tokenUrl, - refreshUrl: scheme.flows.clientCredentials.refreshUrl ?? '', - scopes: scheme.flows.clientCredentials.scopes, - } as ClientCredentialsOAuthFlow - : undefined, - authorizationCode: scheme.flows.authorizationCode - ? { - authorizationUrl: scheme.flows.authorizationCode.authorizationUrl, - tokenUrl: scheme.flows.authorizationCode.tokenUrl, - refreshUrl: scheme.flows.authorizationCode.refreshUrl ?? '', - scopes: scheme.flows.authorizationCode.scopes, - } as AuthorizationCodeOAuthFlow - : undefined, - } as OAuthFlows, - oauth2MetadataUrl: scheme.oauth2MetadataUrl ?? '', - } as OAuth2SecurityScheme, - } - }; - case "openIdConnect": - return { - scheme: { - $case: "openIdConnectSecurityScheme", - value: { - description: scheme.description ?? '', - openIdConnectUrl: scheme.openIdConnectUrl, - } as OpenIdConnectSecurityScheme, - } - }; - default: - throw new Error(`Unknown security scheme type: ${(scheme as any).type}`); - } - } - - static agentInterface(agentInterface: types.AgentInterface): AgentInterface { + case 'mutualTLS': return { - transport: agentInterface.transport, - url: agentInterface.url, + scheme: { + $case: 'mtlsSecurityScheme', + value: { + description: scheme.description ?? '', + } as MutualTlsSecurityScheme, + }, }; - } - - static agentProvider(agentProvider: types.AgentProvider): AgentProvider { + case 'oauth2': return { - url: agentProvider.url, - organization: agentProvider.organization, + scheme: { + $case: 'oauth2SecurityScheme', + value: { + description: scheme.description ?? '', + flows: { + implicit: scheme.flows.implicit + ? ({ + authorizationUrl: scheme.flows.implicit.authorizationUrl, + refreshUrl: scheme.flows.implicit.refreshUrl ?? '', + scopes: scheme.flows.implicit.scopes, + } as ImplicitOAuthFlow) + : undefined, + password: scheme.flows.password + ? ({ + tokenUrl: scheme.flows.password.tokenUrl, + refreshUrl: scheme.flows.password.refreshUrl ?? '', + scopes: scheme.flows.password.scopes, + } as PasswordOAuthFlow) + : undefined, + clientCredentials: scheme.flows.clientCredentials + ? ({ + tokenUrl: scheme.flows.clientCredentials.tokenUrl, + refreshUrl: scheme.flows.clientCredentials.refreshUrl ?? '', + scopes: scheme.flows.clientCredentials.scopes, + } as ClientCredentialsOAuthFlow) + : undefined, + authorizationCode: scheme.flows.authorizationCode + ? ({ + authorizationUrl: scheme.flows.authorizationCode.authorizationUrl, + tokenUrl: scheme.flows.authorizationCode.tokenUrl, + refreshUrl: scheme.flows.authorizationCode.refreshUrl ?? '', + scopes: scheme.flows.authorizationCode.scopes, + } as AuthorizationCodeOAuthFlow) + : undefined, + } as OAuthFlows, + oauth2MetadataUrl: scheme.oauth2MetadataUrl ?? '', + } as OAuth2SecurityScheme, + }, }; - } - - static agentCapabilities(capabilities: types.AgentCapabilities): AgentCapabilities { + case 'openIdConnect': return { - streaming: capabilities.streaming ?? false, - pushNotifications: capabilities.pushNotifications ?? false, - extensions: capabilities.extensions.map(e => this.extension(e)), + scheme: { + $case: 'openIdConnectSecurityScheme', + value: { + description: scheme.description ?? '', + openIdConnectUrl: scheme.openIdConnectUrl, + } as OpenIdConnectSecurityScheme, + }, }; - } - - static extension(extension: types.AgentExtension): AgentExtension { - return { - uri: extension.uri, - description: extension.description ?? '', - required: extension.required ?? false, - params: extension.params, + default: + return undefined; + } + } + + static agentInterface(agentInterface: types.AgentInterface): AgentInterface { + return { + transport: agentInterface.transport, + url: agentInterface.url, + }; + } + + static agentProvider(agentProvider: types.AgentProvider): AgentProvider { + return { + url: agentProvider.url, + organization: agentProvider.organization, + }; + } + + static agentCapabilities(capabilities: types.AgentCapabilities): AgentCapabilities { + return { + streaming: capabilities.streaming ?? false, + pushNotifications: capabilities.pushNotifications ?? false, + extensions: capabilities.extensions.map((e) => this.extension(e)), + }; + } + + static extension(extension: types.AgentExtension): AgentExtension { + return { + uri: extension.uri, + description: extension.description ?? '', + required: extension.required ?? false, + params: extension.params, + }; + } + + static listTaskPushNotificationConfigs( + config: types.TaskPushNotificationConfig[] + ): ListTaskPushNotificationConfigResponse { + return { + configs: config.map((c) => this.taskPushNotificationConfig(c)), + nextPageToken: '', + }; + } + + static taskPushNotificationConfig( + config: types.TaskPushNotificationConfig + ): TaskPushNotificationConfig { + return { + name: `tasks/${config.taskId}/pushNotificationConfigs/${config.pushNotificationConfig.id || ''}`, + pushNotificationConfig: this.pushNotificationConfig(config.pushNotificationConfig), + }; + } + + static pushNotificationConfig(config: types.PushNotificationConfig): PushNotificationConfig { + return { + id: config.id ?? '', + url: config.url, + token: config.token ?? '', + authentication: config.authentication + ? this.authenticationInfo(config.authentication) + : undefined, + }; + } + + static authenticationInfo( + authInfo: types.PushNotificationAuthenticationInfo + ): AuthenticationInfo { + return { + schemes: authInfo.schemes, + credentials: authInfo.credentials ?? '', + }; + } + + static messageStreamResult( + event: types.Message | types.Task | types.TaskStatusUpdateEvent | types.TaskArtifactUpdateEvent + ): StreamResponse { + if (event.kind === 'message') { + return { + payload: { + $case: 'msg', + value: this.message(event), + }, + }; + } else if (event.kind === 'task') { + return { + payload: { + $case: 'task', + value: this.task(event), + }, + }; + } else if (event.kind === 'status-update') { + return { + payload: { + $case: 'statusUpdate', + value: this.taskStatusUpdate(event), + }, + }; + } else if (event.kind === 'artifact-update') { + return { + payload: { + $case: 'artifactUpdate', + value: this.taskArtifactUpdate(event), + }, + }; + } else { + throw new Error('Invalid event type'); + } + } + + static taskStatusUpdate(event: types.TaskStatusUpdateEvent): TaskStatusUpdateEvent { + return { + taskId: event.taskId, + status: this.taskStatus(event.status), + contextId: event.contextId, + metadata: event.metadata, + final: event.final, + }; + } + + static taskArtifactUpdate(event: types.TaskArtifactUpdateEvent): TaskArtifactUpdateEvent { + return { + taskId: event.taskId, + artifact: this.artifact(event.artifact), + contextId: event.contextId, + metadata: event.metadata, + append: event.append ?? false, + lastChunk: event.lastChunk ?? false, + }; + } + + static messageSendResult(params: types.Message | types.Task): SendMessageResponse { + if (params.kind === 'message') { + return { + payload: { + $case: 'msg', + value: this.message(params), + }, + }; + } else if (params.kind === 'task') { + return { + payload: { + $case: 'task', + value: this.task(params), + }, + }; + } + } + + static message(message: types.Message): Message { + return { + messageId: message.messageId, + content: message.parts.map((p) => this.parts(p)), + contextId: message.contextId ?? '', + taskId: message.taskId ?? '', + role: message.role === 'agent' ? Role.ROLE_AGENT : Role.ROLE_USER, + metadata: message.metadata, + extensions: message.extensions ? message.extensions : [], + }; + } + + static task(task: types.Task): Task { + return { + id: task.id, + contextId: task.contextId, + status: this.taskStatus(task.status), + artifacts: task.artifacts.map((a) => this.artifact(a)), + history: task.history.map((m) => this.message(m)), + metadata: task.metadata, + }; + } + + static taskStatus(status: types.TaskStatus): TaskStatus { + return { + state: this.taskState(status.state), + update: status.message ? this.message(status.message) : undefined, + timestamp: status.timestamp ? new Date(status.timestamp) : undefined, + }; + } + + static artifact(artifact: types.Artifact): Artifact { + return { + artifactId: artifact.artifactId, + name: artifact.name ?? '', + description: artifact.description ?? '', + parts: artifact.parts.map((p) => this.parts(p)), + metadata: artifact.metadata, + extensions: artifact.extensions ? artifact.extensions : [], + }; + } + + static taskState(state: types.TaskState): TaskState { + switch (state) { + case 'submitted': + return TaskState.TASK_STATE_SUBMITTED; + case 'working': + return TaskState.TASK_STATE_WORKING; + case 'input-required': + return TaskState.TASK_STATE_INPUT_REQUIRED; + case 'rejected': + return TaskState.TASK_STATE_REJECTED; + case 'auth-required': + return TaskState.TASK_STATE_AUTH_REQUIRED; + case 'completed': + return TaskState.TASK_STATE_COMPLETED; + case 'failed': + return TaskState.TASK_STATE_FAILED; + case 'canceled': + return TaskState.TASK_STATE_CANCELLED; + case 'unknown': + return TaskState.TASK_STATE_UNSPECIFIED; + default: + return TaskState.UNRECOGNIZED; + } + } + + static parts(part: types.Part): Part { + if (part.kind === 'text') { + return { + part: { $case: 'text', value: part.text }, + metadata: { ...part.metadata }, + } as Part; + } + + if (part.kind === 'file') { + let filePart: ProtoFilePart; + if ('uri' in part.file) { + filePart = { + file: { $case: 'fileWithUri', value: part.file.uri }, + mimeType: part.file.mimeType ?? '', }; - } - - static listTaskPushNotificationConfigs(config: types.TaskPushNotificationConfig[]): ListTaskPushNotificationConfigResponse { - return { - configs: config.map(c => this.taskPushNotificationConfig(c)), - nextPageToken: '', - }; - } - - static taskPushNotificationConfig(config: types.TaskPushNotificationConfig): TaskPushNotificationConfig { - return { - name: `tasks/${config.taskId}/pushNotificationConfigs/${config.pushNotificationConfig.id || ''}`, - pushNotificationConfig: this.pushNotificationConfig(config.pushNotificationConfig) - }; - } - - static pushNotificationConfig(config: types.PushNotificationConfig): PushNotificationConfig { - return { - id: config.id ?? '', - url: config.url, - token: config.token ?? '', - authentication: config.authentication - ? this.authenticationInfo(config.authentication) - : undefined - }; - } - - static authenticationInfo(authInfo: types.PushNotificationAuthenticationInfo): AuthenticationInfo { - return { - schemes: authInfo.schemes, - credentials: authInfo.credentials ?? '', + } else if ('bytes' in part.file) { + filePart = { + file: { $case: 'fileWithBytes', value: Buffer.from(part.file.bytes, 'base64') }, + mimeType: part.file.mimeType ?? '', }; + } else { + throw new Error('Invalid file part'); + } + return { + part: { $case: 'file', value: filePart }, + metadata: { ...part.metadata }, + } as Part; } - static messageStreamResult(event: types.Message | types.Task | types.TaskStatusUpdateEvent | types.TaskArtifactUpdateEvent): StreamResponse { - if (event.kind === "message") { - return { - payload: { - $case: 'msg', - value: this.message(event), - }, - }; - } else if (event.kind === "task") { - return { - payload: { - $case: 'task', - value: this.task(event), - }, - }; - } else if (event.kind === "status-update") { - return { - payload: { - $case: 'statusUpdate', - value: this.taskStatusUpdate(event), - }, - }; - } else if (event.kind === "artifact-update") { - return { - payload: { - $case: 'artifactUpdate', - value: this.taskArtifactUpdate(event), - }, - }; - } else { - throw new Error("Invalid event type"); - } + if (part.kind === 'data') { + return { + part: { $case: 'data', value: { data: part.data } }, + metadata: { ...part.metadata }, + } as Part; } - static taskStatusUpdate(event: types.TaskStatusUpdateEvent): TaskStatusUpdateEvent { - return { - taskId: event.taskId, - status: this.taskStatus(event.status), - contextId: event.contextId, - metadata: event.metadata, - final: event.final, - }; - } - - static taskArtifactUpdate(event: types.TaskArtifactUpdateEvent): TaskArtifactUpdateEvent { - return { - taskId: event.taskId, - artifact: this.artifact(event.artifact), - contextId: event.contextId, - metadata: event.metadata, - append: event.append ?? false, - lastChunk: event.lastChunk ?? false, - }; - } - - static messageSendResult(params: types.Message | types.Task): SendMessageResponse { - if (params.kind === "message") { - return { - payload: { - $case: 'msg', - value: this.message(params), - }, - }; - } else if (params.kind === "task") { - return { - payload: { - $case: 'task', - value: this.task(params), - }, - }; - } - } - - static message(message: types.Message): Message { - return { - messageId: message.messageId, - content: message.parts.map(p => this.parts(p)), - contextId: message.contextId ?? '', - taskId: message.taskId ?? '', - role: message.role === 'agent' ? Role.ROLE_AGENT : Role.ROLE_USER, - metadata: message.metadata, - extensions: message.extensions ? message.extensions : [], - }; - } - - static task(task: types.Task): Task { - return { - id: task.id, - contextId: task.contextId, - status: this.taskStatus(task.status), - artifacts: task.artifacts.map(a => this.artifact(a)), - history: task.history.map(m => this.message(m)), - metadata: task.metadata, - }; - } - - static taskStatus(status: types.TaskStatus): TaskStatus { - return { - state: this.taskState(status.state), - update: status.message ? this.message(status.message) : undefined, - timestamp: status.timestamp ? new Date(status.timestamp) : undefined, - }; - } - - static artifact(artifact: types.Artifact): Artifact { - return { - artifactId: artifact.artifactId, - name: artifact.name ?? '', - description: artifact.description ?? '', - parts: artifact.parts.map(p => this.parts(p)), - metadata: artifact.metadata, - extensions: artifact.extensions ? artifact.extensions : [], - }; - } - - static taskState(state: types.TaskState): TaskState { - switch (state) { - case "submitted": - return TaskState.TASK_STATE_SUBMITTED; - case "working": - return TaskState.TASK_STATE_WORKING; - case "input-required": - return TaskState.TASK_STATE_INPUT_REQUIRED; - case "rejected": - return TaskState.TASK_STATE_REJECTED; - case "auth-required": - return TaskState.TASK_STATE_AUTH_REQUIRED; - case "completed": - return TaskState.TASK_STATE_COMPLETED; - case "failed": - return TaskState.TASK_STATE_FAILED; - case "canceled": - return TaskState.TASK_STATE_CANCELLED; - case "unknown": - return TaskState.TASK_STATE_UNSPECIFIED; - default: - return TaskState.UNRECOGNIZED; - } - } - - static parts(part: types.Part): Part { - - if (part.kind === "text") { - return { - part: { $case: "text", value: part.text }, - metadata: { ...part.metadata }, - } as Part; - } - - if (part.kind === "file") { - let filePart: ProtoFilePart; - if ('uri' in part.file) { - filePart = { file: { $case: "fileWithUri", value: part.file.uri }, mimeType: part.file.mimeType ?? '' }; - } else if ('bytes' in part.file) { - filePart = { file: { $case: "fileWithBytes", value: Buffer.from(part.file.bytes) }, mimeType: part.file.mimeType ?? '' }; - } else { - throw new Error("Invalid file part"); - } - return { - part: { $case: "file", value: filePart }, - metadata: { ...part.metadata }, - } as Part; - } - - if (part.kind === "data") { - return { - part: { $case: "data", value: { data: part.data } }, - metadata: { ...part.metadata }, - } as Part; - } - - throw new Error("Invalid part type"); - } -} \ No newline at end of file + throw new Error('Invalid part type'); + } +} diff --git a/src/samples/agents/sample-agent/client.ts b/src/samples/agents/sample-agent/client.ts index 19d95ffd..f0568c88 100644 --- a/src/samples/agents/sample-agent/client.ts +++ b/src/samples/agents/sample-agent/client.ts @@ -1,44 +1,46 @@ -import { ServiceError, credentials } from "@grpc/grpc-js"; -import { A2AServiceClient, SendMessageRequest, Role, SendMessageResponse} from "../../../grpc/a2a.js"; +import { ServiceError, credentials } from '@grpc/grpc-js'; +import { + A2AServiceClient, + SendMessageRequest, + Role, + SendMessageResponse, +} from '../../../grpc/a2a.js'; -const client = new A2AServiceClient( - "localhost:8080", - credentials.createInsecure() -); +const client = new A2AServiceClient('localhost:8080', credentials.createInsecure()); function sendMessageExample() { const request: SendMessageRequest = { - tenant: "sample-tenant", + tenant: 'sample-tenant', configuration: { - blocking: true, - acceptedOutputModes: ["text"], - pushNotificationConfig: undefined, + blocking: true, + acceptedOutputModes: ['text'], + pushNotificationConfig: undefined, }, metadata: {}, request: { - messageId: "msg-1", + messageId: 'msg-1', parts: [ { - part: { $case: "text", value: "Hello, Agent!" }, + part: { $case: 'text', value: 'Hello, Agent!' }, metadata: {}, }, ], role: Role.ROLE_USER, - contextId: "context-1", - taskId: undefined, - metadata: {}, - extensions: [], - referenceTaskIds: [], + contextId: 'context-1', + taskId: undefined, + metadata: {}, + extensions: [], + referenceTaskIds: [], }, }; client.sendMessage(request, (error: ServiceError | null, response: SendMessageResponse) => { if (error) { - console.error("Error sending message:", error); + console.error('Error sending message:', error); } else { - console.log("Received response:", response); + console.log('Received response:', response); } }); } -sendMessageExample(); \ No newline at end of file +sendMessageExample(); diff --git a/src/samples/agents/sample-agent/grpc.ts b/src/samples/agents/sample-agent/grpc.ts index 8f8d9ff2..a9ba13e8 100644 --- a/src/samples/agents/sample-agent/grpc.ts +++ b/src/samples/agents/sample-agent/grpc.ts @@ -1,12 +1,11 @@ import * as grpc from '@grpc/grpc-js'; -import { AgentCard, AGENT_CARD_PATH } from '../../../index.js'; +import { AgentCard } from '../../../index.js'; import { InMemoryTaskStore, TaskStore, AgentExecutor, DefaultRequestHandler, } from '../../../server/index.js'; -import { agentCardHandler, jsonRpcHandler, UserBuilder } from '../../../server/express/index.js'; import { SampleAgentExecutor } from './agent_executor.js'; import { A2AServiceService } from '../../../grpc/a2a.js'; import { createGRPCHandler } from '../../../server/grpc/grpc_handler.js'; @@ -57,9 +56,9 @@ async function main() { const server = new grpc.Server(); server.addService(A2AServiceService, createGRPCHandler(requestHandler)); - server.bindAsync("localhost:8080", grpc.ServerCredentials.createInsecure(), () => { - console.log("Server running at http://localhost:8080"); -}); + server.bindAsync('localhost:8080', grpc.ServerCredentials.createInsecure(), () => { + console.log('Server running at http://localhost:8080'); + }); } main().catch(console.error); diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index 5835d338..d1e52ca9 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -1,10 +1,34 @@ import * as grpc from '@grpc/grpc-js'; -import { A2AServiceServer, A2AServiceService, AgentCard, CancelTaskRequest, CreateTaskPushNotificationConfigRequest, DeleteTaskPushNotificationConfigRequest, GetAgentCardRequest, GetTaskPushNotificationConfigRequest, GetTaskRequest, ListTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigResponse, Message, SendMessageRequest, SendMessageResponse, StreamResponse, Task, TaskPushNotificationConfig, TaskSubscriptionRequest } from '../../grpc/a2a.js'; -import { Task as A2ATask, DeleteTaskPushNotificationConfigParams, GetTaskPushNotificationConfigParams, ListTaskPushNotificationConfigParams, MessageSendParams, TaskIdParams, TaskPushNotificationConfig as TaskPushNotificationConfigInternal, TaskQueryParams } from '../../types.js'; +import { + A2AServiceServer, + AgentCard, + CancelTaskRequest, + CreateTaskPushNotificationConfigRequest, + DeleteTaskPushNotificationConfigRequest, + GetAgentCardRequest, + GetTaskPushNotificationConfigRequest, + GetTaskRequest, + ListTaskPushNotificationConfigRequest, + ListTaskPushNotificationConfigResponse, + SendMessageRequest, + SendMessageResponse, + StreamResponse, + Task, + TaskPushNotificationConfig, + TaskSubscriptionRequest, +} from '../../grpc/a2a.js'; +import { + DeleteTaskPushNotificationConfigParams, + GetTaskPushNotificationConfigParams, + ListTaskPushNotificationConfigParams, + MessageSendParams, + TaskIdParams, + TaskPushNotificationConfig as TaskPushNotificationConfigInternal, + TaskQueryParams, +} from '../../types.js'; import { Empty } from '../../grpc/google/protobuf/empty.js'; import { A2ARequestHandler } from '../request_handler/a2a_request_handler.js'; import { FromProto, ToProto } from '../../grpc/utils/proto_type_converter.js'; -import { UserBuilder } from '../express/common.js'; import { gRpcTransportHandler } from '../transports/grpc/grpc_transport_handler.js'; import { ServerCallContext } from '../context.js'; import { Extensions } from '../../extensions.js'; @@ -17,7 +41,9 @@ import { A2AError } from '../error.js'; */ export interface gRpcHandlerOptions { requestHandler: A2ARequestHandler; - userBuilder: (call: grpc.ServerUnaryCall | grpc.ServerWritableStream) => Promise; + userBuilder: ( + call: grpc.ServerUnaryCall | grpc.ServerWritableStream + ) => Promise; } /** @@ -29,7 +55,7 @@ export interface gRpcHandlerOptions { * @returns An object that implements the A2AServiceServer interface. */ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { - const grpcTransportHandler = new gRpcTransportHandler(options.requestHandler); + const grpcTransportHandler = new gRpcTransportHandler(options.requestHandler); return { async sendMessage( @@ -43,13 +69,19 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { const response = ToProto.messageSendResult(task); callback(null, response); } catch (error) { - const a2aError = error instanceof A2AError ? error - : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + const a2aError = + error instanceof A2AError + ? error + : A2AError.internalError( + error instanceof Error ? error.message : 'Internal server error' + ); callback(mapToError(a2aError), null); } }, - async sendStreamingMessage(call: grpc.ServerWritableStream): Promise { + async sendStreamingMessage( + call: grpc.ServerWritableStream + ): Promise { try { const context = await buildContext(call, options.userBuilder); const params: MessageSendParams = FromProto.messageSendParams(call.request); @@ -59,31 +91,42 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { call.write(response); } } catch (error) { - const a2aError = error instanceof A2AError ? error - : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + const a2aError = + error instanceof A2AError + ? error + : A2AError.internalError( + error instanceof Error ? error.message : 'Internal server error' + ); call.emit('error', a2aError); } finally { call.end(); } }, - taskSubscription(call: grpc.ServerWritableStream): void { + taskSubscription( + call: grpc.ServerWritableStream + ): void { call.emit('error', A2AError.unsupportedOperation('Streaming not supported.')); call.end(); }, - + async deleteTaskPushNotificationConfig( call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData ): Promise { try { const context = await buildContext(call, options.userBuilder); - const params: DeleteTaskPushNotificationConfigParams = FromProto.deleteTaskPushNotificationConfigParams(call.request); + const params: DeleteTaskPushNotificationConfigParams = + FromProto.deleteTaskPushNotificationConfigParams(call.request); await grpcTransportHandler.deleteTaskPushNotificationConfig(params, context); callback(null, null); } catch (error) { - const a2aError = error instanceof A2AError ? error - : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + const a2aError = + error instanceof A2AError + ? error + : A2AError.internalError( + error instanceof Error ? error.message : 'Internal server error' + ); callback(a2aError, null); } }, @@ -96,29 +139,46 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { ): Promise { try { const context = await buildContext(call, options.userBuilder); - const params: ListTaskPushNotificationConfigParams = FromProto.listTaskPushNotificationConfigParams(call.request); - const listTaskPushNotificationConfigs = await grpcTransportHandler.listTaskPushNotificationConfigs(params, context); + const params: ListTaskPushNotificationConfigParams = + FromProto.listTaskPushNotificationConfigParams(call.request); + const listTaskPushNotificationConfigs = + await grpcTransportHandler.listTaskPushNotificationConfigs(params, context); const response = ToProto.listTaskPushNotificationConfigs(listTaskPushNotificationConfigs); callback(null, response); } catch (error) { - const a2aError = error instanceof A2AError ? error - : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + const a2aError = + error instanceof A2AError + ? error + : A2AError.internalError( + error instanceof Error ? error.message : 'Internal server error' + ); callback(a2aError, null); } }, async createTaskPushNotificationConfig( - call: grpc.ServerUnaryCall, + call: grpc.ServerUnaryCall< + CreateTaskPushNotificationConfigRequest, + TaskPushNotificationConfig + >, callback: grpc.sendUnaryData ): Promise { try { const context = await buildContext(call, options.userBuilder); - const params: TaskPushNotificationConfigInternal = FromProto.setTaskPushNotificationConfigParams(call.request); - const taskPushNotificationConfig = await grpcTransportHandler.setTaskPushNotificationConfig(params, context); + const params: TaskPushNotificationConfigInternal = + FromProto.setTaskPushNotificationConfigParams(call.request); + const taskPushNotificationConfig = await grpcTransportHandler.setTaskPushNotificationConfig( + params, + context + ); const response = ToProto.taskPushNotificationConfig(taskPushNotificationConfig); callback(null, response); } catch (error) { - const a2aError = error instanceof A2AError ? error - : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + const a2aError = + error instanceof A2AError + ? error + : A2AError.internalError( + error instanceof Error ? error.message : 'Internal server error' + ); callback(a2aError, null); } }, @@ -128,17 +188,28 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { ): Promise { try { const context = await buildContext(call, options.userBuilder); - const params: GetTaskPushNotificationConfigParams = FromProto.getTaskPushNotificationConfigParams(call.request); - const taskPushNotificationConfig = await grpcTransportHandler.getTaskPushNotificationConfig(params, context); + const params: GetTaskPushNotificationConfigParams = + FromProto.getTaskPushNotificationConfigParams(call.request); + const taskPushNotificationConfig = await grpcTransportHandler.getTaskPushNotificationConfig( + params, + context + ); const response = ToProto.taskPushNotificationConfig(taskPushNotificationConfig); callback(null, response); } catch (error) { - const a2aError = error instanceof A2AError ? error - : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + const a2aError = + error instanceof A2AError + ? error + : A2AError.internalError( + error instanceof Error ? error.message : 'Internal server error' + ); callback(a2aError, null); } }, - async getTask(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): Promise { + async getTask( + call: grpc.ServerUnaryCall, + callback: grpc.sendUnaryData + ): Promise { try { const context = await buildContext(call, options.userBuilder); const params: TaskQueryParams = FromProto.taskQueryParams(call.request); @@ -146,12 +217,19 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { const response = ToProto.task(task); callback(null, response); } catch (error) { - const a2aError = error instanceof A2AError ? error - : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + const a2aError = + error instanceof A2AError + ? error + : A2AError.internalError( + error instanceof Error ? error.message : 'Internal server error' + ); callback(a2aError, null); } }, - async cancelTask(call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData): Promise { + async cancelTask( + call: grpc.ServerUnaryCall, + callback: grpc.sendUnaryData + ): Promise { try { const context = await buildContext(call, options.userBuilder); const params: TaskIdParams = FromProto.taskIdParams(call.request); @@ -159,8 +237,12 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { const response = ToProto.task(task); callback(null, response); } catch (error) { - const a2aError = error instanceof A2AError ? error - : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + const a2aError = + error instanceof A2AError + ? error + : A2AError.internalError( + error instanceof Error ? error.message : 'Internal server error' + ); callback(a2aError, null); } }, @@ -174,8 +256,12 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { const response = ToProto.agentCard(agentCard); callback(null, response); } catch (error) { - const a2aError = error instanceof A2AError ? error - : A2AError.internalError(error instanceof Error ? error.message : 'Internal server error'); + const a2aError = + error instanceof A2AError + ? error + : A2AError.internalError( + error instanceof Error ? error.message : 'Internal server error' + ); callback(a2aError, null); } }, @@ -183,57 +269,53 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { } const mapToError = (error: A2AError): Partial => { - grpc.status - switch (error.code) { - case -32001: - return { - code: grpc.status.NOT_FOUND, - details: error.message, - metadata: undefined, - }; - case -32002 || -32007 || -32008: - return { - code: grpc.status.FAILED_PRECONDITION, - details: error.message, - metadata: undefined, - }; - case -32003 || -32004 || -32009: - return { - code: grpc.status.UNIMPLEMENTED, - details: error.message, - metadata: undefined, - }; - case -32005: - return { - code: grpc.status.INVALID_ARGUMENT, - details: error.message, - metadata: undefined, - }; - case -32006: - return { - code: grpc.status.INTERNAL, - details: error.message, - metadata: undefined, - }; - case -32009: - return { - code: grpc.status.UNIMPLEMENTED, - details: error.message, - metadata: undefined, - }; - } -} + switch (error.code) { + case -32001: + return { + code: grpc.status.NOT_FOUND, + details: error.message, + }; + case -32002: + case -32007: + case -32008: + return { + code: grpc.status.FAILED_PRECONDITION, + details: error.message, + }; + case -32003: + case -32004: + case -32009: + return { + code: grpc.status.UNIMPLEMENTED, + details: error.message, + }; + case -32005: + return { + code: grpc.status.INVALID_ARGUMENT, + details: error.message, + }; + case -32006: + return { + code: grpc.status.INTERNAL, + details: error.message, + }; + } +}; const buildContext = async ( - call: grpc.ServerUnaryCall | grpc.ServerWritableStream, - userBuilder: (call: grpc.ServerUnaryCall | grpc.ServerWritableStream) => Promise - ): Promise => { - const user = await userBuilder(call); - const extensionHeader = call.metadata.get(HTTP_EXTENSION_HEADER.toLowerCase()); - const extensionString = Array.isArray(extensionHeader) ? extensionHeader.join('') : extensionHeader; + call: grpc.ServerUnaryCall | grpc.ServerWritableStream, + userBuilder: ( + call: grpc.ServerUnaryCall | grpc.ServerWritableStream + ) => Promise +): Promise => { + const user = await userBuilder(call); + const extensionHeader = call.metadata.get(HTTP_EXTENSION_HEADER.toLowerCase()); + const extensionString = Array.isArray(extensionHeader) + ? extensionHeader.join('') + : extensionHeader; - return new ServerCallContext( - Extensions.parseServiceParameter(extensionString), - user ?? new UnauthenticatedUser() - ); - } \ No newline at end of file + return new ServerCallContext( + Extensions.parseServiceParameter(extensionString), + user ?? new UnauthenticatedUser() + ); +}; diff --git a/src/server/transports/grpc/grpc_transport_handler.ts b/src/server/transports/grpc/grpc_transport_handler.ts index 72ab8c67..fa136e75 100644 --- a/src/server/transports/grpc/grpc_transport_handler.ts +++ b/src/server/transports/grpc/grpc_transport_handler.ts @@ -10,143 +10,152 @@ import { TaskPushNotificationConfig, TaskQueryParams, TaskIdParams, - Part, AgentCard, - FileWithBytes, - FileWithUri, DeleteTaskPushNotificationConfigParams, ListTaskPushNotificationConfigParams, GetTaskPushNotificationConfigParams, } from '../../../types.js'; export class gRpcTransportHandler { - private requestHandler: A2ARequestHandler; + private requestHandler: A2ARequestHandler; - constructor(requestHandler: A2ARequestHandler) { - this.requestHandler = requestHandler; - } + constructor(requestHandler: A2ARequestHandler) { + this.requestHandler = requestHandler; + } + + /** + * Gets the agent card (for capability checks). + */ + async getAgentCard(): Promise { + return this.requestHandler.getAgentCard(); + } + + /** + * Gets the authenticated extended agent card. + */ + async getAuthenticatedExtendedAgentCard(context: ServerCallContext): Promise { + return this.requestHandler.getAuthenticatedExtendedAgentCard(context); + } + + /** + * Sends a message to the agent. + * Accepts both snake_case and camelCase input, returns camelCase. + */ + async sendMessage( + params: MessageSendParams, + context: ServerCallContext + ): Promise { + return this.requestHandler.sendMessage(params, context); + } + + /** + * Sends a message with streaming response. + * Accepts both snake_case and camelCase input, returns camelCase stream. + * @throws {A2AError} UnsupportedOperation if streaming not supported + */ + async sendMessageStream( + params: MessageSendParams, + context: ServerCallContext + ): Promise< + AsyncGenerator< + Message | Task | TaskStatusUpdateEvent | TaskArtifactUpdateEvent, + void, + undefined + > + > { + this.requireCapability('streaming'); + return this.requestHandler.sendMessageStream(params, context); + } + + /** + * Gets a task by ID. + * Validates historyLength parameter if provided. + */ + async getTask(params: TaskQueryParams, context: ServerCallContext): Promise { + return this.requestHandler.getTask(params, context); + } + + /** + * Cancels a task. + */ + async cancelTask(params: TaskIdParams, context: ServerCallContext): Promise { + return this.requestHandler.cancelTask(params, context); + } - /** - * Gets the agent card (for capability checks). - */ - async getAgentCard(): Promise { - return this.requestHandler.getAgentCard(); - } - - /** - * Gets the authenticated extended agent card. - */ - async getAuthenticatedExtendedAgentCard(context: ServerCallContext): Promise { - return this.requestHandler.getAuthenticatedExtendedAgentCard(context); - } - - /** - * Sends a message to the agent. - * Accepts both snake_case and camelCase input, returns camelCase. - */ - async sendMessage( - params: MessageSendParams, - context: ServerCallContext - ): Promise { - return this.requestHandler.sendMessage(params, context); - } - - /** - * Sends a message with streaming response. - * Accepts both snake_case and camelCase input, returns camelCase stream. - * @throws {A2AError} UnsupportedOperation if streaming not supported - */ - async sendMessageStream( - params: MessageSendParams, - context: ServerCallContext - ): Promise< - AsyncGenerator< - Message | Task | TaskStatusUpdateEvent | TaskArtifactUpdateEvent, - void, - undefined - > - > { - return this.requestHandler.sendMessageStream(params, context); - } - - /** - * Gets a task by ID. - * Validates historyLength parameter if provided. - */ - async getTask( - params: TaskQueryParams, - context: ServerCallContext, - ): Promise { - return this.requestHandler.getTask(params, context); - } - - /** - * Cancels a task. - */ - async cancelTask(params: TaskIdParams, context: ServerCallContext): Promise { - return this.requestHandler.cancelTask(params, context); - } - - /** - * Resubscribes to task updates. - * Returns camelCase stream of task updates. - * @throws {A2AError} UnsupportedOperation if streaming not supported - */ - async resubscribe( - taskId: string, - context: ServerCallContext - ): Promise< - AsyncGenerator - > { - const params: TaskIdParams = { id: taskId }; - return this.requestHandler.resubscribe(params, context); - } - - /** - * Sets a push notification configuration. - * Accepts both snake_case and camelCase input, returns camelCase. - * @throws {A2AError} PushNotificationNotSupported if push notifications not supported - */ - async setTaskPushNotificationConfig( - config: TaskPushNotificationConfig, - context: ServerCallContext - ): Promise { - return this.requestHandler.setTaskPushNotificationConfig(config, context); - } - - /** - * Lists all push notification configurations for a task. - */ - async listTaskPushNotificationConfigs( - params: ListTaskPushNotificationConfigParams, - context: ServerCallContext - ): Promise { - return this.requestHandler.listTaskPushNotificationConfigs(params, context); - } - - /** - * Gets a specific push notification configuration. - */ - async getTaskPushNotificationConfig( - params: GetTaskPushNotificationConfigParams, - context: ServerCallContext - ): Promise { - return this.requestHandler.getTaskPushNotificationConfig( - params, - context - ); - } - - /** - * Deletes a push notification configuration. - */ - async deleteTaskPushNotificationConfig( - params: DeleteTaskPushNotificationConfigParams, - context: ServerCallContext - ): Promise { - await this.requestHandler.deleteTaskPushNotificationConfig( - params, - context - ); - } -} \ No newline at end of file + /** + * Resubscribes to task updates. + * Returns camelCase stream of task updates. + * @throws {A2AError} UnsupportedOperation if streaming not supported + */ + async resubscribe( + taskId: string, + context: ServerCallContext + ): Promise< + AsyncGenerator + > { + const params: TaskIdParams = { id: taskId }; + return this.requestHandler.resubscribe(params, context); + } + + /** + * Sets a push notification configuration. + * Accepts both snake_case and camelCase input, returns camelCase. + * @throws {A2AError} PushNotificationNotSupported if push notifications not supported + */ + async setTaskPushNotificationConfig( + config: TaskPushNotificationConfig, + context: ServerCallContext + ): Promise { + this.requireCapability('pushNotifications'); + return this.requestHandler.setTaskPushNotificationConfig(config, context); + } + + /** + * Lists all push notification configurations for a task. + */ + async listTaskPushNotificationConfigs( + params: ListTaskPushNotificationConfigParams, + context: ServerCallContext + ): Promise { + return this.requestHandler.listTaskPushNotificationConfigs(params, context); + } + + /** + * Gets a specific push notification configuration. + */ + async getTaskPushNotificationConfig( + params: GetTaskPushNotificationConfigParams, + context: ServerCallContext + ): Promise { + return this.requestHandler.getTaskPushNotificationConfig(params, context); + } + + /** + * Deletes a push notification configuration. + */ + async deleteTaskPushNotificationConfig( + params: DeleteTaskPushNotificationConfigParams, + context: ServerCallContext + ): Promise { + await this.requestHandler.deleteTaskPushNotificationConfig(params, context); + } + + /** + * Static map of capability to error for missing capabilities. + */ + private readonly CAPABILITY_ERRORS: Record<'streaming' | 'pushNotifications', () => A2AError> = { + streaming: () => A2AError.unsupportedOperation('Agent does not support streaming'), + pushNotifications: () => A2AError.pushNotificationNotSupported(), + }; + + /** + * Validates that the agent supports a required capability. + * @throws {A2AError} UnsupportedOperation for streaming, PushNotificationNotSupported for push notifications + */ + private async requireCapability(capability: 'streaming' | 'pushNotifications'): Promise { + const agentCard = await this.getAgentCard(); + if (!agentCard.capabilities?.[capability]) { + throw this.CAPABILITY_ERRORS[capability](); + } + } +} From 926cb78f6b366639dcc52c44c31442d57ab6cdb2 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Thu, 18 Dec 2025 14:55:44 +0000 Subject: [PATCH 10/64] wip --- src/grpc/utils/proto_type_converter.ts | 112 ++++--- src/server/grpc/grpc_handler.ts | 308 ++++++++---------- .../transports/grpc/grpc_transport_handler.ts | 9 +- test/server/grpc_handler.spec.ts | 108 ++++++ 4 files changed, 313 insertions(+), 224 deletions(-) create mode 100644 test/server/grpc_handler.spec.ts diff --git a/src/grpc/utils/proto_type_converter.ts b/src/grpc/utils/proto_type_converter.ts index 5d13fd23..aa09ec7a 100644 --- a/src/grpc/utils/proto_type_converter.ts +++ b/src/grpc/utils/proto_type_converter.ts @@ -166,7 +166,7 @@ export class FromProto { return { kind: 'text', text: part.part.value, - } as types.TextPart; + }; } if (part.part?.$case === 'file') { @@ -177,14 +177,14 @@ export class FromProto { file: { uri: filePart.file.value, }, - } as types.FilePart; + }; } else if (filePart.file?.$case === 'fileWithBytes') { return { kind: 'file', file: { bytes: filePart.file.value.toString('base64'), }, - } as types.FilePart; + }; } throw new Error('Invalid file part type'); } @@ -193,7 +193,7 @@ export class FromProto { return { kind: 'data', data: part.part.value.data, - } as types.DataPart; + }; } throw new Error('Invalid part type'); @@ -261,7 +261,7 @@ export class ToProto { return { schemes: Object.fromEntries( Object.entries(security).map(([key, value]) => { - return [key, { list: value } as StringList]; + return [key, { list: value }]; }) ), }; @@ -277,7 +277,7 @@ export class ToProto { name: scheme.name, location: scheme.in, description: scheme.description ?? '', - } as APIKeySecurityScheme, + }, }, }; case 'http': @@ -288,7 +288,7 @@ export class ToProto { description: scheme.description ?? '', scheme: scheme.scheme, bearerFormat: scheme.bearerFormat ?? '', - } as HTTPAuthSecurityScheme, + }, }, }; case 'mutualTLS': @@ -297,7 +297,7 @@ export class ToProto { $case: 'mtlsSecurityScheme', value: { description: scheme.description ?? '', - } as MutualTlsSecurityScheme, + }, }, }; case 'oauth2': @@ -306,39 +306,9 @@ export class ToProto { $case: 'oauth2SecurityScheme', value: { description: scheme.description ?? '', - flows: { - implicit: scheme.flows.implicit - ? ({ - authorizationUrl: scheme.flows.implicit.authorizationUrl, - refreshUrl: scheme.flows.implicit.refreshUrl ?? '', - scopes: scheme.flows.implicit.scopes, - } as ImplicitOAuthFlow) - : undefined, - password: scheme.flows.password - ? ({ - tokenUrl: scheme.flows.password.tokenUrl, - refreshUrl: scheme.flows.password.refreshUrl ?? '', - scopes: scheme.flows.password.scopes, - } as PasswordOAuthFlow) - : undefined, - clientCredentials: scheme.flows.clientCredentials - ? ({ - tokenUrl: scheme.flows.clientCredentials.tokenUrl, - refreshUrl: scheme.flows.clientCredentials.refreshUrl ?? '', - scopes: scheme.flows.clientCredentials.scopes, - } as ClientCredentialsOAuthFlow) - : undefined, - authorizationCode: scheme.flows.authorizationCode - ? ({ - authorizationUrl: scheme.flows.authorizationCode.authorizationUrl, - tokenUrl: scheme.flows.authorizationCode.tokenUrl, - refreshUrl: scheme.flows.authorizationCode.refreshUrl ?? '', - scopes: scheme.flows.authorizationCode.scopes, - } as AuthorizationCodeOAuthFlow) - : undefined, - } as OAuthFlows, + flows: this.oauthFlows(scheme.flows), oauth2MetadataUrl: scheme.oauth2MetadataUrl ?? '', - } as OAuth2SecurityScheme, + }, }, }; case 'openIdConnect': @@ -348,7 +318,7 @@ export class ToProto { value: { description: scheme.description ?? '', openIdConnectUrl: scheme.openIdConnectUrl, - } as OpenIdConnectSecurityScheme, + }, }, }; default: @@ -356,6 +326,57 @@ export class ToProto { } } + static oauthFlows(flows: types.OAuthFlows): OAuthFlows { + if (flows.implicit) { + return { + flow: { + $case: 'implicit', + value: { + authorizationUrl: flows.implicit.authorizationUrl, + scopes: flows.implicit.scopes, + refreshUrl: flows.implicit.refreshUrl, + }, + }, + }; + } else if (flows.password) { + return { + flow: { + $case: 'password', + value: { + tokenUrl: flows.password.tokenUrl, + scopes: flows.password.scopes, + refreshUrl: flows.password.refreshUrl, + }, + }, + }; + } else if (flows.clientCredentials) { + return { + flow: { + $case: 'clientCredentials', + value: { + tokenUrl: flows.clientCredentials.tokenUrl, + scopes: flows.clientCredentials.scopes, + refreshUrl: flows.clientCredentials.refreshUrl, + }, + }, + }; + } else if (flows.authorizationCode) { + return { + flow: { + $case: 'authorizationCode', + value: { + authorizationUrl: flows.authorizationCode.authorizationUrl, + tokenUrl: flows.authorizationCode.tokenUrl, + scopes: flows.authorizationCode.scopes, + refreshUrl: flows.authorizationCode.refreshUrl, + }, + }, + }; + } else { + return undefined; + } + } + static agentInterface(agentInterface: types.AgentInterface): AgentInterface { return { transport: agentInterface.transport, @@ -571,8 +592,7 @@ export class ToProto { if (part.kind === 'text') { return { part: { $case: 'text', value: part.text }, - metadata: { ...part.metadata }, - } as Part; + }; } if (part.kind === 'file') { @@ -592,15 +612,13 @@ export class ToProto { } return { part: { $case: 'file', value: filePart }, - metadata: { ...part.metadata }, - } as Part; + }; } if (part.kind === 'data') { return { part: { $case: 'data', value: { data: part.data } }, - metadata: { ...part.metadata }, - } as Part; + }; } throw new Error('Invalid part type'); diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index d1e52ca9..0143964a 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -18,13 +18,8 @@ import { TaskSubscriptionRequest, } from '../../grpc/a2a.js'; import { - DeleteTaskPushNotificationConfigParams, - GetTaskPushNotificationConfigParams, - ListTaskPushNotificationConfigParams, MessageSendParams, TaskIdParams, - TaskPushNotificationConfig as TaskPushNotificationConfigInternal, - TaskQueryParams, } from '../../types.js'; import { Empty } from '../../grpc/google/protobuf/empty.js'; import { A2ARequestHandler } from '../request_handler/a2a_request_handler.js'; @@ -57,26 +52,40 @@ export interface gRpcHandlerOptions { export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { const grpcTransportHandler = new gRpcTransportHandler(options.requestHandler); + /** + * Helper to wrap Unary calls with common logic (context, metadata, error handling) + */ + const wrapUnary = async ( + call: grpc.ServerUnaryCall, + callback: grpc.sendUnaryData, + parser: (req: TReq) => TParams, + handler: (params: TParams, ctx: ServerCallContext) => Promise, + converter: (res: TResult) => TRes + ) => { + try { + const context = await buildContext(call, options.userBuilder); + const params = parser(call.request); + const result = await handler(params, context); + + call.sendMetadata(buildMetadata(context)); + callback(null, converter(result)); + } catch (error) { + callback(mapToError(error), null); + } + }; + return { async sendMessage( call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData ): Promise { - try { - const context = await buildContext(call, options.userBuilder); - const params: MessageSendParams = FromProto.messageSendParams(call.request); - const task = await grpcTransportHandler.sendMessage(params, context); - const response = ToProto.messageSendResult(task); - callback(null, response); - } catch (error) { - const a2aError = - error instanceof A2AError - ? error - : A2AError.internalError( - error instanceof Error ? error.message : 'Internal server error' - ); - callback(mapToError(a2aError), null); - } + return wrapUnary( + call, + callback, + FromProto.messageSendParams, + grpcTransportHandler.sendMessage, + ToProto.messageSendResult + ); }, async sendStreamingMessage( @@ -86,6 +95,8 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { const context = await buildContext(call, options.userBuilder); const params: MessageSendParams = FromProto.messageSendParams(call.request); const stream = await grpcTransportHandler.sendMessageStream(params, context); + const metadata = buildMetadata(context); + call.sendMetadata(metadata); for await (const responsePart of stream) { const response = ToProto.messageStreamResult(responsePart); call.write(response); @@ -97,29 +108,25 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { : A2AError.internalError( error instanceof Error ? error.message : 'Internal server error' ); - call.emit('error', a2aError); + call.emit('error', mapToError(a2aError)); } finally { call.end(); } }, - taskSubscription( + async taskSubscription( call: grpc.ServerWritableStream - ): void { - call.emit('error', A2AError.unsupportedOperation('Streaming not supported.')); - call.end(); - }, - - async deleteTaskPushNotificationConfig( - call: grpc.ServerUnaryCall, - callback: grpc.sendUnaryData ): Promise { try { const context = await buildContext(call, options.userBuilder); - const params: DeleteTaskPushNotificationConfigParams = - FromProto.deleteTaskPushNotificationConfigParams(call.request); - await grpcTransportHandler.deleteTaskPushNotificationConfig(params, context); - callback(null, null); + const params: TaskIdParams = FromProto.taskIdParams(call.request); + const stream = await grpcTransportHandler.resubscribe(params, context); + const metadata = buildMetadata(context); + call.sendMetadata(metadata); + for await (const responsePart of stream) { + const response = ToProto.messageStreamResult(responsePart); + call.write(response); + } } catch (error) { const a2aError = error instanceof A2AError @@ -127,9 +134,24 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { : A2AError.internalError( error instanceof Error ? error.message : 'Internal server error' ); - callback(a2aError, null); + call.emit('error', mapToError(a2aError)); + } finally { + call.end(); } }, + + async deleteTaskPushNotificationConfig( + call: grpc.ServerUnaryCall, + callback: grpc.sendUnaryData + ): Promise { + return wrapUnary( + call, + callback, + FromProto.deleteTaskPushNotificationConfigParams, + grpcTransportHandler.deleteTaskPushNotificationConfig, + () => ({}) + ); + }, async listTaskPushNotificationConfig( call: grpc.ServerUnaryCall< ListTaskPushNotificationConfigRequest, @@ -137,23 +159,13 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { >, callback: grpc.sendUnaryData ): Promise { - try { - const context = await buildContext(call, options.userBuilder); - const params: ListTaskPushNotificationConfigParams = - FromProto.listTaskPushNotificationConfigParams(call.request); - const listTaskPushNotificationConfigs = - await grpcTransportHandler.listTaskPushNotificationConfigs(params, context); - const response = ToProto.listTaskPushNotificationConfigs(listTaskPushNotificationConfigs); - callback(null, response); - } catch (error) { - const a2aError = - error instanceof A2AError - ? error - : A2AError.internalError( - error instanceof Error ? error.message : 'Internal server error' - ); - callback(a2aError, null); - } + return wrapUnary( + call, + callback, + FromProto.listTaskPushNotificationConfigParams, + grpcTransportHandler.listTaskPushNotificationConfigs, + ToProto.listTaskPushNotificationConfigs + ); }, async createTaskPushNotificationConfig( call: grpc.ServerUnaryCall< @@ -162,160 +174,112 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { >, callback: grpc.sendUnaryData ): Promise { - try { - const context = await buildContext(call, options.userBuilder); - const params: TaskPushNotificationConfigInternal = - FromProto.setTaskPushNotificationConfigParams(call.request); - const taskPushNotificationConfig = await grpcTransportHandler.setTaskPushNotificationConfig( - params, - context - ); - const response = ToProto.taskPushNotificationConfig(taskPushNotificationConfig); - callback(null, response); - } catch (error) { - const a2aError = - error instanceof A2AError - ? error - : A2AError.internalError( - error instanceof Error ? error.message : 'Internal server error' - ); - callback(a2aError, null); - } + return wrapUnary( + call, + callback, + FromProto.setTaskPushNotificationConfigParams, + grpcTransportHandler.setTaskPushNotificationConfig, + ToProto.taskPushNotificationConfig + ); }, async getTaskPushNotificationConfig( call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData ): Promise { - try { - const context = await buildContext(call, options.userBuilder); - const params: GetTaskPushNotificationConfigParams = - FromProto.getTaskPushNotificationConfigParams(call.request); - const taskPushNotificationConfig = await grpcTransportHandler.getTaskPushNotificationConfig( - params, - context - ); - const response = ToProto.taskPushNotificationConfig(taskPushNotificationConfig); - callback(null, response); - } catch (error) { - const a2aError = - error instanceof A2AError - ? error - : A2AError.internalError( - error instanceof Error ? error.message : 'Internal server error' - ); - callback(a2aError, null); - } + return wrapUnary( + call, + callback, + FromProto.getTaskPushNotificationConfigParams, + grpcTransportHandler.getTaskPushNotificationConfig, + ToProto.taskPushNotificationConfig + ); }, async getTask( call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData ): Promise { - try { - const context = await buildContext(call, options.userBuilder); - const params: TaskQueryParams = FromProto.taskQueryParams(call.request); - const task = await grpcTransportHandler.getTask(params, context); - const response = ToProto.task(task); - callback(null, response); - } catch (error) { - const a2aError = - error instanceof A2AError - ? error - : A2AError.internalError( - error instanceof Error ? error.message : 'Internal server error' - ); - callback(a2aError, null); - } + return wrapUnary( + call, + callback, + FromProto.taskQueryParams, + grpcTransportHandler.getTask, + ToProto.task + ); }, async cancelTask( call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData ): Promise { - try { - const context = await buildContext(call, options.userBuilder); - const params: TaskIdParams = FromProto.taskIdParams(call.request); - const task = await grpcTransportHandler.cancelTask(params, context); - const response = ToProto.task(task); - callback(null, response); - } catch (error) { - const a2aError = - error instanceof A2AError - ? error - : A2AError.internalError( - error instanceof Error ? error.message : 'Internal server error' - ); - callback(a2aError, null); - } + return wrapUnary( + call, + callback, + FromProto.taskIdParams, + grpcTransportHandler.cancelTask, + ToProto.task + ); }, async getAgentCard( call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData ): Promise { - try { - const context = await buildContext(call, options.userBuilder); - const agentCard = await grpcTransportHandler.getAuthenticatedExtendedAgentCard(context); - const response = ToProto.agentCard(agentCard); - callback(null, response); - } catch (error) { - const a2aError = - error instanceof A2AError - ? error - : A2AError.internalError( - error instanceof Error ? error.message : 'Internal server error' - ); - callback(a2aError, null); - } + return wrapUnary( + call, + callback, + () => ({}), + (_, context) => this.grpcTransportHandler.getAgentCard(context), + ToProto.agentCard + ); }, }; } -const mapToError = (error: A2AError): Partial => { - switch (error.code) { - case -32001: - return { - code: grpc.status.NOT_FOUND, - details: error.message, - }; - case -32002: - case -32007: - case -32008: - return { - code: grpc.status.FAILED_PRECONDITION, - details: error.message, - }; - case -32003: - case -32004: - case -32009: - return { - code: grpc.status.UNIMPLEMENTED, - details: error.message, - }; - case -32005: - return { - code: grpc.status.INVALID_ARGUMENT, - details: error.message, - }; - case -32006: - return { - code: grpc.status.INTERNAL, - details: error.message, - }; - } +// --- Internal Helpers --- + +/** + * Maps A2AError or standard Error to gRPC Status codes + */ +const mapping: Record = { + [-32001]: grpc.status.NOT_FOUND, + [-32002]: grpc.status.FAILED_PRECONDITION, + [-32007]: grpc.status.FAILED_PRECONDITION, + [-32008]: grpc.status.FAILED_PRECONDITION, + [-32003]: grpc.status.UNIMPLEMENTED, + [-32004]: grpc.status.UNIMPLEMENTED, + [-32009]: grpc.status.UNIMPLEMENTED, + [-32005]: grpc.status.INVALID_ARGUMENT, + [-32006]: grpc.status.INTERNAL, + }; + +const mapToError = (error: unknown): Partial => { + const a2aError = error instanceof A2AError + ? error + : A2AError.internalError(error instanceof Error ? error.message : 'Unknown Error'); + + return { + message: a2aError.message, + code: mapping[a2aError.code] ?? grpc.status.INTERNAL, + details: a2aError.message, + }; }; const buildContext = async ( call: grpc.ServerUnaryCall | grpc.ServerWritableStream, - userBuilder: ( - call: grpc.ServerUnaryCall | grpc.ServerWritableStream - ) => Promise + userBuilder: gRpcHandlerOptions['userBuilder'] ): Promise => { const user = await userBuilder(call); const extensionHeader = call.metadata.get(HTTP_EXTENSION_HEADER.toLowerCase()); - const extensionString = Array.isArray(extensionHeader) - ? extensionHeader.join('') - : extensionHeader; + const extensionString = Array.isArray(extensionHeader) ? extensionHeader.join(',') : (extensionHeader as string); return new ServerCallContext( Extensions.parseServiceParameter(extensionString), user ?? new UnauthenticatedUser() ); }; + +const buildMetadata = (context: ServerCallContext): grpc.Metadata => { + const metadata = new grpc.Metadata(); + if (context.activatedExtensions?.length) { + metadata.set(HTTP_EXTENSION_HEADER, context.activatedExtensions.join(',')); + } + return metadata; +}; diff --git a/src/server/transports/grpc/grpc_transport_handler.ts b/src/server/transports/grpc/grpc_transport_handler.ts index fa136e75..b5049897 100644 --- a/src/server/transports/grpc/grpc_transport_handler.ts +++ b/src/server/transports/grpc/grpc_transport_handler.ts @@ -39,7 +39,6 @@ export class gRpcTransportHandler { /** * Sends a message to the agent. - * Accepts both snake_case and camelCase input, returns camelCase. */ async sendMessage( params: MessageSendParams, @@ -50,7 +49,6 @@ export class gRpcTransportHandler { /** * Sends a message with streaming response. - * Accepts both snake_case and camelCase input, returns camelCase stream. * @throws {A2AError} UnsupportedOperation if streaming not supported */ async sendMessageStream( @@ -72,6 +70,9 @@ export class gRpcTransportHandler { * Validates historyLength parameter if provided. */ async getTask(params: TaskQueryParams, context: ServerCallContext): Promise { + if (params.historyLength !== undefined && params.historyLength < 0){ + throw A2AError.invalidParams('historyLength must be non-negative'); + } return this.requestHandler.getTask(params, context); } @@ -88,18 +89,16 @@ export class gRpcTransportHandler { * @throws {A2AError} UnsupportedOperation if streaming not supported */ async resubscribe( - taskId: string, + params: TaskIdParams, context: ServerCallContext ): Promise< AsyncGenerator > { - const params: TaskIdParams = { id: taskId }; return this.requestHandler.resubscribe(params, context); } /** * Sets a push notification configuration. - * Accepts both snake_case and camelCase input, returns camelCase. * @throws {A2AError} PushNotificationNotSupported if push notifications not supported */ async setTaskPushNotificationConfig( diff --git a/test/server/grpc_handler.spec.ts b/test/server/grpc_handler.spec.ts new file mode 100644 index 00000000..9f19b606 --- /dev/null +++ b/test/server/grpc_handler.spec.ts @@ -0,0 +1,108 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import * as grpc from '@grpc/grpc-js'; +import { grpcHandler } from './your-file-path.js'; // Adjust path +import { gRpcTransportHandler } from '../transports/grpc/grpc_transport_handler.js'; +import { FromProto, ToProto } from '../../grpc/utils/proto_type_converter.js'; +import { A2AError } from '../error.js'; +import { HTTP_EXTENSION_HEADER } from '../../constants.js'; + +// Mock dependencies +vi.mock('../transports/grpc/grpc_transport_handler.js'); +vi.mock('../../grpc/utils/proto_type_converter.js'); + +describe('grpcHandler', () => { + let mockRequestHandler: any; + let mockUserBuilder: any; + let transportInstance: any; + + beforeEach(() => { + vi.clearAllMocks(); + + mockRequestHandler = {}; + mockUserBuilder = vi.fn().mockResolvedValue({ id: 'user-123' }); + + // Setup transport mock instance + transportInstance = { + sendMessage: vi.fn(), + getTask: vi.fn(), + }; + (gRpcTransportHandler as any).mockImplementation(() => transportInstance); + }); + + const createMockUnaryCall = (request: any, metadataValues: Record = {}) => { + const metadata = new grpc.Metadata(); + Object.entries(metadataValues).forEach(([k, v]) => metadata.set(k, v)); + + return { + request, + metadata, + sendMetadata: vi.fn(), + } as unknown as grpc.ServerUnaryCall; + }; + + describe('sendMessage', () => { + it('should successfully process a message and return the response', async () => { + // 1. Arrange + const handler = grpcHandler({ requestHandler: mockRequestHandler, userBuilder: mockUserBuilder }); + const mockRequest = { text: 'hello' }; + const mockParams = { message: 'hello' }; + const mockResult = { id: 'task-1' }; + const mockProtoRes = { taskId: 'task-1' }; + const callback = vi.fn(); + + vi.mocked(FromProto.messageSendParams).mockReturnValue(mockParams); + transportInstance.sendMessage.mockResolvedValue(mockResult); + vi.mocked(ToProto.messageSendResult).mockReturnValue(mockProtoRes); + + const call = createMockUnaryCall(mockRequest, { [HTTP_EXTENSION_HEADER.toLowerCase()]: 'ext1' }); + + // 2. Act + await handler.sendMessage(call, callback); + + // 3. Assert + expect(mockUserBuilder).toHaveBeenCalledWith(call); + expect(transportInstance.sendMessage).toHaveBeenCalledWith(mockParams, expect.any(Object)); + expect(call.sendMetadata).toHaveBeenCalled(); + expect(callback).toHaveBeenCalledWith(null, mockProtoRes); + }); + + it('should catch A2AErrors and map them to gRPC status codes', async () => { + // 1. Arrange + const handler = grpcHandler({ requestHandler: mockRequestHandler, userBuilder: mockUserBuilder }); + const callback = vi.fn(); + + const a2aError = new A2AError('Not found', -32001); // Maps to NOT_FOUND + transportInstance.sendMessage.mockRejectedValue(a2aError); + + const call = createMockUnaryCall({}); + + // 2. Act + await handler.sendMessage(call, callback); + + // 3. Assert + expect(callback).toHaveBeenCalledWith( + expect.objectContaining({ + code: grpc.status.NOT_FOUND, + message: 'Not found' + }), + null + ); + }); + }); + + describe('Context and Metadata Building', () => { + it('should correctly pass extensions from metadata to context', async () => { + const handler = grpcHandler({ requestHandler: mockRequestHandler, userBuilder: mockUserBuilder }); + const callback = vi.fn(); + + const call = createMockUnaryCall({}, { [HTTP_EXTENSION_HEADER.toLowerCase()]: 'test-extension' }); + + await handler.getTask(call, callback); + + // Check if transport was called with context containing the extension + const contextArgument = transportInstance.getTask.mock.calls[0][1]; + // Note: You'll need to verify how your Extensions.parseServiceParameter works + expect(contextArgument.user.id).toBe('user-123'); + }); + }); +}); \ No newline at end of file From 4c6a0432bd381c9073159992ca2eec8d9b929e6e Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Thu, 18 Dec 2025 15:15:43 +0000 Subject: [PATCH 11/64] wip --- package-lock.json | 927 +++++++++++-------------------- package.json | 2 +- test/server/grpc_handler.spec.ts | 213 ++++--- 3 files changed, 474 insertions(+), 668 deletions(-) diff --git a/package-lock.json b/package-lock.json index b37969b0..89941458 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "tsx": "^4.19.3", "typescript": "^5.9.3", "typescript-eslint": "^8.46.4", - "vitest": "^4.0.15" + "vitest": "^3.2.4" }, "engines": { "node": ">=18" @@ -1492,13 +1492,6 @@ "node": ">=4" } }, - "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/body-parser": { "version": "1.19.6", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", @@ -2028,50 +2021,77 @@ } }, "node_modules/@vitest/expect": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.15.tgz", - "integrity": "sha512-Gfyva9/GxPAWXIWjyGDli9O+waHDC0Q0jaLdFP1qPAUUfo1FEXPXUfUkp3eZA0sSq340vPycSyOlYUeM15Ft1w==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "license": "MIT", "dependencies": { - "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.15", - "@vitest/utils": "4.0.15", - "chai": "^6.2.1", - "tinyrainbow": "^3.0.3" + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/expect/node_modules/chai": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.1.tgz", - "integrity": "sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==", + "node_modules/@vitest/expect/node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" + "node": ">=14.0.0" } }, "node_modules/@vitest/mocker": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.15.tgz", - "integrity": "sha512-CZ28GLfOEIFkvCFngN8Sfx5h+Se0zN+h4B7yOsPVCcgtiO7t5jt9xQh2E1UkFep+eb9fjyMfuC5gBypwb07fvQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.0.15", + "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", - "magic-string": "^0.30.21" + "magic-string": "^0.30.17" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "peerDependenciesMeta": { "msw": { @@ -2096,40 +2116,105 @@ } }, "node_modules/@vitest/runner": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.15.tgz", - "integrity": "sha512-+A+yMY8dGixUhHmNdPUxOh0la6uVzun86vAbuMT3hIDxMrAOmn5ILBHm8ajrqHE0t8R9T1dGnde1A5DTnmi3qw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.0.15", - "pathe": "^2.0.3" + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/runner/node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@vitest/snapshot": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.15.tgz", - "integrity": "sha512-A7Ob8EdFZJIBjLjeO0DZF4lqR6U7Ydi5/5LIZ0xcI+23lYlsYJAfGn8PrIWTYdZQRNnSRlzhg0zyGu37mVdy5g==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.0.15", - "magic-string": "^0.30.21", + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/snapshot/node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot/node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@vitest/spy": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.15.tgz", - "integrity": "sha512-+EIjOJmnY6mIfdXtE/bnozKEvTC4Uczg19yeZ2vtCz5Yyb0QQ31QWVQ8hswJ3Ysx/K2EqaNsVanjr//2+P3FHw==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", "dev": true, "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, "funding": { "url": "https://opencollective.com/vitest" } @@ -2493,6 +2578,23 @@ "url": "https://github.com/sponsors/mesqueeb" } }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2517,6 +2619,16 @@ "dev": true, "license": "MIT" }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -2783,6 +2895,16 @@ "node": ">=0.10.0" } }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -5198,6 +5320,13 @@ "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "license": "Apache-2.0" }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -5902,6 +6031,16 @@ "dev": true, "license": "MIT" }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -6966,6 +7105,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -7147,6 +7306,16 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, "node_modules/tinyrainbow": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", @@ -7157,6 +7326,16 @@ "node": ">=14.0.0" } }, + "node_modules/tinyspy": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -8033,13 +8212,13 @@ } }, "node_modules/vite": { - "version": "7.2.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.7.tgz", - "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", + "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.25.0", + "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", @@ -8107,576 +8286,138 @@ } } }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, "engines": { - "node": ">=18" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, "engines": { - "node": ">=18" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } } }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], + "node_modules/vitest/node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], + "node_modules/vitest/node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], + "node_modules/vitest/node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/vitest": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.15.tgz", - "integrity": "sha512-n1RxDp8UJm6N0IbJLQo+yzLZ2sQCDyl1o0LeugbPWf8+8Fttp29GghsQBjYJVmWq3gBFfe9Hs1spR44vovn2wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.15", - "@vitest/mocker": "4.0.15", - "@vitest/pretty-format": "4.0.15", - "@vitest/runner": "4.0.15", - "@vitest/snapshot": "4.0.15", - "@vitest/spy": "4.0.15", - "@vitest/utils": "4.0.15", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.21", - "obug": "^2.1.1", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.10.0", - "tinybench": "^2.9.0", - "tinyexec": "^1.0.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@opentelemetry/api": "^1.9.0", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.15", - "@vitest/browser-preview": "4.0.15", - "@vitest/browser-webdriverio": "4.0.15", - "@vitest/ui": "4.0.15", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@opentelemetry/api": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" + "node": ">=14.0.0" } }, "node_modules/walkdir": { diff --git a/package.json b/package.json index b0657806..e063b925 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "tsx": "^4.19.3", "typescript": "^5.9.3", "typescript-eslint": "^8.46.4", - "vitest": "^4.0.15" + "vitest": "^3.2.4" }, "scripts": { "clean": "gts clean", diff --git a/test/server/grpc_handler.spec.ts b/test/server/grpc_handler.spec.ts index 9f19b606..4c645de3 100644 --- a/test/server/grpc_handler.spec.ts +++ b/test/server/grpc_handler.spec.ts @@ -1,38 +1,39 @@ -import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { describe, it, beforeEach, afterEach, assert, expect, vi, Mock } from 'vitest'; import * as grpc from '@grpc/grpc-js'; -import { grpcHandler } from './your-file-path.js'; // Adjust path -import { gRpcTransportHandler } from '../transports/grpc/grpc_transport_handler.js'; -import { FromProto, ToProto } from '../../grpc/utils/proto_type_converter.js'; -import { A2AError } from '../error.js'; -import { HTTP_EXTENSION_HEADER } from '../../constants.js'; +import { A2AError, A2ARequestHandler } from '../../src/server/index.js'; +import { grpcHandler } from '../../src/server/grpc/grpc_handler.js'; +import { AgentCard, HTTP_EXTENSION_HEADER, Task } from '../../src/index.js'; -// Mock dependencies -vi.mock('../transports/grpc/grpc_transport_handler.js'); -vi.mock('../../grpc/utils/proto_type_converter.js'); describe('grpcHandler', () => { - let mockRequestHandler: any; - let mockUserBuilder: any; - let transportInstance: any; - - beforeEach(() => { - vi.clearAllMocks(); + let mockRequestHandler: A2ARequestHandler; + let handler: ReturnType; + + const testAgentCard: AgentCard = { + protocolVersion: '0.3.0', + name: 'Test Agent', + description: 'An agent for testing purposes', + url: 'http://localhost:8080', + preferredTransport: 'gRPC', + version: '1.0.0', + capabilities: { streaming: true, pushNotifications: true }, + defaultInputModes: ['text/plain'], + defaultOutputModes: ['text/plain'], + skills: [], + }; - mockRequestHandler = {}; - mockUserBuilder = vi.fn().mockResolvedValue({ id: 'user-123' }); - - // Setup transport mock instance - transportInstance = { - sendMessage: vi.fn(), - getTask: vi.fn(), - }; - (gRpcTransportHandler as any).mockImplementation(() => transportInstance); - }); + const testTask: Task = { + id: 'task-1', + kind: 'task' as const, + status: { state: 'completed' as const }, + contextId: 'ctx-1', + history: [], + }; + // Helper to create a mock gRPC Unary Call const createMockUnaryCall = (request: any, metadataValues: Record = {}) => { const metadata = new grpc.Metadata(); Object.entries(metadataValues).forEach(([k, v]) => metadata.set(k, v)); - return { request, metadata, @@ -40,69 +41,133 @@ describe('grpcHandler', () => { } as unknown as grpc.ServerUnaryCall; }; - describe('sendMessage', () => { - it('should successfully process a message and return the response', async () => { - // 1. Arrange - const handler = grpcHandler({ requestHandler: mockRequestHandler, userBuilder: mockUserBuilder }); - const mockRequest = { text: 'hello' }; - const mockParams = { message: 'hello' }; - const mockResult = { id: 'task-1' }; - const mockProtoRes = { taskId: 'task-1' }; - const callback = vi.fn(); + // Helper to create a mock gRPC Writable Stream + const createMockWritableStream = (request: any) => { + return { + request, + metadata: new grpc.Metadata(), + sendMetadata: vi.fn(), + write: vi.fn(), + end: vi.fn(), + emit: vi.fn(), + } as unknown as grpc.ServerWritableStream; + }; - vi.mocked(FromProto.messageSendParams).mockReturnValue(mockParams); - transportInstance.sendMessage.mockResolvedValue(mockResult); - vi.mocked(ToProto.messageSendResult).mockReturnValue(mockProtoRes); + beforeEach(() => { + mockRequestHandler = { + getAgentCard: vi.fn().mockResolvedValue(testAgentCard), + getAuthenticatedExtendedAgentCard: vi.fn().mockResolvedValue(testAgentCard), + sendMessage: vi.fn(), + sendMessageStream: vi.fn(), + getTask: vi.fn(), + cancelTask: vi.fn(), + setTaskPushNotificationConfig: vi.fn(), + getTaskPushNotificationConfig: vi.fn(), + listTaskPushNotificationConfigs: vi.fn(), + deleteTaskPushNotificationConfig: vi.fn(), + resubscribe: vi.fn(), + } as unknown as A2ARequestHandler; + + handler = grpcHandler({ + requestHandler: mockRequestHandler, + userBuilder: async () => ({ id: 'test-user' } as any), + }); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); - const call = createMockUnaryCall(mockRequest, { [HTTP_EXTENSION_HEADER.toLowerCase()]: 'ext1' }); + describe('getAgentCard', () => { + it('should return agent card via gRPC callback', async () => { + const call = createMockUnaryCall({}); + const callback = vi.fn(); - // 2. Act - await handler.sendMessage(call, callback); + await handler.getAgentCard(call, callback); - // 3. Assert - expect(mockUserBuilder).toHaveBeenCalledWith(call); - expect(transportInstance.sendMessage).toHaveBeenCalledWith(mockParams, expect.any(Object)); + expect(mockRequestHandler.getAuthenticatedExtendedAgentCard).toHaveBeenCalled(); + // Verify callback: callback(error, response) + const [err, response] = callback.mock.calls[0]; + assert.isNull(err); + assert.equal(response.name, testAgentCard.name); expect(call.sendMetadata).toHaveBeenCalled(); - expect(callback).toHaveBeenCalledWith(null, mockProtoRes); }); - it('should catch A2AErrors and map them to gRPC status codes', async () => { - // 1. Arrange - const handler = grpcHandler({ requestHandler: mockRequestHandler, userBuilder: mockUserBuilder }); + it('should return gRPC error code on failure', async () => { + (mockRequestHandler.getAuthenticatedExtendedAgentCard as Mock).mockRejectedValue( + new A2AError(-32001, 'Not Found') + ); + const call = createMockUnaryCall({}); const callback = vi.fn(); - - const a2aError = new A2AError('Not found', -32001); // Maps to NOT_FOUND - transportInstance.sendMessage.mockRejectedValue(a2aError); - const call = createMockUnaryCall({}); + await handler.getAgentCard(call, callback); + + const [err] = callback.mock.calls[0]; + assert.equal(err.code, grpc.status.NOT_FOUND); + assert.equal(err.details, 'Not Found'); + }); + }); + + describe('sendMessage', () => { + it('should successfully send a message and return a task', async () => { + (mockRequestHandler.sendMessage as Mock).mockResolvedValue(testTask); + const call = createMockUnaryCall({ message: { role: 'user', parts: [] } }); + const callback = vi.fn(); - // 2. Act await handler.sendMessage(call, callback); - // 3. Assert - expect(callback).toHaveBeenCalledWith( - expect.objectContaining({ - code: grpc.status.NOT_FOUND, - message: 'Not found' - }), - null - ); + const [err, response] = callback.mock.calls[0]; + assert.isNull(err); + assert.equal(response.id, testTask.id); + }); + }); + + describe('sendStreamingMessage', () => { + it('should stream multiple parts and end correctly', async () => { + async function* mockStream() { + yield { kind: 'message', messageId: 'm1' }; + yield { kind: 'task', id: 't1' }; + } + (mockRequestHandler.sendMessageStream as Mock).mockResolvedValue(mockStream()); + + const call = createMockWritableStream({ message: { role: 'user', parts: [] } }); + + await handler.sendStreamingMessage(call); + + expect(call.write).toHaveBeenCalledTimes(2); + expect(call.end).toHaveBeenCalled(); + expect(call.sendMetadata).toHaveBeenCalled(); + }); + + it('should emit error on stream failure', async () => { + (mockRequestHandler.sendMessageStream as Mock).mockRejectedValue(new Error('Stream crash')); + const call = createMockWritableStream({}); + + await handler.sendStreamingMessage(call); + + expect(call.emit).toHaveBeenCalledWith('error', expect.objectContaining({ + code: grpc.status.INTERNAL + })); + expect(call.end).toHaveBeenCalled(); }); }); - describe('Context and Metadata Building', () => { - it('should correctly pass extensions from metadata to context', async () => { - const handler = grpcHandler({ requestHandler: mockRequestHandler, userBuilder: mockUserBuilder }); - const callback = vi.fn(); - - const call = createMockUnaryCall({}, { [HTTP_EXTENSION_HEADER.toLowerCase()]: 'test-extension' }); - - await handler.getTask(call, callback); - - // Check if transport was called with context containing the extension - const contextArgument = transportInstance.getTask.mock.calls[0][1]; - // Note: You'll need to verify how your Extensions.parseServiceParameter works - expect(contextArgument.user.id).toBe('user-123'); + describe('Extensions (Metadata) Handling', () => { + it('should extract extensions from metadata and pass to context', async () => { + (mockRequestHandler.getTask as Mock).mockResolvedValue(testTask); + + // Mocking the header 'x-a2a-extension' + const call = createMockUnaryCall({ id: 'task-1' }, { + [HTTP_EXTENSION_HEADER.toLowerCase()]: 'extension-v1' + }); + const callback = vi.fn(); + + await handler.getTask(call, callback); + + // Verify that the handler passed the parsed extension to the RequestHandler + const contextArg = (mockRequestHandler.getTask as Mock).mock.calls[0][1]; + // This assumes your ServerCallContext holds the extensions + expect(contextArg).toBeDefined(); }); }); }); \ No newline at end of file From 7df1553a601f43c7edec154fcd1a20849e4dbf2d Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Thu, 18 Dec 2025 16:34:48 +0000 Subject: [PATCH 12/64] wip tests --- src/server/grpc/grpc_handler.ts | 19 +++++++++---------- test/server/grpc_handler.spec.ts | 32 +++++++++++++++++++++----------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index 0143964a..eade4b5f 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -66,7 +66,6 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { const context = await buildContext(call, options.userBuilder); const params = parser(call.request); const result = await handler(params, context); - call.sendMetadata(buildMetadata(context)); callback(null, converter(result)); } catch (error) { @@ -83,7 +82,7 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { call, callback, FromProto.messageSendParams, - grpcTransportHandler.sendMessage, + (params, context) => grpcTransportHandler.sendMessage(params, context), ToProto.messageSendResult ); }, @@ -148,7 +147,7 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { call, callback, FromProto.deleteTaskPushNotificationConfigParams, - grpcTransportHandler.deleteTaskPushNotificationConfig, + grpcTransportHandler.deleteTaskPushNotificationConfig.bind(grpcTransportHandler), () => ({}) ); }, @@ -163,7 +162,7 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { call, callback, FromProto.listTaskPushNotificationConfigParams, - grpcTransportHandler.listTaskPushNotificationConfigs, + grpcTransportHandler.listTaskPushNotificationConfigs.bind(grpcTransportHandler), ToProto.listTaskPushNotificationConfigs ); }, @@ -178,7 +177,7 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { call, callback, FromProto.setTaskPushNotificationConfigParams, - grpcTransportHandler.setTaskPushNotificationConfig, + grpcTransportHandler.setTaskPushNotificationConfig.bind(grpcTransportHandler), ToProto.taskPushNotificationConfig ); }, @@ -190,7 +189,7 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { call, callback, FromProto.getTaskPushNotificationConfigParams, - grpcTransportHandler.getTaskPushNotificationConfig, + grpcTransportHandler.getTaskPushNotificationConfig.bind(grpcTransportHandler), ToProto.taskPushNotificationConfig ); }, @@ -202,7 +201,7 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { call, callback, FromProto.taskQueryParams, - grpcTransportHandler.getTask, + grpcTransportHandler.getTask.bind(grpcTransportHandler), ToProto.task ); }, @@ -214,7 +213,7 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { call, callback, FromProto.taskIdParams, - grpcTransportHandler.cancelTask, + grpcTransportHandler.cancelTask.bind(grpcTransportHandler), ToProto.task ); }, @@ -222,11 +221,11 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { call: grpc.ServerUnaryCall, callback: grpc.sendUnaryData ): Promise { - return wrapUnary( + return await wrapUnary( call, callback, () => ({}), - (_, context) => this.grpcTransportHandler.getAgentCard(context), + (_params, _context) => grpcTransportHandler.getAgentCard(), ToProto.agentCard ); }, diff --git a/test/server/grpc_handler.spec.ts b/test/server/grpc_handler.spec.ts index 4c645de3..b68405f1 100644 --- a/test/server/grpc_handler.spec.ts +++ b/test/server/grpc_handler.spec.ts @@ -1,9 +1,12 @@ import { describe, it, beforeEach, afterEach, assert, expect, vi, Mock } from 'vitest'; import * as grpc from '@grpc/grpc-js'; +import * as proto from '../../src/grpc/a2a.js'; import { A2AError, A2ARequestHandler } from '../../src/server/index.js'; import { grpcHandler } from '../../src/server/grpc/grpc_handler.js'; -import { AgentCard, HTTP_EXTENSION_HEADER, Task } from '../../src/index.js'; +import { AgentCard, HTTP_EXTENSION_HEADER, MessageSendParams, Task } from '../../src/index.js'; +import { FromProto, ToProto } from '../../src/grpc/utils/proto_type_converter.js'; +vi.mock('../../src/grpc/utils/proto_type_converter.js'); describe('grpcHandler', () => { let mockRequestHandler: A2ARequestHandler; @@ -31,7 +34,7 @@ describe('grpcHandler', () => { }; // Helper to create a mock gRPC Unary Call - const createMockUnaryCall = (request: any, metadataValues: Record = {}) => { + const createMockUnaryCall = (request: any, metadataValues: Record = {}): grpc.ServerUnaryCall => { const metadata = new grpc.Metadata(); Object.entries(metadataValues).forEach(([k, v]) => metadata.set(k, v)); return { @@ -56,8 +59,8 @@ describe('grpcHandler', () => { beforeEach(() => { mockRequestHandler = { getAgentCard: vi.fn().mockResolvedValue(testAgentCard), - getAuthenticatedExtendedAgentCard: vi.fn().mockResolvedValue(testAgentCard), - sendMessage: vi.fn(), + getAuthenticatedExtendedAgentCard: vi.fn(), + sendMessage: vi.fn().mockResolvedValue(testTask), sendMessageStream: vi.fn(), getTask: vi.fn(), cancelTask: vi.fn(), @@ -66,7 +69,7 @@ describe('grpcHandler', () => { listTaskPushNotificationConfigs: vi.fn(), deleteTaskPushNotificationConfig: vi.fn(), resubscribe: vi.fn(), - } as unknown as A2ARequestHandler; + }; handler = grpcHandler({ requestHandler: mockRequestHandler, @@ -82,19 +85,22 @@ describe('grpcHandler', () => { it('should return agent card via gRPC callback', async () => { const call = createMockUnaryCall({}); const callback = vi.fn(); + const mockProtoAgentCard = { name: 'Proto Test Agent' } as proto.AgentCard; + + (ToProto.agentCard as Mock).mockReturnValue(mockProtoAgentCard); await handler.getAgentCard(call, callback); - expect(mockRequestHandler.getAuthenticatedExtendedAgentCard).toHaveBeenCalled(); - // Verify callback: callback(error, response) + expect(mockRequestHandler.getAgentCard).toHaveBeenCalled(); + expect(ToProto.agentCard).toHaveBeenCalledWith(testAgentCard); const [err, response] = callback.mock.calls[0]; assert.isNull(err); - assert.equal(response.name, testAgentCard.name); + assert.deepEqual(response, mockProtoAgentCard); expect(call.sendMetadata).toHaveBeenCalled(); }); it('should return gRPC error code on failure', async () => { - (mockRequestHandler.getAuthenticatedExtendedAgentCard as Mock).mockRejectedValue( + (mockRequestHandler.getAgentCard as Mock).mockRejectedValue( new A2AError(-32001, 'Not Found') ); const call = createMockUnaryCall({}); @@ -110,15 +116,19 @@ describe('grpcHandler', () => { describe('sendMessage', () => { it('should successfully send a message and return a task', async () => { - (mockRequestHandler.sendMessage as Mock).mockResolvedValue(testTask); const call = createMockUnaryCall({ message: { role: 'user', parts: [] } }); const callback = vi.fn(); + const messageSendParams = { message: { role: 'user' } } as MessageSendParams + (FromProto.messageSendParams as Mock).mockReturnValue(messageSendParams); + const sendMessageResponse = { payload: { $case: 'task', value: { id: 'task-1' } } as proto.SendMessageResponse }; + (ToProto.messageSendResult as Mock).mockReturnValue(sendMessageResponse); await handler.sendMessage(call, callback); const [err, response] = callback.mock.calls[0]; assert.isNull(err); - assert.equal(response.id, testTask.id); + assert.equal(response.payload.$case, 'task'); + assert.equal(response.payload.value.id, testTask.id); }); }); From 2e531f398bdf9040b6ec905909e2833cef56edae Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Thu, 18 Dec 2025 16:57:55 +0000 Subject: [PATCH 13/64] wip tests --- src/server/grpc/grpc_handler.ts | 2 +- test/server/grpc_handler.spec.ts | 34 ++++++++++++++++++++++++++------ 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index eade4b5f..ee51219a 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -201,7 +201,7 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { call, callback, FromProto.taskQueryParams, - grpcTransportHandler.getTask.bind(grpcTransportHandler), + (params, context) => grpcTransportHandler.getTask(params, context), ToProto.task ); }, diff --git a/test/server/grpc_handler.spec.ts b/test/server/grpc_handler.spec.ts index b68405f1..a935cd68 100644 --- a/test/server/grpc_handler.spec.ts +++ b/test/server/grpc_handler.spec.ts @@ -5,6 +5,8 @@ import { A2AError, A2ARequestHandler } from '../../src/server/index.js'; import { grpcHandler } from '../../src/server/grpc/grpc_handler.js'; import { AgentCard, HTTP_EXTENSION_HEADER, MessageSendParams, Task } from '../../src/index.js'; import { FromProto, ToProto } from '../../src/grpc/utils/proto_type_converter.js'; +import { context } from 'esbuild'; +import test from 'node:test'; vi.mock('../../src/grpc/utils/proto_type_converter.js'); @@ -62,7 +64,7 @@ describe('grpcHandler', () => { getAuthenticatedExtendedAgentCard: vi.fn(), sendMessage: vi.fn().mockResolvedValue(testTask), sendMessageStream: vi.fn(), - getTask: vi.fn(), + getTask: vi.fn().mockResolvedValue(testTask), cancelTask: vi.fn(), setTaskPushNotificationConfig: vi.fn(), getTaskPushNotificationConfig: vi.fn(), @@ -163,21 +165,41 @@ describe('grpcHandler', () => { }); describe('Extensions (Metadata) Handling', () => { - it('should extract extensions from metadata and pass to context', async () => { - (mockRequestHandler.getTask as Mock).mockResolvedValue(testTask); - + it('should extract extensions from metadata and pass to context', async () => { // Mocking the header 'x-a2a-extension' const call = createMockUnaryCall({ id: 'task-1' }, { [HTTP_EXTENSION_HEADER.toLowerCase()]: 'extension-v1' }); const callback = vi.fn(); + (FromProto.taskQueryParams as Mock).mockReturnValue({ id: 'task-1' }); + (ToProto.task as Mock).mockReturnValue({ id: 'task-1' , contextId: 'ctx-1'}); await handler.getTask(call, callback); - // Verify that the handler passed the parsed extension to the RequestHandler const contextArg = (mockRequestHandler.getTask as Mock).mock.calls[0][1]; - // This assumes your ServerCallContext holds the extensions expect(contextArg).toBeDefined(); + expect(contextArg.requestedExtensions).toEqual(['extension-v1']); + }); + + it('should return activated extensions in context through metadata', async () => { + // Mocking the header 'x-a2a-extension' + const call = createMockUnaryCall({ id: 'task-1' }, { + [HTTP_EXTENSION_HEADER.toLowerCase()]: 'extension-v1' + }); + const callback = vi.fn(); + + (mockRequestHandler.getTask as Mock).mockImplementation(async (_params, context) => { + context.activatedExtensions = ['extension-v1']; + return testTask; + }); + + (FromProto.taskQueryParams as Mock).mockReturnValue({ id: 'task-1' }); + (ToProto.task as Mock).mockReturnValue({ id: 'task-1' , contextId: 'ctx-1'}); + await handler.getTask(call, callback); + + const metadata = (call.sendMetadata as Mock).mock.calls[0]; + expect(metadata).toBeDefined(); + console.log(metadata); }); }); }); \ No newline at end of file From 91f5b634a723fade554bff472cf7c750446d6195 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Thu, 18 Dec 2025 22:15:10 +0000 Subject: [PATCH 14/64] fix tests --- test/server/grpc_handler.spec.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/test/server/grpc_handler.spec.ts b/test/server/grpc_handler.spec.ts index a935cd68..21c1d7f0 100644 --- a/test/server/grpc_handler.spec.ts +++ b/test/server/grpc_handler.spec.ts @@ -5,8 +5,6 @@ import { A2AError, A2ARequestHandler } from '../../src/server/index.js'; import { grpcHandler } from '../../src/server/grpc/grpc_handler.js'; import { AgentCard, HTTP_EXTENSION_HEADER, MessageSendParams, Task } from '../../src/index.js'; import { FromProto, ToProto } from '../../src/grpc/utils/proto_type_converter.js'; -import { context } from 'esbuild'; -import test from 'node:test'; vi.mock('../../src/grpc/utils/proto_type_converter.js'); @@ -64,7 +62,7 @@ describe('grpcHandler', () => { getAuthenticatedExtendedAgentCard: vi.fn(), sendMessage: vi.fn().mockResolvedValue(testTask), sendMessageStream: vi.fn(), - getTask: vi.fn().mockResolvedValue(testTask), + getTask: vi.fn(), cancelTask: vi.fn(), setTaskPushNotificationConfig: vi.fn(), getTaskPushNotificationConfig: vi.fn(), @@ -181,25 +179,25 @@ describe('grpcHandler', () => { expect(contextArg.requestedExtensions).toEqual(['extension-v1']); }); - it('should return activated extensions in context through metadata', async () => { + it('should return activated extensions in context through metadata', async () => { // Mocking the header 'x-a2a-extension' const call = createMockUnaryCall({ id: 'task-1' }, { [HTTP_EXTENSION_HEADER.toLowerCase()]: 'extension-v1' }); const callback = vi.fn(); - (mockRequestHandler.getTask as Mock).mockImplementation(async (_params, context) => { - context.activatedExtensions = ['extension-v1']; - return testTask; - }); + (mockRequestHandler.getTask as Mock).mockImplementation(async (_params, context) => { + context.addActivatedExtension('extension-v1'); + return testTask; + }); (FromProto.taskQueryParams as Mock).mockReturnValue({ id: 'task-1' }); (ToProto.task as Mock).mockReturnValue({ id: 'task-1' , contextId: 'ctx-1'}); await handler.getTask(call, callback); - const metadata = (call.sendMetadata as Mock).mock.calls[0]; + const [metadata] = (call.sendMetadata as Mock).mock.calls[0]; expect(metadata).toBeDefined(); - console.log(metadata); + expect(metadata.get(HTTP_EXTENSION_HEADER.toLowerCase())).toEqual(['extension-v1']); }); }); }); \ No newline at end of file From 21669abcbad752ac8b1db8c1cf906b191fd466e0 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Thu, 18 Dec 2025 22:21:03 +0000 Subject: [PATCH 15/64] revert modification on sample --- src/samples/agents/sample-agent/client.ts | 46 - src/samples/agents/sample-agent/grpc.ts | 64 - src/samples/package-lock.json | 7652 +++++++++++++++++++++ src/samples/package.json | 25 + 4 files changed, 7677 insertions(+), 110 deletions(-) delete mode 100644 src/samples/agents/sample-agent/client.ts delete mode 100644 src/samples/agents/sample-agent/grpc.ts create mode 100644 src/samples/package-lock.json create mode 100644 src/samples/package.json diff --git a/src/samples/agents/sample-agent/client.ts b/src/samples/agents/sample-agent/client.ts deleted file mode 100644 index f0568c88..00000000 --- a/src/samples/agents/sample-agent/client.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { ServiceError, credentials } from '@grpc/grpc-js'; -import { - A2AServiceClient, - SendMessageRequest, - Role, - SendMessageResponse, -} from '../../../grpc/a2a.js'; - -const client = new A2AServiceClient('localhost:8080', credentials.createInsecure()); - -function sendMessageExample() { - const request: SendMessageRequest = { - tenant: 'sample-tenant', - configuration: { - blocking: true, - acceptedOutputModes: ['text'], - pushNotificationConfig: undefined, - }, - metadata: {}, - request: { - messageId: 'msg-1', - parts: [ - { - part: { $case: 'text', value: 'Hello, Agent!' }, - metadata: {}, - }, - ], - role: Role.ROLE_USER, - contextId: 'context-1', - taskId: undefined, - metadata: {}, - extensions: [], - referenceTaskIds: [], - }, - }; - - client.sendMessage(request, (error: ServiceError | null, response: SendMessageResponse) => { - if (error) { - console.error('Error sending message:', error); - } else { - console.log('Received response:', response); - } - }); -} - -sendMessageExample(); diff --git a/src/samples/agents/sample-agent/grpc.ts b/src/samples/agents/sample-agent/grpc.ts deleted file mode 100644 index a9ba13e8..00000000 --- a/src/samples/agents/sample-agent/grpc.ts +++ /dev/null @@ -1,64 +0,0 @@ -import * as grpc from '@grpc/grpc-js'; -import { AgentCard } from '../../../index.js'; -import { - InMemoryTaskStore, - TaskStore, - AgentExecutor, - DefaultRequestHandler, -} from '../../../server/index.js'; -import { SampleAgentExecutor } from './agent_executor.js'; -import { A2AServiceService } from '../../../grpc/a2a.js'; -import { createGRPCHandler } from '../../../server/grpc/grpc_handler.js'; - -// --- Server Setup --- - -const sampleAgentCard: AgentCard = { - name: 'Sample Agent', - description: - 'A sample agent to test the stream functionality and simulate the flow of tasks statuses.', - url: 'http://localhost:41241/', - provider: { - organization: 'A2A Samples', - url: 'https://example.com/a2a-samples', // Added provider URL - }, - version: '1.0.0', // Incremented version - protocolVersion: '0.3.0', - capabilities: { - streaming: true, // The new framework supports streaming - pushNotifications: false, // Assuming not implemented for this agent yet - stateTransitionHistory: true, // Agent uses history - }, - defaultInputModes: ['text'], - defaultOutputModes: ['text', 'task-status'], // task-status is a common output mode - skills: [ - { - id: 'sample_agent', - name: 'Sample Agent', - description: 'Simulate the general flow of a streaming agent.', - tags: ['sample'], - examples: ['hi', 'hello world', 'how are you', 'goodbye'], - inputModes: ['text'], // Explicitly defining for skill - outputModes: ['text', 'task-status'], // Explicitly defining for skill - }, - ], - supportsAuthenticatedExtendedCard: false, -}; - -async function main() { - // 1. Create TaskStore - const taskStore: TaskStore = new InMemoryTaskStore(); - - // 2. Create AgentExecutor - const agentExecutor: AgentExecutor = new SampleAgentExecutor(); - - // 3. Create DefaultRequestHandler - const requestHandler = new DefaultRequestHandler(sampleAgentCard, taskStore, agentExecutor); - - const server = new grpc.Server(); - server.addService(A2AServiceService, createGRPCHandler(requestHandler)); - server.bindAsync('localhost:8080', grpc.ServerCredentials.createInsecure(), () => { - console.log('Server running at http://localhost:8080'); - }); -} - -main().catch(console.error); diff --git a/src/samples/package-lock.json b/src/samples/package-lock.json new file mode 100644 index 00000000..1fadfe34 --- /dev/null +++ b/src/samples/package-lock.json @@ -0,0 +1,7652 @@ +{ + "name": "samples", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "uuid": "^11.1.0" + }, + "devDependencies": { + "@genkit-ai/googleai": "^1.8.0", + "@types/express": "^5.0.5", + "@types/passport": "^1.0.17", + "@types/passport-jwt": "^4.0.1", + "express": "^5.1.0", + "genkit": "^1.8.0", + "passport": "^0.7.0", + "passport-jwt": "^4.0.1", + "tsx": "^4.19.3" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@so-ric/colorspace": "^1.1.6", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@fastify/busboy": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", + "integrity": "sha512-m9FVDXU3GT2ITSe0UaMA5rU3QkfC/UXtCU8y0gSN/GugTqtVldOBWIB5V6V3sbmenVZUIpU6f+mPEO2+m5iTaA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz", + "integrity": "sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true + }, + "node_modules/@firebase/app-types": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", + "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz", + "integrity": "sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true + }, + "node_modules/@firebase/component": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.7.0.tgz", + "integrity": "sha512-wR9En2A+WESUHexjmRHkqtaVH94WLNKt6rmeqZhSLBybg4Wyf0Umk04SZsS6sBq4102ZsDBFwoqMqJYj2IoDSg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@firebase/util": "1.13.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@firebase/database": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.1.0.tgz", + "integrity": "sha512-gM6MJFae3pTyNLoc9VcJNuaUDej0ctdjn3cVtILo3D5lpp0dmUHHLFN/pUKe7ImyeB1KAvRlEYxvIHNF04Filg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@firebase/app-check-interop-types": "0.3.3", + "@firebase/auth-interop-types": "0.2.4", + "@firebase/component": "0.7.0", + "@firebase/logger": "0.5.0", + "@firebase/util": "1.13.0", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.1.0.tgz", + "integrity": "sha512-8nYc43RqxScsePVd1qe1xxvWNf0OBnbwHxmXJ7MHSuuTVYFO3eLyLW3PiCKJ9fHnmIz4p4LbieXwz+qtr9PZDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@firebase/component": "0.7.0", + "@firebase/database": "1.1.0", + "@firebase/database-types": "1.0.16", + "@firebase/logger": "0.5.0", + "@firebase/util": "1.13.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.16.tgz", + "integrity": "sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@firebase/app-types": "0.9.3", + "@firebase/util": "1.13.0" + } + }, + "node_modules/@firebase/logger": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.5.0.tgz", + "integrity": "sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@firebase/util": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.13.0.tgz", + "integrity": "sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@genkit-ai/ai": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@genkit-ai/ai/-/ai-1.26.0.tgz", + "integrity": "sha512-L6sX2pocyGQTJU77w/Y6DP/VfWEgD/WyFZL/P2RSxz/xr25/twbdPE45xzjP7KTaFHFhAAp+lOMYhvh9kEBS3g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@genkit-ai/core": "1.26.0", + "@opentelemetry/api": "^1.9.0", + "@types/node": "^20.11.19", + "colorette": "^2.0.20", + "dotprompt": "^1.1.1", + "json5": "^2.2.3", + "node-fetch": "^3.3.2", + "partial-json": "^0.1.7", + "uri-templates": "^0.2.0", + "uuid": "^10.0.0" + } + }, + "node_modules/@genkit-ai/ai/node_modules/@types/node": { + "version": "20.19.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz", + "integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@genkit-ai/ai/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@genkit-ai/ai/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@genkit-ai/core": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@genkit-ai/core/-/core-1.26.0.tgz", + "integrity": "sha512-wLcfyWjRyDMeyIcx2De0Sl8P4MxuTVPdCyr7wSR4YZmLIOA02LrdhQXGPcx8Rh7N0z5IxUAxPZ5rVdsUitxIzA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "~1.25.0", + "@opentelemetry/core": "~1.25.0", + "@opentelemetry/exporter-jaeger": "^1.25.0", + "@opentelemetry/sdk-metrics": "~1.25.0", + "@opentelemetry/sdk-node": "^0.52.0", + "@opentelemetry/sdk-trace-base": "~1.25.0", + "@types/json-schema": "^7.0.15", + "ajv": "^8.12.0", + "ajv-formats": "^3.0.1", + "async-mutex": "^0.5.0", + "body-parser": "^1.20.3", + "cors": "^2.8.5", + "dotprompt": "^1.1.1", + "express": "^4.21.0", + "get-port": "^5.1.0", + "json-schema": "^0.4.0", + "zod": "^3.23.8", + "zod-to-json-schema": "^3.22.4" + }, + "optionalDependencies": { + "@genkit-ai/firebase": "^1.16.1" + } + }, + "node_modules/@genkit-ai/core/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@genkit-ai/core/node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/@genkit-ai/core/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@genkit-ai/core/node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@genkit-ai/core/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/@genkit-ai/core/node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/@genkit-ai/core/node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@genkit-ai/core/node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@genkit-ai/core/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@genkit-ai/core/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@genkit-ai/core/node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@genkit-ai/core/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@genkit-ai/core/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@genkit-ai/core/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@genkit-ai/core/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@genkit-ai/core/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@genkit-ai/core/node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@genkit-ai/core/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@genkit-ai/core/node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@genkit-ai/core/node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@genkit-ai/core/node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/@genkit-ai/core/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@genkit-ai/firebase": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@genkit-ai/firebase/-/firebase-1.26.0.tgz", + "integrity": "sha512-r87uh0ub+OBhm33ds6M/H8oXzE9qSiczhPE5uFpehp++7iZ6lE3bNaiGwsSdG9iU0ghNyQBa475t+IWFe9kePQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@genkit-ai/google-cloud": "^1.26.0" + }, + "peerDependencies": { + "@google-cloud/firestore": "^7.11.0", + "firebase": ">=11.5.0", + "firebase-admin": ">=12.2", + "genkit": "^1.26.0" + }, + "peerDependenciesMeta": { + "firebase": { + "optional": true + } + } + }, + "node_modules/@genkit-ai/google-cloud": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@genkit-ai/google-cloud/-/google-cloud-1.26.0.tgz", + "integrity": "sha512-HTmwNinoKOF8lMFYx79Xx6V4pZPsCPlUmJfqsH+VWmJWHGQeBTE3B9cUTvu8up+Y/EaVf8qcG/9c1onZOA22cQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@google-cloud/logging-winston": "^6.0.0", + "@google-cloud/modelarmor": "^0.4.1", + "@google-cloud/opentelemetry-cloud-monitoring-exporter": "^0.19.0", + "@google-cloud/opentelemetry-cloud-trace-exporter": "^2.4.1", + "@google-cloud/opentelemetry-resource-util": "^2.4.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/auto-instrumentations-node": "^0.49.1", + "@opentelemetry/core": "~1.25.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/instrumentation-pino": "^0.41.0", + "@opentelemetry/instrumentation-winston": "^0.39.0", + "@opentelemetry/resources": "~1.25.0", + "@opentelemetry/sdk-metrics": "~1.25.0", + "@opentelemetry/sdk-node": "^0.52.0", + "@opentelemetry/sdk-trace-base": "~1.25.0", + "google-auth-library": "^9.6.3", + "node-fetch": "^3.3.2", + "winston": "^3.12.0" + }, + "peerDependencies": { + "genkit": "^1.26.0" + } + }, + "node_modules/@genkit-ai/googleai": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@genkit-ai/googleai/-/googleai-1.26.0.tgz", + "integrity": "sha512-RpH1fQ2IRpFk/haImE1n0PhoywA8oIvWtLiq9wi2ymJ7H7E4uWhwhUYFY04JeU0KWxwFado8whOfWJq3vyzgqQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@google/generative-ai": "^0.24.0", + "google-auth-library": "^9.6.3", + "node-fetch": "^3.3.2" + }, + "peerDependencies": { + "genkit": "^1.26.0" + } + }, + "node_modules/@google-cloud/common": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.2.tgz", + "integrity": "sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "^4.0.0", + "arrify": "^2.0.1", + "duplexify": "^4.1.1", + "extend": "^3.0.2", + "google-auth-library": "^9.0.0", + "html-entities": "^2.5.2", + "retry-request": "^7.0.0", + "teeny-request": "^9.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/firestore": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.6.tgz", + "integrity": "sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@opentelemetry/api": "^1.3.0", + "fast-deep-equal": "^3.1.1", + "functional-red-black-tree": "^1.0.1", + "google-gax": "^4.3.3", + "protobufjs": "^7.2.6" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/logging": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@google-cloud/logging/-/logging-11.2.1.tgz", + "integrity": "sha512-2h9HBJG3OAsvzXmb81qXmaTPfXYU7KJTQUxunoOKFGnY293YQ/eCkW1Y5mHLocwpEqeqQYT/Qvl6Tk+Q7PfStw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@google-cloud/common": "^5.0.0", + "@google-cloud/paginator": "^5.0.0", + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "4.0.0", + "@opentelemetry/api": "^1.7.0", + "arrify": "^2.0.1", + "dot-prop": "^6.0.0", + "eventid": "^2.0.0", + "extend": "^3.0.2", + "gcp-metadata": "^6.0.0", + "google-auth-library": "^9.0.0", + "google-gax": "^4.0.3", + "on-finished": "^2.3.0", + "pumpify": "^2.0.1", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/logging-winston": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@google-cloud/logging-winston/-/logging-winston-6.0.1.tgz", + "integrity": "sha512-tgA/qe/aGZITMrJ/5Tuykv234pLb/Qo6iDZ8SDkjbsiIy69mLQmbphrUd/IqnE17BSDfrwDUckvWdghiy8b+Qg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@google-cloud/logging": "^11.0.0", + "google-auth-library": "^9.0.0", + "lodash.mapvalues": "^4.6.0", + "winston-transport": "^4.3.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "winston": ">=3.2.1" + } + }, + "node_modules/@google-cloud/logging/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@google-cloud/modelarmor": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@google-cloud/modelarmor/-/modelarmor-0.4.1.tgz", + "integrity": "sha512-CT9TpQF443aatjhRRvazrYNOvUot26HnFP3hhgmV89QYygNPB6owWvGFFOTsKK4zSvTDfkeeb+E6diVXxn9t4g==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "google-gax": "^5.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/modelarmor/node_modules/@grpc/proto-loader": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", + "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.3", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@google-cloud/modelarmor/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@google-cloud/modelarmor/node_modules/gaxios": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", + "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2", + "rimraf": "^5.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google-cloud/modelarmor/node_modules/gcp-metadata": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", + "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google-cloud/modelarmor/node_modules/google-auth-library": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz", + "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.0.0", + "gcp-metadata": "^8.0.0", + "google-logging-utils": "^1.0.0", + "gtoken": "^8.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google-cloud/modelarmor/node_modules/google-gax": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-5.0.6.tgz", + "integrity": "sha512-1kGbqVQBZPAAu4+/R1XxPQKP0ydbNYoLAr4l0ZO2bMV0kLyLW4I1gAk++qBLWt7DPORTzmWRMsCZe86gDjShJA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@grpc/grpc-js": "^1.12.6", + "@grpc/proto-loader": "^0.8.0", + "duplexify": "^4.1.3", + "google-auth-library": "^10.1.0", + "google-logging-utils": "^1.1.1", + "node-fetch": "^3.3.2", + "object-hash": "^3.0.0", + "proto3-json-serializer": "^3.0.0", + "protobufjs": "^7.5.3", + "retry-request": "^8.0.0", + "rimraf": "^5.0.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google-cloud/modelarmor/node_modules/google-logging-utils": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", + "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/modelarmor/node_modules/gtoken": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", + "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "gaxios": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google-cloud/modelarmor/node_modules/proto3-json-serializer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-3.0.4.tgz", + "integrity": "sha512-E1sbAYg3aEbXrq0n1ojJkRHQJGE1kaE/O6GLA94y8rnJBfgvOPTOd1b9hOceQK1FFZI9qMh1vBERCyO2ifubcw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "protobufjs": "^7.4.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google-cloud/modelarmor/node_modules/retry-request": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-8.0.2.tgz", + "integrity": "sha512-JzFPAfklk1kjR1w76f0QOIhoDkNkSqW8wYKT08n9yysTmZfB+RQ2QoXoTAeOi1HD9ZipTyTAZg3c4pM/jeqgSw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "extend": "^3.0.2", + "teeny-request": "^10.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google-cloud/modelarmor/node_modules/teeny-request": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-10.1.0.tgz", + "integrity": "sha512-3ZnLvgWF29jikg1sAQ1g0o+lr5JX6sVgYvfUJazn7ZjJroDBUTWp44/+cFVX0bULjv4vci+rBD+oGVAkWqhUbw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^3.3.2", + "stream-events": "^1.0.5" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@google-cloud/modelarmor/node_modules/teeny-request/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@google-cloud/opentelemetry-cloud-monitoring-exporter": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-cloud-monitoring-exporter/-/opentelemetry-cloud-monitoring-exporter-0.19.0.tgz", + "integrity": "sha512-5SOPXwC6RET4ZvXxw5D97dp8fWpqWEunHrzrUUGXhG4UAeedQe1KvYV8CK+fnaAbN2l2ha6QDYspT6z40TVY0g==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@google-cloud/opentelemetry-resource-util": "^2.3.0", + "@google-cloud/precise-date": "^4.0.0", + "google-auth-library": "^9.0.0", + "googleapis": "^137.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/sdk-metrics": "^1.0.0" + } + }, + "node_modules/@google-cloud/opentelemetry-cloud-trace-exporter": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-cloud-trace-exporter/-/opentelemetry-cloud-trace-exporter-2.4.1.tgz", + "integrity": "sha512-Dq2IyAyA9PCjbjLOn86i2byjkYPC59b5ic8k/L4q5bBWH0Jro8lzMs8C0G5pJfqh2druj8HF+oAIAlSdWQ+Z9Q==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@google-cloud/opentelemetry-resource-util": "^2.4.0", + "@grpc/grpc-js": "^1.1.8", + "@grpc/proto-loader": "^0.7.0", + "google-auth-library": "^9.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0", + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.0.0", + "@opentelemetry/sdk-trace-base": "^1.0.0" + } + }, + "node_modules/@google-cloud/opentelemetry-resource-util": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@google-cloud/opentelemetry-resource-util/-/opentelemetry-resource-util-2.4.0.tgz", + "integrity": "sha512-/7ujlMoKtDtrbQlJihCjQnm31n2s2RTlvJqcSbt2jV3OkCzPAdo3u31Q13HNugqtIRUSk7bUoLx6AzhURkhW4w==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.22.0", + "gcp-metadata": "^6.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/resources": "^1.0.0" + } + }, + "node_modules/@google-cloud/paginator": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-5.0.2.tgz", + "integrity": "sha512-DJS3s0OVH4zFDB1PzjxAsHqJT6sKVbRwwML0ZBP9PbU7Yebtu/7SWMRzvO2J3nUi9pRNITCfu4LJeooM2w4pjg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/precise-date": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/precise-date/-/precise-date-4.0.0.tgz", + "integrity": "sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/projectify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-4.0.0.tgz", + "integrity": "sha512-MmaX6HeSvyPbWGwFq7mXdo0uQZLGBYCwziiLIGq5JVX+/bdI3SAq6bP98trV5eTWfLuvsMcIC1YJOF2vfteLFA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@google-cloud/promisify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-4.0.0.tgz", + "integrity": "sha512-Orxzlfb9c67A15cq2JQEyVc7wEsmFBmHjZWZYQMUyJ1qivXyMwdyNOs9odi79hze+2zqdTtu1E19IM/FtqZ10g==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/storage": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.18.0.tgz", + "integrity": "sha512-r3ZwDMiz4nwW6R922Z1pwpePxyRwE5GdevYX63hRmAQUkUQJcBH/79EnQPDv5cOv1mFBgevdNWQfi3tie3dHrQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@google-cloud/paginator": "^5.0.0", + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "<4.1.0", + "abort-controller": "^3.0.0", + "async-retry": "^1.3.3", + "duplexify": "^4.1.3", + "fast-xml-parser": "^4.4.1", + "gaxios": "^6.0.2", + "google-auth-library": "^9.6.3", + "html-entities": "^2.5.2", + "mime": "^3.0.0", + "p-limit": "^3.0.1", + "retry-request": "^7.0.0", + "teeny-request": "^9.0.0", + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@google-cloud/storage/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@google/generative-ai": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.24.1.tgz", + "integrity": "sha512-MqO+MLfM6kjxcKoy0p1wRzG3b4ZZXtPI+z2IE26UogS2Cm/XHO+7gGRBh6gcJsOiIVoH93UwKvW4HdgiOZCy9Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@grpc/grpc-js": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", + "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", + "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.3", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", + "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", + "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/auto-instrumentations-node": { + "version": "0.49.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/auto-instrumentations-node/-/auto-instrumentations-node-0.49.2.tgz", + "integrity": "sha512-xtETEPmAby/3MMmedv8Z/873sdLTWg+Vq98rtm4wbwvAiXBB/ao8qRyzRlvR2MR6puEr+vIB/CXeyJnzNA3cyw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/instrumentation-amqplib": "^0.41.0", + "@opentelemetry/instrumentation-aws-lambda": "^0.43.0", + "@opentelemetry/instrumentation-aws-sdk": "^0.43.1", + "@opentelemetry/instrumentation-bunyan": "^0.40.0", + "@opentelemetry/instrumentation-cassandra-driver": "^0.40.0", + "@opentelemetry/instrumentation-connect": "^0.38.0", + "@opentelemetry/instrumentation-cucumber": "^0.8.0", + "@opentelemetry/instrumentation-dataloader": "^0.11.0", + "@opentelemetry/instrumentation-dns": "^0.38.0", + "@opentelemetry/instrumentation-express": "^0.41.1", + "@opentelemetry/instrumentation-fastify": "^0.38.0", + "@opentelemetry/instrumentation-fs": "^0.14.0", + "@opentelemetry/instrumentation-generic-pool": "^0.38.1", + "@opentelemetry/instrumentation-graphql": "^0.42.0", + "@opentelemetry/instrumentation-grpc": "^0.52.0", + "@opentelemetry/instrumentation-hapi": "^0.40.0", + "@opentelemetry/instrumentation-http": "^0.52.0", + "@opentelemetry/instrumentation-ioredis": "^0.42.0", + "@opentelemetry/instrumentation-kafkajs": "^0.2.0", + "@opentelemetry/instrumentation-knex": "^0.39.0", + "@opentelemetry/instrumentation-koa": "^0.42.0", + "@opentelemetry/instrumentation-lru-memoizer": "^0.39.0", + "@opentelemetry/instrumentation-memcached": "^0.38.0", + "@opentelemetry/instrumentation-mongodb": "^0.46.0", + "@opentelemetry/instrumentation-mongoose": "^0.41.0", + "@opentelemetry/instrumentation-mysql": "^0.40.0", + "@opentelemetry/instrumentation-mysql2": "^0.40.0", + "@opentelemetry/instrumentation-nestjs-core": "^0.39.0", + "@opentelemetry/instrumentation-net": "^0.38.0", + "@opentelemetry/instrumentation-pg": "^0.43.0", + "@opentelemetry/instrumentation-pino": "^0.41.0", + "@opentelemetry/instrumentation-redis": "^0.41.0", + "@opentelemetry/instrumentation-redis-4": "^0.41.1", + "@opentelemetry/instrumentation-restify": "^0.40.0", + "@opentelemetry/instrumentation-router": "^0.39.0", + "@opentelemetry/instrumentation-socket.io": "^0.41.0", + "@opentelemetry/instrumentation-tedious": "^0.13.0", + "@opentelemetry/instrumentation-undici": "^0.5.0", + "@opentelemetry/instrumentation-winston": "^0.39.0", + "@opentelemetry/resource-detector-alibaba-cloud": "^0.29.0", + "@opentelemetry/resource-detector-aws": "^1.6.0", + "@opentelemetry/resource-detector-azure": "^0.2.10", + "@opentelemetry/resource-detector-container": "^0.4.0", + "@opentelemetry/resource-detector-gcp": "^0.29.10", + "@opentelemetry/resources": "^1.24.0", + "@opentelemetry/sdk-node": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.4.1" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz", + "integrity": "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-jaeger": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-jaeger/-/exporter-jaeger-1.30.1.tgz", + "integrity": "sha512-7Ki+x7cZ/PEQxp3UyB+CWkWBqLk22yRGQ4AWIGwZlEs6rpCOdWwIFOyQDO9DdeyWtTPTvO3An/7chPZcRHOgzQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/sdk-trace-base": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0", + "jaeger-client": "^3.15.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-jaeger/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-jaeger/node_modules/@opentelemetry/resources": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz", + "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-jaeger/node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.1.tgz", + "integrity": "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.30.1", + "@opentelemetry/resources": "1.30.1", + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/exporter-jaeger/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-grpc": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.52.1.tgz", + "integrity": "sha512-pVkSH20crBwMTqB3nIN4jpQKUEoB0Z94drIHpYyEqs7UBr+I0cpYyOR3bqjA/UasQUMROb3GX8ZX4/9cVRqGBQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-grpc-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-http": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.52.1.tgz", + "integrity": "sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-trace-otlp-proto": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.52.1.tgz", + "integrity": "sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.25.1.tgz", + "integrity": "sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", + "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.52.1", + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-amqplib": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.41.0.tgz", + "integrity": "sha512-00Oi6N20BxJVcqETjgNzCmVKN+I5bJH/61IlHiIWd00snj1FdgiIKlpE4hYVacTB2sjIBB3nTbHskttdZEE2eg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-lambda": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-lambda/-/instrumentation-aws-lambda-0.43.0.tgz", + "integrity": "sha512-pSxcWlsE/pCWQRIw92sV2C+LmKXelYkjkA7C5s39iPUi4pZ2lA1nIiw+1R/y2pDEhUHcaKkNyljQr3cx9ZpVlQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/propagator-aws-xray": "^1.3.1", + "@opentelemetry/resources": "^1.8.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/aws-lambda": "8.10.122" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-aws-sdk": { + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-aws-sdk/-/instrumentation-aws-sdk-0.43.1.tgz", + "integrity": "sha512-qLT2cCniJ5W+6PFzKbksnoIQuq9pS83nmgaExfUwXVvlwi0ILc50dea0tWBHZMkdIDa/zZdcuFrJ7+fUcSnRow==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/propagation-utils": "^0.30.10", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-bunyan": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-bunyan/-/instrumentation-bunyan-0.40.0.tgz", + "integrity": "sha512-aZ4cXaGWwj79ZXSYrgFVsrDlE4mmf2wfvP9bViwRc0j75A6eN6GaHYHqufFGMTCqASQn5pIjjP+Bx+PWTGiofw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/api-logs": "^0.52.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@types/bunyan": "1.8.9" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-cassandra-driver": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cassandra-driver/-/instrumentation-cassandra-driver-0.40.0.tgz", + "integrity": "sha512-JxbM39JU7HxE9MTKKwi6y5Z3mokjZB2BjwfqYi4B3Y29YO3I42Z7eopG6qq06yWZc+nQli386UDQe0d9xKmw0A==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.38.0.tgz", + "integrity": "sha512-2/nRnx3pjYEmdPIaBwtgtSviTKHWnDZN3R+TkRUnhIVrvBKVcq+I5B2rtd6mr6Fe9cHlZ9Ojcuh7pkNh/xdWWg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/connect": "3.4.36" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect/node_modules/@types/connect": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@opentelemetry/instrumentation-cucumber": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-cucumber/-/instrumentation-cucumber-0.8.0.tgz", + "integrity": "sha512-ieTm4RBIlZt2brPwtX5aEZYtYnkyqhAVXJI9RIohiBVMe5DxiwCwt+2Exep/nDVqGPX8zRBZUl4AEw423OxJig==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dataloader": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.11.0.tgz", + "integrity": "sha512-27urJmwkH4KDaMJtEv1uy2S7Apk4XbN4AgWMdfMJbi7DnOduJmeuA+DpJCwXB72tEWXo89z5T3hUVJIDiSNmNw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-dns": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-dns/-/instrumentation-dns-0.38.0.tgz", + "integrity": "sha512-Um07I0TQXDWa+ZbEAKDFUxFH40dLtejtExDOMLNJ1CL8VmOmA71qx93Qi/QG4tGkiI1XWqr7gF/oiMCJ4m8buQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.41.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.41.1.tgz", + "integrity": "sha512-uRx0V3LPGzjn2bxAnV8eUsDT82vT7NTwI0ezEuPMBOTOsnPpGhWdhcdNdhH80sM4TrWrOfXm9HGEdfWE3TRIww==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.38.0.tgz", + "integrity": "sha512-HBVLpTSYpkQZ87/Df3N0gAw7VzYZV3n28THIBrJWfuqw3Or7UqdhnjeuMIPQ04BKk3aZc0cWn2naSQObbh5vXw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.14.0.tgz", + "integrity": "sha512-pVc8P5AgliC1DphyyBUgsxXlm2XaPH4BpYvt7rAZDMIqUpRk8gs19SioABtKqqxvFzg5jPtgJfJsdxq0Y+maLw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-generic-pool": { + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.38.1.tgz", + "integrity": "sha512-WvssuKCuavu/hlq661u82UWkc248cyI/sT+c2dEIj6yCk0BUkErY1D+9XOO+PmHdJNE+76i2NdcvQX5rJrOe/w==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.42.0.tgz", + "integrity": "sha512-N8SOwoKL9KQSX7z3gOaw5UaTeVQcfDO1c21csVHnmnmGUoqsXbArK2B8VuwPWcv6/BC/i3io+xTo7QGRZ/z28Q==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.52.1.tgz", + "integrity": "sha512-EdSDiDSAO+XRXk/ZN128qQpBo1I51+Uay/LUPcPQhSRGf7fBPIEUBeOLQiItguGsug5MGOYjql2w/1wCQF3fdQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "0.52.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-grpc/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.40.0.tgz", + "integrity": "sha512-8U/w7Ifumtd2bSN1OLaSwAAFhb9FyqWUki3lMMB0ds+1+HdSxYBe9aspEJEgvxAqOkrQnVniAPTEGf1pGM7SOw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.52.1.tgz", + "integrity": "sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/instrumentation": "0.52.1", + "@opentelemetry/semantic-conventions": "1.25.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.42.0.tgz", + "integrity": "sha512-P11H168EKvBB9TUSasNDOGJCSkpT44XgoM6d3gRIWAa9ghLpYhl0uRkS8//MqPzcJVHr3h3RmfXIpiYLjyIZTw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-kafkajs": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.2.0.tgz", + "integrity": "sha512-uKKmhEFd0zR280tJovuiBG7cfnNZT4kvVTvqtHPxQP7nOmRbJstCYHFH13YzjVcKjkmoArmxiSulmZmF7SLIlg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.24.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-knex": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.39.0.tgz", + "integrity": "sha512-lRwTqIKQecPWDkH1KEcAUcFhCaNssbKSpxf4sxRTAROCwrCEnYkjOuqJHV+q1/CApjMTaKu0Er4LBv/6bDpoxA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.42.0.tgz", + "integrity": "sha512-H1BEmnMhho8o8HuNRq5zEI4+SIHDIglNB7BPKohZyWG4fWNuR7yM4GTlR01Syq21vODAS7z5omblScJD/eZdKw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-lru-memoizer": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.39.0.tgz", + "integrity": "sha512-eU1Wx1RRTR/2wYXFzH9gcpB8EPmhYlNDIUHzUXjyUE0CAXEJhBLkYNlzdaVCoQDw2neDqS+Woshiia6+emWK9A==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-memcached": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-memcached/-/instrumentation-memcached-0.38.0.tgz", + "integrity": "sha512-tPmyqQEZNyrvg6G+iItdlguQEcGzfE+bJkpQifmBXmWBnoS5oU3UxqtyYuXGL2zI9qQM5yMBHH4nRXWALzy7WA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.23.0", + "@types/memcached": "^2.2.6" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.46.0.tgz", + "integrity": "sha512-VF/MicZ5UOBiXrqBslzwxhN7TVqzu1/LN/QDpkskqM0Zm0aZ4CVRbUygL8d7lrjLn15x5kGIe8VsSphMfPJzlA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/sdk-metrics": "^1.9.1", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.41.0.tgz", + "integrity": "sha512-ivJg4QnnabFxxoI7K8D+in7hfikjte38sYzJB9v1641xJk9Esa7jM3hmbPB7lxwcgWJLVEDvfPwobt1if0tXxA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.40.0.tgz", + "integrity": "sha512-d7ja8yizsOCNMYIJt5PH/fKZXjb/mS48zLROO4BzZTtDfhNCl2UM/9VIomP2qkGIFVouSJrGr/T00EzY7bPtKA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/mysql": "2.15.22" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.40.0.tgz", + "integrity": "sha512-0xfS1xcqUmY7WE1uWjlmI67Xg3QsSUlNT+AcXHeA4BDUPwZtWqF4ezIwLgpVZfHOnkAEheqGfNSWd1PIu3Wnfg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@opentelemetry/sql-common": "^0.40.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.39.0.tgz", + "integrity": "sha512-mewVhEXdikyvIZoMIUry8eb8l3HUjuQjSjVbmLVTt4NQi35tkpnHQrG9bTRBrl3403LoWZ2njMPJyg4l6HfKvA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-net": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-net/-/instrumentation-net-0.38.0.tgz", + "integrity": "sha512-stjow1PijcmUquSmRD/fSihm/H61DbjPlJuJhWUe7P22LFPjFhsrSeiB5vGj3vn+QGceNAs+kioUTzMGPbNxtg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.43.0.tgz", + "integrity": "sha512-og23KLyoxdnAeFs1UWqzSonuCkePUzCX30keSYigIzJe/6WSYA8rnEI5lobcxPEzg+GcU06J7jzokuEHbjVJNw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@opentelemetry/sql-common": "^0.40.1", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.4" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pino": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pino/-/instrumentation-pino-0.41.0.tgz", + "integrity": "sha512-Kpv0fJRk/8iMzMk5Ue5BsUJfHkBJ2wQoIi/qduU1a1Wjx9GLj6J2G17PHjPK5mnZjPNzkFOXFADZMfgDioliQw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/api-logs": "^0.52.0", + "@opentelemetry/core": "^1.25.0", + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis/-/instrumentation-redis-0.41.0.tgz", + "integrity": "sha512-RJ1pwI3btykp67ts+5qZbaFSAAzacucwBet5/5EsKYtWBpHbWwV/qbGN/kIBzXg5WEZBhXLrR/RUq0EpEUpL3A==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.41.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.41.1.tgz", + "integrity": "sha512-UqJAbxraBk7s7pQTlFi5ND4sAUs4r/Ai7gsAVZTQDbHl2kSsOp7gpHcpIuN5dpcI2xnuhM2tkH4SmEhbrv2S6Q==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-restify": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-restify/-/instrumentation-restify-0.40.0.tgz", + "integrity": "sha512-sm/rH/GysY/KOEvZqYBZSLYFeXlBkHCgqPDgWc07tz+bHCN6mPs9P3otGOSTe7o3KAIM8Nc6ncCO59vL+jb2cA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-router": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-router/-/instrumentation-router-0.39.0.tgz", + "integrity": "sha512-LaXnVmD69WPC4hNeLzKexCCS19hRLrUw3xicneAMkzJSzNJvPyk7G6I7lz7VjQh1cooObPBt9gNyd3hhTCUrag==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-socket.io": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-socket.io/-/instrumentation-socket.io-0.41.0.tgz", + "integrity": "sha512-7fzDe9/FpO6NFizC/wnzXXX7bF9oRchsD//wFqy5g5hVEgXZCQ70IhxjrKdBvgjyIejR9T9zTvfQ6PfVKfkCAw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-tedious": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.13.0.tgz", + "integrity": "sha512-Pob0+0R62AqXH50pjazTeGBy/1+SK4CYpFUBV5t7xpbpeuQezkkgVGvLca84QqjBqQizcXedjpUJLgHQDixPQg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/tedious": "^4.0.14" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-undici": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.5.0.tgz", + "integrity": "sha512-aNTeSrFAVcM9qco5DfZ9DNXu6hpMRe8Kt8nCDHfMWDB3pwgGVUE76jTdohc+H/7eLRqh4L7jqs5NSQoHw7S6ww==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" + } + }, + "node_modules/@opentelemetry/instrumentation-winston": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-winston/-/instrumentation-winston-0.39.0.tgz", + "integrity": "sha512-v/1xziLJ9CyB3YDjBSBzbB70Qd0JwWTo36EqWK5m3AR0CzsyMQQmf3ZIZM6sgx7hXMcRQ0pnEYhg6nhrUQPm9A==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/api-logs": "^0.52.0", + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/otlp-exporter-base": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.52.1.tgz", + "integrity": "sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-transformer": "0.52.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-grpc-exporter-base": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.52.1.tgz", + "integrity": "sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@grpc/grpc-js": "^1.7.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/otlp-exporter-base": "0.52.1", + "@opentelemetry/otlp-transformer": "0.52.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/otlp-transformer": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.52.1.tgz", + "integrity": "sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.52.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-logs": "0.52.1", + "@opentelemetry/sdk-metrics": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "protobufjs": "^7.3.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagation-utils": { + "version": "0.30.16", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.30.16.tgz", + "integrity": "sha512-ZVQ3Z/PQ+2GQlrBfbMMMT0U7MzvYZLCPP800+ooyaBqm4hMvuQHfP028gB9/db0mwkmyEAMad9houukUVxhwcw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/propagator-aws-xray": { + "version": "1.26.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-aws-xray/-/propagator-aws-xray-1.26.2.tgz", + "integrity": "sha512-k43wxTjKYvwfce9L4eT8fFYy/ATmCfPHZPZsyT/6ABimf2KE1HafoOsIcxLOtmNSZt6dCvBIYCrXaOWta20xJg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-b3": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.25.1.tgz", + "integrity": "sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/propagator-jaeger": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.25.1.tgz", + "integrity": "sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", + "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud": { + "version": "0.29.7", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-alibaba-cloud/-/resource-detector-alibaba-cloud-0.29.7.tgz", + "integrity": "sha512-PExUl/R+reSQI6Y/eNtgAsk6RHk1ElYSzOa8/FHfdc/nLmx9sqMasBEpLMkETkzDP7t27ORuXe4F9vwkV2uwwg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resource-detector-alibaba-cloud/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resource-detector-aws": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-aws/-/resource-detector-aws-1.12.0.tgz", + "integrity": "sha512-Cvi7ckOqiiuWlHBdA1IjS0ufr3sltex2Uws2RK6loVp4gzIJyOijsddAI6IZ5kiO8h/LgCWe8gxPmwkTKImd+Q==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-azure": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-azure/-/resource-detector-azure-0.2.12.tgz", + "integrity": "sha512-iIarQu6MiCjEEp8dOzmBvCSlRITPFTinFB2oNKAjU6xhx8d7eUcjNOKhBGQTvuCriZrxrEvDaEEY9NfrPQ6uYQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/resources": "^1.10.1", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-container": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-container/-/resource-detector-container-0.4.4.tgz", + "integrity": "sha512-ZEN2mq7lIjQWJ8NTt1umtr6oT/Kb89856BOmESLSvgSHbIwOFYs7cSfSRH5bfiVw6dXTQAVbZA/wLgCHKrebJA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.26.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resource-detector-container/node_modules/@opentelemetry/core": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz", + "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/semantic-conventions": "1.28.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resource-detector-container/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz", + "integrity": "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resource-detector-gcp": { + "version": "0.29.13", + "resolved": "https://registry.npmjs.org/@opentelemetry/resource-detector-gcp/-/resource-detector-gcp-0.29.13.tgz", + "integrity": "sha512-vdotx+l3Q+89PeyXMgKEGnZ/CwzwMtuMi/ddgD9/5tKZ08DfDGB2Npz9m2oXPHRCjc4Ro6ifMqFlRyzIvgOjhg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.0.0", + "@opentelemetry/resources": "^1.10.0", + "@opentelemetry/semantic-conventions": "^1.27.0", + "gcp-metadata": "^6.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.0.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", + "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-logs": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.52.1.tgz", + "integrity": "sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.52.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.4.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", + "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.52.1.tgz", + "integrity": "sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.52.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/exporter-trace-otlp-grpc": "0.52.1", + "@opentelemetry/exporter-trace-otlp-http": "0.52.1", + "@opentelemetry/exporter-trace-otlp-proto": "0.52.1", + "@opentelemetry/exporter-zipkin": "1.25.1", + "@opentelemetry/instrumentation": "0.52.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/sdk-logs": "0.52.1", + "@opentelemetry/sdk-metrics": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "@opentelemetry/sdk-trace-node": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-node/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", + "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sdk-trace-node": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.25.1.tgz", + "integrity": "sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/context-async-hooks": "1.25.1", + "@opentelemetry/core": "1.25.1", + "@opentelemetry/propagator-b3": "1.25.1", + "@opentelemetry/propagator-jaeger": "1.25.1", + "@opentelemetry/sdk-trace-base": "1.25.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.38.0.tgz", + "integrity": "sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", + "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@opentelemetry/core": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@types/aws-lambda": { + "version": "8.10.122", + "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.122.tgz", + "integrity": "sha512-vBkIh9AY22kVOCEKo5CJlyCgmSWvasC+SWUxL/x/vOwRobMpI/HG1xp/Ae3AqmSiZeLUbOhW0FCD3ZjqqUxmXw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bunyan": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/@types/bunyan/-/bunyan-1.8.9.tgz", + "integrity": "sha512-ZqS9JGpBxVOvsawzmVt30sP++gSQMTejCkIAQ3VdadOcRE8izTyW66hufvwLeH+YEGP6Js2AW7Gz+RMyvrEbmw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/caseless": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.5.tgz", + "integrity": "sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", + "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.10", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", + "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/memcached": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@types/memcached/-/memcached-2.2.10.tgz", + "integrity": "sha512-AM9smvZN55Gzs2wRrqeMHVP7KE8KWgCJO/XL5yCly2xF6EKa4YlbpK+cLSAH4NG/Ah64HrlegmGqW8kYws7Vxg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mysql": { + "version": "2.15.22", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz", + "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "25.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", + "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/passport": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.17.tgz", + "integrity": "sha512-aciLyx+wDwT2t2/kJGJR2AEeBz0nJU4WuRX04Wu9Dqc5lSUtwu0WERPHYsLhF9PtseiAMPBGNUOtFjxZ56prsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/passport-jwt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-4.0.1.tgz", + "integrity": "sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/jsonwebtoken": "*", + "@types/passport-strategy": "*" + } + }, + "node_modules/@types/passport-strategy": { + "version": "0.2.38", + "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.38.tgz", + "integrity": "sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*", + "@types/passport": "*" + } + }, + "node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz", + "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/pg": "*" + } + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/request": { + "version": "2.48.13", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.13.tgz", + "integrity": "sha512-FGJ6udDNUCjd19pp0Q3iTiDkwhYup7J8hpMW9c4k53NrccQFFWKRho6hvtPPEhnXWKvukfwAlB6DbDz4yhH5Gg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.5" + } + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tedious": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", + "integrity": "sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "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", + "optional": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ansi-color": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ansi-color/-/ansi-color-0.2.2.tgz", + "integrity": "sha512-qPx7iZZDHITYrrfzaUFXQpIcF2xYifcQHQflP1pFz8yY3lfU6GgCHb0+hJD7nimYKO7f2iaYYwBpZ+GaNcAhcA==", + "dev": true, + "license": "BSD License" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ansi-styles/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ansi-styles/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/async-mutex": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/async-mutex/-/async-mutex-0.5.0.tgz", + "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "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/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/body-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/bufrw": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/bufrw/-/bufrw-1.4.0.tgz", + "integrity": "sha512-sWm8iPbqvL9+5SiYxXH73UOkyEbGQg7kyHQmReF89WJHQJw2eV4P/yZ0E+b71cczJ4pPobVhXxgQcmfSTgGHxQ==", + "dev": true, + "dependencies": { + "ansi-color": "^0.2.1", + "error": "^7.0.0", + "hexer": "^1.5.0", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.10.x" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/color": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color-convert": "^3.1.3", + "color-string": "^2.1.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotprompt": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/dotprompt/-/dotprompt-1.1.2.tgz", + "integrity": "sha512-24EU+eORQbPywBicIP44BiqykzEXFwZq1ZQKO5TEr9KrrENyDA7I1NzqhtmmEdQVfAXka0DEbSLPN5nerCqJ8A==", + "dev": true, + "license": "ISC", + "dependencies": { + "handlebars": "^4.7.8", + "yaml": "^2.8.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexify": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.3.tgz", + "integrity": "sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.2" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/error": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", + "integrity": "sha512-UtVv4l5MhijsYUxPJo4390gzfZvAnTHreNnDjnTZaKIiZ/SemXxAhBkYSKtWa5RtBXbLP8tMgn/n0RUa/H7jXw==", + "dev": true, + "dependencies": { + "string-template": "~0.2.1", + "xtend": "~4.0.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "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", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eventid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/eventid/-/eventid-2.0.1.tgz", + "integrity": "sha512-sPNTqiMokAvV048P2c9+foqVJzk49o6d4e0D/sq5jog3pw+4kBgyR0gaM1FM7Mx6Kzd9dztesh9oYz1LWWOpzw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "uuid": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eventid/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/farmhash-modern": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/farmhash-modern/-/farmhash-modern-1.1.0.tgz", + "integrity": "sha512-6ypT4XfgqJk/F3Yuv4SX26I3doUjt0GTG4a+JgWxXQpxXzTBq8fPUeGHfcYMMDPHJHm3yPOSjaeBwBGAHWXCdA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fast-xml-parser": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", + "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "strnum": "^1.1.1" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/firebase-admin": { + "version": "13.6.0", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-13.6.0.tgz", + "integrity": "sha512-GdPA/t0+Cq8p1JnjFRBmxRxAGvF/kl2yfdhALl38PrRp325YxyQ5aNaHui0XmaKcKiGRFIJ/EgBNWFoDP0onjw==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "@fastify/busboy": "^3.0.0", + "@firebase/database-compat": "^2.0.0", + "@firebase/database-types": "^1.0.6", + "@types/node": "^22.8.7", + "farmhash-modern": "^1.1.0", + "fast-deep-equal": "^3.1.1", + "google-auth-library": "^9.14.2", + "jsonwebtoken": "^9.0.0", + "jwks-rsa": "^3.1.0", + "node-forge": "^1.3.1", + "uuid": "^11.0.2" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@google-cloud/firestore": "^7.11.0", + "@google-cloud/storage": "^7.14.0" + } + }, + "node_modules/firebase-admin/node_modules/@types/node": { + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/firebase-admin/node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", + "integrity": "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/gaxios": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.7.1.tgz", + "integrity": "sha512-LDODD4TMYx7XXdpwxAVRAIAuB0bzv0s+ywFonY46k126qzQHT9ygyoa9tncmOiQmmDrik65UYsEkv3lbfqQ3yQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gaxios/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/gaxios/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/gcp-metadata": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.1.tgz", + "integrity": "sha512-a4tiq7E0/5fTjxPAaH4jpjkSv/uCaU2p5KC6HVGrvl0cDjA8iBZv4vv1gyzlmK0ZUKqwpOyQMKzZQe3lTit77A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^6.1.1", + "google-logging-utils": "^0.0.2", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/genkit": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/genkit/-/genkit-1.26.0.tgz", + "integrity": "sha512-+bfQWefF56mZU8RTH0zHwlXyreA1rMkEXBBb5mNqP1OVuv92F8eJWP80/8M+wvL8OeaxBiejtbGIjcepOJRgpA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@genkit-ai/ai": "1.26.0", + "@genkit-ai/core": "1.26.0", + "uuid": "^10.0.0" + } + }, + "node_modules/genkit/node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/google-auth-library": { + "version": "9.15.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", + "integrity": "sha512-Jb6Z0+nvECVz+2lzSMt9u98UsoakXxA2HGHMCxh+so3n90XgYWkq5dur19JAJV7ONiJY22yBTyJB1TSkvPq9Ng==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.1.1", + "gcp-metadata": "^6.1.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/google-gax": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-4.6.1.tgz", + "integrity": "sha512-V6eky/xz2mcKfAd1Ioxyd6nmA61gao3n01C+YeuIwu3vzM9EDR6wcVzMSIbLMDXWeoi9SHYctXuKYC5uJUT3eQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@grpc/grpc-js": "^1.10.9", + "@grpc/proto-loader": "^0.7.13", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "google-auth-library": "^9.3.0", + "node-fetch": "^2.7.0", + "object-hash": "^3.0.0", + "proto3-json-serializer": "^2.0.2", + "protobufjs": "^7.3.2", + "retry-request": "^7.0.0", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/google-gax/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/google-gax/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/google-logging-utils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-0.0.2.tgz", + "integrity": "sha512-NEgUnEcBiP5HrPzufUkBzJOD/Sxsco3rLNo1F1TNf7ieU8ryUzBhqba8r756CjLX7rn3fHl6iLEwPYuqpoKgQQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/googleapis": { + "version": "137.1.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-137.1.0.tgz", + "integrity": "sha512-2L7SzN0FLHyQtFmyIxrcXhgust77067pkkduqkbIpDuj9JzVnByxsRrcRfUMFQam3rQkWW2B0f1i40IwKDWIVQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "google-auth-library": "^9.0.0", + "googleapis-common": "^7.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/googleapis-common": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-7.2.0.tgz", + "integrity": "sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "extend": "^3.0.2", + "gaxios": "^6.0.3", + "google-auth-library": "^9.7.0", + "qs": "^6.7.0", + "url-template": "^2.0.8", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/googleapis-common/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gtoken": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", + "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "gaxios": "^6.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hexer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/hexer/-/hexer-1.5.0.tgz", + "integrity": "sha512-dyrPC8KzBzUJ19QTIo1gXNqIISRXQ0NwteW6OeQHRN4ZuZeHkdODfj0zHBdOlHbRY8GqbqK57C9oWSvQZizFsg==", + "dev": true, + "dependencies": { + "ansi-color": "^0.2.1", + "minimist": "^1.1.0", + "process": "^0.10.0", + "xtend": "^4.0.0" + }, + "bin": { + "hexer": "cli.js" + }, + "engines": { + "node": ">= 0.10.x" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz", + "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT", + "optional": true + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", + "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", + "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/import-in-the-middle": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz", + "integrity": "sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.14.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "optional": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jaeger-client": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/jaeger-client/-/jaeger-client-3.19.0.tgz", + "integrity": "sha512-M0c7cKHmdyEUtjemnJyx/y9uX16XHocL46yQvyqDlPdvAcwPDbHrIbKjQdBqtiE4apQ/9dmr+ZLJYYPGnurgpw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0", + "opentracing": "^0.14.4", + "thriftrw": "^3.5.0", + "uuid": "^8.3.2", + "xorshift": "^1.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jaeger-client/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/jose": { + "version": "4.15.9", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.9.tgz", + "integrity": "sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true, + "license": "(AFL-2.1 OR BSD-3-Clause)" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonwebtoken": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", + "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jws": "^4.0.1", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jwks-rsa": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jwks-rsa/-/jwks-rsa-3.2.0.tgz", + "integrity": "sha512-PwchfHcQK/5PSydeKCs1ylNym0w/SSv8a62DgHJ//7x2ZclCoinlsjAfDxAAbpoTPybOum/Jgy+vkvMmKz89Ww==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/express": "^4.17.20", + "@types/jsonwebtoken": "^9.0.4", + "debug": "^4.3.4", + "jose": "^4.15.4", + "limiter": "^1.1.5", + "lru-memoizer": "^2.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/jwks-rsa/node_modules/@types/express": { + "version": "4.17.25", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", + "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "^1" + } + }, + "node_modules/jwks-rsa/node_modules/@types/express-serve-static-core": { + "version": "4.19.7", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.7.tgz", + "integrity": "sha512-FvPtiIf1LfhzsaIXhv/PHan/2FeQBbtBDtfX2QfvPxdUelMDEckK08SM6nqo1MIZY3RUlfA+HV8+hFUSio78qg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/jwks-rsa/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/jwks-rsa/node_modules/@types/serve-static": { + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/jws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", + "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jwa": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.mapvalues": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz", + "integrity": "sha512-JPFqXFeZQ7BfS00H58kClY7SPVeHertPE0lNuCyZ26/XlN8TvakYD7b9bGyNmXbT/D3BbtPAAmq90gPWqLkxlQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true, + "license": "MIT" + }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-memoizer": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.3.0.tgz", + "integrity": "sha512-GXn7gyHAMhO13WSKrIiNfztwxodVsP8IoZ3XfrJV4yH2x0/OeTO/FIaAHTY5YekdGgW94njfuKmyyt1E0mR6Ug==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "lodash.clonedeep": "^4.5.0", + "lru-cache": "6.0.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "optional": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", + "dev": true, + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-forge": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", + "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/opentracing": { + "version": "0.14.7", + "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz", + "integrity": "sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0", + "optional": true + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/partial-json": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/partial-json/-/partial-json-0.1.7.tgz", + "integrity": "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA==", + "dev": true, + "license": "MIT" + }, + "node_modules/passport": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/passport/-/passport-0.7.0.tgz", + "integrity": "sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "passport-strategy": "1.x.x", + "pause": "0.0.1", + "utils-merge": "^1.0.1" + }, + "engines": { + "node": ">= 0.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jaredhanson" + } + }, + "node_modules/passport-jwt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz", + "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsonwebtoken": "^9.0.0", + "passport-strategy": "^1.0.0" + } + }, + "node_modules/passport-strategy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", + "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "optional": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==", + "dev": true + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "dev": true, + "license": "ISC", + "optional": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", + "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", + "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/process/-/process-0.10.1.tgz", + "integrity": "sha512-dyIett8dgGIZ/TXKUzeYExt7WA6ldDzys9vTDU/cCA9L17Ypme+KzS+NjQCjpn9xsvi/shbMC+yP/BcFMBz0NA==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/proto3-json-serializer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-2.0.2.tgz", + "integrity": "sha512-SAzp/O4Yh02jGdRc+uIrGoe87dkN/XtwxfZ4ZyafJHymd79ozp5VG5nyZ7ygqPM5+cpLDjjGnYFUkngonyDPOQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "protobufjs": "^7.2.5" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "dev": true, + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz", + "integrity": "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/retry-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-7.0.2.tgz", + "integrity": "sha512-dUOvLMJ0/JJYEn8NrpOaGNE7X3vpI5XlZS/u0ANjqtcZVKnIxP7IgCFwrKTxENw29emmwug53awKtaMm4i9g5w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/request": "^2.48.8", + "extend": "^3.0.2", + "teeny-request": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/rimraf": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", + "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "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/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "optional": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "stubs": "^3.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", + "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "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", + "optional": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strnum": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "optional": true, + "peer": true + }, + "node_modules/stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha512-PdHt7hHUJKxvTCgbKX9C1V/ftOcjJQgz8BZwNfV5c4B6dcGqlpelTbJ999jBGZ2jYiPAwcX5dP6oBwVlBlUbxw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/teeny-request": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-9.0.0.tgz", + "integrity": "sha512-resvxdc6Mgb7YEThw6G6bExlXKkv6+YbuzGg9xuXxSgxJF7Ozs+o8Y9+2R3sArdWdW8nOokoQb1yrpFB0pQK2g==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.9", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/teeny-request/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/teeny-request/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/teeny-request/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/teeny-request/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "optional": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/thriftrw": { + "version": "3.11.4", + "resolved": "https://registry.npmjs.org/thriftrw/-/thriftrw-3.11.4.tgz", + "integrity": "sha512-UcuBd3eanB3T10nXWRRMwfwoaC6VMk7qe3/5YIWP2Jtw+EbHqJ0p1/K3x8ixiR5dozKSSfcg1W+0e33G1Di3XA==", + "dev": true, + "dependencies": { + "bufrw": "^1.2.1", + "error": "7.0.2", + "long": "^2.4.0" + }, + "bin": { + "thrift2json": "thrift2json.js" + }, + "engines": { + "node": ">= 0.10.x" + } + }, + "node_modules/thriftrw/node_modules/long": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/long/-/long-2.4.0.tgz", + "integrity": "sha512-ijUtjmO/n2A5PaosNG9ZGDsQ3vxJg7ZW8vsY8Kp0f2yIZWhSJvjmegV7t+9RPQKxKrvj8yKGehhS+po14hPLGQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-templates": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/uri-templates/-/uri-templates-0.2.0.tgz", + "integrity": "sha512-EWkjYEN0L6KOfEoOH6Wj4ghQqU7eBZMJqRHQnxQAq+dSEzRPClkWjf8557HkWQXF6BrAUoLSAyy9i3RVTliaNg==", + "dev": true, + "license": "http://geraintluff.github.io/tv4/LICENSE.txt" + }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", + "dev": true, + "license": "BSD", + "optional": true + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "optional": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/winston": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", + "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.8", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/xorshift": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/xorshift/-/xorshift-1.2.0.tgz", + "integrity": "sha512-iYgNnGyeeJ4t6U11NpA/QiKy+PXn5Aa3Azg5qkwIFz1tBLllQrjjsk9yzD7IAK0naNU4JxdeDgqW9ov4u/hc4g==", + "dev": true, + "license": "MIT" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true + }, + "node_modules/yaml": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", + "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.0.tgz", + "integrity": "sha512-HvWtU2UG41LALjajJrML6uQejQhNJx+JBO9IflpSja4R03iNWfKXrj6W2h7ljuLyc1nKS+9yDyL/9tD1U/yBnQ==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25 || ^4" + } + } + } +} diff --git a/src/samples/package.json b/src/samples/package.json new file mode 100644 index 00000000..f41ae5f7 --- /dev/null +++ b/src/samples/package.json @@ -0,0 +1,25 @@ +{ + "type": "module", + "private": true, + "scripts": { + "a2a:cli": "tsx cli.ts", + "agents:movie-agent": "tsx agents/movie-agent/index.ts", + "agents:sample-agent": "tsx agents/sample-agent/index.ts", + "agents:extension-agent": "tsx extensions/index.ts", + "agents:authentication-agent": "tsx authentication/index.ts" + }, + "devDependencies": { + "@genkit-ai/googleai": "^1.8.0", + "@types/express": "^5.0.5", + "@types/passport": "^1.0.17", + "@types/passport-jwt": "^4.0.1", + "express": "^5.1.0", + "genkit": "^1.8.0", + "passport": "^0.7.0", + "passport-jwt": "^4.0.1", + "tsx": "^4.19.3" + }, + "dependencies": { + "uuid": "^11.1.0" + } +} \ No newline at end of file From 343af4eff23daf0e1a5b2c19437e0087cc28bf36 Mon Sep 17 00:00:00 2001 From: Guglielmo Colombo Date: Thu, 18 Dec 2025 23:32:34 +0100 Subject: [PATCH 16/64] Update src/server/grpc/grpc_handler.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/server/grpc/grpc_handler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index ee51219a..9c474390 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -266,8 +266,8 @@ const buildContext = async ( userBuilder: gRpcHandlerOptions['userBuilder'] ): Promise => { const user = await userBuilder(call); - const extensionHeader = call.metadata.get(HTTP_EXTENSION_HEADER.toLowerCase()); - const extensionString = Array.isArray(extensionHeader) ? extensionHeader.join(',') : (extensionHeader as string); + const extensionValues = call.metadata.get(HTTP_EXTENSION_HEADER.toLowerCase()); + const extensionString = extensionValues.map(v => v.toString()).join(','); return new ServerCallContext( Extensions.parseServiceParameter(extensionString), From 7f8f0f11c9017b9dc830964e2b31fdc49638cc2e Mon Sep 17 00:00:00 2001 From: Guglielmo Colombo Date: Thu, 18 Dec 2025 23:35:03 +0100 Subject: [PATCH 17/64] Update src/server/grpc/grpc_handler.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/server/grpc/grpc_handler.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index 9c474390..c8220c57 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -101,13 +101,7 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { call.write(response); } } catch (error) { - const a2aError = - error instanceof A2AError - ? error - : A2AError.internalError( - error instanceof Error ? error.message : 'Internal server error' - ); - call.emit('error', mapToError(a2aError)); + call.emit('error', mapToError(error)); } finally { call.end(); } From 7529971b898a6b3babd94d905c863537a5656544 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Thu, 18 Dec 2025 22:37:17 +0000 Subject: [PATCH 18/64] run linter --- src/grpc/utils/proto_type_converter.ts | 12 +--- src/server/grpc/grpc_handler.ts | 54 +++++++++-------- .../transports/grpc/grpc_transport_handler.ts | 2 +- test/server/grpc_handler.spec.ts | 58 ++++++++++++------- 4 files changed, 64 insertions(+), 62 deletions(-) diff --git a/src/grpc/utils/proto_type_converter.ts b/src/grpc/utils/proto_type_converter.ts index aa09ec7a..d19abcb6 100644 --- a/src/grpc/utils/proto_type_converter.ts +++ b/src/grpc/utils/proto_type_converter.ts @@ -6,24 +6,15 @@ import { AgentExtension, AgentInterface, AgentProvider, - APIKeySecurityScheme, Artifact, AuthenticationInfo, - AuthorizationCodeOAuthFlow, CancelTaskRequest, - ClientCredentialsOAuthFlow, FilePart as ProtoFilePart, GetTaskPushNotificationConfigRequest, GetTaskRequest, - HTTPAuthSecurityScheme, - ImplicitOAuthFlow, Message, - MutualTlsSecurityScheme, - OAuth2SecurityScheme, OAuthFlows, - OpenIdConnectSecurityScheme, Part, - PasswordOAuthFlow, PushNotificationConfig, Role, Security, @@ -32,7 +23,6 @@ import { SendMessageRequest, SendMessageResponse, StreamResponse, - StringList, Task, TaskArtifactUpdateEvent, TaskPushNotificationConfig, @@ -339,7 +329,7 @@ export class ToProto { }, }; } else if (flows.password) { - return { + return { flow: { $case: 'password', value: { diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index c8220c57..21e3707f 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -17,10 +17,7 @@ import { TaskPushNotificationConfig, TaskSubscriptionRequest, } from '../../grpc/a2a.js'; -import { - MessageSendParams, - TaskIdParams, -} from '../../types.js'; +import { MessageSendParams, TaskIdParams } from '../../types.js'; import { Empty } from '../../grpc/google/protobuf/empty.js'; import { A2ARequestHandler } from '../request_handler/a2a_request_handler.js'; import { FromProto, ToProto } from '../../grpc/utils/proto_type_converter.js'; @@ -62,15 +59,15 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { handler: (params: TParams, ctx: ServerCallContext) => Promise, converter: (res: TResult) => TRes ) => { - try { - const context = await buildContext(call, options.userBuilder); - const params = parser(call.request); - const result = await handler(params, context); - call.sendMetadata(buildMetadata(context)); - callback(null, converter(result)); - } catch (error) { - callback(mapToError(error), null); - } + try { + const context = await buildContext(call, options.userBuilder); + const params = parser(call.request); + const result = await handler(params, context); + call.sendMetadata(buildMetadata(context)); + callback(null, converter(result)); + } catch (error) { + callback(mapToError(error), null); + } }; return { @@ -232,21 +229,22 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { * Maps A2AError or standard Error to gRPC Status codes */ const mapping: Record = { - [-32001]: grpc.status.NOT_FOUND, - [-32002]: grpc.status.FAILED_PRECONDITION, - [-32007]: grpc.status.FAILED_PRECONDITION, - [-32008]: grpc.status.FAILED_PRECONDITION, - [-32003]: grpc.status.UNIMPLEMENTED, - [-32004]: grpc.status.UNIMPLEMENTED, - [-32009]: grpc.status.UNIMPLEMENTED, - [-32005]: grpc.status.INVALID_ARGUMENT, - [-32006]: grpc.status.INTERNAL, - }; + [-32001]: grpc.status.NOT_FOUND, + [-32002]: grpc.status.FAILED_PRECONDITION, + [-32007]: grpc.status.FAILED_PRECONDITION, + [-32008]: grpc.status.FAILED_PRECONDITION, + [-32003]: grpc.status.UNIMPLEMENTED, + [-32004]: grpc.status.UNIMPLEMENTED, + [-32009]: grpc.status.UNIMPLEMENTED, + [-32005]: grpc.status.INVALID_ARGUMENT, + [-32006]: grpc.status.INTERNAL, +}; const mapToError = (error: unknown): Partial => { - const a2aError = error instanceof A2AError - ? error - : A2AError.internalError(error instanceof Error ? error.message : 'Unknown Error'); + const a2aError = + error instanceof A2AError + ? error + : A2AError.internalError(error instanceof Error ? error.message : 'Unknown Error'); return { message: a2aError.message, @@ -260,8 +258,8 @@ const buildContext = async ( userBuilder: gRpcHandlerOptions['userBuilder'] ): Promise => { const user = await userBuilder(call); - const extensionValues = call.metadata.get(HTTP_EXTENSION_HEADER.toLowerCase()); - const extensionString = extensionValues.map(v => v.toString()).join(','); + const extensionHeaders = call.metadata.get(HTTP_EXTENSION_HEADER.toLowerCase()); + const extensionString = extensionHeaders.map((v) => v.toString()).join(','); return new ServerCallContext( Extensions.parseServiceParameter(extensionString), diff --git a/src/server/transports/grpc/grpc_transport_handler.ts b/src/server/transports/grpc/grpc_transport_handler.ts index b5049897..cea5781c 100644 --- a/src/server/transports/grpc/grpc_transport_handler.ts +++ b/src/server/transports/grpc/grpc_transport_handler.ts @@ -70,7 +70,7 @@ export class gRpcTransportHandler { * Validates historyLength parameter if provided. */ async getTask(params: TaskQueryParams, context: ServerCallContext): Promise { - if (params.historyLength !== undefined && params.historyLength < 0){ + if (params.historyLength !== undefined && params.historyLength < 0) { throw A2AError.invalidParams('historyLength must be non-negative'); } return this.requestHandler.getTask(params, context); diff --git a/test/server/grpc_handler.spec.ts b/test/server/grpc_handler.spec.ts index 21c1d7f0..bf75a82f 100644 --- a/test/server/grpc_handler.spec.ts +++ b/test/server/grpc_handler.spec.ts @@ -34,7 +34,10 @@ describe('grpcHandler', () => { }; // Helper to create a mock gRPC Unary Call - const createMockUnaryCall = (request: any, metadataValues: Record = {}): grpc.ServerUnaryCall => { + const createMockUnaryCall = ( + request: any, + metadataValues: Record = {} + ): grpc.ServerUnaryCall => { const metadata = new grpc.Metadata(); Object.entries(metadataValues).forEach(([k, v]) => metadata.set(k, v)); return { @@ -73,7 +76,7 @@ describe('grpcHandler', () => { handler = grpcHandler({ requestHandler: mockRequestHandler, - userBuilder: async () => ({ id: 'test-user' } as any), + userBuilder: async () => ({ id: 'test-user' }) as any, }); }); @@ -119,9 +122,11 @@ describe('grpcHandler', () => { const call = createMockUnaryCall({ message: { role: 'user', parts: [] } }); const callback = vi.fn(); - const messageSendParams = { message: { role: 'user' } } as MessageSendParams + const messageSendParams = { message: { role: 'user' } } as MessageSendParams; (FromProto.messageSendParams as Mock).mockReturnValue(messageSendParams); - const sendMessageResponse = { payload: { $case: 'task', value: { id: 'task-1' } } as proto.SendMessageResponse }; + const sendMessageResponse = { + payload: { $case: 'task', value: { id: 'task-1' } } as proto.SendMessageResponse, + }; (ToProto.messageSendResult as Mock).mockReturnValue(sendMessageResponse); await handler.sendMessage(call, callback); @@ -139,7 +144,7 @@ describe('grpcHandler', () => { yield { kind: 'task', id: 't1' }; } (mockRequestHandler.sendMessageStream as Mock).mockResolvedValue(mockStream()); - + const call = createMockWritableStream({ message: { role: 'user', parts: [] } }); await handler.sendStreamingMessage(call); @@ -155,23 +160,29 @@ describe('grpcHandler', () => { await handler.sendStreamingMessage(call); - expect(call.emit).toHaveBeenCalledWith('error', expect.objectContaining({ - code: grpc.status.INTERNAL - })); + expect(call.emit).toHaveBeenCalledWith( + 'error', + expect.objectContaining({ + code: grpc.status.INTERNAL, + }) + ); expect(call.end).toHaveBeenCalled(); }); }); describe('Extensions (Metadata) Handling', () => { - it('should extract extensions from metadata and pass to context', async () => { + it('should extract extensions from metadata and pass to context', async () => { // Mocking the header 'x-a2a-extension' - const call = createMockUnaryCall({ id: 'task-1' }, { - [HTTP_EXTENSION_HEADER.toLowerCase()]: 'extension-v1' - }); + const call = createMockUnaryCall( + { id: 'task-1' }, + { + [HTTP_EXTENSION_HEADER.toLowerCase()]: 'extension-v1', + } + ); const callback = vi.fn(); (FromProto.taskQueryParams as Mock).mockReturnValue({ id: 'task-1' }); - (ToProto.task as Mock).mockReturnValue({ id: 'task-1' , contextId: 'ctx-1'}); + (ToProto.task as Mock).mockReturnValue({ id: 'task-1', contextId: 'ctx-1' }); await handler.getTask(call, callback); const contextArg = (mockRequestHandler.getTask as Mock).mock.calls[0][1]; @@ -181,18 +192,21 @@ describe('grpcHandler', () => { it('should return activated extensions in context through metadata', async () => { // Mocking the header 'x-a2a-extension' - const call = createMockUnaryCall({ id: 'task-1' }, { - [HTTP_EXTENSION_HEADER.toLowerCase()]: 'extension-v1' - }); + const call = createMockUnaryCall( + { id: 'task-1' }, + { + [HTTP_EXTENSION_HEADER.toLowerCase()]: 'extension-v1', + } + ); const callback = vi.fn(); - (mockRequestHandler.getTask as Mock).mockImplementation(async (_params, context) => { - context.addActivatedExtension('extension-v1'); - return testTask; - }); + (mockRequestHandler.getTask as Mock).mockImplementation(async (_params, context) => { + context.addActivatedExtension('extension-v1'); + return testTask; + }); (FromProto.taskQueryParams as Mock).mockReturnValue({ id: 'task-1' }); - (ToProto.task as Mock).mockReturnValue({ id: 'task-1' , contextId: 'ctx-1'}); + (ToProto.task as Mock).mockReturnValue({ id: 'task-1', contextId: 'ctx-1' }); await handler.getTask(call, callback); const [metadata] = (call.sendMetadata as Mock).mock.calls[0]; @@ -200,4 +214,4 @@ describe('grpcHandler', () => { expect(metadata.get(HTTP_EXTENSION_HEADER.toLowerCase())).toEqual(['extension-v1']); }); }); -}); \ No newline at end of file +}); From b92d0708e4c6b5d5b1021921104c175d571aec69 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 08:12:19 +0000 Subject: [PATCH 19/64] fix typo --- src/grpc/utils/proto_type_converter.ts | 22 +++++++++++----------- src/server/grpc/grpc_handler.ts | 12 +++--------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/src/grpc/utils/proto_type_converter.ts b/src/grpc/utils/proto_type_converter.ts index d19abcb6..51a440e7 100644 --- a/src/grpc/utils/proto_type_converter.ts +++ b/src/grpc/utils/proto_type_converter.ts @@ -37,13 +37,13 @@ import { } from '../a2a.js'; const TASK_ID_REGEX = /tasks\/([^/]+)/; -const CONFIG_ID_REGEX = /pushNotificationConfigs\/([^/]*)/; +const CONFIG_ID_REGEX = /pushNotificationConfigs\/([^/]+)/; /** * Converts proto types to internal types. */ export class FromProto { - private static _getTaskIdFromName(name: string): string { + private static getTaskIdFromName(name: string): string { const match = name.match(TASK_ID_REGEX); if (!match) { throw new Error(`Invalid or missing task ID in name: "${name}"`); @@ -51,7 +51,7 @@ export class FromProto { return match[1]; } - private static _getPushNotificationConfigIdFromName(name: string): string { + private static getPushNotificationConfigIdFromName(name: string): string { const match = name.match(CONFIG_ID_REGEX); if (!match || match.length < 2) { throw new Error(`Invalid or missing config ID in name: "${name}"`); @@ -61,14 +61,14 @@ export class FromProto { static taskQueryParams(request: GetTaskRequest): types.TaskQueryParams { return { - id: this._getTaskIdFromName(request.name), + id: this.getTaskIdFromName(request.name), historyLength: request.historyLength, }; } static taskIdParams(request: CancelTaskRequest): types.TaskIdParams { return { - id: this._getTaskIdFromName(request.name), + id: this.getTaskIdFromName(request.name), }; } @@ -76,8 +76,8 @@ export class FromProto { request: GetTaskPushNotificationConfigRequest ): types.GetTaskPushNotificationConfigParams { return { - id: this._getTaskIdFromName(request.name), - pushNotificationConfigId: this._getPushNotificationConfigIdFromName(request.name), + id: this.getTaskIdFromName(request.name), + pushNotificationConfigId: this.getPushNotificationConfigIdFromName(request.name), }; } @@ -85,7 +85,7 @@ export class FromProto { request: ListTaskPushNotificationConfigRequest ): types.ListTaskPushNotificationConfigParams { return { - id: this._getTaskIdFromName(request.parent), + id: this.getTaskIdFromName(request.parent), }; } @@ -93,7 +93,7 @@ export class FromProto { request: CreateTaskPushNotificationConfigRequest ): types.TaskPushNotificationConfig { return { - taskId: this._getTaskIdFromName(request.parent), + taskId: this.getTaskIdFromName(request.parent), pushNotificationConfig: this.pushNotificationConfig(request.config.pushNotificationConfig), }; } @@ -103,8 +103,8 @@ export class FromProto { ): types.DeleteTaskPushNotificationConfigParams { const name = request.name; return { - id: this._getTaskIdFromName(name), - pushNotificationConfigId: this._getPushNotificationConfigIdFromName(name), + id: this.getTaskIdFromName(name), + pushNotificationConfigId: this.getPushNotificationConfigIdFromName(name), }; } diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index 21e3707f..49b3e886 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -79,7 +79,7 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { call, callback, FromProto.messageSendParams, - (params, context) => grpcTransportHandler.sendMessage(params, context), + grpcTransportHandler.sendMessage.bind(grpcTransportHandler), ToProto.messageSendResult ); }, @@ -118,13 +118,7 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { call.write(response); } } catch (error) { - const a2aError = - error instanceof A2AError - ? error - : A2AError.internalError( - error instanceof Error ? error.message : 'Internal server error' - ); - call.emit('error', mapToError(a2aError)); + call.emit('error', mapToError(error)); } finally { call.end(); } @@ -192,7 +186,7 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { call, callback, FromProto.taskQueryParams, - (params, context) => grpcTransportHandler.getTask(params, context), + grpcTransportHandler.getTask.bind(grpcTransportHandler), ToProto.task ); }, From a467720cfdd23202d0632c63bb972e57a5de655d Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 08:52:04 +0000 Subject: [PATCH 20/64] update error types --- src/grpc/utils/proto_type_converter.ts | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/grpc/utils/proto_type_converter.ts b/src/grpc/utils/proto_type_converter.ts index 51a440e7..5296e0b7 100644 --- a/src/grpc/utils/proto_type_converter.ts +++ b/src/grpc/utils/proto_type_converter.ts @@ -1,3 +1,4 @@ +import { A2AError } from '../../server/error.js'; import * as types from '../../types.js'; import { AgentCard, @@ -46,7 +47,7 @@ export class FromProto { private static getTaskIdFromName(name: string): string { const match = name.match(TASK_ID_REGEX); if (!match) { - throw new Error(`Invalid or missing task ID in name: "${name}"`); + throw A2AError.invalidParams(`Invalid or missing task ID in name: "${name}"`); } return match[1]; } @@ -54,7 +55,7 @@ export class FromProto { private static getPushNotificationConfigIdFromName(name: string): string { const match = name.match(CONFIG_ID_REGEX); if (!match || match.length < 2) { - throw new Error(`Invalid or missing config ID in name: "${name}"`); + throw A2AError.invalidParams(`Invalid or missing config ID in name: "${name}"`); } return match[1]; } @@ -176,7 +177,7 @@ export class FromProto { }, }; } - throw new Error('Invalid file part type'); + throw A2AError.invalidParams('Invalid file part type'); } if (part.part?.$case === 'data') { @@ -185,8 +186,7 @@ export class FromProto { data: part.part.value.data, }; } - - throw new Error('Invalid part type'); + throw A2AError.invalidParams('Invalid part type'); } static messageSendParams(request: SendMessageRequest): types.MessageSendParams { @@ -312,7 +312,7 @@ export class ToProto { }, }; default: - return undefined; + throw A2AError.internalError(`Unsupported security scheme type`); } } @@ -363,7 +363,7 @@ export class ToProto { }, }; } else { - return undefined; + throw A2AError.internalError(`Unsupported OAuth flows`); } } @@ -468,7 +468,7 @@ export class ToProto { }, }; } else { - throw new Error('Invalid event type'); + throw A2AError.internalError('Invalid event type'); } } @@ -598,7 +598,7 @@ export class ToProto { mimeType: part.file.mimeType ?? '', }; } else { - throw new Error('Invalid file part'); + throw A2AError.internalError('Invalid file part'); } return { part: { $case: 'file', value: filePart }, @@ -610,7 +610,6 @@ export class ToProto { part: { $case: 'data', value: { data: part.data } }, }; } - - throw new Error('Invalid part type'); + throw A2AError.internalError('Invalid part type'); } } From 24184a1387a5b7620972c97ef701a489125b9354 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 08:57:14 +0000 Subject: [PATCH 21/64] regenerate package lock --- package-lock.json | 9587 +++++++++++++++++++++++---------------------- 1 file changed, 4980 insertions(+), 4607 deletions(-) diff --git a/package-lock.json b/package-lock.json index 571401c0..29bd5e30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -95,6 +95,13 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -162,31 +169,176 @@ "dev": true, "license": "(Apache-2.0 AND BSD-3-Clause)" }, - "node_modules/@edge-runtime/primitives": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@edge-runtime/primitives/-/primitives-6.0.0.tgz", - "integrity": "sha512-FqoxaBT+prPBHBwE1WXS1ocnu/VLTQyZ6NMUBAdbP7N2hsFTTxMC/jMu2D/8GAlMQfxeuppcPuCUk/HO3fpIvA==", + "node_modules/@cloudflare/kv-asset-handler": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.1.tgz", + "integrity": "sha512-Nu8ahitGFFJztxUml9oD/DLb7Z28C8cd8F46IVQ7y5Btz575pvMY8AqZsXkX7Gds29eCKdMgIHjIvzskHgPSFg==", + "dev": true, + "license": "MIT OR Apache-2.0", + "dependencies": { + "mime": "^3.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@cloudflare/kv-asset-handler/node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, + "bin": { + "mime": "cli.js" + }, "engines": { - "node": ">=18" + "node": ">=10.0.0" } }, - "node_modules/@edge-runtime/vm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@edge-runtime/vm/-/vm-5.0.0.tgz", - "integrity": "sha512-NKBGBSIKUG584qrS1tyxVpX/AKJKQw5HgjYEnPLC0QsTw79JrGn+qUr8CXFb955Iy7GUdiiUv1rJ6JBGvaKb6w==", + "node_modules/@cloudflare/unenv-preset": { + "version": "2.7.13", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.7.13.tgz", + "integrity": "sha512-NulO1H8R/DzsJguLC0ndMuk4Ufv0KSlN+E54ay9rn9ZCQo0kpAPwwh3LhgpZ96a3Dr6L9LqW57M4CqC34iLOvw==", + "dev": true, + "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.24", + "workerd": "^1.20251202.0" + }, + "peerDependenciesMeta": { + "workerd": { + "optional": true + } + } + }, + "node_modules/@cloudflare/vitest-pool-workers": { + "version": "0.10.15", + "resolved": "https://registry.npmjs.org/@cloudflare/vitest-pool-workers/-/vitest-pool-workers-0.10.15.tgz", + "integrity": "sha512-eISef+JvqC5xr6WBv2+kc6WEjxuKSrZ1MdMuIwdb4vsh8olqw7WHW5pLBL/UzAhbLVlXaAL1uH9UyxIlFkJe7w==", "dev": true, "license": "MIT", + "dependencies": { + "birpc": "0.2.14", + "cjs-module-lexer": "^1.2.3", + "devalue": "^5.3.2", + "miniflare": "4.20251210.0", + "semver": "^7.7.1", + "wrangler": "4.54.0", + "zod": "^3.22.3" + }, + "peerDependencies": { + "@vitest/runner": "2.0.x - 3.2.x", + "@vitest/snapshot": "2.0.x - 3.2.x", + "vitest": "2.0.x - 3.2.x" + } + }, + "node_modules/@cloudflare/workerd-darwin-64": { + "version": "1.20251210.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20251210.0.tgz", + "integrity": "sha512-Nn9X1moUDERA9xtFdCQ2XpQXgAS9pOjiCxvOT8sVx9UJLAiBLkfSCGbpsYdarODGybXCpjRlc77Yppuolvt7oQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-darwin-arm64": { + "version": "1.20251210.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20251210.0.tgz", + "integrity": "sha512-Mg8iYIZQFnbevq/ls9eW/eneWTk/EE13Pej1MwfkY5et0jVpdHnvOLywy/o+QtMJFef1AjsqXGULwAneYyBfHw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-64": { + "version": "1.20251210.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20251210.0.tgz", + "integrity": "sha512-kjC2fCZhZ2Gkm1biwk2qByAYpGguK5Gf5ic8owzSCUw0FOUfQxTZUT9Lp3gApxsfTLbbnLBrX/xzWjywH9QR4g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-linux-arm64": { + "version": "1.20251210.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20251210.0.tgz", + "integrity": "sha512-2IB37nXi7PZVQLa1OCuO7/6pNxqisRSO8DmCQ5x/3sezI5op1vwOxAcb1osAnuVsVN9bbvpw70HJvhKruFJTuA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=16" + } + }, + "node_modules/@cloudflare/workerd-windows-64": { + "version": "1.20251210.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20251210.0.tgz", + "integrity": "sha512-Uaz6/9XE+D6E7pCY4OvkCuJHu7HcSDzeGcCGY1HLhojXhHd7yL52c3yfiyJdS8hPatiAa0nn5qSI/42+aTdDSw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", "optional": true, - "peer": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=16" + } + }, + "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": { - "@edge-runtime/primitives": "6.0.0" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=18" + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/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/@emnapi/runtime": { @@ -200,10 +352,18 @@ "tslib": "^2.4.0" } }, + "node_modules/@emnapi/runtime/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", - "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", "cpu": [ "ppc64" ], @@ -218,9 +378,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz", - "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", "cpu": [ "arm" ], @@ -235,9 +395,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", - "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", "cpu": [ "arm64" ], @@ -252,9 +412,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz", - "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", "cpu": [ "x64" ], @@ -269,9 +429,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", - "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", "cpu": [ "arm64" ], @@ -286,9 +446,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", - "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", "cpu": [ "x64" ], @@ -303,9 +463,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", - "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", "cpu": [ "arm64" ], @@ -320,9 +480,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", - "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", "cpu": [ "x64" ], @@ -337,9 +497,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", - "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", "cpu": [ "arm" ], @@ -354,9 +514,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", - "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", "cpu": [ "arm64" ], @@ -371,9 +531,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", - "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", "cpu": [ "ia32" ], @@ -388,9 +548,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", - "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", "cpu": [ "loong64" ], @@ -405,9 +565,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", - "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", "cpu": [ "mips64el" ], @@ -422,9 +582,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", - "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", "cpu": [ "ppc64" ], @@ -439,9 +599,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", - "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", "cpu": [ "riscv64" ], @@ -456,9 +616,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", - "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", "cpu": [ "s390x" ], @@ -473,9 +633,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", - "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", "cpu": [ "x64" ], @@ -490,9 +650,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz", - "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", "cpu": [ "arm64" ], @@ -507,9 +667,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", - "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", "cpu": [ "x64" ], @@ -524,9 +684,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz", - "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", "cpu": [ "arm64" ], @@ -541,9 +701,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", - "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", "cpu": [ "x64" ], @@ -558,9 +718,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz", - "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", "cpu": [ "arm64" ], @@ -575,9 +735,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", - "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", "cpu": [ "x64" ], @@ -592,9 +752,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", - "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", "cpu": [ "arm64" ], @@ -609,9 +769,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", - "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", "cpu": [ "ia32" ], @@ -626,9 +786,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", - "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", "cpu": [ "x64" ], @@ -726,9 +886,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -738,7 +898,7 @@ "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, @@ -750,9 +910,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.1.tgz", - "integrity": "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "license": "MIT", "engines": { @@ -1024,45 +1184,13 @@ "url": "https://opencollective.com/libvips" } }, - "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.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz", + "integrity": "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==", + "cpu": [ + "x64" + ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, @@ -1107,74 +1235,10 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.2.tgz", - "integrity": "sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==", + "node_modules/@img/sharp-linux-arm": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz", + "integrity": "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==", "cpu": [ "arm" ], @@ -1400,6 +1464,19 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -1441,6 +1518,24 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -1490,6 +1585,16 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", @@ -1534,10 +1639,10 @@ "node": ">= 8" } }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", "dependencies": { @@ -1624,10 +1729,74 @@ "dev": true, "license": "MIT" }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "license": "BSD-3-Clause" + }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.2.tgz", - "integrity": "sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.5.tgz", + "integrity": "sha512-iDGS/h7D8t7tvZ1t6+WPK04KD0MwzLZrG0se1hzBjSi5fyxlsiggoJHwh18PCFNn7tG43OWb6pdZ6Y+rMlmyNQ==", "cpu": [ "arm" ], @@ -1639,9 +1808,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.2.tgz", - "integrity": "sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.5.tgz", + "integrity": "sha512-wrSAViWvZHBMMlWk6EJhvg8/rjxzyEhEdgfMMjREHEq11EtJ6IP6yfcCH57YAEca2Oe3FNCE9DSTgU70EIGmVw==", "cpu": [ "arm64" ], @@ -1653,9 +1822,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.2.tgz", - "integrity": "sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.53.5.tgz", + "integrity": "sha512-S87zZPBmRO6u1YXQLwpveZm4JfPpAa6oHBX7/ghSiGH3rz/KDgAu1rKdGutV+WUI6tKDMbaBJomhnT30Y2t4VQ==", "cpu": [ "arm64" ], @@ -1667,9 +1836,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.2.tgz", - "integrity": "sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.53.5.tgz", + "integrity": "sha512-YTbnsAaHo6VrAczISxgpTva8EkfQus0VPEVJCEaboHtZRIb6h6j0BNxRBOwnDciFTZLDPW5r+ZBmhL/+YpTZgA==", "cpu": [ "x64" ], @@ -1680,10 +1849,14 @@ "darwin" ] }, - "node_modules/@types/node": { - "version": "22.19.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", - "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.53.5.tgz", + "integrity": "sha512-1T8eY2J8rKJWzaznV7zedfdhD1BqVs1iqILhmHDq/bqCUZsrMt+j8VCTHhP0vdfbHK3e1IQ7VYx3jlKqwlf+vw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1691,9 +1864,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.2.tgz", - "integrity": "sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.53.5.tgz", + "integrity": "sha512-sHTiuXyBJApxRn+VFMaw1U+Qsz4kcNlxQ742snICYPrY+DDL8/ZbaC4DVIB7vgZmp3jiDaKA0WpBdP0aqPJoBQ==", "cpu": [ "x64" ], @@ -1705,9 +1878,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.2.tgz", - "integrity": "sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.53.5.tgz", + "integrity": "sha512-dV3T9MyAf0w8zPVLVBptVlzaXxka6xg1f16VAQmjg+4KMSTWDvhimI/Y6mp8oHwNrmnmVl9XxJ/w/mO4uIQONA==", "cpu": [ "arm" ], @@ -1719,9 +1892,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.2.tgz", - "integrity": "sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.53.5.tgz", + "integrity": "sha512-wIGYC1x/hyjP+KAu9+ewDI+fi5XSNiUi9Bvg6KGAh2TsNMA3tSEs+Sh6jJ/r4BV/bx/CyWu2ue9kDnIdRyafcQ==", "cpu": [ "arm" ], @@ -1733,9 +1906,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.2.tgz", - "integrity": "sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.5.tgz", + "integrity": "sha512-Y+qVA0D9d0y2FRNiG9oM3Hut/DgODZbU9I8pLLPwAsU0tUKZ49cyV1tzmB/qRbSzGvY8lpgGkJuMyuhH7Ma+Vg==", "cpu": [ "arm64" ], @@ -1747,9 +1920,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.2.tgz", - "integrity": "sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.5.tgz", + "integrity": "sha512-juaC4bEgJsyFVfqhtGLz8mbopaWD+WeSOYr5E16y+1of6KQjc0BpwZLuxkClqY1i8sco+MdyoXPNiCkQou09+g==", "cpu": [ "arm64" ], @@ -1761,9 +1934,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.2.tgz", - "integrity": "sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.53.5.tgz", + "integrity": "sha512-rIEC0hZ17A42iXtHX+EPJVL/CakHo+tT7W0pbzdAGuWOt2jxDFh7A/lRhsNHBcqL4T36+UiAgwO8pbmn3dE8wA==", "cpu": [ "loong64" ], @@ -1775,9 +1948,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.2.tgz", - "integrity": "sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.53.5.tgz", + "integrity": "sha512-T7l409NhUE552RcAOcmJHj3xyZ2h7vMWzcwQI0hvn5tqHh3oSoclf9WgTl+0QqffWFG8MEVZZP1/OBglKZx52Q==", "cpu": [ "ppc64" ], @@ -1789,9 +1962,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.2.tgz", - "integrity": "sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.53.5.tgz", + "integrity": "sha512-7OK5/GhxbnrMcxIFoYfhV/TkknarkYC1hqUw1wU2xUN3TVRLNT5FmBv4KkheSG2xZ6IEbRAhTooTV2+R5Tk0lQ==", "cpu": [ "riscv64" ], @@ -1803,9 +1976,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.2.tgz", - "integrity": "sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.53.5.tgz", + "integrity": "sha512-GwuDBE/PsXaTa76lO5eLJTyr2k8QkPipAyOrs4V/KJufHCZBJ495VCGJol35grx9xryk4V+2zd3Ri+3v7NPh+w==", "cpu": [ "riscv64" ], @@ -1817,9 +1990,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.2.tgz", - "integrity": "sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.53.5.tgz", + "integrity": "sha512-IAE1Ziyr1qNfnmiQLHBURAD+eh/zH1pIeJjeShleII7Vj8kyEm2PF77o+lf3WTHDpNJcu4IXJxNO0Zluro8bOw==", "cpu": [ "s390x" ], @@ -1831,9 +2004,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.2.tgz", - "integrity": "sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.5.tgz", + "integrity": "sha512-Pg6E+oP7GvZ4XwgRJBuSXZjcqpIW3yCBhK4BcsANvb47qMvAbCjR6E+1a/U2WXz1JJxp9/4Dno3/iSJLcm5auw==", "cpu": [ "x64" ], @@ -1845,9 +2018,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.2.tgz", - "integrity": "sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.53.5.tgz", + "integrity": "sha512-txGtluxDKTxaMDzUduGP0wdfng24y1rygUMnmlUJ88fzCCULCLn7oE5kb2+tRB+MWq1QDZT6ObT5RrR8HFRKqg==", "cpu": [ "x64" ], @@ -1859,9 +2032,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.2.tgz", - "integrity": "sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.5.tgz", + "integrity": "sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==", "cpu": [ "arm64" ], @@ -1873,9 +2046,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.2.tgz", - "integrity": "sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.53.5.tgz", + "integrity": "sha512-nggc/wPpNTgjGg75hu+Q/3i32R00Lq1B6N1DO7MCU340MRKL3WZJMjA9U4K4gzy3dkZPXm9E1Nc81FItBVGRlA==", "cpu": [ "arm64" ], @@ -1887,120 +2060,276 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.2.tgz", - "integrity": "sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==", + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.53.5.tgz", + "integrity": "sha512-U/54pTbdQpPLBdEzCT6NBCFAfSZMvmjr0twhnD9f4EIvlm9wy3jjQ38yQj1AGznrNO65EWQMgm/QUjuIVrYF9w==", "cpu": [ "ia32" ], "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.47.0", - "@typescript-eslint/types": "^8.47.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.47.0.tgz", - "integrity": "sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==", + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.53.5.tgz", + "integrity": "sha512-2NqKgZSuLH9SXBBV2dWNRCZmocgSOx8OJSdpRaEcRlIfX8YrKxUT6z0F1NpvDVhOsl190UFTRh2F2WDWWCYp3A==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.47.0.tgz", - "integrity": "sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.5.tgz", + "integrity": "sha512-JRpZUhCfhZ4keB5v0fe02gQJy05GqboPOaxvjugW04RLSYYoB/9t2lx2u/tMs/Na/1NXfY8QYjgRljRpN+MjTQ==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.47.0.tgz", - "integrity": "sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==", + "node_modules/@sindresorhus/is": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.1.1.tgz", + "integrity": "sha512-rO92VvpgMc3kfiTjGT52LEtJ8Yc5kCWhZjLQ3LwlA4pSgPpQO7bVpYXParOD8Jwf+cVQECJo3yP/4I8aZtUQTQ==", "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0", - "@typescript-eslint/utils": "8.47.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.47.0.tgz", - "integrity": "sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==", + "node_modules/@speed-highlight/core": { + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.12.tgz", + "integrity": "sha512-uilwrK0Ygyri5dToHYdZSjcvpS2ZwX0w5aSt3GCEN9hrjxWCoeV4Z2DTXuxjwbntaLQIEEAlCeNQss5SoHvAEA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/@types/body-parser": { + "version": "1.19.6", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", + "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", "dev": true, "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "dependencies": { + "@types/connect": "*", + "@types/node": "*" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.47.0.tgz", - "integrity": "sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==", + "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": { - "@typescript-eslint/project-service": "8.47.0", - "@typescript-eslint/tsconfig-utils": "8.47.0", - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cookiejar": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", + "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", + "dev": true, + "license": "MIT" + }, + "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.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", + "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^5.0.0", + "@types/serve-static": "^2" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", + "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", + "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/methods": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", + "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.19.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", + "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", + "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*" + } + }, + "node_modules/@types/superagent": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", + "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cookiejar": "^2.1.5", + "@types/methods": "^1.1.4", + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/supertest": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", + "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/methods": "^1.1.4", + "@types/superagent": "^8.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.0.tgz", + "integrity": "sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/type-utils": "8.50.0", + "@typescript-eslint/utils": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "engines": { @@ -2011,46 +2340,56 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { + "@typescript-eslint/parser": "^8.50.0", + "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "engines": { + "node": ">= 4" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/@typescript-eslint/parser": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.50.0.tgz", + "integrity": "sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/utils": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.47.0.tgz", - "integrity": "sha512-g7XrNf25iL4TJOiPqatNuaChyqt49a/onq5YsJ9+hXeugK+41LVg7AxikMfM02PC6jbNtZLCJj6AUcQXJS/jGQ==", + "node_modules/@typescript-eslint/project-service": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.50.0.tgz", + "integrity": "sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.47.0", - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0" + "@typescript-eslint/tsconfig-utils": "^8.50.0", + "@typescript-eslint/types": "^8.50.0", + "debug": "^4.3.4" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2060,19 +2399,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.47.0.tgz", - "integrity": "sha512-SIV3/6eftCy1bNzCQoPmbWsRLujS8t5iDIZ4spZOBHqrM+yfX2ogg8Tt3PDTAVKw3sSCiUgg30uOAvK2r9zGjQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.50.0.tgz", + "integrity": "sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.47.0", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2082,98 +2420,214 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@vitest/coverage-v8": { - "version": "4.0.15", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.0.15.tgz", - "integrity": "sha512-FUJ+1RkpTFW7rQITdgTi93qOCWJobWhBirEPCeXh2SW2wsTlFxy51apDz5gzG+ZEYt/THvWeNmhdAoS9DTwpCw==", + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.0.tgz", + "integrity": "sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==", "dev": true, "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^1.0.2", - "@vitest/utils": "4.0.15", - "ast-v8-to-istanbul": "^0.3.8", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.2.0", - "magicast": "^0.5.1", - "obug": "^2.1.1", - "std-env": "^3.10.0", - "tinyrainbow": "^3.0.3" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@vitest/browser": "4.0.15", - "vitest": "4.0.15" - }, - "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true - } + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "node_modules/@typescript-eslint/type-utils": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.50.0.tgz", + "integrity": "sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==", "dev": true, "license": "MIT", "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/utils": "8.50.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@vitest/expect/node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "node_modules/@typescript-eslint/types": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.50.0.tgz", + "integrity": "sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==", "dev": true, "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://opencollective.com/vitest" - } + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.0.tgz", + "integrity": "sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.50.0", + "@typescript-eslint/tsconfig-utils": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", + "debug": "^4.3.4", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.50.0.tgz", + "integrity": "sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.0.tgz", + "integrity": "sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.50.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" }, - "node_modules/@vitest/expect/node_modules/@vitest/utils": { + "node_modules/@vitest/coverage-v8": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", + "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^1.0.2", + "ast-v8-to-istanbul": "^0.3.3", + "debug": "^4.4.1", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.17", + "magicast": "^0.3.5", + "std-env": "^3.9.0", + "test-exclude": "^7.0.1", "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "3.2.4", + "vitest": "3.2.4" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } } }, - "node_modules/@vitest/expect/node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", "dev": true, "license": "MIT", - "engines": { - "node": ">=14.0.0" + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/mocker": { @@ -2203,19 +2657,18 @@ } } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.53.2.tgz", - "integrity": "sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==", - "cpu": [ - "x64" - ], + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } }, "node_modules/@vitest/runner": { "version": "3.2.4", @@ -2232,20 +2685,35 @@ "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner/node_modules/@vitest/pretty-format": { + "node_modules/@vitest/snapshot": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^2.0.0" + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner/node_modules/@vitest/utils": { + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", @@ -2257,135 +2725,87 @@ "tinyrainbow": "^2.0.0" }, "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner/node_modules/tinyrainbow": { + "node_modules/accepts": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "dev": true, "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, "engines": { - "node": ">=14.0.0" + "node": ">= 0.6" } }, - "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" + "bin": { + "acorn": "bin/acorn" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">=0.4.0" } }, - "node_modules/@vitest/snapshot/node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@vitest/snapshot/node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=0.4.0" } }, - "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { - "tinyspy": "^4.0.3" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "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/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cookiejar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", - "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", - "dev": true, - "license": "MIT" - }, - "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.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/express": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.5.tgz", - "integrity": "sha512-LuIQOcb6UmnF7C1PCFmEU1u2hmiHL43fgFQX67sN3H4Z+0Yk0Neo++mFsBjhOAuLzvlQeqAAkeDOZrJs9rzumQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^1" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.0.tgz", - "integrity": "sha512-jnHMsrd0Mwa9Cf4IdOzbz543y4XJepXrbia2T4b6+spXC2We3t1y6K44D3mR8XMFSXMCf3/l7rCgddfx7UNVBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-regex": { @@ -2403,308 +2823,271 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", "dev": true, "license": "MIT" }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "license": "MIT" + "license": "Python-2.0" }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/@types/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, "license": "MIT" }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, "license": "MIT", - "dependencies": { - "@types/node": "*" + "engines": { + "node": ">=12" } }, - "node_modules/@types/serve-static": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", + "node_modules/ast-v8-to-istanbul": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.9.tgz", + "integrity": "sha512-dSC6tJeOJxbZrPzPbv5mMd6CMiQ1ugaVXXPRad2fXUSsy1kstFn9XQWemV9VW7Y7kpxgQ/4WMoZfwdH8XSU48w==", "dev": true, "license": "MIT", "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "<1" + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^9.0.1" } }, - "node_modules/@types/serve-static/node_modules/@types/send": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } + "license": "MIT" }, - "node_modules/@types/superagent": { - "version": "8.1.9", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", - "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/cookiejar": "^2.1.5", - "@types/methods": "^1.1.4", - "@types/node": "*", - "form-data": "^4.0.0" - } + "license": "MIT" }, - "node_modules/@types/supertest": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", - "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", + "node_modules/birpc": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.14.tgz", + "integrity": "sha512-37FHE8rqsYM5JEKCnXFyHpBCzvgHEExwVVTq+nUmloInU7l8ezD1TpOhKpS8oe1DTYFqEK27rFZVKG43oTqXRA==", "dev": true, "license": "MIT", - "dependencies": { - "@types/methods": "^1.1.4", - "@types/superagent": "^8.1.0" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.47.0.tgz", - "integrity": "sha512-fe0rz9WJQ5t2iaLfdbDc9T80GJy0AeO453q8C3YCilnGozvOyCG5t+EZtg7j7D88+c3FipfP/x+wzGnh1xp8ZA==", + "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/body-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", + "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.47.0", - "@typescript-eslint/type-utils": "8.47.0", - "@typescript-eslint/utils": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.0", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.47.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "url": "https://opencollective.com/express" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 4" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@typescript-eslint/parser": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.47.0.tgz", - "integrity": "sha512-lJi3PfxVmo0AkEY93ecfN+r8SofEqZNGByvHAI3GBLrvt1Cw6H5k1IM02nSzu0RfUafr2EvFSw0wAsZgubNplQ==", + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.47.0", - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0", - "debug": "^4.3.4" + "fill-range": "^7.1.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "node": ">=8" } }, - "node_modules/@typescript-eslint/project-service": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.47.0.tgz", - "integrity": "sha512-2X4BX8hUeB5JcA1TQJ7GjcgulXQ+5UkNb0DL8gHsHUHdFoiCTJoYLTpib3LtSDPZsRET5ygN4qqIWrHyYIKERA==", + "node_modules/builtins": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.47.0", - "@typescript-eslint/types": "^8.47.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "semver": "^7.0.0" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.47.0.tgz", - "integrity": "sha512-a0TTJk4HXMkfpFkL9/WaGTNuv7JWfFTQFJd6zS9dVAjKsojmv9HT55xzbEpnZoY+VUb+YXLMp+ihMLz/UlZfDg==", + "node_modules/bundle-require": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", + "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0" + "load-tsconfig": "^0.2.3" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "esbuild": ">=0.18" } }, - "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.47.0.tgz", - "integrity": "sha512-ybUAvjy4ZCL11uryalkKxuT3w3sXJAuWhOoGS3T/Wu+iUu1tGJmk5ytSY8gbdACNARmcYEB0COksD2j6hfGK2g==", + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "node": ">= 0.8" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.47.0.tgz", - "integrity": "sha512-QC9RiCmZ2HmIdCEvhd1aJELBlD93ErziOXXlHEZyuBo3tBiAZieya0HLIxp+DoDWlsQqDawyKuNEhORyku+P8A==", + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0", - "@typescript-eslint/utils": "8.47.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "node": ">=8" } }, - "node_modules/@typescript-eslint/types": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.47.0.tgz", - "integrity": "sha512-nHAE6bMKsizhA2uuYZbEbmp5z2UpffNrPEqiKIeN7VsV6UY/roxanWfoRrf6x/k9+Obf+GQdkm0nPU+vnMXo9A==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "engines": { + "node": ">= 0.4" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.47.0.tgz", - "integrity": "sha512-k6ti9UepJf5NpzCjH31hQNLHQWupTRPhZ+KFF8WtTuTpy7uHPfeg2NM7cP27aCGajoEplxJDFVCEm9TGPYyiVg==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.47.0", - "@typescript-eslint/tsconfig-utils": "8.47.0", - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/visitor-keys": "8.47.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 0.4" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "engines": { + "node": ">=6" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "license": "ISC", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/case-anything": { @@ -2744,21 +3127,14 @@ "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.47.0", - "@typescript-eslint/types": "8.47.0", - "@typescript-eslint/typescript-estree": "8.47.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/chardet": { @@ -2785,73 +3161,43 @@ "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.47.0", - "eslint-visitor-keys": "^4.2.1" + "readdirp": "^4.0.1" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 14.16.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/@vitest/coverage-v8": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", - "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==", + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@bcoe/v8-coverage": "^1.0.2", - "ast-v8-to-istanbul": "^0.3.3", - "debug": "^4.4.1", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.6", - "istanbul-reports": "^3.1.7", - "magic-string": "^0.30.17", - "magicast": "^0.3.5", - "std-env": "^3.9.0", - "test-exclude": "^7.0.1", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@vitest/browser": "3.2.4", - "vitest": "3.2.4" + "restore-cursor": "^3.1.0" }, - "peerDependenciesMeta": { - "@vitest/browser": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "license": "ISC", + "engines": { + "node": ">= 10" } }, "node_modules/cliui": { @@ -2868,21 +3214,18 @@ "node": ">=12" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/color": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", + "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "color-convert": "^2.0.1", + "color-string": "^1.9.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=12.5.0" } }, "node_modules/color-convert": { @@ -2891,24 +3234,10 @@ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "license": "MIT", "dependencies": { - "@vitest/spy": "3.2.4", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + "color-name": "~1.1.4" }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { @@ -2917,6 +3246,17 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "license": "MIT" }, + "node_modules/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2924,198 +3264,175 @@ "dev": true, "license": "MIT", "dependencies": { - "tinyrainbow": "^2.0.0" + "delayed-stream": "~1.0.0" }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">= 0.8" } }, - "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, "license": "MIT", - "dependencies": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": ">= 6" } }, - "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", "dev": true, "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" - }, "funding": { - "url": "https://opencollective.com/vitest" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", + "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", "dev": true, "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "engines": { + "node": "^14.18.0 || >=16.10.0" } }, - "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "node_modules/content-disposition": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", + "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", "dev": true, "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" + "engines": { + "node": ">=18" }, "funding": { - "url": "https://opencollective.com/vitest" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, "engines": { "node": ">= 0.6" } }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, "engines": { - "node": ">=0.4.0" + "node": ">= 0.6" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "dev": true, "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + "engines": { + "node": ">=6.6.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "node_modules/cookiejar": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", + "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } + "license": "MIT" }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">= 8" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "ms": "^2.1.3" }, "engines": { - "node": ">=8" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/deep-eql": { @@ -3135,78 +3452,79 @@ "dev": true, "license": "MIT" }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=12" + "node": ">=0.4.0" } }, - "node_modules/ast-v8-to-istanbul": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.8.tgz", - "integrity": "sha512-szgSZqUxI5T8mLKvS7WTjF9is+MVbOeLADU73IseOcrqhxr/VAvy6wfoVE39KnKzA7JRhjF5eUagNlHwvZPlKQ==", + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.31", - "estree-walker": "^3.0.3", - "js-tokens": "^9.0.1" + "engines": { + "node": ">= 0.8" } }, "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "license": "Apache-2.0", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, "engines": { - "node": ">=0.10" + "node": ">=8" } }, + "node_modules/devalue": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz", + "integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==", + "dev": true, + "license": "MIT" + }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/birpc": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.14.tgz", - "integrity": "sha512-37FHE8rqsYM5JEKCnXFyHpBCzvgHEExwVVTq+nUmloInU7l8ezD1TpOhKpS8oe1DTYFqEK27rFZVKG43oTqXRA==", + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } }, "node_modules/dprint-node": { "version": "1.0.8", @@ -3218,6 +3536,19 @@ "detect-libc": "^1.0.3" } }, + "node_modules/dprint-node/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -3225,22 +3556,12 @@ "dev": true, "license": "MIT", "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">= 0.4" } }, "node_modules/eastasianwidth": { @@ -3263,104 +3584,132 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/builtins": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", - "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.0.0" + "is-arrayish": "^0.2.1" } }, - "node_modules/bundle-require": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", "dev": true, "license": "MIT", - "dependencies": { - "load-tsconfig": "^0.2.3" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.18" + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.4" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "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/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", "dev": true, + "hasInstallScript": true, "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=6" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" } }, "node_modules/escalade": { @@ -3377,801 +3726,817 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/chai": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", - "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" }, - "engines": { - "node": ">=18" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=10" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 16" + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", "dev": true, "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" }, "engines": { - "node": ">= 14.16.0" + "node": ">=8.10.0" }, "funding": { - "url": "https://paulmillr.com/funding/" + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" } }, - "node_modules/cjs-module-lexer": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", - "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "license": "MIT", "dependencies": { - "restore-cursor": "^3.1.0" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": ">=8" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "ISC", + "license": "Apache-2.0", "engines": { - "node": ">= 10" + "node": ">=4" } }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", + "node_modules/eslint-plugin-n": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", "dev": true, "license": "MIT", "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" }, "engines": { - "node": ">=12.5.0" + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/eslint-plugin-prettier": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", "dev": true, "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" }, "engines": { - "node": ">=7.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "license": "MIT", "dependencies": { - "delayed-stream": "~1.0.0" + "eslint-visitor-keys": "^2.0.0" }, "engines": { - "node": ">= 0.8" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">= 6" - } - }, - "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": "^14.18.0 || >=16.10.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, "engines": { - "node": ">=18" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://opencollective.com/eslint" } }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=0.10" } }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=4.0" } }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "engines": { - "node": ">=6.6.0" + "node": ">=4.0" } }, - "node_modules/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" + "@types/estree": "^1.0.0" } }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "license": "MIT", "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "node_modules/exit-hook": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", + "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "engines": { - "node": ">=6" + "node": ">=12.0.0" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "dev": true, "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, "engines": { - "node": ">=0.4.0" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/devalue": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz", - "integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==", + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true, - "license": "ISC", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } + "license": "Apache-2.0" }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { - "path-type": "^4.0.0" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" + "is-glob": "^4.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 6" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, "license": "MIT" }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true, "license": "MIT" }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "license": "MIT", "dependencies": { - "is-arrayish": "^0.2.1" + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/error-stack-parser-es": { + "node_modules/figures/node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", - "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" + "engines": { + "node": ">=0.8.0" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=16.0.0" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "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/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0" + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/esbuild": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz", - "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", + "node_modules/fix-dts-default-cjs-exports": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", + "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" + "dependencies": { + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "rollup": "^4.34.8" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" }, "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.0", - "@esbuild/android-arm": "0.27.0", - "@esbuild/android-arm64": "0.27.0", - "@esbuild/android-x64": "0.27.0", - "@esbuild/darwin-arm64": "0.27.0", - "@esbuild/darwin-x64": "0.27.0", - "@esbuild/freebsd-arm64": "0.27.0", - "@esbuild/freebsd-x64": "0.27.0", - "@esbuild/linux-arm": "0.27.0", - "@esbuild/linux-arm64": "0.27.0", - "@esbuild/linux-ia32": "0.27.0", - "@esbuild/linux-loong64": "0.27.0", - "@esbuild/linux-mips64el": "0.27.0", - "@esbuild/linux-ppc64": "0.27.0", - "@esbuild/linux-riscv64": "0.27.0", - "@esbuild/linux-s390x": "0.27.0", - "@esbuild/linux-x64": "0.27.0", - "@esbuild/netbsd-arm64": "0.27.0", - "@esbuild/netbsd-x64": "0.27.0", - "@esbuild/openbsd-arm64": "0.27.0", - "@esbuild/openbsd-x64": "0.27.0", - "@esbuild/openharmony-arm64": "0.27.0", - "@esbuild/sunos-x64": "0.27.0", - "@esbuild/win32-arm64": "0.27.0", - "@esbuild/win32-ia32": "0.27.0", - "@esbuild/win32-x64": "0.27.0" + "node": ">=16" } }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint": { - "version": "9.39.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz", - "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.8.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.2", - "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.1", - "@eslint/plugin-kit": "^0.4.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, + "license": "ISC", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=14" }, "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/eslint-config-prettier": { - "version": "10.1.8", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", - "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "funding": { - "url": "https://opencollective.com/eslint-config-prettier" + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" }, - "peerDependencies": { - "eslint": ">=7.0.0" + "engines": { + "node": ">= 6" } }, - "node_modules/eslint-plugin-es": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", - "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" + "mime-db": "1.52.0" }, "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" + "node": ">= 0.6" } }, - "node_modules/eslint-plugin-es/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "node_modules/formidable": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "@paralleldrive/cuid2": "^2.2.2", + "dezalgo": "^1.0.4", + "once": "^1.4.0" }, "engines": { - "node": ">=6" + "node": ">=14.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://ko-fi.com/tunnckoCore/commissions" } }, - "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.6" } }, - "node_modules/eslint-plugin-n": { - "version": "15.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", - "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "dev": true, "license": "MIT", - "dependencies": { - "builtins": "^5.0.1", - "eslint-plugin-es": "^4.1.0", - "eslint-utils": "^3.0.0", - "ignore": "^5.1.1", - "is-core-module": "^2.11.0", - "minimatch": "^3.1.2", - "resolve": "^1.22.1", - "semver": "^7.3.8" - }, "engines": { - "node": ">=12.22.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "node": ">= 0.8" } }, - "node_modules/eslint-plugin-prettier": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", - "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.11.7" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^14.18.0 || >=16.0.0" - }, + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-caller-file": { @@ -4188,166 +4553,140 @@ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "node": ">= 0.4" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "resolve-pkg-maps": "^1.0.0" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "BSD-3-Clause", + "license": "ISC", "dependencies": { - "estraverse": "^5.1.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=0.10" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "BSD-2-Clause", + "license": "ISC", "dependencies": { - "estraverse": "^5.2.0" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" + "node": ">=10.13.0" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } + "license": "BSD-2-Clause" }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/google-proto-files": { @@ -4371,452 +4710,591 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/gts": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/gts/-/gts-6.0.2.tgz", + "integrity": "sha512-lp9+eDzzm6TYqiBpgGY00EInxBHFTJiU5brsVp11qXCJEw7Q6WNNngja0spZeqSFWSquaRuHQUuWxdZLaxnKmw==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@typescript-eslint/eslint-plugin": "5.62.0", + "@typescript-eslint/parser": "5.62.0", + "chalk": "^4.1.2", + "eslint": "8.57.1", + "eslint-config-prettier": "9.1.0", + "eslint-plugin-n": "15.7.0", + "eslint-plugin-prettier": "5.2.1", + "execa": "^5.0.0", + "inquirer": "^7.3.3", + "json5": "^2.1.3", + "meow": "^9.0.0", + "ncp": "^2.0.0", + "prettier": "3.3.3", + "rimraf": "3.0.2", + "write-file-atomic": "^4.0.0" + }, + "bin": { + "gts": "build/src/cli.js" + }, "engines": { - "node": ">=12.0.0" + "node": ">=18" + }, + "peerDependencies": { + "typescript": ">=5" } }, - "node_modules/express": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.0.tgz", - "integrity": "sha512-XdpJDLxfztVY59X0zPI6sibRiGcxhTPXRD3IhJmjKf2jwMvkRGV1j7loB8U+heeamoU3XvihAaGRTR4aXXUN3A==", + "node_modules/gts/node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "license": "MIT", "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">= 18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://opencollective.com/eslint" } }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "node_modules/gts/node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "license": "MIT", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/gts/node_modules/@pkgr/core": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.2.tgz", + "integrity": "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ==", "dev": true, "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "node_modules/gts/node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=8.6.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/gts/node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, - "license": "ISC", + "license": "BSD-2-Clause", "dependencies": { - "is-glob": "^4.0.1" + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "node_modules/gts/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "reusify": "^1.0.4" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "node_modules/gts/node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, "engines": { - "node": ">=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "picomatch": "^3 || ^4" + "eslint": "*" }, "peerDependenciesMeta": { - "picomatch": { + "typescript": { "optional": true } } }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "node_modules/gts/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/gts/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, "engines": { - "node": ">=0.8.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "node_modules/gts/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "license": "MIT", "dependencies": { - "flat-cache": "^4.0.0" + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" }, "engines": { - "node": ">=16.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/gts/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", + "node_modules/gts/node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">= 0.8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/gts/node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/gts/node_modules/eslint-plugin-prettier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", + "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" }, "engines": { - "node": ">=10" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "node_modules/fix-dts-default-cjs-exports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", - "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", + "node_modules/gts/node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "rollup": "^4.34.8" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "node_modules/gts/node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">=16" + "node": ">=4.0" } }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "node_modules/gts/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "ISC" + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "node_modules/gts/node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "license": "ISC", + "license": "BSD-2-Clause", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=14" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://opencollective.com/eslint" } }, - "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "node_modules/gts/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">= 6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "node_modules/gts/node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, "engines": { - "node": ">= 0.6" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/gts/node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" }, "engines": { - "node": ">= 0.6" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/formidable": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", - "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", + "node_modules/gts/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", "dependencies": { - "@paralleldrive/cuid2": "^2.2.2", - "dezalgo": "^1.0.4", - "once": "^1.4.0" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=8" }, "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "node_modules/gts/node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", "dev": true, "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, "engines": { - "node": ">= 0.6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "node_modules/gts/node_modules/synckit": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.3.tgz", + "integrity": "sha512-JJoOEKTfL1urb1mDoEblhD9NhEbWmq9jHEMEnxoC4ujUaZ4itA8vKgwkFAyNClgxplLi9tsUKX+EduK0p/l7sg==", "dev": true, "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, "engines": { - "node": ">= 0.8" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "node_modules/gts/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, - "license": "ISC" + "license": "0BSD" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/gts/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, - "hasInstallScript": true, "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=6" } }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, "engines": { "node": ">= 0.4" }, @@ -4824,232 +5302,235 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-tsconfig": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", - "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "license": "MIT", "dependencies": { - "resolve-pkg-maps": "^1.0.0" + "function-bind": "^1.1.2" }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "engines": { + "node": ">= 0.4" } }, - "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "license": "ISC", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "lru-cache": "^6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=10" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, - "license": "ISC", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.3" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "node_modules/iconv-lite": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", + "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=0.10.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 4" } }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.8.19" } }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/gts": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/gts/-/gts-6.0.2.tgz", - "integrity": "sha512-lp9+eDzzm6TYqiBpgGY00EInxBHFTJiU5brsVp11qXCJEw7Q6WNNngja0spZeqSFWSquaRuHQUuWxdZLaxnKmw==", + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "license": "Apache-2.0", + "license": "ISC", "dependencies": { - "@typescript-eslint/eslint-plugin": "5.62.0", - "@typescript-eslint/parser": "5.62.0", - "chalk": "^4.1.2", - "eslint": "8.57.1", - "eslint-config-prettier": "9.1.0", - "eslint-plugin-n": "15.7.0", - "eslint-plugin-prettier": "5.2.1", - "execa": "^5.0.0", - "inquirer": "^7.3.3", - "json5": "^2.1.3", - "meow": "^9.0.0", - "ncp": "^2.0.0", - "prettier": "3.3.3", - "rimraf": "3.0.2", - "write-file-atomic": "^4.0.0" - }, - "bin": { - "gts": "build/src/cli.js" + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "typescript": ">=5" + "node": ">=8.0.0" } }, - "node_modules/gts/node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "hasown": "^2.0.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gts/node_modules/@eslint/js": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", - "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { @@ -5058,520 +5539,341 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" + "node": ">=8" } }, - "node_modules/gts/node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/gts/node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=0.12.0" } }, - "node_modules/gts/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=8" } }, - "node_modules/gts/node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=0.10.0" } }, - "node_modules/gts/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/gts/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=8" } }, - "node_modules/gts/node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "node": ">=10" } }, - "node_modules/gts/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "node": ">=10" } }, - "node_modules/gts/node_modules/eslint": { - "version": "8.57.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", - "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.1", - "@humanwhocodes/config-array": "^0.13.0", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8" } }, - "node_modules/gts/node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" }, - "peerDependencies": { - "eslint": ">=7.0.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/gts/node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", "dev": true, "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" - }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } + "node": ">=10" } }, - "node_modules/gts/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=8.0.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/gts/node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } + "license": "MIT" }, - "node_modules/gts/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } + "license": "MIT" }, - "node_modules/gts/node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "node_modules/json-schema-to-typescript": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz", + "integrity": "sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "@apidevtools/json-schema-ref-parser": "^11.5.5", + "@types/json-schema": "^7.0.15", + "@types/lodash": "^4.17.7", + "is-glob": "^4.0.3", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "prettier": "^3.2.5", + "tinyglobby": "^0.2.9" }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "bin": { + "json2ts": "dist/src/cli.js" }, - "funding": { - "url": "https://opencollective.com/eslint" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/gts/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } + "license": "MIT" }, - "node_modules/gts/node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=6" } }, - "node_modules/gts/node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" + "json-buffer": "3.0.1" } }, - "node_modules/gts/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/gts/node_modules/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", "dev": true, "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "node": ">=6" } }, - "node_modules/gts/node_modules/synckit": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.3.tgz", - "integrity": "sha512-JJoOEKTfL1urb1mDoEblhD9NhEbWmq9jHEMEnxoC4ujUaZ4itA8vKgwkFAyNClgxplLi9tsUKX+EduK0p/l7sg==", + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" + "node": ">= 0.8.0" } }, - "node_modules/gts/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" + "url": "https://github.com/sponsors/antonk52" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -5583,13 +5885,7 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } + "license": "MIT" }, "node_modules/long": { "version": "5.3.2", @@ -5611,606 +5907,567 @@ "dev": true, "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" + "yallist": "^4.0.0" }, "engines": { "node": ">=10" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" + "@jridgewell/sourcemap-codec": "^1.5.5" } }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" } }, - "node_modules/iconv-lite": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", - "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.19" + "node": ">= 0.4" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "node": ">= 0.8" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "dev": true, "license": "MIT", "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "engines": { - "node": ">=8.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, - "license": "MIT", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">= 0.10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "dev": true, "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.6" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.12.0" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true, "license": "MIT", + "bin": { + "mime": "cli.js" + }, "engines": { - "node": ">=8" + "node": ">=4.0.0" } }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "dev": true, "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, "engines": { - "node": ">=8" + "node": ">=18" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "node_modules/miniflare": { + "version": "4.20251210.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20251210.0.tgz", + "integrity": "sha512-k6kIoXwGVqlPZb0hcn+X7BmnK+8BjIIkusQPY22kCo2RaQJ/LzAjtxHQdGXerlHSnJyQivDQsL6BJHMpQfUFyw==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" + "@cspotcode/source-map-support": "0.8.1", + "acorn": "8.14.0", + "acorn-walk": "8.3.2", + "exit-hook": "2.2.1", + "glob-to-regexp": "0.4.1", + "sharp": "^0.33.5", + "stoppable": "1.1.0", + "undici": "7.14.0", + "workerd": "1.20251210.0", + "ws": "8.18.0", + "youch": "4.1.0-beta.10", + "zod": "3.22.3" + }, + "bin": { + "miniflare": "bootstrap.js" }, "engines": { - "node": ">=10" + "node": ">=18.0.0" } }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "node_modules/miniflare/node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "node_modules/miniflare/node_modules/zod": { + "version": "3.22.3", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", + "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", "dependencies": { - "@isaacs/cliui": "^8.0.2" + "brace-expansion": "^1.1.7" }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, "engines": { - "node": ">=10" + "node": ">= 6" } }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", "dev": true, "license": "MIT", "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true, - "license": "MIT" + "license": "ISC" }, - "node_modules/json-schema-to-typescript": { - "version": "15.0.4", - "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz", - "integrity": "sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==", + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", "dev": true, "license": "MIT", "dependencies": { - "@apidevtools/json-schema-ref-parser": "^11.5.5", - "@types/json-schema": "^7.0.15", - "@types/lodash": "^4.17.7", - "is-glob": "^4.0.3", - "js-yaml": "^4.1.0", - "lodash": "^4.17.21", - "minimist": "^1.2.8", - "prettier": "^3.2.5", - "tinyglobby": "^0.2.9" - }, + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "bin": { - "json2ts": "dist/src/cli.js" + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=16.0.0" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, "license": "MIT" }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true, "license": "MIT" }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", "dev": true, "license": "MIT", "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" + "ncp": "bin/ncp" } }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "path-key": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "license": "MIT", "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" + "node": ">=0.10.0" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "ee-first": "1.1.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/loupe": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", - "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "license": "MIT" + "license": "ISC", + "dependencies": { + "wrappy": "1" + } }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=10" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.5.3" + "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" @@ -6219,141 +6476,161 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=6" } }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=6" } }, - "node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "license": "MIT", "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "license": "MIT", "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true, - "license": "MIT", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, "engines": { - "node": ">= 0.6" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/path-to-regexp": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", + "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, "engines": { - "node": ">=8.6" + "node": ">=8" } }, "node_modules/pathe": { @@ -6387,129 +6664,143 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" - }, "engines": { - "node": ">=10.0.0" + "node": ">= 6" } }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">= 0.6" + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" } }, - "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "mime-db": "^1.54.0" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { - "node": ">= 0.6" + "node": "^10 || ^12 || >=14" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, "engines": { - "node": ">=6" + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/miniflare": { - "version": "4.20251210.0", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20251210.0.tgz", - "integrity": "sha512-k6kIoXwGVqlPZb0hcn+X7BmnK+8BjIIkusQPY22kCo2RaQJ/LzAjtxHQdGXerlHSnJyQivDQsL6BJHMpQfUFyw==", + "node_modules/prettier": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "0.8.1", - "acorn": "8.14.0", - "acorn-walk": "8.3.2", - "exit-hook": "2.2.1", - "glob-to-regexp": "0.4.1", - "sharp": "^0.33.5", - "stoppable": "1.1.0", - "undici": "7.14.0", - "workerd": "1.20251210.0", - "ws": "8.18.0", - "youch": "4.1.0-beta.10", - "zod": "3.22.3" - }, "bin": { - "miniflare": "bootstrap.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/miniflare/node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "node": ">=14" }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/miniflare/node_modules/zod": { - "version": "3.22.3", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz", - "integrity": "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==", - "dev": true, - "license": "MIT", "funding": { - "url": "https://github.com/sponsors/colinhacks" + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "fast-diff": "^1.1.2" }, "engines": { - "node": "*" + "node": ">=6.0.0" } }, "node_modules/protobufjs": { @@ -6543,209 +6834,165 @@ "dev": true, "license": "MIT", "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">= 6" + "node": ">= 0.10" } }, - "node_modules/minimist-options/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "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": ">=0.10.0" + "node": ">=6" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "dev": true, - "license": "ISC", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.15.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.1" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true, - "license": "ISC" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/ai" + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" } ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true, "license": "MIT" }, - "node_modules/ncp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", - "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, "license": "MIT", - "bin": { - "ncp": "bin/ncp" + "engines": { + "node": ">=8" } }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.10" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, "license": "MIT", "dependencies": { - "path-key": "^3.0.0" + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" }, "engines": { "node": ">=8" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "wrappy": "1" + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "p-try": "^2.0.0" }, "engines": { "node": ">=6" @@ -6754,515 +7001,633 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" + "p-limit": "^2.2.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "license": "MIT", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true, - "license": "MIT", + "license": "ISC" + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", "dev": true, "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/path-exists": { + "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, "engines": { "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "BlueOak-1.0.0", + "license": "ISC", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=16 || 14 >=14.18" + "bin": { + "rimraf": "bin.js" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "node_modules/rollup": { + "version": "4.53.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.5.tgz", + "integrity": "sha512-iTNAbFSlRpcHeeWu73ywU/8KuU/LZmNCSxp6fjQkJBD3ivUb8tpDrXhIxEzA05HlYMEwmtaUnb3RP+YNv162OQ==", "dev": true, - "license": "ISC" + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.53.5", + "@rollup/rollup-android-arm64": "4.53.5", + "@rollup/rollup-darwin-arm64": "4.53.5", + "@rollup/rollup-darwin-x64": "4.53.5", + "@rollup/rollup-freebsd-arm64": "4.53.5", + "@rollup/rollup-freebsd-x64": "4.53.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.53.5", + "@rollup/rollup-linux-arm-musleabihf": "4.53.5", + "@rollup/rollup-linux-arm64-gnu": "4.53.5", + "@rollup/rollup-linux-arm64-musl": "4.53.5", + "@rollup/rollup-linux-loong64-gnu": "4.53.5", + "@rollup/rollup-linux-ppc64-gnu": "4.53.5", + "@rollup/rollup-linux-riscv64-gnu": "4.53.5", + "@rollup/rollup-linux-riscv64-musl": "4.53.5", + "@rollup/rollup-linux-s390x-gnu": "4.53.5", + "@rollup/rollup-linux-x64-gnu": "4.53.5", + "@rollup/rollup-linux-x64-musl": "4.53.5", + "@rollup/rollup-openharmony-arm64": "4.53.5", + "@rollup/rollup-win32-arm64-msvc": "4.53.5", + "@rollup/rollup-win32-ia32-msvc": "4.53.5", + "@rollup/rollup-win32-x64-gnu": "4.53.5", + "@rollup/rollup-win32-x64-msvc": "4.53.5", + "fsevents": "~2.3.2" + } }, - "node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", "dev": true, "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.12.0" } }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "license": "MIT" + "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": { + "queue-microtask": "^1.2.2" + } }, - "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^1.9.0" + }, "engines": { - "node": ">= 14.16" + "npm": ">=2.0.0" } }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": ">=10" } }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "dev": true, "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, "engines": { - "node": ">= 6" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "dev": true, "license": "MIT", "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", + "license": "ISC" + }, + "node_modules/sharp": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", + "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "color": "^4.2.3", + "detect-libc": "^2.0.3", + "semver": "^7.6.3" }, "engines": { - "node": "^10 || ^12 || >=14" + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.33.5", + "@img/sharp-darwin-x64": "0.33.5", + "@img/sharp-libvips-darwin-arm64": "1.0.4", + "@img/sharp-libvips-darwin-x64": "1.0.4", + "@img/sharp-libvips-linux-arm": "1.0.5", + "@img/sharp-libvips-linux-arm64": "1.0.4", + "@img/sharp-libvips-linux-s390x": "1.0.4", + "@img/sharp-libvips-linux-x64": "1.0.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", + "@img/sharp-libvips-linuxmusl-x64": "1.0.4", + "@img/sharp-linux-arm": "0.33.5", + "@img/sharp-linux-arm64": "0.33.5", + "@img/sharp-linux-s390x": "0.33.5", + "@img/sharp-linux-x64": "0.33.5", + "@img/sharp-linuxmusl-arm64": "0.33.5", + "@img/sharp-linuxmusl-x64": "0.33.5", + "@img/sharp-wasm32": "0.33.5", + "@img/sharp-win32-ia32": "0.33.5", + "@img/sharp-win32-x64": "0.33.5" } }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], "license": "MIT", "dependencies": { - "lilconfig": "^3.1.1" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } + "node": ">=8" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=8" } }, - "node_modules/prettier": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", - "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" }, "engines": { - "node": ">=14" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/prettier-linter-helpers": { + "node_modules/side-channel-list": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, "license": "MIT", "dependencies": { - "fast-diff": "^1.1.2" + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "license": "MIT", "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" }, "engines": { - "node": ">= 0.10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.1.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { - "node": ">=0.6" + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/simple-swizzle": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", + "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", "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/quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/range-parser": { + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/raw-body": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz", - "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==", + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.7.0", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.10" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "license": "MIT", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "node_modules/spdx-license-ids": { + "version": "3.0.22", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", + "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "dev": true, "license": "MIT", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, "node_modules/std-env": { @@ -7272,27 +7637,42 @@ "dev": true, "license": "MIT" }, + "node_modules/stoppable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", + "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "npm": ">=6" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" @@ -7304,117 +7684,60 @@ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "license": "(MIT OR CC0-1.0)", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true, - "license": "ISC" - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "min-indent": "^1.0.0" + }, "engines": { "node": ">=8" } }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { - "node": ">= 14.18.0" + "node": ">=8" }, "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-literal": { @@ -7430,253 +7753,231 @@ "url": "https://github.com/sponsors/antfu" } }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" }, "bin": { - "resolve": "bin/resolve" + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/superagent": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.3.tgz", + "integrity": "sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==", "dev": true, "license": "MIT", + "dependencies": { + "component-emitter": "^1.3.1", + "cookiejar": "^2.1.4", + "debug": "^4.3.7", + "fast-safe-stringify": "^2.1.1", + "form-data": "^4.0.4", + "formidable": "^3.5.4", + "methods": "^1.1.2", + "mime": "2.6.0", + "qs": "^6.11.2" + }, "engines": { - "node": ">=4" + "node": ">=14.18.0" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "node_modules/supertest": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.4.tgz", + "integrity": "sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "dependencies": { + "methods": "^1.1.2", + "superagent": "^10.2.3" + }, + "engines": { + "node": ">=14.18.0" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/restore-cursor/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "@pkgr/core": "^0.2.9" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://opencollective.com/synckit" } }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", "dev": true, "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=18" } }, - "node_modules/rollup": { - "version": "4.53.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.2.tgz", - "integrity": "sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==", + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "balanced-match": "^1.0.0" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "glob": "dist/esm/bin.mjs" }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.53.2", - "@rollup/rollup-android-arm64": "4.53.2", - "@rollup/rollup-darwin-arm64": "4.53.2", - "@rollup/rollup-darwin-x64": "4.53.2", - "@rollup/rollup-freebsd-arm64": "4.53.2", - "@rollup/rollup-freebsd-x64": "4.53.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.53.2", - "@rollup/rollup-linux-arm-musleabihf": "4.53.2", - "@rollup/rollup-linux-arm64-gnu": "4.53.2", - "@rollup/rollup-linux-arm64-musl": "4.53.2", - "@rollup/rollup-linux-loong64-gnu": "4.53.2", - "@rollup/rollup-linux-ppc64-gnu": "4.53.2", - "@rollup/rollup-linux-riscv64-gnu": "4.53.2", - "@rollup/rollup-linux-riscv64-musl": "4.53.2", - "@rollup/rollup-linux-s390x-gnu": "4.53.2", - "@rollup/rollup-linux-x64-gnu": "4.53.2", - "@rollup/rollup-linux-x64-musl": "4.53.2", - "@rollup/rollup-openharmony-arm64": "4.53.2", - "@rollup/rollup-win32-arm64-msvc": "4.53.2", - "@rollup/rollup-win32-ia32-msvc": "4.53.2", - "@rollup/rollup-win32-x64-gnu": "4.53.2", - "@rollup/rollup-win32-x64-msvc": "4.53.2", - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "node_modules/test-exclude/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">= 18" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } + "license": "MIT" }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", "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": { - "queue-microtask": "^1.2.2" + "any-promise": "^1.0.0" } }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "tslib": "^1.9.0" + "thenify": ">= 3.1.0 < 4" }, "engines": { - "npm": ">=2.0.0" + "node": ">=0.8" } }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true, - "license": "0BSD" + "license": "MIT" }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, "license": "MIT" }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" }, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" @@ -7693,13 +7994,13 @@ } }, "node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, "license": "MIT", "engines": { - "node": ">=10" + "node": ">=14.0.0" } }, "node_modules/tinyspy": { @@ -7719,106 +8020,66 @@ "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" + "os-tmpdir": "~1.0.2" }, "engines": { - "node": ">= 18" + "node": ">=0.6.0" } }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" + "is-number": "^7.0.0" }, "engines": { - "node": ">= 18" + "node": ">=8.0" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=0.6" + } }, - "node_modules/sharp": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz", - "integrity": "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==", + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" - }, - "engines": { - "node": "^18.17.0 || ^20.3.0 || >=21.0.0" - }, - "funding": { - "url": "https://opencollective.com/libvips" - }, - "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.33.5", - "@img/sharp-darwin-x64": "0.33.5", - "@img/sharp-libvips-darwin-arm64": "1.0.4", - "@img/sharp-libvips-darwin-x64": "1.0.4", - "@img/sharp-libvips-linux-arm": "1.0.5", - "@img/sharp-libvips-linux-arm64": "1.0.4", - "@img/sharp-libvips-linux-s390x": "1.0.4", - "@img/sharp-libvips-linux-x64": "1.0.4", - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", - "@img/sharp-libvips-linuxmusl-x64": "1.0.4", - "@img/sharp-linux-arm": "0.33.5", - "@img/sharp-linux-arm64": "0.33.5", - "@img/sharp-linux-s390x": "0.33.5", - "@img/sharp-linux-x64": "0.33.5", - "@img/sharp-linuxmusl-arm64": "0.33.5", - "@img/sharp-linuxmusl-x64": "0.33.5", - "@img/sharp-wasm32": "0.33.5", - "@img/sharp-win32-ia32": "0.33.5", - "@img/sharp-win32-x64": "0.33.5" + "license": "MIT", + "bin": { + "tree-kill": "cli.js" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" } }, "node_modules/ts-interface-checker": { @@ -7865,9 +8126,9 @@ } }, "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, "license": "0BSD" }, @@ -7878,982 +8139,1069 @@ "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" + "bundle-require": "^5.1.0", + "cac": "^6.7.14", + "chokidar": "^4.0.3", + "consola": "^3.4.0", + "debug": "^4.4.0", + "esbuild": "^0.27.0", + "fix-dts-default-cjs-exports": "^1.0.0", + "joycon": "^3.1.1", + "picocolors": "^1.1.1", + "postcss-load-config": "^6.0.1", + "resolve-from": "^5.0.0", + "rollup": "^4.34.8", + "source-map": "^0.7.6", + "sucrase": "^3.35.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.11", + "tree-kill": "^1.2.2" + }, + "bin": { + "tsup": "dist/cli-default.js", + "tsup-node": "dist/cli-node.js" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@swc/core": "^1", + "postcss": "^8.4.12", + "typescript": ">=4.5.0" + }, + "peerDependenciesMeta": { + "@microsoft/api-extractor": { + "optional": true + }, + "@swc/core": { + "optional": true + }, + "postcss": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "node_modules/tsup/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "tslib": "^1.8.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 6" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "node_modules/tsx": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", + "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" + "esbuild": "~0.27.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" }, "engines": { - "node": ">= 0.4" + "node": ">=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">= 0.4" + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz", - "integrity": "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==", + "node_modules/type-is": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "dev": true, "license": "MIT", "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-swizzle/node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.6" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" } }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/typescript-eslint": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.50.0.tgz", + "integrity": "sha512-Q1/6yNUmCpH94fbgMUMg2/BSAr/6U7GBk61kZTv1/asghQOWOjTlp9K8mixS5NcJmm2creY+UFfGeW/+OcA64A==", "dev": true, "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "@typescript-eslint/eslint-plugin": "8.50.0", + "@typescript-eslint/parser": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/utils": "8.50.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.22", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz", - "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", "dev": true, "license": "MIT" }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "node_modules/undici": { + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.14.0.tgz", + "integrity": "sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=20.18.1" } }, - "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "dev": true, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, - "node_modules/stoppable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", - "integrity": "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==", + "node_modules/unenv": { + "version": "2.0.0-rc.24", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz", + "integrity": "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=4", - "npm": ">=6" + "dependencies": { + "pathe": "^2.0.3" } }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "punycode": "^2.1.0" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, + "node_modules/uuid": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", + "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "bin": { + "uuid": "dist/esm/bin/uuid" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "node_modules/vite": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", + "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", "dev": true, "license": "MIT", "dependencies": { - "min-indent": "^1.0.0" + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" }, "engines": { - "node": ">=8" + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", "dev": true, "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, "engines": { - "node": ">=8" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/strip-literal": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", - "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", "dependencies": { - "js-tokens": "^9.0.1" + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { - "url": "https://github.com/sponsors/antfu" + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } } }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "node_modules/walkdir": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", + "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" + "isexe": "^2.0.0" }, "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" + "node-which": "bin/node-which" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">= 8" } }, - "node_modules/superagent": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.3.tgz", - "integrity": "sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==", + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, "license": "MIT", "dependencies": { - "component-emitter": "^1.3.1", - "cookiejar": "^2.1.4", - "debug": "^4.3.7", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.4", - "formidable": "^3.5.4", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.11.2" + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" }, "engines": { - "node": ">=14.18.0" + "node": ">=8" } }, - "node_modules/superagent/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", - "bin": { - "mime": "cli.js" - }, "engines": { - "node": ">=4.0.0" + "node": ">=0.10.0" } }, - "node_modules/supertest": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.4.tgz", - "integrity": "sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg==", + "node_modules/workerd": { + "version": "1.20251210.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20251210.0.tgz", + "integrity": "sha512-9MUUneP1BnRE9XAYi94FXxHmiLGbO75EHQZsgWqSiOXjoXSqJCw8aQbIEPxCy19TclEl/kHUFYce8ST2W+Qpjw==", "dev": true, - "license": "MIT", - "dependencies": { - "methods": "^1.1.2", - "superagent": "^10.2.3" + "hasInstallScript": true, + "license": "Apache-2.0", + "bin": { + "workerd": "bin/workerd" }, "engines": { - "node": ">=14.18.0" + "node": ">=16" + }, + "optionalDependencies": { + "@cloudflare/workerd-darwin-64": "1.20251210.0", + "@cloudflare/workerd-darwin-arm64": "1.20251210.0", + "@cloudflare/workerd-linux-64": "1.20251210.0", + "@cloudflare/workerd-linux-arm64": "1.20251210.0", + "@cloudflare/workerd-windows-64": "1.20251210.0" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/wrangler": { + "version": "4.54.0", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.54.0.tgz", + "integrity": "sha512-bANFsjDwJLbprYoBK+hUDZsVbUv2SqJd8QvArLIcZk+fPq4h/Ohtj5vkKXD3k0s2bD1DXLk08D+hYmeNH+xC6A==", "dev": true, - "license": "MIT", + "license": "MIT OR Apache-2.0", "dependencies": { - "has-flag": "^4.0.0" + "@cloudflare/kv-asset-handler": "0.4.1", + "@cloudflare/unenv-preset": "2.7.13", + "blake3-wasm": "2.1.5", + "esbuild": "0.27.0", + "miniflare": "4.20251210.0", + "path-to-regexp": "6.3.0", + "unenv": "2.0.0-rc.24", + "workerd": "1.20251210.0" + }, + "bin": { + "wrangler": "bin/wrangler.js", + "wrangler2": "bin/wrangler.js" }, "engines": { - "node": ">=8" + "node": ">=20.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.20251210.0" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/wrangler/node_modules/@esbuild/aix-ppc64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz", + "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=18" } }, - "node_modules/synckit": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", - "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "node_modules/wrangler/node_modules/@esbuild/android-arm": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz", + "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.9" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" + "node": ">=18" } }, - "node_modules/test-exclude": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", - "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "node_modules/wrangler/node_modules/@esbuild/android-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz", + "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^10.4.1", - "minimatch": "^9.0.4" - }, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { "node": ">=18" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "node_modules/wrangler/node_modules/@esbuild/android-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz", + "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "node_modules/wrangler/node_modules/@esbuild/darwin-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz", + "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.8" + "node": ">=18" } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "node_modules/wrangler/node_modules/@esbuild/darwin-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz", + "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "node": ">=18" } }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "node_modules/wrangler/node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz", + "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": ">=18" } }, - "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "node_modules/wrangler/node_modules/@esbuild/freebsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz", + "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/tinyspy": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", - "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "node_modules/wrangler/node_modules/@esbuild/linux-arm": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz", + "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/wrangler/node_modules/@esbuild/linux-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz", + "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.6.0" + "node": ">=18" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/wrangler/node_modules/@esbuild/linux-ia32": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz", + "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.0" + "node": ">=18" } }, - "node_modules/ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/wrangler/node_modules/@esbuild/linux-loong64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz", + "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", + "cpu": [ + "loong64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.6" - } - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "license": "MIT", - "bin": { - "tree-kill": "cli.js" + "node": ">=18" } }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", - "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "node_modules/wrangler/node_modules/@esbuild/linux-mips64el": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz", + "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", + "cpu": [ + "mips64el" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "node_modules/wrangler/node_modules/@esbuild/linux-ppc64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz", + "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", + "cpu": [ + "ppc64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" + "node": ">=18" } }, - "node_modules/vite": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", - "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", + "node_modules/wrangler/node_modules/@esbuild/linux-riscv64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz", + "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", + "cpu": [ + "riscv64" + ], "dev": true, "license": "MIT", - "dependencies": { - "esbuild": "^0.27.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "tsup": "dist/cli-default.js", - "tsup-node": "dist/cli-node.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { "node": ">=18" - }, - "peerDependencies": { - "@microsoft/api-extractor": "^7.36.0", - "@swc/core": "^1", - "postcss": "^8.4.12", - "typescript": ">=4.5.0" - }, - "peerDependenciesMeta": { - "@microsoft/api-extractor": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "postcss": { - "optional": true - }, - "typescript": { - "optional": true - } } }, - "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "node_modules/wrangler/node_modules/@esbuild/linux-s390x": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz", + "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", + "cpu": [ + "s390x" + ], "dev": true, "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "node": ">=18" } }, - "node_modules/vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "node_modules/wrangler/node_modules/@esbuild/linux-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz", + "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "std-env": "^3.9.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.4", - "@vitest/ui": "3.2.4", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "node": ">=18" } }, - "node_modules/vitest/node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "node_modules/wrangler/node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz", + "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/vitest/node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "node_modules/wrangler/node_modules/@esbuild/netbsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz", + "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=14.0.0" + "node": ">=18" } }, - "node_modules/walkdir": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", - "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", + "node_modules/wrangler/node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz", + "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "node_modules/wrangler/node_modules/@esbuild/openbsd-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz", + "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">= 8" + "node": ">=18" } }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "node_modules/wrangler/node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz", + "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, + "optional": true, + "os": [ + "openharmony" + ], "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "node_modules/wrangler/node_modules/@esbuild/sunos-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz", + "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=0.10.0" + "node": ">=18" } }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/wrangler/node_modules/@esbuild/win32-arm64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz", + "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/wrangler/node_modules/@esbuild/win32-ia32": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz", + "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", + "cpu": [ + "ia32" + ], "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=18" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "node_modules/wrangler/node_modules/@esbuild/win32-x64": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz", + "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", + "cpu": [ + "x64" + ], "dev": true, "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "node": ">=18" } }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "node_modules/wrangler/node_modules/esbuild": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz", + "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", "dev": true, + "hasInstallScript": true, "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=12" + "node": ">=18" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.0", + "@esbuild/android-arm": "0.27.0", + "@esbuild/android-arm64": "0.27.0", + "@esbuild/android-x64": "0.27.0", + "@esbuild/darwin-arm64": "0.27.0", + "@esbuild/darwin-x64": "0.27.0", + "@esbuild/freebsd-arm64": "0.27.0", + "@esbuild/freebsd-x64": "0.27.0", + "@esbuild/linux-arm": "0.27.0", + "@esbuild/linux-arm64": "0.27.0", + "@esbuild/linux-ia32": "0.27.0", + "@esbuild/linux-loong64": "0.27.0", + "@esbuild/linux-mips64el": "0.27.0", + "@esbuild/linux-ppc64": "0.27.0", + "@esbuild/linux-riscv64": "0.27.0", + "@esbuild/linux-s390x": "0.27.0", + "@esbuild/linux-x64": "0.27.0", + "@esbuild/netbsd-arm64": "0.27.0", + "@esbuild/netbsd-x64": "0.27.0", + "@esbuild/openbsd-arm64": "0.27.0", + "@esbuild/openbsd-x64": "0.27.0", + "@esbuild/openharmony-arm64": "0.27.0", + "@esbuild/sunos-x64": "0.27.0", + "@esbuild/win32-arm64": "0.27.0", + "@esbuild/win32-ia32": "0.27.0", + "@esbuild/win32-x64": "0.27.0" } }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "node_modules/wrangler/node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", "dev": true, "license": "MIT" }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrappy": { @@ -8877,12 +9225,27 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/write-file-atomic/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, - "license": "ISC" + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, "node_modules/y18n": { "version": "5.0.8", @@ -8919,6 +9282,16 @@ } }, "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", From e5b3bd20a680167614a27831d8f235ca891451d1 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 10:06:56 +0000 Subject: [PATCH 22/64] split proto utils --- src/grpc/utils/from_proto.ts | 164 +++++++++++++++++ .../{proto_type_converter.ts => to_proto.ts} | 169 ------------------ src/server/grpc/grpc_handler.ts | 7 +- test/server/grpc_handler.spec.ts | 3 +- vitest.edge.config.ts | 2 + 5 files changed, 171 insertions(+), 174 deletions(-) create mode 100644 src/grpc/utils/from_proto.ts rename src/grpc/utils/{proto_type_converter.ts => to_proto.ts} (72%) diff --git a/src/grpc/utils/from_proto.ts b/src/grpc/utils/from_proto.ts new file mode 100644 index 00000000..6f6ce559 --- /dev/null +++ b/src/grpc/utils/from_proto.ts @@ -0,0 +1,164 @@ +import { A2AError } from "../../server/error.js"; +import { CancelTaskRequest, GetTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigRequest, GetTaskRequest, CreateTaskPushNotificationConfigRequest, DeleteTaskPushNotificationConfigRequest, Message, Role, SendMessageConfiguration, PushNotificationConfig, AuthenticationInfo, SendMessageRequest, Part } from "../a2a.js"; +import * as types from "../../types.js"; + +const TASK_ID_REGEX = /tasks\/([^/]+)/; +const CONFIG_ID_REGEX = /pushNotificationConfigs\/([^/]+)/; + +/** + * Converts proto types to internal types. + */ +export class FromProto { + private static getTaskIdFromName(name: string): string { + const match = name.match(TASK_ID_REGEX); + if (!match) { + throw A2AError.invalidParams(`Invalid or missing task ID in name: "${name}"`); + } + return match[1]; + } + + private static getPushNotificationConfigIdFromName(name: string): string { + const match = name.match(CONFIG_ID_REGEX); + if (!match || match.length < 2) { + throw A2AError.invalidParams(`Invalid or missing config ID in name: "${name}"`); + } + return match[1]; + } + + static taskQueryParams(request: GetTaskRequest): types.TaskQueryParams { + return { + id: this.getTaskIdFromName(request.name), + historyLength: request.historyLength, + }; + } + + static taskIdParams(request: CancelTaskRequest): types.TaskIdParams { + return { + id: this.getTaskIdFromName(request.name), + }; + } + + static getTaskPushNotificationConfigParams( + request: GetTaskPushNotificationConfigRequest + ): types.GetTaskPushNotificationConfigParams { + return { + id: this.getTaskIdFromName(request.name), + pushNotificationConfigId: this.getPushNotificationConfigIdFromName(request.name), + }; + } + + static listTaskPushNotificationConfigParams( + request: ListTaskPushNotificationConfigRequest + ): types.ListTaskPushNotificationConfigParams { + return { + id: this.getTaskIdFromName(request.parent), + }; + } + + static setTaskPushNotificationConfigParams( + request: CreateTaskPushNotificationConfigRequest + ): types.TaskPushNotificationConfig { + return { + taskId: this.getTaskIdFromName(request.parent), + pushNotificationConfig: this.pushNotificationConfig(request.config.pushNotificationConfig), + }; + } + + static deleteTaskPushNotificationConfigParams( + request: DeleteTaskPushNotificationConfigRequest + ): types.DeleteTaskPushNotificationConfigParams { + const name = request.name; + return { + id: this.getTaskIdFromName(name), + pushNotificationConfigId: this.getPushNotificationConfigIdFromName(name), + }; + } + + static message(message: Message): types.Message { + return { + kind: 'message', + messageId: message.messageId, + parts: message.content.map((p) => this.parts(p)), + contextId: message.contextId, + taskId: message.taskId, + role: message.role === Role.ROLE_AGENT ? 'agent' : 'user', + metadata: message.metadata, + extensions: message.extensions.length > 0 ? message.extensions : undefined, + }; + } + + static configuration(configuration: SendMessageConfiguration): types.MessageSendConfiguration { + return { + blocking: configuration.blocking, + acceptedOutputModes: configuration.acceptedOutputModes, + pushNotificationConfig: configuration.pushNotification + ? this.pushNotificationConfig(configuration.pushNotification) + : undefined, + }; + } + + static pushNotificationConfig(config: PushNotificationConfig): types.PushNotificationConfig { + return { + id: config.id, + url: config.url, + token: config.token, + authentication: config.authentication + ? this.authenticationInfo(config.authentication) + : undefined, + }; + } + + static authenticationInfo( + authInfo: AuthenticationInfo + ): types.PushNotificationAuthenticationInfo { + return { + schemes: authInfo.schemes, + credentials: authInfo.credentials, + }; + } + + static parts(part: Part): types.Part { + if (part.part?.$case === 'text') { + return { + kind: 'text', + text: part.part.value, + }; + } + + if (part.part?.$case === 'file') { + const filePart = part.part.value; + if (filePart.file?.$case === 'fileWithUri') { + return { + kind: 'file', + file: { + uri: filePart.file.value, + }, + }; + } else if (filePart.file?.$case === 'fileWithBytes') { + return { + kind: 'file', + file: { + bytes: filePart.file.value.toString('base64'), + }, + }; + } + throw A2AError.invalidParams('Invalid file part type'); + } + + if (part.part?.$case === 'data') { + return { + kind: 'data', + data: part.part.value.data, + }; + } + throw A2AError.invalidParams('Invalid part type'); + } + + static messageSendParams(request: SendMessageRequest): types.MessageSendParams { + return { + message: this.message(request.request), + configuration: request.configuration ? this.configuration(request.configuration) : undefined, + metadata: request.metadata, + }; + } +} \ No newline at end of file diff --git a/src/grpc/utils/proto_type_converter.ts b/src/grpc/utils/to_proto.ts similarity index 72% rename from src/grpc/utils/proto_type_converter.ts rename to src/grpc/utils/to_proto.ts index 5296e0b7..1958e662 100644 --- a/src/grpc/utils/proto_type_converter.ts +++ b/src/grpc/utils/to_proto.ts @@ -9,10 +9,7 @@ import { AgentProvider, Artifact, AuthenticationInfo, - CancelTaskRequest, FilePart as ProtoFilePart, - GetTaskPushNotificationConfigRequest, - GetTaskRequest, Message, OAuthFlows, Part, @@ -20,8 +17,6 @@ import { Role, Security, SecurityScheme, - SendMessageConfiguration, - SendMessageRequest, SendMessageResponse, StreamResponse, Task, @@ -30,174 +25,10 @@ import { TaskState, TaskStatus, TaskStatusUpdateEvent, - DeleteTaskPushNotificationConfigRequest, - ListTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigResponse, AgentSkill, - CreateTaskPushNotificationConfigRequest, } from '../a2a.js'; -const TASK_ID_REGEX = /tasks\/([^/]+)/; -const CONFIG_ID_REGEX = /pushNotificationConfigs\/([^/]+)/; - -/** - * Converts proto types to internal types. - */ -export class FromProto { - private static getTaskIdFromName(name: string): string { - const match = name.match(TASK_ID_REGEX); - if (!match) { - throw A2AError.invalidParams(`Invalid or missing task ID in name: "${name}"`); - } - return match[1]; - } - - private static getPushNotificationConfigIdFromName(name: string): string { - const match = name.match(CONFIG_ID_REGEX); - if (!match || match.length < 2) { - throw A2AError.invalidParams(`Invalid or missing config ID in name: "${name}"`); - } - return match[1]; - } - - static taskQueryParams(request: GetTaskRequest): types.TaskQueryParams { - return { - id: this.getTaskIdFromName(request.name), - historyLength: request.historyLength, - }; - } - - static taskIdParams(request: CancelTaskRequest): types.TaskIdParams { - return { - id: this.getTaskIdFromName(request.name), - }; - } - - static getTaskPushNotificationConfigParams( - request: GetTaskPushNotificationConfigRequest - ): types.GetTaskPushNotificationConfigParams { - return { - id: this.getTaskIdFromName(request.name), - pushNotificationConfigId: this.getPushNotificationConfigIdFromName(request.name), - }; - } - - static listTaskPushNotificationConfigParams( - request: ListTaskPushNotificationConfigRequest - ): types.ListTaskPushNotificationConfigParams { - return { - id: this.getTaskIdFromName(request.parent), - }; - } - - static setTaskPushNotificationConfigParams( - request: CreateTaskPushNotificationConfigRequest - ): types.TaskPushNotificationConfig { - return { - taskId: this.getTaskIdFromName(request.parent), - pushNotificationConfig: this.pushNotificationConfig(request.config.pushNotificationConfig), - }; - } - - static deleteTaskPushNotificationConfigParams( - request: DeleteTaskPushNotificationConfigRequest - ): types.DeleteTaskPushNotificationConfigParams { - const name = request.name; - return { - id: this.getTaskIdFromName(name), - pushNotificationConfigId: this.getPushNotificationConfigIdFromName(name), - }; - } - - static message(message: Message): types.Message { - return { - kind: 'message', - messageId: message.messageId, - parts: message.content.map((p) => this.parts(p)), - contextId: message.contextId, - taskId: message.taskId, - role: message.role === Role.ROLE_AGENT ? 'agent' : 'user', - metadata: message.metadata, - extensions: message.extensions.length > 0 ? message.extensions : undefined, - }; - } - - static configuration(configuration: SendMessageConfiguration): types.MessageSendConfiguration { - return { - blocking: configuration.blocking, - acceptedOutputModes: configuration.acceptedOutputModes, - pushNotificationConfig: configuration.pushNotification - ? this.pushNotificationConfig(configuration.pushNotification) - : undefined, - }; - } - - static pushNotificationConfig(config: PushNotificationConfig): types.PushNotificationConfig { - return { - id: config.id, - url: config.url, - token: config.token, - authentication: config.authentication - ? this.authenticationInfo(config.authentication) - : undefined, - }; - } - - static authenticationInfo( - authInfo: AuthenticationInfo - ): types.PushNotificationAuthenticationInfo { - return { - schemes: authInfo.schemes, - credentials: authInfo.credentials, - }; - } - - static parts(part: Part): types.Part { - if (part.part?.$case === 'text') { - return { - kind: 'text', - text: part.part.value, - }; - } - - if (part.part?.$case === 'file') { - const filePart = part.part.value; - if (filePart.file?.$case === 'fileWithUri') { - return { - kind: 'file', - file: { - uri: filePart.file.value, - }, - }; - } else if (filePart.file?.$case === 'fileWithBytes') { - return { - kind: 'file', - file: { - bytes: filePart.file.value.toString('base64'), - }, - }; - } - throw A2AError.invalidParams('Invalid file part type'); - } - - if (part.part?.$case === 'data') { - return { - kind: 'data', - data: part.part.value.data, - }; - } - throw A2AError.invalidParams('Invalid part type'); - } - - static messageSendParams(request: SendMessageRequest): types.MessageSendParams { - return { - message: this.message(request.request), - configuration: request.configuration ? this.configuration(request.configuration) : undefined, - metadata: request.metadata, - }; - } -} - export class ToProto { static agentCard(agentCard: types.AgentCard): AgentCard { return { diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index 49b3e886..2ef02396 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -20,7 +20,8 @@ import { import { MessageSendParams, TaskIdParams } from '../../types.js'; import { Empty } from '../../grpc/google/protobuf/empty.js'; import { A2ARequestHandler } from '../request_handler/a2a_request_handler.js'; -import { FromProto, ToProto } from '../../grpc/utils/proto_type_converter.js'; +import { FromProto } from '../../grpc/utils/from_proto.js'; +import { ToProto } from '../../grpc/utils/to_proto.js'; import { gRpcTransportHandler } from '../transports/grpc/grpc_transport_handler.js'; import { ServerCallContext } from '../context.js'; import { Extensions } from '../../extensions.js'; @@ -225,13 +226,11 @@ export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { const mapping: Record = { [-32001]: grpc.status.NOT_FOUND, [-32002]: grpc.status.FAILED_PRECONDITION, - [-32007]: grpc.status.FAILED_PRECONDITION, - [-32008]: grpc.status.FAILED_PRECONDITION, [-32003]: grpc.status.UNIMPLEMENTED, [-32004]: grpc.status.UNIMPLEMENTED, - [-32009]: grpc.status.UNIMPLEMENTED, [-32005]: grpc.status.INVALID_ARGUMENT, [-32006]: grpc.status.INTERNAL, + [-32007]: grpc.status.FAILED_PRECONDITION, }; const mapToError = (error: unknown): Partial => { diff --git a/test/server/grpc_handler.spec.ts b/test/server/grpc_handler.spec.ts index bf75a82f..e6aa0106 100644 --- a/test/server/grpc_handler.spec.ts +++ b/test/server/grpc_handler.spec.ts @@ -4,7 +4,8 @@ import * as proto from '../../src/grpc/a2a.js'; import { A2AError, A2ARequestHandler } from '../../src/server/index.js'; import { grpcHandler } from '../../src/server/grpc/grpc_handler.js'; import { AgentCard, HTTP_EXTENSION_HEADER, MessageSendParams, Task } from '../../src/index.js'; -import { FromProto, ToProto } from '../../src/grpc/utils/proto_type_converter.js'; +import { ToProto } from '../../src/grpc/utils/to_proto.js'; +import { FromProto } from '../../src/grpc/utils/from_proto.js'; vi.mock('../../src/grpc/utils/proto_type_converter.js'); diff --git a/vitest.edge.config.ts b/vitest.edge.config.ts index eb4093a4..b5bfa9de 100644 --- a/vitest.edge.config.ts +++ b/vitest.edge.config.ts @@ -8,6 +8,8 @@ export default defineWorkersConfig( exclude: [ // Express tests require Node.js-specific APIs (http, Express framework) 'test/server/a2a_express_app.spec.ts', + // gRpc test require Node.js-specific gRPC module + 'test/server/grpc_handler.spec.ts', 'test/e2e.spec.ts', 'test/server/rest_handler.spec.ts', 'test/server/push_notification_integration.spec.ts', From 4385e1b4b88f633a41996975fd7fe1014080879a Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 10:08:39 +0000 Subject: [PATCH 23/64] fix tests --- test/server/grpc_handler.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/server/grpc_handler.spec.ts b/test/server/grpc_handler.spec.ts index e6aa0106..d8035f60 100644 --- a/test/server/grpc_handler.spec.ts +++ b/test/server/grpc_handler.spec.ts @@ -7,7 +7,8 @@ import { AgentCard, HTTP_EXTENSION_HEADER, MessageSendParams, Task } from '../.. import { ToProto } from '../../src/grpc/utils/to_proto.js'; import { FromProto } from '../../src/grpc/utils/from_proto.js'; -vi.mock('../../src/grpc/utils/proto_type_converter.js'); +vi.mock('../../src/grpc/utils/from_proto.js'); +vi.mock('../../src/grpc/utils/to_proto.js'); describe('grpcHandler', () => { let mockRequestHandler: A2ARequestHandler; From 2f10f81dec9c591bd9b208e2c6f36b13627e42fe Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 10:11:04 +0000 Subject: [PATCH 24/64] run linter --- src/grpc/utils/from_proto.ts | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/grpc/utils/from_proto.ts b/src/grpc/utils/from_proto.ts index 6f6ce559..a3c719d7 100644 --- a/src/grpc/utils/from_proto.ts +++ b/src/grpc/utils/from_proto.ts @@ -1,6 +1,20 @@ -import { A2AError } from "../../server/error.js"; -import { CancelTaskRequest, GetTaskPushNotificationConfigRequest, ListTaskPushNotificationConfigRequest, GetTaskRequest, CreateTaskPushNotificationConfigRequest, DeleteTaskPushNotificationConfigRequest, Message, Role, SendMessageConfiguration, PushNotificationConfig, AuthenticationInfo, SendMessageRequest, Part } from "../a2a.js"; -import * as types from "../../types.js"; +import { A2AError } from '../../server/error.js'; +import { + CancelTaskRequest, + GetTaskPushNotificationConfigRequest, + ListTaskPushNotificationConfigRequest, + GetTaskRequest, + CreateTaskPushNotificationConfigRequest, + DeleteTaskPushNotificationConfigRequest, + Message, + Role, + SendMessageConfiguration, + PushNotificationConfig, + AuthenticationInfo, + SendMessageRequest, + Part, +} from '../a2a.js'; +import * as types from '../../types.js'; const TASK_ID_REGEX = /tasks\/([^/]+)/; const CONFIG_ID_REGEX = /pushNotificationConfigs\/([^/]+)/; @@ -161,4 +175,4 @@ export class FromProto { metadata: request.metadata, }; } -} \ No newline at end of file +} From ad9a917e2612e0ccaa00bbf892bde4b52f21812c Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 10:22:53 +0000 Subject: [PATCH 25/64] fix typo --- src/server/transports/grpc/grpc_transport_handler.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/server/transports/grpc/grpc_transport_handler.ts b/src/server/transports/grpc/grpc_transport_handler.ts index cea5781c..c3290527 100644 --- a/src/server/transports/grpc/grpc_transport_handler.ts +++ b/src/server/transports/grpc/grpc_transport_handler.ts @@ -85,7 +85,6 @@ export class gRpcTransportHandler { /** * Resubscribes to task updates. - * Returns camelCase stream of task updates. * @throws {A2AError} UnsupportedOperation if streaming not supported */ async resubscribe( From 55cdd366118d057d0e51f6963f3ecfb86c868bfd Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 11:55:40 +0000 Subject: [PATCH 26/64] add tests --- src/grpc/utils/from_proto.ts | 36 +-- src/grpc/utils/id_decoding.ts | 28 +++ src/grpc/utils/to_proto.ts | 6 +- src/server/grpc/grpc_handler.ts | 6 +- src/server/grpc/index.ts | 7 + test/utils/from_proto.spec.ts | 262 +++++++++++++++++++++ test/utils/to_proto.spec.ts | 390 ++++++++++++++++++++++++++++++++ 7 files changed, 704 insertions(+), 31 deletions(-) create mode 100644 src/grpc/utils/id_decoding.ts create mode 100644 src/server/grpc/index.ts create mode 100644 test/utils/from_proto.spec.ts create mode 100644 test/utils/to_proto.spec.ts diff --git a/src/grpc/utils/from_proto.ts b/src/grpc/utils/from_proto.ts index a3c719d7..c17eed00 100644 --- a/src/grpc/utils/from_proto.ts +++ b/src/grpc/utils/from_proto.ts @@ -15,40 +15,22 @@ import { Part, } from '../a2a.js'; import * as types from '../../types.js'; - -const TASK_ID_REGEX = /tasks\/([^/]+)/; -const CONFIG_ID_REGEX = /pushNotificationConfigs\/([^/]+)/; +import { extractTaskId, extractPushNotificationConfigId } from './id_decoding.js'; /** * Converts proto types to internal types. */ export class FromProto { - private static getTaskIdFromName(name: string): string { - const match = name.match(TASK_ID_REGEX); - if (!match) { - throw A2AError.invalidParams(`Invalid or missing task ID in name: "${name}"`); - } - return match[1]; - } - - private static getPushNotificationConfigIdFromName(name: string): string { - const match = name.match(CONFIG_ID_REGEX); - if (!match || match.length < 2) { - throw A2AError.invalidParams(`Invalid or missing config ID in name: "${name}"`); - } - return match[1]; - } - static taskQueryParams(request: GetTaskRequest): types.TaskQueryParams { return { - id: this.getTaskIdFromName(request.name), + id: extractTaskId(request.name), historyLength: request.historyLength, }; } static taskIdParams(request: CancelTaskRequest): types.TaskIdParams { return { - id: this.getTaskIdFromName(request.name), + id: extractTaskId(request.name), }; } @@ -56,8 +38,8 @@ export class FromProto { request: GetTaskPushNotificationConfigRequest ): types.GetTaskPushNotificationConfigParams { return { - id: this.getTaskIdFromName(request.name), - pushNotificationConfigId: this.getPushNotificationConfigIdFromName(request.name), + id: extractTaskId(request.name), + pushNotificationConfigId: extractPushNotificationConfigId(request.name), }; } @@ -65,7 +47,7 @@ export class FromProto { request: ListTaskPushNotificationConfigRequest ): types.ListTaskPushNotificationConfigParams { return { - id: this.getTaskIdFromName(request.parent), + id: extractTaskId(request.parent), }; } @@ -73,7 +55,7 @@ export class FromProto { request: CreateTaskPushNotificationConfigRequest ): types.TaskPushNotificationConfig { return { - taskId: this.getTaskIdFromName(request.parent), + taskId: extractTaskId(request.parent), pushNotificationConfig: this.pushNotificationConfig(request.config.pushNotificationConfig), }; } @@ -83,8 +65,8 @@ export class FromProto { ): types.DeleteTaskPushNotificationConfigParams { const name = request.name; return { - id: this.getTaskIdFromName(name), - pushNotificationConfigId: this.getPushNotificationConfigIdFromName(name), + id: extractTaskId(name), + pushNotificationConfigId: extractPushNotificationConfigId(name), }; } diff --git a/src/grpc/utils/id_decoding.ts b/src/grpc/utils/id_decoding.ts new file mode 100644 index 00000000..1633c44b --- /dev/null +++ b/src/grpc/utils/id_decoding.ts @@ -0,0 +1,28 @@ +import { A2AError } from '../../server/error.js'; + +const TASK_ID_REGEX = /tasks\/([^/]+)/; +const CONFIG_ID_REGEX = /pushNotificationConfigs\/([^/]+)/; + +export const extractTaskId = (name: string): string => { + const match = name.match(TASK_ID_REGEX); + if (!match) { + throw A2AError.invalidParams(`Invalid or missing task ID in name: "${name}"`); + } + return match[1]; +}; + +export const generateTaskName = (taskId: string): string => { + return `tasks/${taskId}`; +}; + +export const extractPushNotificationConfigId = (name: string): string => { + const match = name.match(CONFIG_ID_REGEX); + if (!match || match.length < 2) { + throw A2AError.invalidParams(`Invalid or missing config ID in name: "${name}"`); + } + return match[1]; +}; + +export const generatePushNotificationConfigName = (taskId: string, configId: string): string => { + return `tasks/${taskId}/pushNotificationConfigs/${configId}`; +}; diff --git a/src/grpc/utils/to_proto.ts b/src/grpc/utils/to_proto.ts index 1958e662..6286d95e 100644 --- a/src/grpc/utils/to_proto.ts +++ b/src/grpc/utils/to_proto.ts @@ -28,6 +28,7 @@ import { ListTaskPushNotificationConfigResponse, AgentSkill, } from '../a2a.js'; +import { generatePushNotificationConfigName } from './id_decoding.js'; export class ToProto { static agentCard(agentCard: types.AgentCard): AgentCard { @@ -242,7 +243,10 @@ export class ToProto { config: types.TaskPushNotificationConfig ): TaskPushNotificationConfig { return { - name: `tasks/${config.taskId}/pushNotificationConfigs/${config.pushNotificationConfig.id || ''}`, + name: generatePushNotificationConfigName( + config.taskId, + config.pushNotificationConfig.id || '' + ), pushNotificationConfig: this.pushNotificationConfig(config.pushNotificationConfig), }; } diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index 2ef02396..d8a9df7f 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -32,7 +32,7 @@ import { A2AError } from '../error.js'; /** * Options for configuring the gRPC handler. */ -export interface gRpcHandlerOptions { +export interface grpcHandlerOptions { requestHandler: A2ARequestHandler; userBuilder: ( call: grpc.ServerUnaryCall | grpc.ServerWritableStream @@ -47,7 +47,7 @@ export interface gRpcHandlerOptions { * @param requestHandler - The core A2A request handler for business logic. * @returns An object that implements the A2AServiceServer interface. */ -export function grpcHandler(options: gRpcHandlerOptions): A2AServiceServer { +export function grpcHandler(options: grpcHandlerOptions): A2AServiceServer { const grpcTransportHandler = new gRpcTransportHandler(options.requestHandler); /** @@ -248,7 +248,7 @@ const mapToError = (error: unknown): Partial => { const buildContext = async ( call: grpc.ServerUnaryCall | grpc.ServerWritableStream, - userBuilder: gRpcHandlerOptions['userBuilder'] + userBuilder: grpcHandlerOptions['userBuilder'] ): Promise => { const user = await userBuilder(call); const extensionHeaders = call.metadata.get(HTTP_EXTENSION_HEADER.toLowerCase()); diff --git a/src/server/grpc/index.ts b/src/server/grpc/index.ts new file mode 100644 index 00000000..9882c9b5 --- /dev/null +++ b/src/server/grpc/index.ts @@ -0,0 +1,7 @@ +/** + * gRPC integration for the A2A Server library. + * This module provides gRPC specific functionality. + */ + +export { grpcHandler } from './grpc_handler.js'; +export type { grpcHandlerOptions } from './grpc_handler.js'; diff --git a/test/utils/from_proto.spec.ts b/test/utils/from_proto.spec.ts new file mode 100644 index 00000000..45502ddd --- /dev/null +++ b/test/utils/from_proto.spec.ts @@ -0,0 +1,262 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { FromProto } from '../../src/grpc/utils/from_proto.js'; +import * as proto from '../../src/grpc/a2a.js'; +import * as idDecoding from '../../src/grpc/utils/id_decoding.js'; +import { A2AError } from '../../src/server/index.js'; + +vi.mock('../../src/grpc/utils/id_decoding', () => ({ + extractTaskId: vi.fn(), + extractPushNotificationConfigId: vi.fn(), +})); + +describe('FromProto', () => { + beforeEach(() => { + vi.mocked(idDecoding.extractTaskId).mockReturnValue('task-123'); + vi.mocked(idDecoding.extractPushNotificationConfigId).mockReturnValue('pnc-456'); + }); + + it('should convert GetTaskRequest to taskQueryParams', () => { + const request: proto.GetTaskRequest = { + name: 'tasks/task-123', + historyLength: 10, + }; + const result = FromProto.taskQueryParams(request); + expect(idDecoding.extractTaskId).toHaveBeenCalledWith('tasks/task-123'); + expect(result).toEqual({ + id: 'task-123', + historyLength: 10, + }); + }); + + it('should convert CancelTaskRequest to taskIdParams', () => { + const request: proto.CancelTaskRequest = { + name: 'tasks/task-123', + }; + const result = FromProto.taskIdParams(request); + expect(idDecoding.extractTaskId).toHaveBeenCalledWith('tasks/task-123'); + expect(result).toEqual({ + id: 'task-123', + }); + }); + + it('should convert GetTaskPushNotificationConfigRequest to params', () => { + const request: proto.GetTaskPushNotificationConfigRequest = { + name: 'tasks/task-123/pushNotificationConfigs/pnc-456', + }; + const result = FromProto.getTaskPushNotificationConfigParams(request); + expect(idDecoding.extractTaskId).toHaveBeenCalledWith(request.name); + expect(idDecoding.extractPushNotificationConfigId).toHaveBeenCalledWith(request.name); + expect(result).toEqual({ + id: 'task-123', + pushNotificationConfigId: 'pnc-456', + }); + }); + + it('should convert ListTaskPushNotificationConfigRequest to params', () => { + const request: proto.ListTaskPushNotificationConfigRequest = { + parent: 'tasks/task-123', + pageToken: '', + pageSize: 0, + }; + const result = FromProto.listTaskPushNotificationConfigParams(request); + expect(idDecoding.extractTaskId).toHaveBeenCalledWith(request.parent); + expect(result).toEqual({ + id: 'task-123', + }); + }); + + it('should convert CreateTaskPushNotificationConfigRequest to params', () => { + const request: proto.CreateTaskPushNotificationConfigRequest = { + parent: 'tasks/task-123', + configId: 'pnc-456', + config: { + name: 'tasks/task-123/pushNotificationConfigs/pnc-456', + pushNotificationConfig: { + id: 'pnc-456', + url: 'http://example.com', + token: 'token-abc', + authentication: undefined, + }, + }, + }; + const result = FromProto.setTaskPushNotificationConfigParams(request); + expect(idDecoding.extractTaskId).toHaveBeenCalledWith(request.parent); + expect(result).toEqual({ + taskId: 'task-123', + pushNotificationConfig: { + id: 'pnc-456', + url: 'http://example.com', + token: 'token-abc', + authentication: undefined, + }, + }); + }); + + it('should convert DeleteTaskPushNotificationConfigRequest to params', () => { + const request: proto.DeleteTaskPushNotificationConfigRequest = { + name: 'tasks/task-123/pushNotificationConfigs/pnc-456', + }; + const result = FromProto.deleteTaskPushNotificationConfigParams(request); + expect(idDecoding.extractTaskId).toHaveBeenCalledWith(request.name); + expect(idDecoding.extractPushNotificationConfigId).toHaveBeenCalledWith(request.name); + expect(result).toEqual({ + id: 'task-123', + pushNotificationConfigId: 'pnc-456', + }); + }); + + it('should convert proto Message to internal Message', () => { + const protoMessage: proto.Message = { + messageId: 'msg-1', + content: [], + contextId: 'ctx-1', + taskId: 'task-1', + role: proto.Role.ROLE_AGENT, + metadata: { key: 'value' }, + extensions: ['ext1'], + }; + const result = FromProto.message(protoMessage); + expect(result).toEqual({ + kind: 'message', + messageId: 'msg-1', + parts: [], + contextId: 'ctx-1', + taskId: 'task-1', + role: 'agent', + metadata: { key: 'value' }, + extensions: ['ext1'], + }); + }); + + it('should convert proto SendMessageConfiguration to internal type', () => { + const protoConfig: proto.SendMessageConfiguration = { + blocking: true, + acceptedOutputModes: ['text/plain'], + pushNotification: { + id: 'pnc-1', + url: 'http://notify.me', + token: 'token', + authentication: undefined, + }, + historyLength: 0, + }; + const result = FromProto.configuration(protoConfig); + expect(result).toEqual({ + blocking: true, + acceptedOutputModes: ['text/plain'], + pushNotificationConfig: { + id: 'pnc-1', + url: 'http://notify.me', + token: 'token', + authentication: undefined, + }, + }); + }); + + it('should convert proto AuthenticationInfo to internal type', () => { + const authInfo: proto.AuthenticationInfo = { + schemes: ['bearer'], + credentials: 'bearer-token', + }; + const result = FromProto.authenticationInfo(authInfo); + expect(result).toEqual({ + schemes: ['bearer'], + credentials: 'bearer-token', + }); + }); + + describe('parts', () => { + it('should convert a text part', () => { + const part: proto.Part = { part: { $case: 'text', value: 'hello' } }; + const result = FromProto.parts(part); + expect(result).toEqual({ kind: 'text', text: 'hello' }); + }); + + it('should convert a file part with URI', () => { + const part: proto.Part = { + part: { + $case: 'file', + value: { + file: { $case: 'fileWithUri', value: 'file://path/to/file' }, + mimeType: 'text/plain', + }, + }, + }; + const result = FromProto.parts(part); + expect(result).toEqual({ + kind: 'file', + file: { uri: 'file://path/to/file' }, + }); + }); + + it('should convert a file part with bytes', () => { + const bytes = Buffer.from('file content'); + const part: proto.Part = { + part: { + $case: 'file', + value: { file: { $case: 'fileWithBytes', value: bytes }, mimeType: 'text/plain' }, + }, + }; + const result = FromProto.parts(part); + expect(result).toEqual({ + kind: 'file', + file: { bytes: bytes.toString('base64') }, + }); + }); + + it('should throw for invalid file part', () => { + const part: proto.Part = { + part: { + $case: 'file', + value: { + file: { $case: 'wrong format', value: 'invalid bytes' } as any, + mimeType: 'text/plain', + }, // Invalid state + }, + }; + expect(() => FromProto.parts(part)).toThrow(new A2AError(-32602, 'Invalid file part type')); + }); + + it('should convert a data part', () => { + const data = { foo: 'bar' }; + const part: proto.Part = { part: { $case: 'data', value: { data } } }; + const result = FromProto.parts(part); + expect(result).toEqual({ kind: 'data', data }); + }); + + it('should throw for an unknown part type', () => { + const part: proto.Part = { part: { $case: 'invalid', value: undefined } as any }; // Invalid state + expect(() => FromProto.parts(part)).toThrow(new A2AError(-32602, 'Invalid part type')); + }); + }); + + it('should convert SendMessageRequest to messageSendParams', () => { + const request: proto.SendMessageRequest = { + request: { + messageId: 'msg-1', + content: [], + contextId: 'ctx-1', + taskId: 'task-1', + role: proto.Role.ROLE_USER, + metadata: {}, + extensions: [], + }, + configuration: { + blocking: false, + acceptedOutputModes: [], + pushNotification: undefined, + historyLength: 0, + }, + metadata: { client: 'test' }, + }; + + const result = FromProto.messageSendParams(request); + + expect(result).toEqual({ + message: expect.any(Object), + configuration: expect.any(Object), + metadata: { client: 'test' }, + }); + expect(result.message.role).toBe('user'); + }); +}); diff --git a/test/utils/to_proto.spec.ts b/test/utils/to_proto.spec.ts new file mode 100644 index 00000000..f0beebee --- /dev/null +++ b/test/utils/to_proto.spec.ts @@ -0,0 +1,390 @@ +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { ToProto } from '../../src/grpc/utils/to_proto.js'; +import * as types from '../../src/types.js'; +import * as proto from '../../src/grpc/a2a.js'; +import * as idDecoding from '../../src/grpc/utils/id_decoding.js'; +import { A2AError } from '../../src/server/index.js'; + +vi.mock('../../src/grpc/utils/id_decoding', () => ({ + generatePushNotificationConfigName: vi.fn(), +})); + +describe('ToProto', () => { + beforeEach(() => { + vi.mocked(idDecoding.generatePushNotificationConfigName).mockReturnValue( + 'tasks/task-123/pushNotificationConfigs/pnc-456' + ); + }); + + it('should convert internal Task to proto Task', () => { + const internalTask: types.Task = { + id: 'task-123', + kind: 'task', + contextId: 'ctx-1', + status: { + state: 'completed', + timestamp: '2023-01-01T00:00:00.000Z', + }, + artifacts: [], + history: [], + metadata: { key: 'value' }, + }; + + const result = ToProto.task(internalTask); + + expect(result).toEqual({ + id: 'task-123', + contextId: 'ctx-1', + status: { + state: proto.TaskState.TASK_STATE_COMPLETED, + timestamp: new Date('2023-01-01T00:00:00.000Z'), + update: undefined, + }, + artifacts: [], + history: [], + metadata: { key: 'value' }, + }); + }); + + it('should convert internal Message to proto Message', () => { + const internalMessage: types.Message = { + kind: 'message', + messageId: 'msg-1', + parts: [{ kind: 'text', text: 'hello' }], + contextId: 'ctx-1', + taskId: 'task-1', + role: 'user', + metadata: { key: 'value' }, + extensions: ['ext1'], + }; + + const result = ToProto.message(internalMessage); + + expect(result).toEqual({ + messageId: 'msg-1', + content: [{ part: { $case: 'text', value: 'hello' } }], + contextId: 'ctx-1', + taskId: 'task-1', + role: proto.Role.ROLE_USER, + metadata: { key: 'value' }, + extensions: ['ext1'], + }); + }); + + describe('taskState', () => { + it.each([ + ['submitted', proto.TaskState.TASK_STATE_SUBMITTED], + ['working', proto.TaskState.TASK_STATE_WORKING], + ['input-required', proto.TaskState.TASK_STATE_INPUT_REQUIRED], + ['rejected', proto.TaskState.TASK_STATE_REJECTED], + ['auth-required', proto.TaskState.TASK_STATE_AUTH_REQUIRED], + ['completed', proto.TaskState.TASK_STATE_COMPLETED], + ['failed', proto.TaskState.TASK_STATE_FAILED], + ['canceled', proto.TaskState.TASK_STATE_CANCELLED], + ['unknown', proto.TaskState.TASK_STATE_UNSPECIFIED], + ['invalid-state' as types.TaskState, proto.TaskState.UNRECOGNIZED], + ])('should convert internal state "%s" to proto state %s', (internalState, expectedState) => { + const result = ToProto.taskState(internalState as types.TaskState); + expect(result).toBe(expectedState); + }); + }); + + describe('parts', () => { + it('should convert a text part', () => { + const part: types.Part = { kind: 'text', text: 'hello' }; + const result = ToProto.parts(part); + expect(result).toEqual({ + part: { $case: 'text', value: 'hello' }, + }); + }); + + it('should convert a file part with URI', () => { + const part: types.Part = { + kind: 'file', + file: { uri: 'file://path', mimeType: 'text/plain' }, + }; + const result = ToProto.parts(part); + expect(result).toEqual({ + part: { + $case: 'file', + value: { + file: { $case: 'fileWithUri', value: 'file://path' }, + mimeType: 'text/plain', + }, + }, + }); + }); + + it('should convert a file part with bytes', () => { + const base64Bytes = Buffer.from('file content').toString('base64'); + const part: types.Part = { + kind: 'file', + file: { bytes: base64Bytes, mimeType: 'application/octet-stream' }, + }; + const result = ToProto.parts(part); + expect(result).toEqual({ + part: { + $case: 'file', + value: { + file: { $case: 'fileWithBytes', value: Buffer.from('file content') }, + mimeType: 'application/octet-stream', + }, + }, + }); + }); + + it('should throw for an invalid file part', () => { + const part: types.Part = { + kind: 'file', + file: {} as any, + }; + expect(() => ToProto.parts(part)).toThrow(new A2AError(-32603, 'Invalid file part')); + }); + + it('should convert a data part', () => { + const data = { foo: 'bar' }; + const part: types.Part = { kind: 'data', data }; + const result = ToProto.parts(part); + expect(result).toEqual({ + part: { $case: 'data', value: { data } }, + }); + }); + + it('should throw for an unknown part type', () => { + const part: types.Part = { kind: 'unknown' } as any; + expect(() => ToProto.parts(part)).toThrow(new A2AError(-32603, 'Invalid part type')); + }); + }); + + it('should convert internal Artifact to proto Artifact', () => { + const internalArtifact: types.Artifact = { + artifactId: 'art-1', + name: 'My Artifact', + description: 'A test artifact', + parts: [{ kind: 'text', text: 'artifact content' }], + metadata: { key: 'value' }, + extensions: ['ext1'], + }; + + const result = ToProto.artifact(internalArtifact); + + expect(result).toEqual({ + artifactId: 'art-1', + name: 'My Artifact', + description: 'A test artifact', + parts: [{ part: { $case: 'text', value: 'artifact content' } }], + metadata: { key: 'value' }, + extensions: ['ext1'], + }); + }); + + describe('messageSendResult', () => { + it('should convert a message result', () => { + const message: types.Message = { + kind: 'message', + messageId: 'msg-1', + parts: [], + role: 'agent', + }; + const result = ToProto.messageSendResult(message); + expect(result.payload?.$case).toBe('msg'); + expect((result.payload as any).value.messageId).toBe('msg-1'); + }); + + it('should convert a task result', () => { + const task: types.Task = { + kind: 'task', + id: 'task-123', + contextId: 'ctx-1', + status: { state: 'submitted' }, + history: [], + artifacts: [], + }; + const result = ToProto.messageSendResult(task); + expect(result.payload?.$case).toBe('task'); + expect((result.payload as any).value.id).toBe('task-123'); + }); + + it('should return undefined for invalid kind', () => { + const invalid = { kind: 'invalid' } as any; + const result = ToProto.messageSendResult(invalid); + expect(result).toBeUndefined(); + }); + }); + + describe('messageStreamResult', () => { + it('should convert a message event', () => { + const event: types.Message = { + kind: 'message', + messageId: 'msg-1', + parts: [], + role: 'agent', + }; + const result = ToProto.messageStreamResult(event); + expect(result.payload?.$case).toBe('msg'); + }); + + it('should convert a task event', () => { + const event: types.Task = { + kind: 'task', + id: 'task-123', + contextId: 'ctx-1', + status: { state: 'submitted' }, + history: [], + artifacts: [], + }; + const result = ToProto.messageStreamResult(event); + expect(result.payload?.$case).toBe('task'); + }); + + it('should convert a status-update event', () => { + const event: types.TaskStatusUpdateEvent = { + kind: 'status-update', + taskId: 'task-123', + status: { state: 'working' }, + contextId: 'ctx-1', + metadata: {}, + final: false, + }; + const result = ToProto.messageStreamResult(event); + expect(result.payload?.$case).toBe('statusUpdate'); + }); + + it('should convert an artifact-update event', () => { + const event: types.TaskArtifactUpdateEvent = { + kind: 'artifact-update', + taskId: 'task-123', + artifact: { artifactId: 'art-1', parts: [] }, + contextId: 'ctx-1', + metadata: {}, + }; + const result = ToProto.messageStreamResult(event); + expect(result.payload?.$case).toBe('artifactUpdate'); + }); + + it('should throw for an invalid event type', () => { + const event = { kind: 'invalid' } as any; + expect(() => ToProto.messageStreamResult(event)).toThrow( + new A2AError(-32603, 'Invalid event type') + ); + }); + }); + + it('should convert PushNotificationAuthenticationInfo', () => { + const authInfo: types.PushNotificationAuthenticationInfo = { + schemes: ['bearer'], + credentials: 'my-token', + }; + const result = ToProto.authenticationInfo(authInfo); + expect(result).toEqual({ + schemes: ['bearer'], + credentials: 'my-token', + }); + }); + + it('should convert PushNotificationConfig', () => { + const config: types.PushNotificationConfig = { + id: 'pnc-456', + url: 'https://example.com/notify', + token: 'push-token', + authentication: { + schemes: ['bearer'], + credentials: 'my-token', + }, + }; + const result = ToProto.pushNotificationConfig(config); + expect(result).toEqual({ + id: 'pnc-456', + url: 'https://example.com/notify', + token: 'push-token', + authentication: { + schemes: ['bearer'], + credentials: 'my-token', + }, + }); + }); + + it('should convert TaskPushNotificationConfig', () => { + const config: types.TaskPushNotificationConfig = { + taskId: 'task-123', + pushNotificationConfig: { + id: 'pnc-456', + url: 'https://example.com/notify', + }, + }; + const result = ToProto.taskPushNotificationConfig(config); + expect(idDecoding.generatePushNotificationConfigName).toHaveBeenCalledWith( + 'task-123', + 'pnc-456' + ); + expect(result).toEqual({ + name: 'tasks/task-123/pushNotificationConfigs/pnc-456', + pushNotificationConfig: { + id: 'pnc-456', + url: 'https://example.com/notify', + token: '', + authentication: undefined, + }, + }); + }); + + it('should convert a list of TaskPushNotificationConfigs', () => { + const configs: types.TaskPushNotificationConfig[] = [ + { + taskId: 'task-123', + pushNotificationConfig: { id: 'pnc-456', url: 'https://example.com/notify' }, + }, + ]; + const result = ToProto.listTaskPushNotificationConfigs(configs); + expect(result.configs.length).toBe(1); + expect(result.nextPageToken).toBe(''); + expect(result.configs[0].name).toBe('tasks/task-123/pushNotificationConfigs/pnc-456'); + }); + + describe('securityScheme', () => { + it('should convert apiKey scheme', () => { + const scheme: types.SecurityScheme = { + type: 'apiKey', + name: 'X-API-KEY', + in: 'header', + description: 'API Key auth', + }; + const result = ToProto.securityScheme(scheme); + expect(result.scheme?.$case).toBe('apiKeySecurityScheme'); + }); + + it('should convert http scheme', () => { + const scheme: types.SecurityScheme = { + type: 'http', + scheme: 'bearer', + bearerFormat: 'JWT', + }; + const result = ToProto.securityScheme(scheme); + expect(result.scheme?.$case).toBe('httpAuthSecurityScheme'); + }); + + it('should throw on unsupported security scheme', () => { + const scheme: types.SecurityScheme = { type: 'unsupported' } as any; + expect(() => ToProto.securityScheme(scheme)).toThrow( + A2AError.internalError('Unsupported security scheme type') + ); + }); + }); + + describe('oauthFlows', () => { + it('should convert implicit flow', () => { + const flows: types.OAuthFlows = { + implicit: { authorizationUrl: 'url', scopes: { s1: '' } }, + }; + const result = ToProto.oauthFlows(flows); + expect(result.flow?.$case).toBe('implicit'); + }); + + it('should throw on unsupported flow', () => { + const flows: types.OAuthFlows = {}; + expect(() => ToProto.oauthFlows(flows)).toThrow( + A2AError.internalError('Unsupported OAuth flows') + ); + }); + }); +}); From 16acf397663925b23bb0b262548712f5cac68bf8 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 11:58:27 +0000 Subject: [PATCH 27/64] exclude edge tests --- vitest.edge.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/vitest.edge.config.ts b/vitest.edge.config.ts index b5bfa9de..1e43e97a 100644 --- a/vitest.edge.config.ts +++ b/vitest.edge.config.ts @@ -10,6 +10,7 @@ export default defineWorkersConfig( 'test/server/a2a_express_app.spec.ts', // gRpc test require Node.js-specific gRPC module 'test/server/grpc_handler.spec.ts', + 'test/utils/*.spec.ts', 'test/e2e.spec.ts', 'test/server/rest_handler.spec.ts', 'test/server/push_notification_integration.spec.ts', From b2808774bd717d180c446ba009eddfa9221cd7a1 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 13:17:53 +0000 Subject: [PATCH 28/64] update proto converters --- src/grpc/utils/from_proto.ts | 41 +++++++++++++++++++------- src/grpc/utils/id_decoding.ts | 2 +- src/grpc/utils/to_proto.ts | 17 +++++++---- src/server/express/json_rpc_handler.ts | 2 +- 4 files changed, 43 insertions(+), 19 deletions(-) diff --git a/src/grpc/utils/from_proto.ts b/src/grpc/utils/from_proto.ts index c17eed00..a3235806 100644 --- a/src/grpc/utils/from_proto.ts +++ b/src/grpc/utils/from_proto.ts @@ -54,6 +54,11 @@ export class FromProto { static setTaskPushNotificationConfigParams( request: CreateTaskPushNotificationConfigRequest ): types.TaskPushNotificationConfig { + if (!request.config?.pushNotificationConfig) { + throw A2AError.invalidParams( + 'Request must include a `config` object with a `pushNotificationConfig`' + ); + } return { taskId: extractTaskId(request.parent), pushNotificationConfig: this.pushNotificationConfig(request.config.pushNotificationConfig), @@ -70,7 +75,11 @@ export class FromProto { }; } - static message(message: Message): types.Message { + static message(message: Message): types.Message | undefined { + if(!message) { + return undefined; + } + return { kind: 'message', messageId: message.messageId, @@ -83,30 +92,38 @@ export class FromProto { }; } - static configuration(configuration: SendMessageConfiguration): types.MessageSendConfiguration { + static configuration(configuration: SendMessageConfiguration): types.MessageSendConfiguration | undefined { + if (!configuration) { + return undefined; + } + return { blocking: configuration.blocking, acceptedOutputModes: configuration.acceptedOutputModes, - pushNotificationConfig: configuration.pushNotification - ? this.pushNotificationConfig(configuration.pushNotification) - : undefined, + pushNotificationConfig: this.pushNotificationConfig(configuration.pushNotification), }; } - static pushNotificationConfig(config: PushNotificationConfig): types.PushNotificationConfig { + static pushNotificationConfig(config: PushNotificationConfig): types.PushNotificationConfig | undefined { + if (!config) { + return undefined; + } + return { id: config.id, url: config.url, token: config.token, - authentication: config.authentication - ? this.authenticationInfo(config.authentication) - : undefined, + authentication: this.authenticationInfo(config.authentication), }; } static authenticationInfo( authInfo: AuthenticationInfo - ): types.PushNotificationAuthenticationInfo { + ): types.PushNotificationAuthenticationInfo | undefined { + if (!authInfo) { + return undefined; + } + return { schemes: authInfo.schemes, credentials: authInfo.credentials, @@ -128,6 +145,7 @@ export class FromProto { kind: 'file', file: { uri: filePart.file.value, + mimeType: filePart.mimeType, }, }; } else if (filePart.file?.$case === 'fileWithBytes') { @@ -135,6 +153,7 @@ export class FromProto { kind: 'file', file: { bytes: filePart.file.value.toString('base64'), + mimeType: filePart.mimeType, }, }; } @@ -153,7 +172,7 @@ export class FromProto { static messageSendParams(request: SendMessageRequest): types.MessageSendParams { return { message: this.message(request.request), - configuration: request.configuration ? this.configuration(request.configuration) : undefined, + configuration: this.configuration(request.configuration), metadata: request.metadata, }; } diff --git a/src/grpc/utils/id_decoding.ts b/src/grpc/utils/id_decoding.ts index 1633c44b..e808b154 100644 --- a/src/grpc/utils/id_decoding.ts +++ b/src/grpc/utils/id_decoding.ts @@ -17,7 +17,7 @@ export const generateTaskName = (taskId: string): string => { export const extractPushNotificationConfigId = (name: string): string => { const match = name.match(CONFIG_ID_REGEX); - if (!match || match.length < 2) { + if (!match) { throw A2AError.invalidParams(`Invalid or missing config ID in name: "${name}"`); } return match[1]; diff --git a/src/grpc/utils/to_proto.ts b/src/grpc/utils/to_proto.ts index 6286d95e..c5eb12fc 100644 --- a/src/grpc/utils/to_proto.ts +++ b/src/grpc/utils/to_proto.ts @@ -256,15 +256,16 @@ export class ToProto { id: config.id ?? '', url: config.url, token: config.token ?? '', - authentication: config.authentication - ? this.authenticationInfo(config.authentication) - : undefined, + authentication: this.authenticationInfo(config.authentication), }; } static authenticationInfo( authInfo: types.PushNotificationAuthenticationInfo - ): AuthenticationInfo { + ): AuthenticationInfo | undefined { + if (!authInfo) { + return undefined; + } return { schemes: authInfo.schemes, credentials: authInfo.credentials ?? '', @@ -346,7 +347,11 @@ export class ToProto { } } - static message(message: types.Message): Message { + static message(message: types.Message): Message | undefined { + if (!message){ + return undefined; + } + return { messageId: message.messageId, content: message.parts.map((p) => this.parts(p)), @@ -372,7 +377,7 @@ export class ToProto { static taskStatus(status: types.TaskStatus): TaskStatus { return { state: this.taskState(status.state), - update: status.message ? this.message(status.message) : undefined, + update: this.message(status.message), timestamp: status.timestamp ? new Date(status.timestamp) : undefined, }; } diff --git a/src/server/express/json_rpc_handler.ts b/src/server/express/json_rpc_handler.ts index b3a9c59a..fc65a742 100644 --- a/src/server/express/json_rpc_handler.ts +++ b/src/server/express/json_rpc_handler.ts @@ -5,7 +5,7 @@ import express, { NextFunction, RequestHandler, } from 'express'; -import { JSONRPCErrorResponse, JSONRPCSuccessResponse, JSONRPCResponse } from '../../types.js'; +import { JSONRPCErrorResponse, JSONRPCSuccessResponse, JSONRPCResponse, MessageSendParams } from '../../types.js'; import { A2AError } from '../error.js'; import { A2ARequestHandler } from '../request_handler/a2a_request_handler.js'; import { JsonRpcTransportHandler } from '../transports/jsonrpc/jsonrpc_transport_handler.js'; From 8894059f29fe9f36b2a2c705d97c802fb1d1d445 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 13:20:14 +0000 Subject: [PATCH 29/64] run linter --- src/grpc/utils/from_proto.ts | 12 ++++++++---- src/grpc/utils/to_proto.ts | 2 +- src/server/express/json_rpc_handler.ts | 7 ++++++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/grpc/utils/from_proto.ts b/src/grpc/utils/from_proto.ts index a3235806..e78eb831 100644 --- a/src/grpc/utils/from_proto.ts +++ b/src/grpc/utils/from_proto.ts @@ -76,7 +76,7 @@ export class FromProto { } static message(message: Message): types.Message | undefined { - if(!message) { + if (!message) { return undefined; } @@ -92,7 +92,9 @@ export class FromProto { }; } - static configuration(configuration: SendMessageConfiguration): types.MessageSendConfiguration | undefined { + static configuration( + configuration: SendMessageConfiguration + ): types.MessageSendConfiguration | undefined { if (!configuration) { return undefined; } @@ -104,7 +106,9 @@ export class FromProto { }; } - static pushNotificationConfig(config: PushNotificationConfig): types.PushNotificationConfig | undefined { + static pushNotificationConfig( + config: PushNotificationConfig + ): types.PushNotificationConfig | undefined { if (!config) { return undefined; } @@ -121,7 +125,7 @@ export class FromProto { authInfo: AuthenticationInfo ): types.PushNotificationAuthenticationInfo | undefined { if (!authInfo) { - return undefined; + return undefined; } return { diff --git a/src/grpc/utils/to_proto.ts b/src/grpc/utils/to_proto.ts index c5eb12fc..8b78deb5 100644 --- a/src/grpc/utils/to_proto.ts +++ b/src/grpc/utils/to_proto.ts @@ -348,7 +348,7 @@ export class ToProto { } static message(message: types.Message): Message | undefined { - if (!message){ + if (!message) { return undefined; } diff --git a/src/server/express/json_rpc_handler.ts b/src/server/express/json_rpc_handler.ts index fc65a742..c94fe10d 100644 --- a/src/server/express/json_rpc_handler.ts +++ b/src/server/express/json_rpc_handler.ts @@ -5,7 +5,12 @@ import express, { NextFunction, RequestHandler, } from 'express'; -import { JSONRPCErrorResponse, JSONRPCSuccessResponse, JSONRPCResponse, MessageSendParams } from '../../types.js'; +import { + JSONRPCErrorResponse, + JSONRPCSuccessResponse, + JSONRPCResponse, + MessageSendParams, +} from '../../types.js'; import { A2AError } from '../error.js'; import { A2ARequestHandler } from '../request_handler/a2a_request_handler.js'; import { JsonRpcTransportHandler } from '../transports/jsonrpc/jsonrpc_transport_handler.js'; From a70768ce43da7e15cedd9728d4868a7141a3c351 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 13:26:36 +0000 Subject: [PATCH 30/64] fix tests --- src/server/express/json_rpc_handler.ts | 1 - test/utils/from_proto.spec.ts | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/server/express/json_rpc_handler.ts b/src/server/express/json_rpc_handler.ts index c94fe10d..15db35fb 100644 --- a/src/server/express/json_rpc_handler.ts +++ b/src/server/express/json_rpc_handler.ts @@ -9,7 +9,6 @@ import { JSONRPCErrorResponse, JSONRPCSuccessResponse, JSONRPCResponse, - MessageSendParams, } from '../../types.js'; import { A2AError } from '../error.js'; import { A2ARequestHandler } from '../request_handler/a2a_request_handler.js'; diff --git a/test/utils/from_proto.spec.ts b/test/utils/from_proto.spec.ts index 45502ddd..e919ff37 100644 --- a/test/utils/from_proto.spec.ts +++ b/test/utils/from_proto.spec.ts @@ -185,7 +185,7 @@ describe('FromProto', () => { const result = FromProto.parts(part); expect(result).toEqual({ kind: 'file', - file: { uri: 'file://path/to/file' }, + file: { mimeType: 'text/plain', uri: 'file://path/to/file' }, }); }); @@ -200,7 +200,7 @@ describe('FromProto', () => { const result = FromProto.parts(part); expect(result).toEqual({ kind: 'file', - file: { bytes: bytes.toString('base64') }, + file: { bytes: bytes.toString('base64'), mimeType: 'text/plain' }, }); }); From ed73c0108f20bd053c2b32ec5dbabba90f9c1a11 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 15:00:14 +0000 Subject: [PATCH 31/64] generate grpc type with buf --- package-lock.json | 592 ++++++++++--------------- package.json | 15 +- src/grpc/a2a.ts | 196 ++++---- src/grpc/buf.gen.yaml | 10 + src/grpc/buf.lock | 6 + src/grpc/buf.yaml | 6 + src/grpc/google/api/annotations.ts | 4 +- src/grpc/google/api/client.ts | 42 +- src/grpc/google/api/field_behavior.ts | 4 +- src/grpc/google/api/http.ts | 10 +- src/grpc/google/api/launch_stage.ts | 4 +- src/grpc/google/protobuf/descriptor.ts | 91 ++-- src/grpc/google/protobuf/duration.ts | 6 +- src/grpc/google/protobuf/empty.ts | 6 +- src/grpc/google/protobuf/struct.ts | 16 +- src/grpc/google/protobuf/timestamp.ts | 6 +- src/server/express/json_rpc_handler.ts | 6 +- tsup.config.ts | 1 + 18 files changed, 457 insertions(+), 564 deletions(-) create mode 100644 src/grpc/buf.gen.yaml create mode 100644 src/grpc/buf.lock create mode 100644 src/grpc/buf.yaml diff --git a/package-lock.json b/package-lock.json index 29bd5e30..32ebaf2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,10 +9,10 @@ "version": "0.3.7", "license": "Apache-2.0", "dependencies": { - "@grpc/grpc-js": "^1.14.3", "uuid": "^11.1.0" }, "devDependencies": { + "@bufbuild/buf": "^1.61.0", "@cloudflare/vitest-pool-workers": "^0.10.15", "@eslint/js": "^9.39.1", "@types/express": "^5.0.3", @@ -24,12 +24,10 @@ "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.4", "express": "^5.1.0", - "google-proto-files": "^5.0.1", "gts": "^6.0.2", "json-schema-to-typescript": "^15.0.4", "prettier": "^3.6.2", "supertest": "^7.1.4", - "ts-proto": "^2.8.3", "tsup": "^8.5.0", "tsx": "^4.19.3", "typescript": "^5.9.3", @@ -40,9 +38,13 @@ "node": ">=18" }, "peerDependencies": { + "@grpc/grpc-js": "^1.11.0", "express": "^4.21.2 || ^5.1.0" }, "peerDependenciesMeta": { + "@grpc/grpc-js": { + "optional": true + }, "express": { "optional": true } @@ -162,12 +164,149 @@ "node": ">=18" } }, - "node_modules/@bufbuild/protobuf": { - "version": "2.10.2", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.10.2.tgz", - "integrity": "sha512-uFsRXwIGyu+r6AMdz+XijIIZJYpoWeYzILt5yZ2d3mCjQrWUTVpVD9WL/jZAbvp+Ed04rOhrsk7FiTcEDseB5A==", + "node_modules/@bufbuild/buf": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/@bufbuild/buf/-/buf-1.61.0.tgz", + "integrity": "sha512-9kKZK/GjhIDUj50pngmjtC6bGFl6U1rFDH2gZJATRfp2vNnQPsb6BqZ+2lea37bgHBYdAYttlve8wnXszXmftA==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "bin": { + "buf": "bin/buf", + "protoc-gen-buf-breaking": "bin/protoc-gen-buf-breaking", + "protoc-gen-buf-lint": "bin/protoc-gen-buf-lint" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@bufbuild/buf-darwin-arm64": "1.61.0", + "@bufbuild/buf-darwin-x64": "1.61.0", + "@bufbuild/buf-linux-aarch64": "1.61.0", + "@bufbuild/buf-linux-armv7": "1.61.0", + "@bufbuild/buf-linux-x64": "1.61.0", + "@bufbuild/buf-win32-arm64": "1.61.0", + "@bufbuild/buf-win32-x64": "1.61.0" + } + }, + "node_modules/@bufbuild/buf-darwin-arm64": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/@bufbuild/buf-darwin-arm64/-/buf-darwin-arm64-1.61.0.tgz", + "integrity": "sha512-8vUGNV65LNPp+HT3NuCT9i/mCUEyLrSFctJ2Dz8JqnUu8fVPm4f8lVBSCT0TYLoQ8o8xb/A7bwWu14aKfXxgCg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@bufbuild/buf-darwin-x64": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/@bufbuild/buf-darwin-x64/-/buf-darwin-x64-1.61.0.tgz", + "integrity": "sha512-dyJghwTYXT6e/Ec+2iPWijquTzyT+5vTItX4R7hM/soNQOs4eEo2z7EHLqvclHyi7+p7+8xye3z+BFM33ucM8A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@bufbuild/buf-linux-aarch64": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/@bufbuild/buf-linux-aarch64/-/buf-linux-aarch64-1.61.0.tgz", + "integrity": "sha512-9r5DRqwpq3WX0ltzt1p/Oe+8g679Fg4XJLaH/zmjqpwHVO+tNzYy7PHK4qWg83PCoANw6OVizl+iTmnE0vbklg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "(Apache-2.0 AND BSD-3-Clause)" + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@bufbuild/buf-linux-armv7": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/@bufbuild/buf-linux-armv7/-/buf-linux-armv7-1.61.0.tgz", + "integrity": "sha512-P2cSlzu68omZ6kyijMcYezZJFS4XayfLA0ATm1HP0zUaV+xVoeMOGhKvMWUFAa9SGYUs4Drxi2fyK/c2ZFA8sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@bufbuild/buf-linux-x64": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/@bufbuild/buf-linux-x64/-/buf-linux-x64-1.61.0.tgz", + "integrity": "sha512-USDSLB0vkrR6Sk/VDtECLdOKHfynenCjnAchr9bdqC137IVJT7TVT8JhBW0UWMmXDZYjwbDrBLITwWj8hwk6Uw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@bufbuild/buf-win32-arm64": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/@bufbuild/buf-win32-arm64/-/buf-win32-arm64-1.61.0.tgz", + "integrity": "sha512-36n90c0lzhDMXRKhht8XreUCha4OTY7yR6g+bnkAFUXSbCbR3BpqrenWvl5NBtfX2Y70dmvjKnGwVanSIrb1uA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@bufbuild/buf-win32-x64": { + "version": "1.61.0", + "resolved": "https://registry.npmjs.org/@bufbuild/buf-win32-x64/-/buf-win32-x64-1.61.0.tgz", + "integrity": "sha512-uBIU7tQlCBPyoeJZH0NzL6y9Y4ikje4OlgHYGssbaPLsCKELSFDHQkHFabkwnVeXSUf9Intq+U3jtb+qOIlflw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } }, "node_modules/@cloudflare/kv-asset-handler": { "version": "0.4.1", @@ -946,37 +1085,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@grpc/grpc-js": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", - "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", - "license": "Apache-2.0", - "dependencies": { - "@grpc/proto-loader": "^0.8.0", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", - "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.5.3", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -1464,19 +1572,6 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -1518,24 +1613,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -1585,16 +1662,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", @@ -1729,70 +1796,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", - "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", - "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", - "license": "BSD-3-Clause" - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.53.5", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.5.tgz", @@ -2238,6 +2241,7 @@ "version": "22.19.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", + "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -2812,6 +2816,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -2821,6 +2826,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^2.0.1" @@ -3090,19 +3096,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/case-anything": { - "version": "2.1.13", - "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz", - "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, "node_modules/chai": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", @@ -3200,20 +3193,6 @@ "node": ">= 10" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -3232,6 +3211,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -3244,6 +3224,7 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, "license": "MIT" }, "node_modules/color-string": { @@ -3526,29 +3507,6 @@ "node": ">=6.0.0" } }, - "node_modules/dprint-node": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.8.tgz", - "integrity": "sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-libc": "^1.0.3" - } - }, - "node_modules/dprint-node/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -3582,6 +3540,7 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, "license": "MIT" }, "node_modules/encodeurl": { @@ -3712,15 +3671,6 @@ "@esbuild/win32-x64": "0.27.2" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -4539,15 +4489,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -4689,20 +4630,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/google-proto-files": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-5.0.1.tgz", - "integrity": "sha512-DM5x0D1QM/kTQ12p57lG14+aL3PMPtbzYf+oekPMkUweUjrrT4crzV7O9LakZF5/rdl+SVBeSiA/sfTu/dAWvw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "protobufjs": "7.5.4", - "walkdir": "^0.4.1" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -5537,6 +5464,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5874,12 +5802,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -5887,12 +5809,6 @@ "dev": true, "license": "MIT" }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, "node_modules/loupe": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", @@ -6803,30 +6719,6 @@ "node": ">=6.0.0" } }, - "node_modules/protobufjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -7105,15 +6997,6 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -7652,6 +7535,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -7682,6 +7566,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -8089,42 +7974,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/ts-poet": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.12.0.tgz", - "integrity": "sha512-xo+iRNMWqyvXpFTaOAvLPA5QAWO6TZrSUs5s4Odaya3epqofBu/fMLHEWl8jPmjhA0s9sgj9sNvF1BmaQlmQkA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dprint-node": "^1.0.8" - } - }, - "node_modules/ts-proto": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-2.8.3.tgz", - "integrity": "sha512-TdXInqG+61pj/TvORqITWjvjTTsL1EZxwX49iEj89+xFAcqPT8tjChpAGQXzfcF4MJwvNiuoCEbBOKqVf3ds3g==", - "dev": true, - "license": "ISC", - "dependencies": { - "@bufbuild/protobuf": "^2.0.0", - "case-anything": "^2.1.13", - "ts-poet": "^6.12.0", - "ts-proto-descriptors": "2.0.0" - }, - "bin": { - "protoc-gen-ts_proto": "protoc-gen-ts_proto" - } - }, - "node_modules/ts-proto-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-2.0.0.tgz", - "integrity": "sha512-wHcTH3xIv11jxgkX5OyCSFfw27agpInAd6yh89hKG6zqIXnjW9SYqSER2CVQxdPj4czeOhGagNvZBEbJPy7qkw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@bufbuild/protobuf": "^2.0.0" - } - }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -8331,6 +8180,7 @@ "version": "6.21.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, "license": "MIT" }, "node_modules/unenv": { @@ -8568,16 +8418,6 @@ } } }, - "node_modules/walkdir": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", - "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -9169,17 +9009,18 @@ "license": "MIT" }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -9204,6 +9045,73 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -9247,15 +9155,6 @@ } } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -9263,24 +9162,6 @@ "dev": true, "license": "ISC" }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", @@ -9291,15 +9172,6 @@ "node": ">=10" } }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 8f23ec2b..e14cc3ef 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,11 @@ "import": "./dist/server/express/index.js", "require": "./dist/server/express/index.cjs" }, + "./server/grpc": { + "types": "./dist/server/grpc/index.d.ts", + "import": "./dist/server/grpc/index.js", + "require": "./dist/server/grpc/index.cjs" + }, "./client": { "types": "./dist/client/index.d.ts", "import": "./dist/client/index.js", @@ -41,6 +46,7 @@ "README.md" ], "devDependencies": { + "@bufbuild/buf": "^1.61.0", "@cloudflare/vitest-pool-workers": "^0.10.15", "@eslint/js": "^9.39.1", "@types/express": "^5.0.3", @@ -52,12 +58,10 @@ "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.4", "express": "^5.1.0", - "google-proto-files": "^5.0.1", "gts": "^6.0.2", "json-schema-to-typescript": "^15.0.4", "prettier": "^3.6.2", "supertest": "^7.1.4", - "ts-proto": "^2.8.3", "tsup": "^8.5.0", "tsx": "^4.19.3", "typescript": "^5.9.3", @@ -73,18 +77,21 @@ "format:readme": "prettier --write ./README.md", "lint:fix": "npx eslint . --fix", "coverage": "vitest run --coverage", - "ts-proto": "curl -o ./src/grpc/a2a.proto https://raw.githubusercontent.com/a2aproject/A2A/v0.3.0/specification/grpc/a2a.proto && protoc --plugin=./node_modules/.bin/protoc-gen-ts_proto --ts_proto_out=./src/grpc --ts_proto_opt=oneof=unions-value,importSuffix=.js,outputServices=grpc-js,env=node,esModuleInterop=true --proto_path=./src/grpc ./src/grpc/a2a.proto -I ./node_modules/google-proto-files && rm ./src/grpc/a2a.proto", "generate": "curl https://raw.githubusercontent.com/google-a2a/A2A/refs/heads/main/specification/json/a2a.json > spec.json && node scripts/generateTypes.js && rm spec.json", + "generate-grpc-types": "cd ./src/grpc && curl -o ./a2a.proto https://raw.githubusercontent.com/a2aproject/A2A/v0.3.0/specification/grpc/a2a.proto && buf generate && rm ./a2a.proto", "test-build": "esbuild ./dist/client/index.js ./dist/server/index.js ./dist/index.js --bundle --platform=neutral --outdir=dist/tmp-checks --outbase=./dist" }, "dependencies": { - "@grpc/grpc-js": "^1.14.3", "uuid": "^11.1.0" }, "peerDependencies": { + "@grpc/grpc-js": "^1.11.0", "express": "^4.21.2 || ^5.1.0" }, "peerDependenciesMeta": { + "@grpc/grpc-js": { + "optional": true + }, "express": { "optional": true } diff --git a/src/grpc/a2a.ts b/src/grpc/a2a.ts index c2c32834..26711be5 100644 --- a/src/grpc/a2a.ts +++ b/src/grpc/a2a.ts @@ -1,14 +1,14 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: -// protoc-gen-ts_proto v2.8.3 -// protoc v3.21.12 +// protoc-gen-ts_proto v2.6.1 +// protoc unknown // source: a2a.proto /* eslint-disable */ import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; import { type CallOptions, - type ChannelCredentials, + ChannelCredentials, Client, type ClientOptions, type ClientReadableStream, @@ -16,7 +16,7 @@ import { type handleServerStreamingCall, type handleUnaryCall, makeGenericClientConstructor, - type Metadata, + Metadata, type ServiceError, type UntypedServiceImplementation, } from "@grpc/grpc-js"; @@ -918,7 +918,7 @@ export const SendMessageConfiguration: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): SendMessageConfiguration { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSendMessageConfiguration(); while (reader.pos < end) { const tag = reader.uint32(); @@ -1038,7 +1038,7 @@ export const Task: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): Task { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseTask(); while (reader.pos < end) { const tag = reader.uint32(); @@ -1173,7 +1173,7 @@ export const TaskStatus: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): TaskStatus { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseTaskStatus(); while (reader.pos < end) { const tag = reader.uint32(); @@ -1269,7 +1269,7 @@ export const Part: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): Part { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBasePart(); while (reader.pos < end) { const tag = reader.uint32(); @@ -1382,7 +1382,7 @@ export const FilePart: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): FilePart { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseFilePart(); while (reader.pos < end) { const tag = reader.uint32(); @@ -1482,7 +1482,7 @@ export const DataPart: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): DataPart { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseDataPart(); while (reader.pos < end) { const tag = reader.uint32(); @@ -1558,7 +1558,7 @@ export const Message: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): Message { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseMessage(); while (reader.pos < end) { const tag = reader.uint32(); @@ -1713,7 +1713,7 @@ export const Artifact: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): Artifact { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseArtifact(); while (reader.pos < end) { const tag = reader.uint32(); @@ -1852,7 +1852,7 @@ export const TaskStatusUpdateEvent: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): TaskStatusUpdateEvent { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseTaskStatusUpdateEvent(); while (reader.pos < end) { const tag = reader.uint32(); @@ -1981,7 +1981,7 @@ export const TaskArtifactUpdateEvent: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): TaskArtifactUpdateEvent { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseTaskArtifactUpdateEvent(); while (reader.pos < end) { const tag = reader.uint32(); @@ -2117,7 +2117,7 @@ export const PushNotificationConfig: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): PushNotificationConfig { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBasePushNotificationConfig(); while (reader.pos < end) { const tag = reader.uint32(); @@ -2221,7 +2221,7 @@ export const AuthenticationInfo: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): AuthenticationInfo { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseAuthenticationInfo(); while (reader.pos < end) { const tag = reader.uint32(); @@ -2297,7 +2297,7 @@ export const AgentInterface: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): AgentInterface { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseAgentInterface(); while (reader.pos < end) { const tag = reader.uint32(); @@ -2436,7 +2436,7 @@ export const AgentCard: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): AgentCard { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseAgentCard(); while (reader.pos < end) { const tag = reader.uint32(); @@ -2743,7 +2743,7 @@ export const AgentCard_SecuritySchemesEntry: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): AgentProvider { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseAgentProvider(); while (reader.pos < end) { const tag = reader.uint32(); @@ -2902,7 +2902,7 @@ export const AgentCapabilities: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): AgentCapabilities { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseAgentCapabilities(); while (reader.pos < end) { const tag = reader.uint32(); @@ -2999,7 +2999,7 @@ export const AgentExtension: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): AgentExtension { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseAgentExtension(); while (reader.pos < end) { const tag = reader.uint32(); @@ -3119,7 +3119,7 @@ export const AgentSkill: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): AgentSkill { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseAgentSkill(); while (reader.pos < end) { const tag = reader.uint32(); @@ -3280,7 +3280,7 @@ export const AgentCardSignature: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): AgentCardSignature { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseAgentCardSignature(); while (reader.pos < end) { const tag = reader.uint32(); @@ -3369,7 +3369,7 @@ export const TaskPushNotificationConfig: MessageFns decode(input: BinaryReader | Uint8Array, length?: number): TaskPushNotificationConfig { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseTaskPushNotificationConfig(); while (reader.pos < end) { const tag = reader.uint32(); @@ -3447,7 +3447,7 @@ export const StringList: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): StringList { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseStringList(); while (reader.pos < end) { const tag = reader.uint32(); @@ -3505,7 +3505,7 @@ export const Security: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): Security { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSecurity(); while (reader.pos < end) { const tag = reader.uint32(); @@ -3590,7 +3590,7 @@ export const Security_SchemesEntry: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): Security_SchemesEntry { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSecurity_SchemesEntry(); while (reader.pos < end) { const tag = reader.uint32(); @@ -3679,7 +3679,7 @@ export const SecurityScheme: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): SecurityScheme { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSecurityScheme(); while (reader.pos < end) { const tag = reader.uint32(); @@ -3859,7 +3859,7 @@ export const APIKeySecurityScheme: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): APIKeySecurityScheme { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseAPIKeySecurityScheme(); while (reader.pos < end) { const tag = reader.uint32(); @@ -3951,7 +3951,7 @@ export const HTTPAuthSecurityScheme: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): HTTPAuthSecurityScheme { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseHTTPAuthSecurityScheme(); while (reader.pos < end) { const tag = reader.uint32(); @@ -4043,7 +4043,7 @@ export const OAuth2SecurityScheme: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): OAuth2SecurityScheme { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseOAuth2SecurityScheme(); while (reader.pos < end) { const tag = reader.uint32(); @@ -4134,7 +4134,7 @@ export const OpenIdConnectSecurityScheme: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): MutualTlsSecurityScheme { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseMutualTlsSecurityScheme(); while (reader.pos < end) { const tag = reader.uint32(); @@ -4276,7 +4276,7 @@ export const OAuthFlows: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): OAuthFlows { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseOAuthFlows(); while (reader.pos < end) { const tag = reader.uint32(); @@ -4420,7 +4420,7 @@ export const AuthorizationCodeOAuthFlow: MessageFns decode(input: BinaryReader | Uint8Array, length?: number): AuthorizationCodeOAuthFlow { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseAuthorizationCodeOAuthFlow(); while (reader.pos < end) { const tag = reader.uint32(); @@ -4541,7 +4541,7 @@ export const AuthorizationCodeOAuthFlow_ScopesEntry: MessageFns decode(input: BinaryReader | Uint8Array, length?: number): ClientCredentialsOAuthFlow { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseClientCredentialsOAuthFlow(); while (reader.pos < end) { const tag = reader.uint32(); @@ -4732,7 +4732,7 @@ export const ClientCredentialsOAuthFlow_ScopesEntry: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): ImplicitOAuthFlow { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseImplicitOAuthFlow(); while (reader.pos < end) { const tag = reader.uint32(); @@ -4923,7 +4923,7 @@ export const ImplicitOAuthFlow_ScopesEntry: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): PasswordOAuthFlow { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBasePasswordOAuthFlow(); while (reader.pos < end) { const tag = reader.uint32(); @@ -5112,7 +5112,7 @@ export const PasswordOAuthFlow_ScopesEntry: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): SendMessageRequest { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSendMessageRequest(); while (reader.pos < end) { const tag = reader.uint32(); @@ -5286,7 +5286,7 @@ export const GetTaskRequest: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): GetTaskRequest { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseGetTaskRequest(); while (reader.pos < end) { const tag = reader.uint32(); @@ -5359,7 +5359,7 @@ export const CancelTaskRequest: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): CancelTaskRequest { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCancelTaskRequest(); while (reader.pos < end) { const tag = reader.uint32(); @@ -5417,7 +5417,7 @@ export const GetTaskPushNotificationConfigRequest: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): TaskSubscriptionRequest { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseTaskSubscriptionRequest(); while (reader.pos < end) { const tag = reader.uint32(); @@ -5703,7 +5703,7 @@ export const ListTaskPushNotificationConfigRequest: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): GetAgentCardRequest { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseGetAgentCardRequest(); while (reader.pos < end) { const tag = reader.uint32(); @@ -5841,7 +5841,7 @@ export const SendMessageResponse: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): SendMessageResponse { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSendMessageResponse(); while (reader.pos < end) { const tag = reader.uint32(); @@ -5939,7 +5939,7 @@ export const StreamResponse: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): StreamResponse { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseStreamResponse(); while (reader.pos < end) { const tag = reader.uint32(); @@ -6068,7 +6068,7 @@ export const ListTaskPushNotificationConfigResponse: MessageFns Buffer.from(SendMessageRequest.encode(value).finish()), - requestDeserialize: (value: Buffer): SendMessageRequest => SendMessageRequest.decode(value), - responseSerialize: (value: SendMessageResponse): Buffer => Buffer.from(SendMessageResponse.encode(value).finish()), - responseDeserialize: (value: Buffer): SendMessageResponse => SendMessageResponse.decode(value), + requestSerialize: (value: SendMessageRequest) => Buffer.from(SendMessageRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => SendMessageRequest.decode(value), + responseSerialize: (value: SendMessageResponse) => Buffer.from(SendMessageResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => SendMessageResponse.decode(value), }, /** * SendStreamingMessage is a streaming call that will return a stream of @@ -6171,20 +6171,20 @@ export const A2AServiceService = { path: "/a2a.v1.A2AService/SendStreamingMessage", requestStream: false, responseStream: true, - requestSerialize: (value: SendMessageRequest): Buffer => Buffer.from(SendMessageRequest.encode(value).finish()), - requestDeserialize: (value: Buffer): SendMessageRequest => SendMessageRequest.decode(value), - responseSerialize: (value: StreamResponse): Buffer => Buffer.from(StreamResponse.encode(value).finish()), - responseDeserialize: (value: Buffer): StreamResponse => StreamResponse.decode(value), + requestSerialize: (value: SendMessageRequest) => Buffer.from(SendMessageRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => SendMessageRequest.decode(value), + responseSerialize: (value: StreamResponse) => Buffer.from(StreamResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => StreamResponse.decode(value), }, /** Get the current state of a task from the agent. */ getTask: { path: "/a2a.v1.A2AService/GetTask", requestStream: false, responseStream: false, - requestSerialize: (value: GetTaskRequest): Buffer => Buffer.from(GetTaskRequest.encode(value).finish()), - requestDeserialize: (value: Buffer): GetTaskRequest => GetTaskRequest.decode(value), - responseSerialize: (value: Task): Buffer => Buffer.from(Task.encode(value).finish()), - responseDeserialize: (value: Buffer): Task => Task.decode(value), + requestSerialize: (value: GetTaskRequest) => Buffer.from(GetTaskRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => GetTaskRequest.decode(value), + responseSerialize: (value: Task) => Buffer.from(Task.encode(value).finish()), + responseDeserialize: (value: Buffer) => Task.decode(value), }, /** * Cancel a task from the agent. If supported one should expect no @@ -6194,10 +6194,10 @@ export const A2AServiceService = { path: "/a2a.v1.A2AService/CancelTask", requestStream: false, responseStream: false, - requestSerialize: (value: CancelTaskRequest): Buffer => Buffer.from(CancelTaskRequest.encode(value).finish()), - requestDeserialize: (value: Buffer): CancelTaskRequest => CancelTaskRequest.decode(value), - responseSerialize: (value: Task): Buffer => Buffer.from(Task.encode(value).finish()), - responseDeserialize: (value: Buffer): Task => Task.decode(value), + requestSerialize: (value: CancelTaskRequest) => Buffer.from(CancelTaskRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => CancelTaskRequest.decode(value), + responseSerialize: (value: Task) => Buffer.from(Task.encode(value).finish()), + responseDeserialize: (value: Buffer) => Task.decode(value), }, /** * TaskSubscription is a streaming call that will return a stream of task @@ -6209,73 +6209,67 @@ export const A2AServiceService = { path: "/a2a.v1.A2AService/TaskSubscription", requestStream: false, responseStream: true, - requestSerialize: (value: TaskSubscriptionRequest): Buffer => - Buffer.from(TaskSubscriptionRequest.encode(value).finish()), - requestDeserialize: (value: Buffer): TaskSubscriptionRequest => TaskSubscriptionRequest.decode(value), - responseSerialize: (value: StreamResponse): Buffer => Buffer.from(StreamResponse.encode(value).finish()), - responseDeserialize: (value: Buffer): StreamResponse => StreamResponse.decode(value), + requestSerialize: (value: TaskSubscriptionRequest) => Buffer.from(TaskSubscriptionRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => TaskSubscriptionRequest.decode(value), + responseSerialize: (value: StreamResponse) => Buffer.from(StreamResponse.encode(value).finish()), + responseDeserialize: (value: Buffer) => StreamResponse.decode(value), }, /** Set a push notification config for a task. */ createTaskPushNotificationConfig: { path: "/a2a.v1.A2AService/CreateTaskPushNotificationConfig", requestStream: false, responseStream: false, - requestSerialize: (value: CreateTaskPushNotificationConfigRequest): Buffer => + requestSerialize: (value: CreateTaskPushNotificationConfigRequest) => Buffer.from(CreateTaskPushNotificationConfigRequest.encode(value).finish()), - requestDeserialize: (value: Buffer): CreateTaskPushNotificationConfigRequest => - CreateTaskPushNotificationConfigRequest.decode(value), - responseSerialize: (value: TaskPushNotificationConfig): Buffer => + requestDeserialize: (value: Buffer) => CreateTaskPushNotificationConfigRequest.decode(value), + responseSerialize: (value: TaskPushNotificationConfig) => Buffer.from(TaskPushNotificationConfig.encode(value).finish()), - responseDeserialize: (value: Buffer): TaskPushNotificationConfig => TaskPushNotificationConfig.decode(value), + responseDeserialize: (value: Buffer) => TaskPushNotificationConfig.decode(value), }, /** Get a push notification config for a task. */ getTaskPushNotificationConfig: { path: "/a2a.v1.A2AService/GetTaskPushNotificationConfig", requestStream: false, responseStream: false, - requestSerialize: (value: GetTaskPushNotificationConfigRequest): Buffer => + requestSerialize: (value: GetTaskPushNotificationConfigRequest) => Buffer.from(GetTaskPushNotificationConfigRequest.encode(value).finish()), - requestDeserialize: (value: Buffer): GetTaskPushNotificationConfigRequest => - GetTaskPushNotificationConfigRequest.decode(value), - responseSerialize: (value: TaskPushNotificationConfig): Buffer => + requestDeserialize: (value: Buffer) => GetTaskPushNotificationConfigRequest.decode(value), + responseSerialize: (value: TaskPushNotificationConfig) => Buffer.from(TaskPushNotificationConfig.encode(value).finish()), - responseDeserialize: (value: Buffer): TaskPushNotificationConfig => TaskPushNotificationConfig.decode(value), + responseDeserialize: (value: Buffer) => TaskPushNotificationConfig.decode(value), }, /** Get a list of push notifications configured for a task. */ listTaskPushNotificationConfig: { path: "/a2a.v1.A2AService/ListTaskPushNotificationConfig", requestStream: false, responseStream: false, - requestSerialize: (value: ListTaskPushNotificationConfigRequest): Buffer => + requestSerialize: (value: ListTaskPushNotificationConfigRequest) => Buffer.from(ListTaskPushNotificationConfigRequest.encode(value).finish()), - requestDeserialize: (value: Buffer): ListTaskPushNotificationConfigRequest => - ListTaskPushNotificationConfigRequest.decode(value), - responseSerialize: (value: ListTaskPushNotificationConfigResponse): Buffer => + requestDeserialize: (value: Buffer) => ListTaskPushNotificationConfigRequest.decode(value), + responseSerialize: (value: ListTaskPushNotificationConfigResponse) => Buffer.from(ListTaskPushNotificationConfigResponse.encode(value).finish()), - responseDeserialize: (value: Buffer): ListTaskPushNotificationConfigResponse => - ListTaskPushNotificationConfigResponse.decode(value), + responseDeserialize: (value: Buffer) => ListTaskPushNotificationConfigResponse.decode(value), }, /** GetAgentCard returns the agent card for the agent. */ getAgentCard: { path: "/a2a.v1.A2AService/GetAgentCard", requestStream: false, responseStream: false, - requestSerialize: (value: GetAgentCardRequest): Buffer => Buffer.from(GetAgentCardRequest.encode(value).finish()), - requestDeserialize: (value: Buffer): GetAgentCardRequest => GetAgentCardRequest.decode(value), - responseSerialize: (value: AgentCard): Buffer => Buffer.from(AgentCard.encode(value).finish()), - responseDeserialize: (value: Buffer): AgentCard => AgentCard.decode(value), + requestSerialize: (value: GetAgentCardRequest) => Buffer.from(GetAgentCardRequest.encode(value).finish()), + requestDeserialize: (value: Buffer) => GetAgentCardRequest.decode(value), + responseSerialize: (value: AgentCard) => Buffer.from(AgentCard.encode(value).finish()), + responseDeserialize: (value: Buffer) => AgentCard.decode(value), }, /** Delete a push notification config for a task. */ deleteTaskPushNotificationConfig: { path: "/a2a.v1.A2AService/DeleteTaskPushNotificationConfig", requestStream: false, responseStream: false, - requestSerialize: (value: DeleteTaskPushNotificationConfigRequest): Buffer => + requestSerialize: (value: DeleteTaskPushNotificationConfigRequest) => Buffer.from(DeleteTaskPushNotificationConfigRequest.encode(value).finish()), - requestDeserialize: (value: Buffer): DeleteTaskPushNotificationConfigRequest => - DeleteTaskPushNotificationConfigRequest.decode(value), - responseSerialize: (value: Empty): Buffer => Buffer.from(Empty.encode(value).finish()), - responseDeserialize: (value: Buffer): Empty => Empty.decode(value), + requestDeserialize: (value: Buffer) => DeleteTaskPushNotificationConfigRequest.decode(value), + responseSerialize: (value: Empty) => Buffer.from(Empty.encode(value).finish()), + responseDeserialize: (value: Buffer) => Empty.decode(value), }, } as const; diff --git a/src/grpc/buf.gen.yaml b/src/grpc/buf.gen.yaml new file mode 100644 index 00000000..b243ed24 --- /dev/null +++ b/src/grpc/buf.gen.yaml @@ -0,0 +1,10 @@ +# buf generate +# Configuration for the buf generate command +# Uses remote plugins, no separate install required. +version: v2 +inputs: + - directory: . +plugins: + - remote: buf.build/community/stephenh-ts-proto:v2.6.1 + opt: oneof=unions-value,importSuffix=.js,outputServices=grpc-js,env=node,esModuleInterop=true + out: . \ No newline at end of file diff --git a/src/grpc/buf.lock b/src/grpc/buf.lock new file mode 100644 index 00000000..5df8acde --- /dev/null +++ b/src/grpc/buf.lock @@ -0,0 +1,6 @@ +# Generated by buf. DO NOT EDIT. +version: v2 +deps: + - name: buf.build/googleapis/googleapis + commit: 004180b77378443887d3b55cabc00384 + digest: b5:e8f475fe3330f31f5fd86ac689093bcd274e19611a09db91f41d637cb9197881ce89882b94d13a58738e53c91c6e4bae7dc1feba85f590164c975a89e25115dc diff --git a/src/grpc/buf.yaml b/src/grpc/buf.yaml new file mode 100644 index 00000000..9afd6c23 --- /dev/null +++ b/src/grpc/buf.yaml @@ -0,0 +1,6 @@ +version: v2 +modules: + - path: . +deps: + # Common Protobuf types. + - buf.build/googleapis/googleapis \ No newline at end of file diff --git a/src/grpc/google/api/annotations.ts b/src/grpc/google/api/annotations.ts index 6356dbb5..60211996 100644 --- a/src/grpc/google/api/annotations.ts +++ b/src/grpc/google/api/annotations.ts @@ -1,7 +1,7 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: -// protoc-gen-ts_proto v2.8.3 -// protoc v3.21.12 +// protoc-gen-ts_proto v2.6.1 +// protoc unknown // source: google/api/annotations.proto /* eslint-disable */ diff --git a/src/grpc/google/api/client.ts b/src/grpc/google/api/client.ts index 768a498b..7e686fe8 100644 --- a/src/grpc/google/api/client.ts +++ b/src/grpc/google/api/client.ts @@ -1,7 +1,7 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: -// protoc-gen-ts_proto v2.8.3 -// protoc v3.21.12 +// protoc-gen-ts_proto v2.6.1 +// protoc unknown // source: google/api/client.proto /* eslint-disable */ @@ -571,7 +571,7 @@ export const CommonLanguageSettings: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): CommonLanguageSettings { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCommonLanguageSettings(); while (reader.pos < end) { const tag = reader.uint32(); @@ -716,7 +716,7 @@ export const ClientLibrarySettings: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): ClientLibrarySettings { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseClientLibrarySettings(); while (reader.pos < end) { const tag = reader.uint32(); @@ -964,7 +964,7 @@ export const Publishing: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): Publishing { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBasePublishing(); while (reader.pos < end) { const tag = reader.uint32(); @@ -1170,7 +1170,7 @@ export const JavaSettings: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): JavaSettings { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseJavaSettings(); while (reader.pos < end) { const tag = reader.uint32(); @@ -1283,7 +1283,7 @@ export const JavaSettings_ServiceClassNamesEntry: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): CppSettings { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCppSettings(); while (reader.pos < end) { const tag = reader.uint32(); @@ -1420,7 +1420,7 @@ export const PhpSettings: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): PhpSettings { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBasePhpSettings(); while (reader.pos < end) { const tag = reader.uint32(); @@ -1483,7 +1483,7 @@ export const PythonSettings: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): PythonSettings { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBasePythonSettings(); while (reader.pos < end) { const tag = reader.uint32(); @@ -1568,7 +1568,7 @@ export const PythonSettings_ExperimentalFeatures: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): NodeSettings { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseNodeSettings(); while (reader.pos < end) { const tag = reader.uint32(); @@ -1744,7 +1744,7 @@ export const DotnetSettings: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): DotnetSettings { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseDotnetSettings(); while (reader.pos < end) { const tag = reader.uint32(); @@ -1924,7 +1924,7 @@ export const DotnetSettings_RenamedServicesEntry: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): RubySettings { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseRubySettings(); while (reader.pos < end) { const tag = reader.uint32(); @@ -2144,7 +2144,7 @@ export const GoSettings: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): GoSettings { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseGoSettings(); while (reader.pos < end) { const tag = reader.uint32(); @@ -2244,7 +2244,7 @@ export const GoSettings_RenamedServicesEntry: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): MethodSettings { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseMethodSettings(); while (reader.pos < end) { const tag = reader.uint32(); @@ -2424,7 +2424,7 @@ export const MethodSettings_LongRunning: MessageFns decode(input: BinaryReader | Uint8Array, length?: number): MethodSettings_LongRunning { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseMethodSettings_LongRunning(); while (reader.pos < end) { const tag = reader.uint32(); @@ -2532,7 +2532,7 @@ export const SelectiveGapicGeneration: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): SelectiveGapicGeneration { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSelectiveGapicGeneration(); while (reader.pos < end) { const tag = reader.uint32(); diff --git a/src/grpc/google/api/field_behavior.ts b/src/grpc/google/api/field_behavior.ts index a3af577a..46bc7f4a 100644 --- a/src/grpc/google/api/field_behavior.ts +++ b/src/grpc/google/api/field_behavior.ts @@ -1,7 +1,7 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: -// protoc-gen-ts_proto v2.8.3 -// protoc v3.21.12 +// protoc-gen-ts_proto v2.6.1 +// protoc unknown // source: google/api/field_behavior.proto /* eslint-disable */ diff --git a/src/grpc/google/api/http.ts b/src/grpc/google/api/http.ts index e75de9df..cd967746 100644 --- a/src/grpc/google/api/http.ts +++ b/src/grpc/google/api/http.ts @@ -1,7 +1,7 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: -// protoc-gen-ts_proto v2.8.3 -// protoc v3.21.12 +// protoc-gen-ts_proto v2.6.1 +// protoc unknown // source: google/api/http.proto /* eslint-disable */ @@ -389,7 +389,7 @@ export const Http: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): Http { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseHttp(); while (reader.pos < end) { const tag = reader.uint32(); @@ -493,7 +493,7 @@ export const HttpRule: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): HttpRule { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseHttpRule(); while (reader.pos < end) { const tag = reader.uint32(); @@ -709,7 +709,7 @@ export const CustomHttpPattern: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): CustomHttpPattern { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseCustomHttpPattern(); while (reader.pos < end) { const tag = reader.uint32(); diff --git a/src/grpc/google/api/launch_stage.ts b/src/grpc/google/api/launch_stage.ts index 716da8b0..fd362264 100644 --- a/src/grpc/google/api/launch_stage.ts +++ b/src/grpc/google/api/launch_stage.ts @@ -1,7 +1,7 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: -// protoc-gen-ts_proto v2.8.3 -// protoc v3.21.12 +// protoc-gen-ts_proto v2.6.1 +// protoc unknown // source: google/api/launch_stage.proto /* eslint-disable */ diff --git a/src/grpc/google/protobuf/descriptor.ts b/src/grpc/google/protobuf/descriptor.ts index 6406b005..41fa849f 100644 --- a/src/grpc/google/protobuf/descriptor.ts +++ b/src/grpc/google/protobuf/descriptor.ts @@ -1,7 +1,7 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: -// protoc-gen-ts_proto v2.8.3 -// protoc v3.21.12 +// protoc-gen-ts_proto v2.6.1 +// protoc unknown // source: google/protobuf/descriptor.proto /* eslint-disable */ @@ -1130,12 +1130,7 @@ export interface FieldOptions { deprecated?: | boolean | undefined; - /** - * DEPRECATED. DO NOT USE! - * For Google-internal migration only. Do not use. - * - * @deprecated - */ + /** For Google-internal migration only. Do not use. */ weak?: | boolean | undefined; @@ -2281,7 +2276,7 @@ export const FileDescriptorSet: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): FileDescriptorSet { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseFileDescriptorSet(); while (reader.pos < end) { const tag = reader.uint32(); @@ -2357,12 +2352,16 @@ export const FileDescriptorProto: MessageFns = { for (const v of message.dependency) { writer.uint32(26).string(v!); } + writer.uint32(82).fork(); for (const v of message.publicDependency) { - writer.uint32(80).int32(v!); + writer.int32(v); } + writer.join(); + writer.uint32(90).fork(); for (const v of message.weakDependency) { - writer.uint32(88).int32(v!); + writer.int32(v); } + writer.join(); for (const v of message.optionDependency) { writer.uint32(122).string(v!); } @@ -2395,7 +2394,7 @@ export const FileDescriptorProto: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): FileDescriptorProto { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseFileDescriptorProto(); while (reader.pos < end) { const tag = reader.uint32(); @@ -2706,7 +2705,7 @@ export const DescriptorProto: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): DescriptorProto { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseDescriptorProto(); while (reader.pos < end) { const tag = reader.uint32(); @@ -2920,7 +2919,7 @@ export const DescriptorProto_ExtensionRange: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): ExtensionRangeOptions { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseExtensionRangeOptions(); while (reader.pos < end) { const tag = reader.uint32(); @@ -3216,7 +3215,7 @@ export const ExtensionRangeOptions_Declaration: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): FieldDescriptorProto { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseFieldDescriptorProto(); while (reader.pos < end) { const tag = reader.uint32(); @@ -3569,7 +3568,7 @@ export const OneofDescriptorProto: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): OneofDescriptorProto { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseOneofDescriptorProto(); while (reader.pos < end) { const tag = reader.uint32(); @@ -3659,7 +3658,7 @@ export const EnumDescriptorProto: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): EnumDescriptorProto { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseEnumDescriptorProto(); while (reader.pos < end) { const tag = reader.uint32(); @@ -3796,7 +3795,7 @@ export const EnumDescriptorProto_EnumReservedRange: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): EnumValueDescriptorProto { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseEnumValueDescriptorProto(); while (reader.pos < end) { const tag = reader.uint32(); @@ -3973,7 +3972,7 @@ export const ServiceDescriptorProto: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): ServiceDescriptorProto { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseServiceDescriptorProto(); while (reader.pos < end) { const tag = reader.uint32(); @@ -4085,7 +4084,7 @@ export const MethodDescriptorProto: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): MethodDescriptorProto { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseMethodDescriptorProto(); while (reader.pos < end) { const tag = reader.uint32(); @@ -4294,7 +4293,7 @@ export const FileOptions: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): FileOptions { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseFileOptions(); while (reader.pos < end) { const tag = reader.uint32(); @@ -4648,7 +4647,7 @@ export const MessageOptions: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): MessageOptions { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseMessageOptions(); while (reader.pos < end) { const tag = reader.uint32(); @@ -4832,9 +4831,11 @@ export const FieldOptions: MessageFns = { if (message.retention !== undefined && message.retention !== 0) { writer.uint32(136).int32(message.retention); } + writer.uint32(154).fork(); for (const v of message.targets) { - writer.uint32(152).int32(v!); + writer.int32(v); } + writer.join(); for (const v of message.editionDefaults) { FieldOptions_EditionDefault.encode(v!, writer.uint32(162).fork()).join(); } @@ -4852,7 +4853,7 @@ export const FieldOptions: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): FieldOptions { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseFieldOptions(); while (reader.pos < end) { const tag = reader.uint32(); @@ -5106,7 +5107,7 @@ export const FieldOptions_EditionDefault: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): OneofOptions { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseOneofOptions(); while (reader.pos < end) { const tag = reader.uint32(); @@ -5387,7 +5388,7 @@ export const EnumOptions: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): EnumOptions { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseEnumOptions(); while (reader.pos < end) { const tag = reader.uint32(); @@ -5525,7 +5526,7 @@ export const EnumValueOptions: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): EnumValueOptions { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseEnumValueOptions(); while (reader.pos < end) { const tag = reader.uint32(); @@ -5651,7 +5652,7 @@ export const ServiceOptions: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): ServiceOptions { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseServiceOptions(); while (reader.pos < end) { const tag = reader.uint32(); @@ -5750,7 +5751,7 @@ export const MethodOptions: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): MethodOptions { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseMethodOptions(); while (reader.pos < end) { const tag = reader.uint32(); @@ -5881,7 +5882,7 @@ export const UninterpretedOption: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): UninterpretedOption { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseUninterpretedOption(); while (reader.pos < end) { const tag = reader.uint32(); @@ -6024,7 +6025,7 @@ export const UninterpretedOption_NamePart: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): FeatureSet { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseFeatureSet(); while (reader.pos < end) { const tag = reader.uint32(); @@ -6283,7 +6284,7 @@ export const FeatureSet_VisibilityFeature: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): FeatureSetDefaults { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseFeatureSetDefaults(); while (reader.pos < end) { const tag = reader.uint32(); @@ -6432,7 +6433,7 @@ export const FeatureSetDefaults_FeatureSetEditionDefault: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): SourceCodeInfo { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSourceCodeInfo(); while (reader.pos < end) { const tag = reader.uint32(); @@ -6606,7 +6607,7 @@ export const SourceCodeInfo_Location: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): SourceCodeInfo_Location { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseSourceCodeInfo_Location(); while (reader.pos < end) { const tag = reader.uint32(); @@ -6740,7 +6741,7 @@ export const GeneratedCodeInfo: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): GeneratedCodeInfo { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseGeneratedCodeInfo(); while (reader.pos < end) { const tag = reader.uint32(); @@ -6816,7 +6817,7 @@ export const GeneratedCodeInfo_Annotation: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): Duration { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseDuration(); while (reader.pos < end) { const tag = reader.uint32(); diff --git a/src/grpc/google/protobuf/empty.ts b/src/grpc/google/protobuf/empty.ts index d87dde0d..d538ed26 100644 --- a/src/grpc/google/protobuf/empty.ts +++ b/src/grpc/google/protobuf/empty.ts @@ -1,7 +1,7 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: -// protoc-gen-ts_proto v2.8.3 -// protoc v3.21.12 +// protoc-gen-ts_proto v2.6.1 +// protoc unknown // source: google/protobuf/empty.proto /* eslint-disable */ @@ -32,7 +32,7 @@ export const Empty: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): Empty { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseEmpty(); while (reader.pos < end) { const tag = reader.uint32(); diff --git a/src/grpc/google/protobuf/struct.ts b/src/grpc/google/protobuf/struct.ts index 4671bacd..c379c4f8 100644 --- a/src/grpc/google/protobuf/struct.ts +++ b/src/grpc/google/protobuf/struct.ts @@ -1,7 +1,7 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: -// protoc-gen-ts_proto v2.8.3 -// protoc v3.21.12 +// protoc-gen-ts_proto v2.6.1 +// protoc unknown // source: google/protobuf/struct.proto /* eslint-disable */ @@ -121,7 +121,7 @@ export const Struct: MessageFns & StructWrapperFns = { decode(input: BinaryReader | Uint8Array, length?: number): Struct { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseStruct(); while (reader.pos < end) { const tag = reader.uint32(); @@ -227,7 +227,7 @@ export const Struct_FieldsEntry: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): Struct_FieldsEntry { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseStruct_FieldsEntry(); while (reader.pos < end) { const tag = reader.uint32(); @@ -317,7 +317,7 @@ export const Value: MessageFns & AnyValueWrapperFns = { decode(input: BinaryReader | Uint8Array, length?: number): Value { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseValue(); while (reader.pos < end) { const tag = reader.uint32(); @@ -464,7 +464,7 @@ export const Value: MessageFns & AnyValueWrapperFns = { wrap(value: any): Value { const result = createBaseValue(); if (value === null) { - result.kind = { $case: "nullValue", value: NullValue.NULL_VALUE }; + result.kind = { $case: "nullValue", value }; } else if (typeof value === "boolean") { result.kind = { $case: "boolValue", value }; } else if (typeof value === "number") { @@ -482,7 +482,7 @@ export const Value: MessageFns & AnyValueWrapperFns = { }, unwrap(message: Value): string | number | boolean | Object | null | Array | undefined { - return (message.kind?.$case === "nullValue") ? null : message.kind?.value; + return message.kind?.value; }, }; @@ -500,7 +500,7 @@ export const ListValue: MessageFns & ListValueWrapperFns = { decode(input: BinaryReader | Uint8Array, length?: number): ListValue { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseListValue(); while (reader.pos < end) { const tag = reader.uint32(); diff --git a/src/grpc/google/protobuf/timestamp.ts b/src/grpc/google/protobuf/timestamp.ts index 99c0e94d..faf68ee0 100644 --- a/src/grpc/google/protobuf/timestamp.ts +++ b/src/grpc/google/protobuf/timestamp.ts @@ -1,7 +1,7 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: -// protoc-gen-ts_proto v2.8.3 -// protoc v3.21.12 +// protoc-gen-ts_proto v2.6.1 +// protoc unknown // source: google/protobuf/timestamp.proto /* eslint-disable */ @@ -133,7 +133,7 @@ export const Timestamp: MessageFns = { decode(input: BinaryReader | Uint8Array, length?: number): Timestamp { const reader = input instanceof BinaryReader ? input : new BinaryReader(input); - const end = length === undefined ? reader.len : reader.pos + length; + let end = length === undefined ? reader.len : reader.pos + length; const message = createBaseTimestamp(); while (reader.pos < end) { const tag = reader.uint32(); diff --git a/src/server/express/json_rpc_handler.ts b/src/server/express/json_rpc_handler.ts index 15db35fb..b3a9c59a 100644 --- a/src/server/express/json_rpc_handler.ts +++ b/src/server/express/json_rpc_handler.ts @@ -5,11 +5,7 @@ import express, { NextFunction, RequestHandler, } from 'express'; -import { - JSONRPCErrorResponse, - JSONRPCSuccessResponse, - JSONRPCResponse, -} from '../../types.js'; +import { JSONRPCErrorResponse, JSONRPCSuccessResponse, JSONRPCResponse } from '../../types.js'; import { A2AError } from '../error.js'; import { A2ARequestHandler } from '../request_handler/a2a_request_handler.js'; import { JsonRpcTransportHandler } from '../transports/jsonrpc/jsonrpc_transport_handler.js'; diff --git a/tsup.config.ts b/tsup.config.ts index 24030b81..1dff32da 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -5,6 +5,7 @@ export default defineConfig({ 'src/index.ts', 'src/server/index.ts', 'src/server/express/index.ts', + 'src/server/grpc/index.ts', 'src/client/index.ts', ], format: ['esm', 'cjs'], From e47953109bdd18ee0ce5b8179ae247cb21891ef4 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 15:33:23 +0000 Subject: [PATCH 32/64] add package dependency --- package-lock.json | 366 ++++++++++++++++++++++++++++++++++++---------- package.json | 6 +- 2 files changed, 292 insertions(+), 80 deletions(-) diff --git a/package-lock.json b/package-lock.json index 32ebaf2f..10391416 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,8 +13,10 @@ }, "devDependencies": { "@bufbuild/buf": "^1.61.0", + "@bufbuild/protobuf": "^2.10.2", "@cloudflare/vitest-pool-workers": "^0.10.15", "@eslint/js": "^9.39.1", + "@grpc/grpc-js": "^1.11.0", "@types/express": "^5.0.3", "@types/node": "^22.13.14", "@types/supertest": "^6.0.3", @@ -38,13 +40,11 @@ "node": ">=18" }, "peerDependencies": { + "@bufbuild/protobuf": "^2.10.2", "@grpc/grpc-js": "^1.11.0", "express": "^4.21.2 || ^5.1.0" }, "peerDependenciesMeta": { - "@grpc/grpc-js": { - "optional": true - }, "express": { "optional": true } @@ -308,6 +308,13 @@ "node": ">=12" } }, + "node_modules/@bufbuild/protobuf": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.10.2.tgz", + "integrity": "sha512-uFsRXwIGyu+r6AMdz+XijIIZJYpoWeYzILt5yZ2d3mCjQrWUTVpVD9WL/jZAbvp+Ed04rOhrsk7FiTcEDseB5A==", + "dev": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, "node_modules/@cloudflare/kv-asset-handler": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.1.tgz", @@ -1085,6 +1092,39 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@grpc/grpc-js": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", + "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", + "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.3", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -1572,6 +1612,19 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/@isaacs/cliui/node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", @@ -1613,6 +1666,24 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -1662,6 +1733,17 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/@jsdevtools/ono": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", @@ -1796,6 +1878,80 @@ "dev": true, "license": "MIT" }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.53.5", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.53.5.tgz", @@ -3193,6 +3349,21 @@ "node": ">= 10" } }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -3671,6 +3842,16 @@ "@esbuild/win32-x64": "0.27.2" } }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -4489,6 +4670,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -5802,6 +5993,13 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -5809,6 +6007,13 @@ "dev": true, "license": "MIT" }, + "node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/loupe": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", @@ -6719,6 +6924,31 @@ "node": ">=6.0.0" } }, + "node_modules/protobufjs": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", + "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "dev": true, + "hasInstallScript": true, + "license": "BSD-3-Clause", + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -6997,6 +7227,16 @@ "url": "https://github.com/sponsors/mysticatea" } }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -9009,18 +9249,18 @@ "license": "MIT" }, "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -9045,73 +9285,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -9155,6 +9328,16 @@ } } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -9162,6 +9345,25 @@ "dev": true, "license": "ISC" }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", @@ -9172,6 +9374,16 @@ "node": ">=10" } }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index e14cc3ef..67af4c80 100644 --- a/package.json +++ b/package.json @@ -47,8 +47,10 @@ ], "devDependencies": { "@bufbuild/buf": "^1.61.0", + "@bufbuild/protobuf": "^2.10.2", "@cloudflare/vitest-pool-workers": "^0.10.15", "@eslint/js": "^9.39.1", + "@grpc/grpc-js": "^1.11.0", "@types/express": "^5.0.3", "@types/node": "^22.13.14", "@types/supertest": "^6.0.3", @@ -85,13 +87,11 @@ "uuid": "^11.1.0" }, "peerDependencies": { + "@bufbuild/protobuf": "^2.10.2", "@grpc/grpc-js": "^1.11.0", "express": "^4.21.2 || ^5.1.0" }, "peerDependenciesMeta": { - "@grpc/grpc-js": { - "optional": true - }, "express": { "optional": true } From 96c2e00f0e3c45e12a3538f48e5c9c63451271e9 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 17:14:54 +0000 Subject: [PATCH 33/64] updates to proto converters --- src/grpc/utils/from_proto.ts | 12 ++++---- src/grpc/utils/to_proto.ts | 58 ++++++++++++++++++------------------ tck/agent/index.ts | 27 ++++++++++++++--- 3 files changed, 58 insertions(+), 39 deletions(-) diff --git a/src/grpc/utils/from_proto.ts b/src/grpc/utils/from_proto.ts index e78eb831..2c3cc026 100644 --- a/src/grpc/utils/from_proto.ts +++ b/src/grpc/utils/from_proto.ts @@ -61,7 +61,7 @@ export class FromProto { } return { taskId: extractTaskId(request.parent), - pushNotificationConfig: this.pushNotificationConfig(request.config.pushNotificationConfig), + pushNotificationConfig: FromProto.pushNotificationConfig(request.config.pushNotificationConfig), }; } @@ -83,7 +83,7 @@ export class FromProto { return { kind: 'message', messageId: message.messageId, - parts: message.content.map((p) => this.parts(p)), + parts: message.content.map((p) => FromProto.parts(p)), contextId: message.contextId, taskId: message.taskId, role: message.role === Role.ROLE_AGENT ? 'agent' : 'user', @@ -102,7 +102,7 @@ export class FromProto { return { blocking: configuration.blocking, acceptedOutputModes: configuration.acceptedOutputModes, - pushNotificationConfig: this.pushNotificationConfig(configuration.pushNotification), + pushNotificationConfig: FromProto.pushNotificationConfig(configuration.pushNotification), }; } @@ -117,7 +117,7 @@ export class FromProto { id: config.id, url: config.url, token: config.token, - authentication: this.authenticationInfo(config.authentication), + authentication: FromProto.authenticationInfo(config.authentication), }; } @@ -175,8 +175,8 @@ export class FromProto { static messageSendParams(request: SendMessageRequest): types.MessageSendParams { return { - message: this.message(request.request), - configuration: this.configuration(request.configuration), + message: FromProto.message(request.request), + configuration: FromProto.configuration(request.configuration), metadata: request.metadata, }; } diff --git a/src/grpc/utils/to_proto.ts b/src/grpc/utils/to_proto.ts index 8b78deb5..81aac386 100644 --- a/src/grpc/utils/to_proto.ts +++ b/src/grpc/utils/to_proto.ts @@ -38,23 +38,23 @@ export class ToProto { description: agentCard.description, url: agentCard.url, preferredTransport: agentCard.preferredTransport ?? '', - additionalInterfaces: agentCard.additionalInterfaces.map((i) => this.agentInterface(i)), - provider: this.agentProvider(agentCard.provider), + additionalInterfaces: agentCard.additionalInterfaces?.map((i) => ToProto.agentInterface(i)), + provider: ToProto.agentProvider(agentCard.provider), version: agentCard.version, documentationUrl: agentCard.documentationUrl ?? '', - capabilities: this.agentCapabilities(agentCard.capabilities), + capabilities: ToProto.agentCapabilities(agentCard.capabilities), securitySchemes: Object.fromEntries( - Object.entries(agentCard.securitySchemes).map(([key, value]) => [ + Object.entries(agentCard.securitySchemes)?.map(([key, value]) => [ key, - this.securityScheme(value), + ToProto.securityScheme(value), ]) ), - security: agentCard.security.map((s) => this.security(s)), + security: agentCard.security?.map((s) => ToProto.security(s)), defaultInputModes: agentCard.defaultInputModes, defaultOutputModes: agentCard.defaultOutputModes, - skills: agentCard.skills.map((s) => this.agentSkill(s)), + skills: agentCard.skills.map((s) => ToProto.agentSkill(s)), supportsAuthenticatedExtendedCard: agentCard.supportsAuthenticatedExtendedCard ?? false, - signatures: agentCard.signatures.map((s) => this.signatures(s)), + signatures: agentCard.signatures?.map((s) => ToProto.signatures(s)), }; } @@ -75,7 +75,7 @@ export class ToProto { examples: skill.examples ?? [], inputModes: skill.inputModes ?? [], outputModes: skill.outputModes ?? [], - security: skill.security.map((s) => this.security(s)), + security: skill.security?.map((s) => ToProto.security(s)), }; } @@ -128,7 +128,7 @@ export class ToProto { $case: 'oauth2SecurityScheme', value: { description: scheme.description ?? '', - flows: this.oauthFlows(scheme.flows), + flows: ToProto.oauthFlows(scheme.flows), oauth2MetadataUrl: scheme.oauth2MetadataUrl ?? '', }, }, @@ -217,7 +217,7 @@ export class ToProto { return { streaming: capabilities.streaming ?? false, pushNotifications: capabilities.pushNotifications ?? false, - extensions: capabilities.extensions.map((e) => this.extension(e)), + extensions: capabilities.extensions?.map((e) => ToProto.extension(e)), }; } @@ -234,7 +234,7 @@ export class ToProto { config: types.TaskPushNotificationConfig[] ): ListTaskPushNotificationConfigResponse { return { - configs: config.map((c) => this.taskPushNotificationConfig(c)), + configs: config.map((c) => ToProto.taskPushNotificationConfig(c)), nextPageToken: '', }; } @@ -247,7 +247,7 @@ export class ToProto { config.taskId, config.pushNotificationConfig.id || '' ), - pushNotificationConfig: this.pushNotificationConfig(config.pushNotificationConfig), + pushNotificationConfig: ToProto.pushNotificationConfig(config.pushNotificationConfig), }; } @@ -256,7 +256,7 @@ export class ToProto { id: config.id ?? '', url: config.url, token: config.token ?? '', - authentication: this.authenticationInfo(config.authentication), + authentication: ToProto.authenticationInfo(config.authentication), }; } @@ -279,28 +279,28 @@ export class ToProto { return { payload: { $case: 'msg', - value: this.message(event), + value: ToProto.message(event), }, }; } else if (event.kind === 'task') { return { payload: { $case: 'task', - value: this.task(event), + value: ToProto.task(event), }, }; } else if (event.kind === 'status-update') { return { payload: { $case: 'statusUpdate', - value: this.taskStatusUpdate(event), + value: ToProto.taskStatusUpdate(event), }, }; } else if (event.kind === 'artifact-update') { return { payload: { $case: 'artifactUpdate', - value: this.taskArtifactUpdate(event), + value: ToProto.taskArtifactUpdate(event), }, }; } else { @@ -311,7 +311,7 @@ export class ToProto { static taskStatusUpdate(event: types.TaskStatusUpdateEvent): TaskStatusUpdateEvent { return { taskId: event.taskId, - status: this.taskStatus(event.status), + status: ToProto.taskStatus(event.status), contextId: event.contextId, metadata: event.metadata, final: event.final, @@ -321,7 +321,7 @@ export class ToProto { static taskArtifactUpdate(event: types.TaskArtifactUpdateEvent): TaskArtifactUpdateEvent { return { taskId: event.taskId, - artifact: this.artifact(event.artifact), + artifact: ToProto.artifact(event.artifact), contextId: event.contextId, metadata: event.metadata, append: event.append ?? false, @@ -334,14 +334,14 @@ export class ToProto { return { payload: { $case: 'msg', - value: this.message(params), + value: ToProto.message(params), }, }; } else if (params.kind === 'task') { return { payload: { $case: 'task', - value: this.task(params), + value: ToProto.task(params), }, }; } @@ -354,7 +354,7 @@ export class ToProto { return { messageId: message.messageId, - content: message.parts.map((p) => this.parts(p)), + content: message.parts.map((p) => ToProto.parts(p)), contextId: message.contextId ?? '', taskId: message.taskId ?? '', role: message.role === 'agent' ? Role.ROLE_AGENT : Role.ROLE_USER, @@ -367,17 +367,17 @@ export class ToProto { return { id: task.id, contextId: task.contextId, - status: this.taskStatus(task.status), - artifacts: task.artifacts.map((a) => this.artifact(a)), - history: task.history.map((m) => this.message(m)), + status: ToProto.taskStatus(task.status), + artifacts: task.artifacts?.map((a) => ToProto.artifact(a)), + history: task.history?.map((m) => ToProto.message(m)), metadata: task.metadata, }; } static taskStatus(status: types.TaskStatus): TaskStatus { return { - state: this.taskState(status.state), - update: this.message(status.message), + state: ToProto.taskState(status.state), + update: ToProto.message(status.message), timestamp: status.timestamp ? new Date(status.timestamp) : undefined, }; } @@ -387,7 +387,7 @@ export class ToProto { artifactId: artifact.artifactId, name: artifact.name ?? '', description: artifact.description ?? '', - parts: artifact.parts.map((p) => this.parts(p)), + parts: artifact.parts.map((p) => ToProto.parts(p)), metadata: artifact.metadata, extensions: artifact.extensions ? artifact.extensions : [], }; diff --git a/tck/agent/index.ts b/tck/agent/index.ts index ba47971d..159a63bd 100644 --- a/tck/agent/index.ts +++ b/tck/agent/index.ts @@ -1,4 +1,10 @@ import express from 'express'; +import { + Server, + ServerCredentials, + ServerUnaryCall, + sendUnaryData, +} from "@grpc/grpc-js"; import { v4 as uuidv4 } from 'uuid'; // For generating unique IDs import { AgentCard, Task, TaskStatusUpdateEvent, Message } from '../../src/index.js'; @@ -16,6 +22,9 @@ import { restHandler, UserBuilder, } from '../../src/server/express/index.js'; +import { serverErrorToStatus } from '@grpc/grpc-js/build/src/server-call.js'; +import { grpcHandler } from '../../src/server/grpc/grpc_handler.js'; +import { A2AServiceService } from '../../src/grpc/a2a.js'; /** * SUTAgentExecutor implements the agent's core logic. @@ -183,6 +192,7 @@ const SUTAgentCard: AgentCard = { additionalInterfaces: [ { url: 'http://localhost:41241/a2a/jsonrpc', transport: 'JSONRPC' }, { url: 'http://localhost:41241/a2a/rest', transport: 'HTTP+JSON' }, + { url: 'http://localhost:41242', transport: 'GRPC' }, ], }; @@ -218,15 +228,24 @@ async function main() { ); // 5. Start the server - const PORT = process.env.PORT || 41241; - expressApp.listen(PORT, (err) => { + const HTTP_PORT = process.env.HTTP_PORT || 41241; + expressApp.listen(HTTP_PORT, (err) => { if (err) { throw err; } - console.log(`[SUTAgent] Server using new framework started on http://localhost:${PORT}`); - console.log(`[SUTAgent] Agent Card: http://localhost:${PORT}/.well-known/agent-card.json`); + console.log(`[SUTAgent] HTTP server started on http://localhost:${HTTP_PORT}`); + console.log(`[SUTAgent] Agent Card: http://localhost:${HTTP_PORT}/.well-known/agent-card.json`); console.log('[SUTAgent] Press Ctrl+C to stop the server'); }); + + // 6. Start the gRPC server on a different port + const GRPC_PORT = process.env.GRPC_PORT || 41242; + const grpcHandlerInstance = grpcHandler({ requestHandler, userBuilder: UserBuilder.noAuthentication }); + const server = new Server(); + server.addService(A2AServiceService, grpcHandlerInstance ); + server.bindAsync(`localhost:${GRPC_PORT}`, ServerCredentials.createInsecure(), () => { + console.log(`[SUTAgent] gRPC server running at http://localhost:${GRPC_PORT}`); +}); } main().catch(console.error); From af5f5364157956e70397c151a5c6c7d986046073 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 17:29:59 +0000 Subject: [PATCH 34/64] wip tck --- src/grpc/utils/to_proto.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/grpc/utils/to_proto.ts b/src/grpc/utils/to_proto.ts index 81aac386..b872253e 100644 --- a/src/grpc/utils/to_proto.ts +++ b/src/grpc/utils/to_proto.ts @@ -38,23 +38,23 @@ export class ToProto { description: agentCard.description, url: agentCard.url, preferredTransport: agentCard.preferredTransport ?? '', - additionalInterfaces: agentCard.additionalInterfaces?.map((i) => ToProto.agentInterface(i)), + additionalInterfaces: agentCard.additionalInterfaces ? agentCard.additionalInterfaces.map((i) => ToProto.agentInterface(i)) : [], provider: ToProto.agentProvider(agentCard.provider), version: agentCard.version, documentationUrl: agentCard.documentationUrl ?? '', capabilities: ToProto.agentCapabilities(agentCard.capabilities), - securitySchemes: Object.fromEntries( - Object.entries(agentCard.securitySchemes)?.map(([key, value]) => [ + securitySchemes: agentCard.securitySchemes ? Object.fromEntries( + Object.entries(agentCard.securitySchemes).map(([key, value]) => [ key, ToProto.securityScheme(value), ]) - ), - security: agentCard.security?.map((s) => ToProto.security(s)), + ) : {}, + security: agentCard.security ? agentCard.security.map((s) => ToProto.security(s)) : [], defaultInputModes: agentCard.defaultInputModes, defaultOutputModes: agentCard.defaultOutputModes, skills: agentCard.skills.map((s) => ToProto.agentSkill(s)), supportsAuthenticatedExtendedCard: agentCard.supportsAuthenticatedExtendedCard ?? false, - signatures: agentCard.signatures?.map((s) => ToProto.signatures(s)), + signatures: agentCard.signatures ? agentCard.signatures.map((s) => ToProto.signatures(s)) : [], }; } @@ -75,7 +75,7 @@ export class ToProto { examples: skill.examples ?? [], inputModes: skill.inputModes ?? [], outputModes: skill.outputModes ?? [], - security: skill.security?.map((s) => ToProto.security(s)), + security: skill.security ? skill.security.map((s) => ToProto.security(s)) : [], }; } @@ -217,7 +217,7 @@ export class ToProto { return { streaming: capabilities.streaming ?? false, pushNotifications: capabilities.pushNotifications ?? false, - extensions: capabilities.extensions?.map((e) => ToProto.extension(e)), + extensions: capabilities.extensions ? capabilities.extensions.map((e) => ToProto.extension(e)) : [], }; } @@ -368,8 +368,8 @@ export class ToProto { id: task.id, contextId: task.contextId, status: ToProto.taskStatus(task.status), - artifacts: task.artifacts?.map((a) => ToProto.artifact(a)), - history: task.history?.map((m) => ToProto.message(m)), + artifacts: task.artifacts ? task.artifacts.map((a) => ToProto.artifact(a)) : [], + history: task.history ? task.history.map((m) => ToProto.message(m)) : [], metadata: task.metadata, }; } From 12cc82533bbd4782ea2670dde3412205ef21a476 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 18:03:22 +0000 Subject: [PATCH 35/64] fix linter --- src/grpc/utils/from_proto.ts | 4 +++- src/grpc/utils/to_proto.ts | 26 +++++++++++++++++--------- tck/agent/index.ts | 19 ++++++++----------- 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/grpc/utils/from_proto.ts b/src/grpc/utils/from_proto.ts index 2c3cc026..33ceb536 100644 --- a/src/grpc/utils/from_proto.ts +++ b/src/grpc/utils/from_proto.ts @@ -61,7 +61,9 @@ export class FromProto { } return { taskId: extractTaskId(request.parent), - pushNotificationConfig: FromProto.pushNotificationConfig(request.config.pushNotificationConfig), + pushNotificationConfig: FromProto.pushNotificationConfig( + request.config.pushNotificationConfig + ), }; } diff --git a/src/grpc/utils/to_proto.ts b/src/grpc/utils/to_proto.ts index b872253e..1b558236 100644 --- a/src/grpc/utils/to_proto.ts +++ b/src/grpc/utils/to_proto.ts @@ -38,23 +38,29 @@ export class ToProto { description: agentCard.description, url: agentCard.url, preferredTransport: agentCard.preferredTransport ?? '', - additionalInterfaces: agentCard.additionalInterfaces ? agentCard.additionalInterfaces.map((i) => ToProto.agentInterface(i)) : [], + additionalInterfaces: agentCard.additionalInterfaces + ? agentCard.additionalInterfaces.map((i) => ToProto.agentInterface(i)) + : [], provider: ToProto.agentProvider(agentCard.provider), version: agentCard.version, documentationUrl: agentCard.documentationUrl ?? '', capabilities: ToProto.agentCapabilities(agentCard.capabilities), - securitySchemes: agentCard.securitySchemes ? Object.fromEntries( - Object.entries(agentCard.securitySchemes).map(([key, value]) => [ - key, - ToProto.securityScheme(value), - ]) - ) : {}, + securitySchemes: agentCard.securitySchemes + ? Object.fromEntries( + Object.entries(agentCard.securitySchemes).map(([key, value]) => [ + key, + ToProto.securityScheme(value), + ]) + ) + : {}, security: agentCard.security ? agentCard.security.map((s) => ToProto.security(s)) : [], defaultInputModes: agentCard.defaultInputModes, defaultOutputModes: agentCard.defaultOutputModes, skills: agentCard.skills.map((s) => ToProto.agentSkill(s)), supportsAuthenticatedExtendedCard: agentCard.supportsAuthenticatedExtendedCard ?? false, - signatures: agentCard.signatures ? agentCard.signatures.map((s) => ToProto.signatures(s)) : [], + signatures: agentCard.signatures + ? agentCard.signatures.map((s) => ToProto.signatures(s)) + : [], }; } @@ -217,7 +223,9 @@ export class ToProto { return { streaming: capabilities.streaming ?? false, pushNotifications: capabilities.pushNotifications ?? false, - extensions: capabilities.extensions ? capabilities.extensions.map((e) => ToProto.extension(e)) : [], + extensions: capabilities.extensions + ? capabilities.extensions.map((e) => ToProto.extension(e)) + : [], }; } diff --git a/tck/agent/index.ts b/tck/agent/index.ts index 159a63bd..59e164d5 100644 --- a/tck/agent/index.ts +++ b/tck/agent/index.ts @@ -1,10 +1,5 @@ import express from 'express'; -import { - Server, - ServerCredentials, - ServerUnaryCall, - sendUnaryData, -} from "@grpc/grpc-js"; +import { Server, ServerCredentials } from '@grpc/grpc-js'; import { v4 as uuidv4 } from 'uuid'; // For generating unique IDs import { AgentCard, Task, TaskStatusUpdateEvent, Message } from '../../src/index.js'; @@ -22,7 +17,6 @@ import { restHandler, UserBuilder, } from '../../src/server/express/index.js'; -import { serverErrorToStatus } from '@grpc/grpc-js/build/src/server-call.js'; import { grpcHandler } from '../../src/server/grpc/grpc_handler.js'; import { A2AServiceService } from '../../src/grpc/a2a.js'; @@ -240,12 +234,15 @@ async function main() { // 6. Start the gRPC server on a different port const GRPC_PORT = process.env.GRPC_PORT || 41242; - const grpcHandlerInstance = grpcHandler({ requestHandler, userBuilder: UserBuilder.noAuthentication }); + const grpcHandlerInstance = grpcHandler({ + requestHandler, + userBuilder: UserBuilder.noAuthentication, + }); const server = new Server(); - server.addService(A2AServiceService, grpcHandlerInstance ); + server.addService(A2AServiceService, grpcHandlerInstance); server.bindAsync(`localhost:${GRPC_PORT}`, ServerCredentials.createInsecure(), () => { - console.log(`[SUTAgent] gRPC server running at http://localhost:${GRPC_PORT}`); -}); + console.log(`[SUTAgent] gRPC server running at http://localhost:${GRPC_PORT}`); + }); } main().catch(console.error); From 3e0122f7408e4b26476245d4de8231a892c34d49 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Fri, 19 Dec 2025 22:45:16 +0000 Subject: [PATCH 36/64] improve error format --- src/server/grpc/grpc_handler.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index d8a9df7f..e8291a76 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -240,7 +240,6 @@ const mapToError = (error: unknown): Partial => { : A2AError.internalError(error instanceof Error ? error.message : 'Unknown Error'); return { - message: a2aError.message, code: mapping[a2aError.code] ?? grpc.status.INTERNAL, details: a2aError.message, }; From 3c18811230f048fe8d6d682f415984607e2499b9 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Sun, 21 Dec 2025 14:49:02 +0000 Subject: [PATCH 37/64] fix error codes --- src/server/grpc/grpc_handler.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index e8291a76..fbc66f3b 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -231,6 +231,11 @@ const mapping: Record = { [-32005]: grpc.status.INVALID_ARGUMENT, [-32006]: grpc.status.INTERNAL, [-32007]: grpc.status.FAILED_PRECONDITION, + [-32600]: grpc.status.INVALID_ARGUMENT, + [-32601]: grpc.status.UNIMPLEMENTED, + [-32602]: grpc.status.INVALID_ARGUMENT, + [-32603]: grpc.status.INTERNAL, + [-32700]: grpc.status.INTERNAL, }; const mapToError = (error: unknown): Partial => { From 55b6a188bb43d30193d36586746ad870ae437cb8 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Sun, 21 Dec 2025 16:49:00 +0000 Subject: [PATCH 38/64] added optional description to peerDependencies --- package.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/package.json b/package.json index 67af4c80..3198b028 100644 --- a/package.json +++ b/package.json @@ -94,6 +94,12 @@ "peerDependenciesMeta": { "express": { "optional": true + }, + "@grpc/grpc-js": { + "optional": true + }, + "@bufbuild/protobuf": { + "optional": true } } } From 9374358cec6144b312bf054a1b5e4872e14e2bef Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Sun, 21 Dec 2025 17:07:07 +0000 Subject: [PATCH 39/64] fix typo --- src/grpc/utils/id_decoding.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/grpc/utils/id_decoding.ts b/src/grpc/utils/id_decoding.ts index e808b154..ebc7a371 100644 --- a/src/grpc/utils/id_decoding.ts +++ b/src/grpc/utils/id_decoding.ts @@ -6,7 +6,7 @@ const CONFIG_ID_REGEX = /pushNotificationConfigs\/([^/]+)/; export const extractTaskId = (name: string): string => { const match = name.match(TASK_ID_REGEX); if (!match) { - throw A2AError.invalidParams(`Invalid or missing task ID in name: "${name}"`); + throw A2AError.invalidParams(`Invalid or missing task ID in: "${name}"`); } return match[1]; }; @@ -18,7 +18,7 @@ export const generateTaskName = (taskId: string): string => { export const extractPushNotificationConfigId = (name: string): string => { const match = name.match(CONFIG_ID_REGEX); if (!match) { - throw A2AError.invalidParams(`Invalid or missing config ID in name: "${name}"`); + throw A2AError.invalidParams(`Invalid or missing config ID in: "${name}"`); } return match[1]; }; From 2ff522e52a6d5fd93b6356dc414714b5139111e3 Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Mon, 22 Dec 2025 11:09:03 +0000 Subject: [PATCH 40/64] Add GRPC to run-tck.yaml --- .github/workflows/run-tck.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/run-tck.yaml b/.github/workflows/run-tck.yaml index f129db2c..bb1c92b2 100644 --- a/.github/workflows/run-tck.yaml +++ b/.github/workflows/run-tck.yaml @@ -100,14 +100,14 @@ jobs: id: run-tck-mandatory timeout-minutes: 5 run: | - ./run_tck.py --sut-url ${{ env.SUT_JSONRPC_URL }} --category mandatory --transports jsonrpc,rest + ./run_tck.py --sut-url ${{ env.SUT_JSONRPC_URL }} --category mandatory --transports jsonrpc,rest,grpc working-directory: tck/a2a-tck - # TODO: Add back the transports jsonrpc,rest once the TCK supports REST, linked to https://github.com/a2aproject/a2a-tck/issues/99 + # TODO: Add rest once the TCK supports REST, linked to https://github.com/a2aproject/a2a-tck/issues/99 - name: Run TCK (capabilities) id: run-tck-capabilities timeout-minutes: 5 run: | - ./run_tck.py --sut-url ${{ env.SUT_JSONRPC_URL }} --category capabilities + ./run_tck.py --sut-url ${{ env.SUT_JSONRPC_URL }} --category capabilities --transports jsonrpc,grpc working-directory: tck/a2a-tck - name: Stop SUT if: always() From 73c92b722f4340256b48a0e07d21c37e01cdd53c Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Mon, 22 Dec 2025 11:16:30 +0000 Subject: [PATCH 41/64] Sync package-lock.json (add peerDependenciesMeta for new packages) --- package-lock.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/package-lock.json b/package-lock.json index 10391416..1a262aae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,6 +45,12 @@ "express": "^4.21.2 || ^5.1.0" }, "peerDependenciesMeta": { + "@bufbuild/protobuf": { + "optional": true + }, + "@grpc/grpc-js": { + "optional": true + }, "express": { "optional": true } From 47dfebdc8a543d03f01ecf48906bc7f7c1487c08 Mon Sep 17 00:00:00 2001 From: Guglielmo Colombo Date: Mon, 29 Dec 2025 08:54:17 +0100 Subject: [PATCH 42/64] Update src/server/grpc/grpc_handler.ts Co-authored-by: Ivan Shymko --- src/server/grpc/grpc_handler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index fbc66f3b..74124524 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -255,7 +255,7 @@ const buildContext = async ( userBuilder: grpcHandlerOptions['userBuilder'] ): Promise => { const user = await userBuilder(call); - const extensionHeaders = call.metadata.get(HTTP_EXTENSION_HEADER.toLowerCase()); + const extensionHeaders = call.metadata.get(HTTP_EXTENSION_HEADER); const extensionString = extensionHeaders.map((v) => v.toString()).join(','); return new ServerCallContext( From 9b31a00225edc29756436b1f1fb9bd90e8364778 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Mon, 29 Dec 2025 07:57:20 +0000 Subject: [PATCH 43/64] move tests to a new location --- test/{utils => server/grpc}/from_proto.spec.ts | 8 ++++---- test/server/{ => grpc}/grpc_handler.spec.ts | 12 ++++++------ test/{utils => server/grpc}/to_proto.spec.ts | 10 +++++----- vitest.edge.config.ts | 3 +-- 4 files changed, 16 insertions(+), 17 deletions(-) rename test/{utils => server/grpc}/from_proto.spec.ts (97%) rename test/server/{ => grpc}/grpc_handler.spec.ts (95%) rename test/{utils => server/grpc}/to_proto.spec.ts (97%) diff --git a/test/utils/from_proto.spec.ts b/test/server/grpc/from_proto.spec.ts similarity index 97% rename from test/utils/from_proto.spec.ts rename to test/server/grpc/from_proto.spec.ts index e919ff37..b41acc99 100644 --- a/test/utils/from_proto.spec.ts +++ b/test/server/grpc/from_proto.spec.ts @@ -1,8 +1,8 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; -import { FromProto } from '../../src/grpc/utils/from_proto.js'; -import * as proto from '../../src/grpc/a2a.js'; -import * as idDecoding from '../../src/grpc/utils/id_decoding.js'; -import { A2AError } from '../../src/server/index.js'; +import { FromProto } from '../../../src/grpc/utils/from_proto.js'; +import * as proto from '../../../src/grpc/a2a.js'; +import * as idDecoding from '../../../src/grpc/utils/id_decoding.js'; +import { A2AError } from '../../../src/server/index.js'; vi.mock('../../src/grpc/utils/id_decoding', () => ({ extractTaskId: vi.fn(), diff --git a/test/server/grpc_handler.spec.ts b/test/server/grpc/grpc_handler.spec.ts similarity index 95% rename from test/server/grpc_handler.spec.ts rename to test/server/grpc/grpc_handler.spec.ts index d8035f60..ac62d780 100644 --- a/test/server/grpc_handler.spec.ts +++ b/test/server/grpc/grpc_handler.spec.ts @@ -1,11 +1,11 @@ import { describe, it, beforeEach, afterEach, assert, expect, vi, Mock } from 'vitest'; import * as grpc from '@grpc/grpc-js'; -import * as proto from '../../src/grpc/a2a.js'; -import { A2AError, A2ARequestHandler } from '../../src/server/index.js'; -import { grpcHandler } from '../../src/server/grpc/grpc_handler.js'; -import { AgentCard, HTTP_EXTENSION_HEADER, MessageSendParams, Task } from '../../src/index.js'; -import { ToProto } from '../../src/grpc/utils/to_proto.js'; -import { FromProto } from '../../src/grpc/utils/from_proto.js'; +import * as proto from '../../../src/grpc/a2a.js'; +import { A2AError, A2ARequestHandler } from '../../../src/server/index.js'; +import { grpcHandler } from '../../../src/server/grpc/grpc_handler.js'; +import { AgentCard, HTTP_EXTENSION_HEADER, MessageSendParams, Task } from '../../../src/index.js'; +import { ToProto } from '../../../src/grpc/utils/to_proto.js'; +import { FromProto } from '../../../src/grpc/utils/from_proto.js'; vi.mock('../../src/grpc/utils/from_proto.js'); vi.mock('../../src/grpc/utils/to_proto.js'); diff --git a/test/utils/to_proto.spec.ts b/test/server/grpc/to_proto.spec.ts similarity index 97% rename from test/utils/to_proto.spec.ts rename to test/server/grpc/to_proto.spec.ts index f0beebee..59d32ef3 100644 --- a/test/utils/to_proto.spec.ts +++ b/test/server/grpc/to_proto.spec.ts @@ -1,9 +1,9 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; -import { ToProto } from '../../src/grpc/utils/to_proto.js'; -import * as types from '../../src/types.js'; -import * as proto from '../../src/grpc/a2a.js'; -import * as idDecoding from '../../src/grpc/utils/id_decoding.js'; -import { A2AError } from '../../src/server/index.js'; +import { ToProto } from '../../../src/grpc/utils/to_proto.js'; +import * as types from '../../../src/types.js'; +import * as proto from '../../../src/grpc/a2a.js'; +import * as idDecoding from '../../../src/grpc/utils/id_decoding.js'; +import { A2AError } from '../../../src/server/index.js'; vi.mock('../../src/grpc/utils/id_decoding', () => ({ generatePushNotificationConfigName: vi.fn(), diff --git a/vitest.edge.config.ts b/vitest.edge.config.ts index 1e43e97a..817e95b9 100644 --- a/vitest.edge.config.ts +++ b/vitest.edge.config.ts @@ -9,8 +9,7 @@ export default defineWorkersConfig( // Express tests require Node.js-specific APIs (http, Express framework) 'test/server/a2a_express_app.spec.ts', // gRpc test require Node.js-specific gRPC module - 'test/server/grpc_handler.spec.ts', - 'test/utils/*.spec.ts', + 'test/server/grpc/*.spec.ts', 'test/e2e.spec.ts', 'test/server/rest_handler.spec.ts', 'test/server/push_notification_integration.spec.ts', From 0dd6d6016a1cc9cb11dbc73e0b0c6945cb05b30b Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Mon, 29 Dec 2025 08:01:43 +0000 Subject: [PATCH 44/64] rename grpc transport handlers --- src/server/grpc/grpc_handler.ts | 10 +++++----- src/server/grpc/index.ts | 2 +- src/server/transports/grpc/grpc_transport_handler.ts | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index 74124524..c11588c4 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -22,7 +22,7 @@ import { Empty } from '../../grpc/google/protobuf/empty.js'; import { A2ARequestHandler } from '../request_handler/a2a_request_handler.js'; import { FromProto } from '../../grpc/utils/from_proto.js'; import { ToProto } from '../../grpc/utils/to_proto.js'; -import { gRpcTransportHandler } from '../transports/grpc/grpc_transport_handler.js'; +import { GrpcTransportHandler } from '../transports/grpc/grpc_transport_handler.js'; import { ServerCallContext } from '../context.js'; import { Extensions } from '../../extensions.js'; import { User, UnauthenticatedUser } from '../authentication/user.js'; @@ -32,7 +32,7 @@ import { A2AError } from '../error.js'; /** * Options for configuring the gRPC handler. */ -export interface grpcHandlerOptions { +export interface GrpcHandlerOptions { requestHandler: A2ARequestHandler; userBuilder: ( call: grpc.ServerUnaryCall | grpc.ServerWritableStream @@ -47,8 +47,8 @@ export interface grpcHandlerOptions { * @param requestHandler - The core A2A request handler for business logic. * @returns An object that implements the A2AServiceServer interface. */ -export function grpcHandler(options: grpcHandlerOptions): A2AServiceServer { - const grpcTransportHandler = new gRpcTransportHandler(options.requestHandler); +export function grpcHandler(options: GrpcHandlerOptions): A2AServiceServer { + const grpcTransportHandler = new GrpcTransportHandler(options.requestHandler); /** * Helper to wrap Unary calls with common logic (context, metadata, error handling) @@ -252,7 +252,7 @@ const mapToError = (error: unknown): Partial => { const buildContext = async ( call: grpc.ServerUnaryCall | grpc.ServerWritableStream, - userBuilder: grpcHandlerOptions['userBuilder'] + userBuilder: GrpcHandlerOptions['userBuilder'] ): Promise => { const user = await userBuilder(call); const extensionHeaders = call.metadata.get(HTTP_EXTENSION_HEADER); diff --git a/src/server/grpc/index.ts b/src/server/grpc/index.ts index 9882c9b5..dfff0240 100644 --- a/src/server/grpc/index.ts +++ b/src/server/grpc/index.ts @@ -4,4 +4,4 @@ */ export { grpcHandler } from './grpc_handler.js'; -export type { grpcHandlerOptions } from './grpc_handler.js'; +export type { GrpcHandlerOptions as grpcHandlerOptions } from './grpc_handler.js'; diff --git a/src/server/transports/grpc/grpc_transport_handler.ts b/src/server/transports/grpc/grpc_transport_handler.ts index c3290527..c61d3531 100644 --- a/src/server/transports/grpc/grpc_transport_handler.ts +++ b/src/server/transports/grpc/grpc_transport_handler.ts @@ -16,7 +16,7 @@ import { GetTaskPushNotificationConfigParams, } from '../../../types.js'; -export class gRpcTransportHandler { +export class GrpcTransportHandler { private requestHandler: A2ARequestHandler; constructor(requestHandler: A2ARequestHandler) { From f5986ef985c45e2d66c9a19652feab4438a25fde Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Mon, 29 Dec 2025 08:19:14 +0000 Subject: [PATCH 45/64] refactor from and to proto --- src/grpc/utils/from_proto.ts | 13 ++++++++++++- src/grpc/utils/to_proto.ts | 31 +++++++++++++++++++------------ 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/grpc/utils/from_proto.ts b/src/grpc/utils/from_proto.ts index 33ceb536..4e016f24 100644 --- a/src/grpc/utils/from_proto.ts +++ b/src/grpc/utils/from_proto.ts @@ -88,12 +88,23 @@ export class FromProto { parts: message.content.map((p) => FromProto.parts(p)), contextId: message.contextId, taskId: message.taskId, - role: message.role === Role.ROLE_AGENT ? 'agent' : 'user', + role: FromProto.role(message.role), metadata: message.metadata, extensions: message.extensions.length > 0 ? message.extensions : undefined, }; } + static role(role: Role): 'agent' | 'user' { + switch (role) { + case Role.ROLE_AGENT: + return 'agent'; + case Role.ROLE_USER: + return 'user'; + default: + throw A2AError.invalidParams(`Invalid role: ${role}`); + } + } + static configuration( configuration: SendMessageConfiguration ): types.MessageSendConfiguration | undefined { diff --git a/src/grpc/utils/to_proto.ts b/src/grpc/utils/to_proto.ts index 1b558236..2218a286 100644 --- a/src/grpc/utils/to_proto.ts +++ b/src/grpc/utils/to_proto.ts @@ -38,9 +38,7 @@ export class ToProto { description: agentCard.description, url: agentCard.url, preferredTransport: agentCard.preferredTransport ?? '', - additionalInterfaces: agentCard.additionalInterfaces - ? agentCard.additionalInterfaces.map((i) => ToProto.agentInterface(i)) - : [], + additionalInterfaces: agentCard.additionalInterfaces?.map((i) => ToProto.agentInterface(i)) ?? [], provider: ToProto.agentProvider(agentCard.provider), version: agentCard.version, documentationUrl: agentCard.documentationUrl ?? '', @@ -53,14 +51,12 @@ export class ToProto { ]) ) : {}, - security: agentCard.security ? agentCard.security.map((s) => ToProto.security(s)) : [], + security: agentCard.security?.map((s) => ToProto.security(s)) ?? [], defaultInputModes: agentCard.defaultInputModes, defaultOutputModes: agentCard.defaultOutputModes, skills: agentCard.skills.map((s) => ToProto.agentSkill(s)), supportsAuthenticatedExtendedCard: agentCard.supportsAuthenticatedExtendedCard ?? false, - signatures: agentCard.signatures - ? agentCard.signatures.map((s) => ToProto.signatures(s)) - : [], + signatures: agentCard.signatures?.map((s) => ToProto.signatures(s)) ?? [], }; } @@ -253,7 +249,7 @@ export class ToProto { return { name: generatePushNotificationConfigName( config.taskId, - config.pushNotificationConfig.id || '' + config.pushNotificationConfig.id ?? '' ), pushNotificationConfig: ToProto.pushNotificationConfig(config.pushNotificationConfig), }; @@ -365,19 +361,30 @@ export class ToProto { content: message.parts.map((p) => ToProto.parts(p)), contextId: message.contextId ?? '', taskId: message.taskId ?? '', - role: message.role === 'agent' ? Role.ROLE_AGENT : Role.ROLE_USER, + role: ToProto.role(message.role), metadata: message.metadata, - extensions: message.extensions ? message.extensions : [], + extensions: message.extensions ?? [], }; } + static role(role: string): Role { + switch (role) { + case 'agent': + return Role.ROLE_AGENT; + case 'user': + return Role.ROLE_USER; + default: + throw A2AError.internalError(`Invalid role`); + } + } + static task(task: types.Task): Task { return { id: task.id, contextId: task.contextId, status: ToProto.taskStatus(task.status), - artifacts: task.artifacts ? task.artifacts.map((a) => ToProto.artifact(a)) : [], - history: task.history ? task.history.map((m) => ToProto.message(m)) : [], + artifacts: task.artifacts?.map((a) => ToProto.artifact(a)) ?? [], + history: task.history?.map((m) => ToProto.message(m)) ?? [], metadata: task.metadata, }; } From d04b6544091c860b42be53937d84fbdd2aaf5890 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Mon, 29 Dec 2025 08:21:19 +0000 Subject: [PATCH 46/64] revert package json samples --- src/samples/package-lock.json | 1789 +++++++-------------------------- 1 file changed, 382 insertions(+), 1407 deletions(-) diff --git a/src/samples/package-lock.json b/src/samples/package-lock.json index 1fadfe34..4f7b0bae 100644 --- a/src/samples/package-lock.json +++ b/src/samples/package-lock.json @@ -43,282 +43,10 @@ "kuler": "^2.0.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" ], @@ -332,159 +60,6 @@ "node": ">=18" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/@fastify/busboy": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", @@ -623,13 +198,13 @@ } }, "node_modules/@genkit-ai/ai": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/ai/-/ai-1.26.0.tgz", - "integrity": "sha512-L6sX2pocyGQTJU77w/Y6DP/VfWEgD/WyFZL/P2RSxz/xr25/twbdPE45xzjP7KTaFHFhAAp+lOMYhvh9kEBS3g==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@genkit-ai/ai/-/ai-1.24.0.tgz", + "integrity": "sha512-Rv2eZqvJA8awIfLKiZL+P1hlBPGFiBFk1r01hRk0BSp1HmpZmlzSx+MM+X2H54xMgRXBRAelzU6xUXXzN5U57Q==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@genkit-ai/core": "1.26.0", + "@genkit-ai/core": "1.24.0", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.11.19", "colorette": "^2.0.20", @@ -642,9 +217,9 @@ } }, "node_modules/@genkit-ai/ai/node_modules/@types/node": { - "version": "20.19.27", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.27.tgz", - "integrity": "sha512-N2clP5pJhB2YnZJ3PIHFk5RkygRX5WO/5f0WC08tp0wd+sv0rsJk3MqWn3CbNmT2J505a5336jaQj4ph1AdMug==", + "version": "20.19.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.25.tgz", + "integrity": "sha512-ZsJzA5thDQMSQO788d7IocwwQbI8B5OPzmqNvpf3NY/+MHDAS759Wo0gd2WQeXYt5AAAQjzcrTVC6SKCuYgoCQ==", "dev": true, "license": "MIT", "dependencies": { @@ -673,9 +248,9 @@ } }, "node_modules/@genkit-ai/core": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/core/-/core-1.26.0.tgz", - "integrity": "sha512-wLcfyWjRyDMeyIcx2De0Sl8P4MxuTVPdCyr7wSR4YZmLIOA02LrdhQXGPcx8Rh7N0z5IxUAxPZ5rVdsUitxIzA==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@genkit-ai/core/-/core-1.24.0.tgz", + "integrity": "sha512-JGmwdcC066OpbwShXeOOwvinj9b4yA0BKfKjPrVqqbWt9hvu81I60UNNiZC5y8dx+TvEhdEPUAXRvoOup2vC0w==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -718,24 +293,24 @@ } }, "node_modules/@genkit-ai/core/node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "~3.1.2", + "bytes": "3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "~1.2.0", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "on-finished": "~2.4.1", - "qs": "~6.14.0", - "raw-body": "~2.5.3", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", "type-is": "~1.6.18", - "unpipe": "~1.0.0" + "unpipe": "1.0.0" }, "engines": { "node": ">= 0.8", @@ -755,10 +330,20 @@ "node": ">= 0.6" } }, + "node_modules/@genkit-ai/core/node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/@genkit-ai/core/node_modules/cookie-signature": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", - "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "dev": true, "license": "MIT" }, @@ -773,40 +358,40 @@ } }, "node_modules/@genkit-ai/core/node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "~1.20.3", - "content-disposition": "~0.5.4", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "~0.7.1", - "cookie-signature": "~1.0.6", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "~1.3.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.0", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "~2.4.1", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "~0.1.12", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "~6.14.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "~0.19.0", - "serve-static": "~1.16.2", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", - "statuses": "~2.0.1", + "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -820,18 +405,18 @@ } }, "node_modules/@genkit-ai/core/node_modules/finalhandler": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", - "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", - "on-finished": "~2.4.1", + "on-finished": "2.4.1", "parseurl": "~1.3.3", - "statuses": "~2.0.2", + "statuses": "2.0.1", "unpipe": "~1.0.0" }, "engines": { @@ -845,7 +430,24 @@ "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.6" + } + }, + "node_modules/@genkit-ai/core/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" } }, "node_modules/@genkit-ai/core/node_modules/iconv-lite": { @@ -941,47 +543,73 @@ "dev": true, "license": "MIT" }, + "node_modules/@genkit-ai/core/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@genkit-ai/core/node_modules/raw-body": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", - "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.4.24", - "unpipe": "~1.0.0" + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" }, "engines": { "node": ">= 0.8" } }, "node_modules/@genkit-ai/core/node_modules/send": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", - "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "fresh": "~0.5.2", - "http-errors": "~2.0.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", "mime": "1.6.0", "ms": "2.1.3", - "on-finished": "~2.4.1", + "on-finished": "2.4.1", "range-parser": "~1.2.1", - "statuses": "~2.0.2" + "statuses": "2.0.1" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/@genkit-ai/core/node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/@genkit-ai/core/node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -990,21 +618,31 @@ "license": "MIT" }, "node_modules/@genkit-ai/core/node_modules/serve-static": { - "version": "1.16.3", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", - "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "license": "MIT", "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "~0.19.1" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/@genkit-ai/core/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/@genkit-ai/core/node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -1020,388 +658,175 @@ } }, "node_modules/@genkit-ai/firebase": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/firebase/-/firebase-1.26.0.tgz", - "integrity": "sha512-r87uh0ub+OBhm33ds6M/H8oXzE9qSiczhPE5uFpehp++7iZ6lE3bNaiGwsSdG9iU0ghNyQBa475t+IWFe9kePQ==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@genkit-ai/firebase/-/firebase-1.24.0.tgz", + "integrity": "sha512-6DZ612qNV4OUsAa0L40gYx0rIzcANAjv3u9R08wGK/twdOvANJuMOUWBRTIVPA0IZL2WiHLcm6Ss+GOdZOdvpg==", "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { - "@genkit-ai/google-cloud": "^1.26.0" + "@genkit-ai/google-cloud": "^1.24.0" }, "peerDependencies": { "@google-cloud/firestore": "^7.11.0", "firebase": ">=11.5.0", "firebase-admin": ">=12.2", - "genkit": "^1.26.0" - }, - "peerDependenciesMeta": { - "firebase": { - "optional": true - } - } - }, - "node_modules/@genkit-ai/google-cloud": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/google-cloud/-/google-cloud-1.26.0.tgz", - "integrity": "sha512-HTmwNinoKOF8lMFYx79Xx6V4pZPsCPlUmJfqsH+VWmJWHGQeBTE3B9cUTvu8up+Y/EaVf8qcG/9c1onZOA22cQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@google-cloud/logging-winston": "^6.0.0", - "@google-cloud/modelarmor": "^0.4.1", - "@google-cloud/opentelemetry-cloud-monitoring-exporter": "^0.19.0", - "@google-cloud/opentelemetry-cloud-trace-exporter": "^2.4.1", - "@google-cloud/opentelemetry-resource-util": "^2.4.0", - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/auto-instrumentations-node": "^0.49.1", - "@opentelemetry/core": "~1.25.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/instrumentation-pino": "^0.41.0", - "@opentelemetry/instrumentation-winston": "^0.39.0", - "@opentelemetry/resources": "~1.25.0", - "@opentelemetry/sdk-metrics": "~1.25.0", - "@opentelemetry/sdk-node": "^0.52.0", - "@opentelemetry/sdk-trace-base": "~1.25.0", - "google-auth-library": "^9.6.3", - "node-fetch": "^3.3.2", - "winston": "^3.12.0" - }, - "peerDependencies": { - "genkit": "^1.26.0" - } - }, - "node_modules/@genkit-ai/googleai": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@genkit-ai/googleai/-/googleai-1.26.0.tgz", - "integrity": "sha512-RpH1fQ2IRpFk/haImE1n0PhoywA8oIvWtLiq9wi2ymJ7H7E4uWhwhUYFY04JeU0KWxwFado8whOfWJq3vyzgqQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@google/generative-ai": "^0.24.0", - "google-auth-library": "^9.6.3", - "node-fetch": "^3.3.2" - }, - "peerDependencies": { - "genkit": "^1.26.0" - } - }, - "node_modules/@google-cloud/common": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.2.tgz", - "integrity": "sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "^4.0.0", - "arrify": "^2.0.1", - "duplexify": "^4.1.1", - "extend": "^3.0.2", - "google-auth-library": "^9.0.0", - "html-entities": "^2.5.2", - "retry-request": "^7.0.0", - "teeny-request": "^9.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/firestore": { - "version": "7.11.6", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.6.tgz", - "integrity": "sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "@opentelemetry/api": "^1.3.0", - "fast-deep-equal": "^3.1.1", - "functional-red-black-tree": "^1.0.1", - "google-gax": "^4.3.3", - "protobufjs": "^7.2.6" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/logging": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@google-cloud/logging/-/logging-11.2.1.tgz", - "integrity": "sha512-2h9HBJG3OAsvzXmb81qXmaTPfXYU7KJTQUxunoOKFGnY293YQ/eCkW1Y5mHLocwpEqeqQYT/Qvl6Tk+Q7PfStw==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@google-cloud/common": "^5.0.0", - "@google-cloud/paginator": "^5.0.0", - "@google-cloud/projectify": "^4.0.0", - "@google-cloud/promisify": "4.0.0", - "@opentelemetry/api": "^1.7.0", - "arrify": "^2.0.1", - "dot-prop": "^6.0.0", - "eventid": "^2.0.0", - "extend": "^3.0.2", - "gcp-metadata": "^6.0.0", - "google-auth-library": "^9.0.0", - "google-gax": "^4.0.3", - "on-finished": "^2.3.0", - "pumpify": "^2.0.1", - "stream-events": "^1.0.5", - "uuid": "^9.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/logging-winston": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@google-cloud/logging-winston/-/logging-winston-6.0.1.tgz", - "integrity": "sha512-tgA/qe/aGZITMrJ/5Tuykv234pLb/Qo6iDZ8SDkjbsiIy69mLQmbphrUd/IqnE17BSDfrwDUckvWdghiy8b+Qg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@google-cloud/logging": "^11.0.0", - "google-auth-library": "^9.0.0", - "lodash.mapvalues": "^4.6.0", - "winston-transport": "^4.3.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "winston": ">=3.2.1" - } - }, - "node_modules/@google-cloud/logging/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "optional": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@google-cloud/modelarmor": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@google-cloud/modelarmor/-/modelarmor-0.4.1.tgz", - "integrity": "sha512-CT9TpQF443aatjhRRvazrYNOvUot26HnFP3hhgmV89QYygNPB6owWvGFFOTsKK4zSvTDfkeeb+E6diVXxn9t4g==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "google-gax": "^5.0.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@google-cloud/modelarmor/node_modules/@grpc/proto-loader": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.0.tgz", - "integrity": "sha512-rc1hOQtjIWGxcxpb9aHAfLpIctjEnsDehj0DAiVfBlmT84uvR0uUtN2hEi/ecvWVjXUGf5qPF4qEgiLOx1YIMQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.5.3", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@google-cloud/modelarmor/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/@google-cloud/modelarmor/node_modules/gaxios": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.3.tgz", - "integrity": "sha512-YGGyuEdVIjqxkxVH1pUTMY/XtmmsApXrCVv5EU25iX6inEPbV+VakJfLealkBtJN69AQmh1eGOdCl9Sm1UP6XQ==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "extend": "^3.0.2", - "https-proxy-agent": "^7.0.1", - "node-fetch": "^3.3.2", - "rimraf": "^5.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@google-cloud/modelarmor/node_modules/gcp-metadata": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-8.1.2.tgz", - "integrity": "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "gaxios": "^7.0.0", - "google-logging-utils": "^1.0.0", - "json-bigint": "^1.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@google-cloud/modelarmor/node_modules/google-auth-library": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.5.0.tgz", - "integrity": "sha512-7ABviyMOlX5hIVD60YOfHw4/CxOfBhyduaYB+wbFWCWoni4N7SLcV46hrVRktuBbZjFC9ONyqamZITN7q3n32w==", - "dev": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "base64-js": "^1.3.0", - "ecdsa-sig-formatter": "^1.0.11", - "gaxios": "^7.0.0", - "gcp-metadata": "^8.0.0", - "google-logging-utils": "^1.0.0", - "gtoken": "^8.0.0", - "jws": "^4.0.0" - }, - "engines": { - "node": ">=18" + "genkit": "^1.24.0" + }, + "peerDependenciesMeta": { + "firebase": { + "optional": true + } } }, - "node_modules/@google-cloud/modelarmor/node_modules/google-gax": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-5.0.6.tgz", - "integrity": "sha512-1kGbqVQBZPAAu4+/R1XxPQKP0ydbNYoLAr4l0ZO2bMV0kLyLW4I1gAk++qBLWt7DPORTzmWRMsCZe86gDjShJA==", + "node_modules/@genkit-ai/google-cloud": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@genkit-ai/google-cloud/-/google-cloud-1.24.0.tgz", + "integrity": "sha512-SrNCuo7UC1c7BRRk4F6IRAM9ZSBbpLUUWgpP9xUUQ3sozVzPwWwI5Eps32WCa52ljrbhSiQQRi4sRm36glDBiA==", "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { - "@grpc/grpc-js": "^1.12.6", - "@grpc/proto-loader": "^0.8.0", - "duplexify": "^4.1.3", - "google-auth-library": "^10.1.0", - "google-logging-utils": "^1.1.1", + "@google-cloud/logging-winston": "^6.0.0", + "@google-cloud/opentelemetry-cloud-monitoring-exporter": "^0.19.0", + "@google-cloud/opentelemetry-cloud-trace-exporter": "^2.4.1", + "@google-cloud/opentelemetry-resource-util": "^2.4.0", + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/auto-instrumentations-node": "^0.49.1", + "@opentelemetry/core": "~1.25.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/instrumentation-pino": "^0.41.0", + "@opentelemetry/instrumentation-winston": "^0.39.0", + "@opentelemetry/resources": "~1.25.0", + "@opentelemetry/sdk-metrics": "~1.25.0", + "@opentelemetry/sdk-node": "^0.52.0", + "@opentelemetry/sdk-trace-base": "~1.25.0", + "google-auth-library": "^9.6.3", "node-fetch": "^3.3.2", - "object-hash": "^3.0.0", - "proto3-json-serializer": "^3.0.0", - "protobufjs": "^7.5.3", - "retry-request": "^8.0.0", - "rimraf": "^5.0.1" + "winston": "^3.12.0" }, - "engines": { - "node": ">=18" + "peerDependencies": { + "genkit": "^1.24.0" } }, - "node_modules/@google-cloud/modelarmor/node_modules/google-logging-utils": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.3.tgz", - "integrity": "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA==", + "node_modules/@genkit-ai/googleai": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/@genkit-ai/googleai/-/googleai-1.24.0.tgz", + "integrity": "sha512-TI4QC4nIkk/8JVccMmZZ6wO9ekhFtBhc69370A/CJRSw9jN7nJeIwQd5bo2JOyVT+BR2hQI8Upsoc1LTYAkLbw==", "dev": true, "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=14" + "dependencies": { + "@google/generative-ai": "^0.24.0", + "google-auth-library": "^9.6.3", + "node-fetch": "^3.3.2" + }, + "peerDependencies": { + "genkit": "^1.24.0" } }, - "node_modules/@google-cloud/modelarmor/node_modules/gtoken": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", - "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", + "node_modules/@google-cloud/common": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-5.0.2.tgz", + "integrity": "sha512-V7bmBKYQyu0eVG2BFejuUjlBt+zrya6vtsKdY+JxMM/dNntPF41vZ9+LhOshEUH01zOHEqBSvI7Dad7ZS6aUeA==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "dependencies": { - "gaxios": "^7.0.0", - "jws": "^4.0.0" + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "^4.0.0", + "arrify": "^2.0.1", + "duplexify": "^4.1.1", + "extend": "^3.0.2", + "google-auth-library": "^9.0.0", + "html-entities": "^2.5.2", + "retry-request": "^7.0.0", + "teeny-request": "^9.0.0" }, "engines": { - "node": ">=18" + "node": ">=14.0.0" } }, - "node_modules/@google-cloud/modelarmor/node_modules/proto3-json-serializer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/proto3-json-serializer/-/proto3-json-serializer-3.0.4.tgz", - "integrity": "sha512-E1sbAYg3aEbXrq0n1ojJkRHQJGE1kaE/O6GLA94y8rnJBfgvOPTOd1b9hOceQK1FFZI9qMh1vBERCyO2ifubcw==", + "node_modules/@google-cloud/firestore": { + "version": "7.11.6", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-7.11.6.tgz", + "integrity": "sha512-EW/O8ktzwLfyWBOsNuhRoMi8lrC3clHM5LVFhGvO1HCsLozCOOXRAlHrYBoE6HL42Sc8yYMuCb2XqcnJ4OOEpw==", "dev": true, "license": "Apache-2.0", "optional": true, + "peer": true, "dependencies": { - "protobufjs": "^7.4.0" + "@opentelemetry/api": "^1.3.0", + "fast-deep-equal": "^3.1.1", + "functional-red-black-tree": "^1.0.1", + "google-gax": "^4.3.3", + "protobufjs": "^7.2.6" }, "engines": { - "node": ">=18" + "node": ">=14.0.0" } }, - "node_modules/@google-cloud/modelarmor/node_modules/retry-request": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-8.0.2.tgz", - "integrity": "sha512-JzFPAfklk1kjR1w76f0QOIhoDkNkSqW8wYKT08n9yysTmZfB+RQ2QoXoTAeOi1HD9ZipTyTAZg3c4pM/jeqgSw==", + "node_modules/@google-cloud/logging": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@google-cloud/logging/-/logging-11.2.1.tgz", + "integrity": "sha512-2h9HBJG3OAsvzXmb81qXmaTPfXYU7KJTQUxunoOKFGnY293YQ/eCkW1Y5mHLocwpEqeqQYT/Qvl6Tk+Q7PfStw==", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "optional": true, "dependencies": { + "@google-cloud/common": "^5.0.0", + "@google-cloud/paginator": "^5.0.0", + "@google-cloud/projectify": "^4.0.0", + "@google-cloud/promisify": "4.0.0", + "@opentelemetry/api": "^1.7.0", + "arrify": "^2.0.1", + "dot-prop": "^6.0.0", + "eventid": "^2.0.0", "extend": "^3.0.2", - "teeny-request": "^10.0.0" + "gcp-metadata": "^6.0.0", + "google-auth-library": "^9.0.0", + "google-gax": "^4.0.3", + "on-finished": "^2.3.0", + "pumpify": "^2.0.1", + "stream-events": "^1.0.5", + "uuid": "^9.0.0" }, "engines": { - "node": ">=18" + "node": ">=14.0.0" } }, - "node_modules/@google-cloud/modelarmor/node_modules/teeny-request": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-10.1.0.tgz", - "integrity": "sha512-3ZnLvgWF29jikg1sAQ1g0o+lr5JX6sVgYvfUJazn7ZjJroDBUTWp44/+cFVX0bULjv4vci+rBD+oGVAkWqhUbw==", + "node_modules/@google-cloud/logging-winston": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@google-cloud/logging-winston/-/logging-winston-6.0.1.tgz", + "integrity": "sha512-tgA/qe/aGZITMrJ/5Tuykv234pLb/Qo6iDZ8SDkjbsiIy69mLQmbphrUd/IqnE17BSDfrwDUckvWdghiy8b+Qg==", "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^3.3.2", - "stream-events": "^1.0.5" + "@google-cloud/logging": "^11.0.0", + "google-auth-library": "^9.0.0", + "lodash.mapvalues": "^4.6.0", + "winston-transport": "^4.3.0" }, "engines": { - "node": ">=18" + "node": ">=14.0.0" + }, + "peerDependencies": { + "winston": ">=3.2.1" } }, - "node_modules/@google-cloud/modelarmor/node_modules/teeny-request/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/@google-cloud/logging/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "license": "MIT", "optional": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" + "bin": { + "uuid": "dist/bin/uuid" } }, "node_modules/@google-cloud/opentelemetry-cloud-monitoring-exporter": { @@ -1517,9 +942,9 @@ } }, "node_modules/@google-cloud/storage": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.18.0.tgz", - "integrity": "sha512-r3ZwDMiz4nwW6R922Z1pwpePxyRwE5GdevYX63hRmAQUkUQJcBH/79EnQPDv5cOv1mFBgevdNWQfi3tie3dHrQ==", + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.17.3.tgz", + "integrity": "sha512-gOnCAbFgAYKRozywLsxagdevTF7Gm+2Ncz5u5CQAuOv/2VCa0rdGJWvJFDOftPx1tc+q8TXiC2pEJfFKu+yeMQ==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -1568,9 +993,9 @@ } }, "node_modules/@grpc/grpc-js": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.3.tgz", - "integrity": "sha512-Iq8QQQ/7X3Sac15oB6p0FmUg/klxQvXLeileoqrTRGJYLV+/9tubbr9ipz0GKHjmXVsgFPo/+W+2cA8eNcR+XA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.1.tgz", + "integrity": "sha512-sPxgEWtPUR3EnRJCEtbGZG2iX8LQDUls2wUS3o27jg07KqJFMq6YDeWvMo1wfpmy3rqRdS0rivpLwhqQtEyCuQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1620,116 +1045,6 @@ "node": ">=6" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@js-sdsl/ordered-map": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", @@ -3277,17 +2592,6 @@ "@opentelemetry/api": "^1.1.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -3434,15 +2738,15 @@ } }, "node_modules/@types/express": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.5.tgz", + "integrity": "sha512-LuIQOcb6UmnF7C1PCFmEU1u2hmiHL43fgFQX67sN3H4Z+0Yk0Neo++mFsBjhOAuLzvlQeqAAkeDOZrJs9rzumQ==", "dev": true, "license": "MIT", "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^2" + "@types/serve-static": "^1" } }, "node_modules/@types/express-serve-static-core": { @@ -3507,9 +2811,7 @@ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", "dev": true, - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "node_modules/@types/ms": { "version": "2.1.0", @@ -3530,9 +2832,9 @@ } }, "node_modules/@types/node": { - "version": "25.0.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.3.tgz", - "integrity": "sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==", + "version": "24.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.1.tgz", + "integrity": "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3634,13 +2936,25 @@ } }, "node_modules/@types/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", + "version": "1.15.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", + "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", "dev": true, "license": "MIT", "dependencies": { "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "<1" + } + }, + "node_modules/@types/serve-static/node_modules/@types/send": { + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", + "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", "@types/node": "*" } }, @@ -3775,11 +3089,13 @@ } }, "node_modules/ansi-color": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ansi-color/-/ansi-color-0.2.2.tgz", - "integrity": "sha512-qPx7iZZDHITYrrfzaUFXQpIcF2xYifcQHQflP1pFz8yY3lfU6GgCHb0+hJD7nimYKO7f2iaYYwBpZ+GaNcAhcA==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-color/-/ansi-color-0.2.1.tgz", + "integrity": "sha512-bF6xLaZBLpOQzgYUtYEhJx090nPSZk1BQ/q2oyBK9aMMcJHzx9uXGCjI2Y+LebsN4Jwoykr0V9whbPiogdyHoQ==", "dev": true, - "license": "BSD License" + "engines": { + "node": "*" + } }, "node_modules/ansi-regex": { "version": "5.0.1", @@ -3883,14 +3199,6 @@ "license": "MIT", "optional": true }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -3947,17 +3255,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/buffer-equal-constant-time": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", @@ -4176,22 +3473,6 @@ "node": ">= 0.10" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", @@ -4306,16 +3587,8 @@ "end-of-stream": "^1.4.1", "inherits": "^2.0.3", "readable-stream": "^3.1.1", - "stream-shift": "^1.0.2" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT", - "optional": true + "stream-shift": "^1.0.2" + } }, "node_modules/ecdsa-sig-formatter": { "version": "1.0.11", @@ -4431,9 +3704,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4444,32 +3717,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" } }, "node_modules/escalade": { @@ -4536,20 +3809,19 @@ } }, "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", + "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", "dev": true, "license": "MIT", "dependencies": { "accepts": "^2.0.0", - "body-parser": "^2.2.1", + "body-parser": "^2.2.0", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", - "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", @@ -4691,9 +3963,9 @@ } }, "node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", + "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4705,11 +3977,7 @@ "statuses": "^2.0.1" }, "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" + "node": ">= 0.8" } }, "node_modules/firebase-admin": { @@ -4742,9 +4010,9 @@ } }, "node_modules/firebase-admin/node_modules/@types/node": { - "version": "22.19.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.3.tgz", - "integrity": "sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA==", + "version": "22.19.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.1.tgz", + "integrity": "sha512-LCCV0HdSZZZb34qifBsyWlUmok6W7ouER+oQIGBScS8EsZsQbrtFTUrDX4hOl+CS6p7cnNC4td+qrSVGSCTUfQ==", "dev": true, "license": "MIT", "optional": true, @@ -4770,24 +4038,6 @@ "license": "MIT", "optional": true }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { "version": "2.5.5", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz", @@ -4865,21 +4115,6 @@ "node": ">= 0.8" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -4967,14 +4202,14 @@ } }, "node_modules/genkit": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/genkit/-/genkit-1.26.0.tgz", - "integrity": "sha512-+bfQWefF56mZU8RTH0zHwlXyreA1rMkEXBBb5mNqP1OVuv92F8eJWP80/8M+wvL8OeaxBiejtbGIjcepOJRgpA==", + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/genkit/-/genkit-1.24.0.tgz", + "integrity": "sha512-9BjPrLULfWdzauibKkbZcCf2LVu0mW2EW6EXHK/cTber6QdiP/guA5mXahaaDWBo+qdIKpInXAYDEzcRUmCVSA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@genkit-ai/ai": "1.26.0", - "@genkit-ai/core": "1.26.0", + "@genkit-ai/ai": "1.24.0", + "@genkit-ai/core": "1.24.0", "uuid": "^10.0.0" } }, @@ -5067,28 +4302,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/google-auth-library": { "version": "9.15.1", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.15.1.tgz", @@ -5431,9 +4644,9 @@ } }, "node_modules/iconv-lite": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", - "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", + "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5534,31 +4747,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true, - "license": "ISC", - "optional": true - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "license": "BlueOak-1.0.0", - "optional": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/jaeger-client": { "version": "3.19.0", "resolved": "https://registry.npmjs.org/jaeger-client/-/jaeger-client-3.19.0.tgz", @@ -5636,13 +4824,13 @@ } }, "node_modules/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", "dev": true, "license": "MIT", "dependencies": { - "jws": "^4.0.1", + "jws": "^3.2.2", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", @@ -5658,6 +4846,29 @@ "npm": ">=6" } }, + "node_modules/jsonwebtoken/node_modules/jwa": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", + "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/jws": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.3.tgz", + "integrity": "sha512-byiJ0FLRdLdSVSReO/U4E7RoEyOCKnEnEPMjq3HxWtvzLsV08/i5RQKsFVNkCldrCaPr2vDNAOMsfs8T/Hze7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jwa": "^1.4.2", + "safe-buffer": "^5.0.1" + } + }, "node_modules/jwa": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", @@ -5720,33 +4931,6 @@ "@types/send": "*" } }, - "node_modules/jwks-rsa/node_modules/@types/send": { - "version": "0.17.6", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.6.tgz", - "integrity": "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/jwks-rsa/node_modules/@types/serve-static": { - "version": "1.15.10", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.10.tgz", - "integrity": "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "<1" - } - }, "node_modules/jws": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", @@ -5993,23 +5177,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", @@ -6020,17 +5187,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "optional": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/module-details-from-path": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", @@ -6103,9 +5259,9 @@ } }, "node_modules/node-forge": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.3.tgz", - "integrity": "sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.2.tgz", + "integrity": "sha512-6xKiQ+cph9KImrRh0VsjH2d8/GXA4FIMlgU4B757iI1ApvcyA9VlouP0yZJha01V+huImO+kKMU7ih+2+E14fw==", "dev": true, "license": "(BSD-3-Clause OR GPL-2.0)", "optional": true, @@ -6217,14 +5373,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0", - "optional": true - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -6281,17 +5429,6 @@ "node": ">= 0.4.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", @@ -6299,32 +5436,6 @@ "dev": true, "license": "MIT" }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dev": true, - "license": "BlueOak-1.0.0", - "optional": true, - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "dev": true, - "license": "ISC", - "optional": true - }, "node_modules/path-to-regexp": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", @@ -6391,9 +5502,9 @@ } }, "node_modules/postgres-bytea": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.1.tgz", - "integrity": "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", "dev": true, "license": "MIT", "optional": true, @@ -6665,23 +5776,6 @@ "node": ">=14" } }, - "node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -6752,36 +5846,32 @@ } }, "node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", + "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.4.3", + "debug": "^4.3.5", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", + "http-errors": "^2.0.0", + "mime-types": "^3.0.1", "ms": "^2.1.3", "on-finished": "^2.4.1", "range-parser": "^1.2.1", - "statuses": "^2.0.2" + "statuses": "^2.0.1" }, "engines": { "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", + "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6792,10 +5882,6 @@ }, "engines": { "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/setprototypeof": { @@ -6805,31 +5891,6 @@ "dev": true, "license": "ISC" }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, "node_modules/shimmer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", @@ -6913,20 +5974,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "optional": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7009,23 +6056,6 @@ "node": ">=8" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -7039,21 +6069,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strnum": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", @@ -7245,13 +6260,13 @@ "license": "0BSD" }, "node_modules/tsx": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", - "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", + "version": "4.20.6", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.20.6.tgz", + "integrity": "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "~0.27.0", + "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "bin": { @@ -7423,27 +6438,10 @@ "webidl-conversions": "^3.0.0" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "license": "ISC", - "optional": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/winston": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", - "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.18.3.tgz", + "integrity": "sha512-NoBZauFNNWENgsnC9YpgyYwOVrl2m58PpQ8lNHjV3kosGs7KJ7Npk9pCUE+WJlawVSe8mykWDKWFSVfs3QO9ww==", "dev": true, "license": "MIT", "optional": true, @@ -7505,26 +6503,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7569,9 +6547,9 @@ "peer": true }, "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", + "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", "dev": true, "license": "ISC", "bin": { @@ -7579,9 +6557,6 @@ }, "engines": { "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { @@ -7649,4 +6624,4 @@ } } } -} +} \ No newline at end of file From 31ef47a5674d9c571f80662d4d97a4070a85c5b9 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Mon, 29 Dec 2025 08:22:31 +0000 Subject: [PATCH 47/64] fix typo --- src/samples/package-lock.json | 2 +- src/samples/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/samples/package-lock.json b/src/samples/package-lock.json index 4f7b0bae..abbbef80 100644 --- a/src/samples/package-lock.json +++ b/src/samples/package-lock.json @@ -6624,4 +6624,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/samples/package.json b/src/samples/package.json index f41ae5f7..88d2b9ee 100644 --- a/src/samples/package.json +++ b/src/samples/package.json @@ -22,4 +22,4 @@ "dependencies": { "uuid": "^11.1.0" } -} \ No newline at end of file +} From f5bd2a8abbf114cb13255b90545d337660b978e6 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Mon, 29 Dec 2025 08:39:07 +0000 Subject: [PATCH 48/64] create grpc userBuilder --- src/grpc/utils/to_proto.ts | 3 ++- src/server/express/json_rpc_handler.ts | 2 +- src/server/grpc/common.ts | 10 ++++++++++ src/server/grpc/grpc_handler.ts | 13 ++++--------- 4 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 src/server/grpc/common.ts diff --git a/src/grpc/utils/to_proto.ts b/src/grpc/utils/to_proto.ts index 2218a286..25160428 100644 --- a/src/grpc/utils/to_proto.ts +++ b/src/grpc/utils/to_proto.ts @@ -38,7 +38,8 @@ export class ToProto { description: agentCard.description, url: agentCard.url, preferredTransport: agentCard.preferredTransport ?? '', - additionalInterfaces: agentCard.additionalInterfaces?.map((i) => ToProto.agentInterface(i)) ?? [], + additionalInterfaces: + agentCard.additionalInterfaces?.map((i) => ToProto.agentInterface(i)) ?? [], provider: ToProto.agentProvider(agentCard.provider), version: agentCard.version, documentationUrl: agentCard.documentationUrl ?? '', diff --git a/src/server/express/json_rpc_handler.ts b/src/server/express/json_rpc_handler.ts index b3a9c59a..e6d985be 100644 --- a/src/server/express/json_rpc_handler.ts +++ b/src/server/express/json_rpc_handler.ts @@ -44,7 +44,7 @@ export function jsonRpcHandler(options: JsonRpcHandlerOptions): RequestHandler { const user = await options.userBuilder(req); const context = new ServerCallContext( Extensions.parseServiceParameter(req.header(HTTP_EXTENSION_HEADER)), - user ?? new UnauthenticatedUser() + user ); const rpcResponseOrStream = await jsonRpcTransportHandler.handle(req.body, context); diff --git a/src/server/grpc/common.ts b/src/server/grpc/common.ts new file mode 100644 index 00000000..1868943c --- /dev/null +++ b/src/server/grpc/common.ts @@ -0,0 +1,10 @@ +import * as grpc from '@grpc/grpc-js'; +import { UnauthenticatedUser, User } from '../authentication/user.js'; + +export type UserBuilder = ( + call: grpc.ServerUnaryCall | grpc.ServerWritableStream + ) => Promise; + +export const UserBuilder = { + noAuthentication: () => Promise.resolve(new UnauthenticatedUser()), +}; \ No newline at end of file diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index c11588c4..7a84ee49 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -25,7 +25,7 @@ import { ToProto } from '../../grpc/utils/to_proto.js'; import { GrpcTransportHandler } from '../transports/grpc/grpc_transport_handler.js'; import { ServerCallContext } from '../context.js'; import { Extensions } from '../../extensions.js'; -import { User, UnauthenticatedUser } from '../authentication/user.js'; +import { UserBuilder } from './common.js'; import { HTTP_EXTENSION_HEADER } from '../../constants.js'; import { A2AError } from '../error.js'; @@ -34,9 +34,7 @@ import { A2AError } from '../error.js'; */ export interface GrpcHandlerOptions { requestHandler: A2ARequestHandler; - userBuilder: ( - call: grpc.ServerUnaryCall | grpc.ServerWritableStream - ) => Promise; + userBuilder: UserBuilder; } /** @@ -252,16 +250,13 @@ const mapToError = (error: unknown): Partial => { const buildContext = async ( call: grpc.ServerUnaryCall | grpc.ServerWritableStream, - userBuilder: GrpcHandlerOptions['userBuilder'] + userBuilder: UserBuilder ): Promise => { const user = await userBuilder(call); const extensionHeaders = call.metadata.get(HTTP_EXTENSION_HEADER); const extensionString = extensionHeaders.map((v) => v.toString()).join(','); - return new ServerCallContext( - Extensions.parseServiceParameter(extensionString), - user ?? new UnauthenticatedUser() - ); + return new ServerCallContext(Extensions.parseServiceParameter(extensionString), user); }; const buildMetadata = (context: ServerCallContext): grpc.Metadata => { From 44f1dbe905bf94a5646f2b52352ace30d75bf1c4 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Mon, 29 Dec 2025 09:20:36 +0000 Subject: [PATCH 49/64] add example for grpc handler --- src/server/grpc/grpc_handler.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index 7a84ee49..9aac4851 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -44,6 +44,13 @@ export interface GrpcHandlerOptions { * * @param requestHandler - The core A2A request handler for business logic. * @returns An object that implements the A2AServiceServer interface. + * + * @example + * ```ts + * const server = new grpc.Server(); + * const requestHandler = new DefaultRequestHandler(...); + * server.addService(A2AService, grpcHandler({ requestHandler, userBuilder: UserBuilder.noAuthentication })); + * ``` */ export function grpcHandler(options: GrpcHandlerOptions): A2AServiceServer { const grpcTransportHandler = new GrpcTransportHandler(options.requestHandler); From 929b8dd9096653ff46eaf4f6caae5545e1d8ce6d Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Mon, 29 Dec 2025 09:55:25 +0000 Subject: [PATCH 50/64] fix tests --- src/types.ts | 2 +- test/server/grpc/from_proto.spec.ts | 2 +- test/server/grpc/grpc_handler.spec.ts | 4 ++-- test/server/grpc/to_proto.spec.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/types.ts b/src/types.ts index 4f332f94..4c6d5f5a 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1764,7 +1764,7 @@ export interface Message1 { * The current status of the task, including its state and a descriptive message. */ export interface TaskStatus { - message?: Message; + message?: Message2; /** * The current state of the task's lifecycle. */ diff --git a/test/server/grpc/from_proto.spec.ts b/test/server/grpc/from_proto.spec.ts index b41acc99..ac43a449 100644 --- a/test/server/grpc/from_proto.spec.ts +++ b/test/server/grpc/from_proto.spec.ts @@ -4,7 +4,7 @@ import * as proto from '../../../src/grpc/a2a.js'; import * as idDecoding from '../../../src/grpc/utils/id_decoding.js'; import { A2AError } from '../../../src/server/index.js'; -vi.mock('../../src/grpc/utils/id_decoding', () => ({ +vi.mock('../../../src/grpc/utils/id_decoding.js', () => ({ extractTaskId: vi.fn(), extractPushNotificationConfigId: vi.fn(), })); diff --git a/test/server/grpc/grpc_handler.spec.ts b/test/server/grpc/grpc_handler.spec.ts index ac62d780..b8fb3e5b 100644 --- a/test/server/grpc/grpc_handler.spec.ts +++ b/test/server/grpc/grpc_handler.spec.ts @@ -7,8 +7,8 @@ import { AgentCard, HTTP_EXTENSION_HEADER, MessageSendParams, Task } from '../.. import { ToProto } from '../../../src/grpc/utils/to_proto.js'; import { FromProto } from '../../../src/grpc/utils/from_proto.js'; -vi.mock('../../src/grpc/utils/from_proto.js'); -vi.mock('../../src/grpc/utils/to_proto.js'); +vi.mock('../../../src/grpc/utils/from_proto.js'); +vi.mock('../../../src/grpc/utils/to_proto.js'); describe('grpcHandler', () => { let mockRequestHandler: A2ARequestHandler; diff --git a/test/server/grpc/to_proto.spec.ts b/test/server/grpc/to_proto.spec.ts index 59d32ef3..70ccd1e4 100644 --- a/test/server/grpc/to_proto.spec.ts +++ b/test/server/grpc/to_proto.spec.ts @@ -5,7 +5,7 @@ import * as proto from '../../../src/grpc/a2a.js'; import * as idDecoding from '../../../src/grpc/utils/id_decoding.js'; import { A2AError } from '../../../src/server/index.js'; -vi.mock('../../src/grpc/utils/id_decoding', () => ({ +vi.mock('../../../src/grpc/utils/id_decoding.js', () => ({ generatePushNotificationConfigName: vi.fn(), })); From ae7d2c2e21f354160647cc2c14cf613b919c5c00 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Mon, 29 Dec 2025 10:03:30 +0000 Subject: [PATCH 51/64] fix typo --- vitest.edge.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vitest.edge.config.ts b/vitest.edge.config.ts index 817e95b9..aede574e 100644 --- a/vitest.edge.config.ts +++ b/vitest.edge.config.ts @@ -7,7 +7,7 @@ export default defineWorkersConfig( test: { exclude: [ // Express tests require Node.js-specific APIs (http, Express framework) - 'test/server/a2a_express_app.spec.ts', + 'test/server/express/**', // gRpc test require Node.js-specific gRPC module 'test/server/grpc/*.spec.ts', 'test/e2e.spec.ts', From ca8e775231de5d1977b5632a344905bb405185d1 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Mon, 29 Dec 2025 10:12:18 +0000 Subject: [PATCH 52/64] run linter --- src/server/express/json_rpc_handler.ts | 1 - src/server/grpc/common.ts | 6 +++--- src/server/grpc/grpc_handler.ts | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/server/express/json_rpc_handler.ts b/src/server/express/json_rpc_handler.ts index e6d985be..35e56366 100644 --- a/src/server/express/json_rpc_handler.ts +++ b/src/server/express/json_rpc_handler.ts @@ -11,7 +11,6 @@ import { A2ARequestHandler } from '../request_handler/a2a_request_handler.js'; import { JsonRpcTransportHandler } from '../transports/jsonrpc/jsonrpc_transport_handler.js'; import { ServerCallContext } from '../context.js'; import { HTTP_EXTENSION_HEADER } from '../../constants.js'; -import { UnauthenticatedUser } from '../authentication/user.js'; import { UserBuilder } from './common.js'; import { SSE_HEADERS, formatSSEEvent, formatSSEErrorEvent } from '../../sse_utils.js'; import { Extensions } from '../../extensions.js'; diff --git a/src/server/grpc/common.ts b/src/server/grpc/common.ts index 1868943c..9b58b7e4 100644 --- a/src/server/grpc/common.ts +++ b/src/server/grpc/common.ts @@ -2,9 +2,9 @@ import * as grpc from '@grpc/grpc-js'; import { UnauthenticatedUser, User } from '../authentication/user.js'; export type UserBuilder = ( - call: grpc.ServerUnaryCall | grpc.ServerWritableStream - ) => Promise; + call: grpc.ServerUnaryCall | grpc.ServerWritableStream +) => Promise; export const UserBuilder = { noAuthentication: () => Promise.resolve(new UnauthenticatedUser()), -}; \ No newline at end of file +}; diff --git a/src/server/grpc/grpc_handler.ts b/src/server/grpc/grpc_handler.ts index 9aac4851..d22d77c0 100644 --- a/src/server/grpc/grpc_handler.ts +++ b/src/server/grpc/grpc_handler.ts @@ -44,7 +44,7 @@ export interface GrpcHandlerOptions { * * @param requestHandler - The core A2A request handler for business logic. * @returns An object that implements the A2AServiceServer interface. - * + * * @example * ```ts * const server = new grpc.Server(); From ee204d0817283f8f76cffc5885902d9f09b44c46 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Mon, 29 Dec 2025 10:41:34 +0000 Subject: [PATCH 53/64] change id regex --- src/grpc/utils/id_decoding.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/grpc/utils/id_decoding.ts b/src/grpc/utils/id_decoding.ts index ebc7a371..97d36f5e 100644 --- a/src/grpc/utils/id_decoding.ts +++ b/src/grpc/utils/id_decoding.ts @@ -1,7 +1,7 @@ import { A2AError } from '../../server/error.js'; -const TASK_ID_REGEX = /tasks\/([^/]+)/; -const CONFIG_ID_REGEX = /pushNotificationConfigs\/([^/]+)/; +const TASK_ID_REGEX = /^tasks\/([^/]+)/; +const CONFIG_ID_REGEX = /pushNotificationConfigs\/([^/]+)$/; export const extractTaskId = (name: string): string => { const match = name.match(TASK_ID_REGEX); From 736fa520485cd80f75d27ec894f0b5c75a2cdbc4 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Mon, 29 Dec 2025 10:56:07 +0000 Subject: [PATCH 54/64] update regex id extraction --- src/grpc/utils/from_proto.ts | 13 +++++++------ src/grpc/utils/id_decoding.ts | 14 ++++++++------ test/server/grpc/from_proto.spec.ts | 10 ++++------ 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/grpc/utils/from_proto.ts b/src/grpc/utils/from_proto.ts index 4e016f24..6c1accdc 100644 --- a/src/grpc/utils/from_proto.ts +++ b/src/grpc/utils/from_proto.ts @@ -15,7 +15,7 @@ import { Part, } from '../a2a.js'; import * as types from '../../types.js'; -import { extractTaskId, extractPushNotificationConfigId } from './id_decoding.js'; +import { extractTaskId, extractTaskAndPushNotificationConfigId } from './id_decoding.js'; /** * Converts proto types to internal types. @@ -37,9 +37,10 @@ export class FromProto { static getTaskPushNotificationConfigParams( request: GetTaskPushNotificationConfigRequest ): types.GetTaskPushNotificationConfigParams { + const { taskId, configId } = extractTaskAndPushNotificationConfigId(request.name); return { - id: extractTaskId(request.name), - pushNotificationConfigId: extractPushNotificationConfigId(request.name), + id: taskId, + pushNotificationConfigId: configId, }; } @@ -70,10 +71,10 @@ export class FromProto { static deleteTaskPushNotificationConfigParams( request: DeleteTaskPushNotificationConfigRequest ): types.DeleteTaskPushNotificationConfigParams { - const name = request.name; + const { taskId, configId } = extractTaskAndPushNotificationConfigId(request.name); return { - id: extractTaskId(name), - pushNotificationConfigId: extractPushNotificationConfigId(name), + id: taskId, + pushNotificationConfigId: configId, }; } diff --git a/src/grpc/utils/id_decoding.ts b/src/grpc/utils/id_decoding.ts index 97d36f5e..22a64778 100644 --- a/src/grpc/utils/id_decoding.ts +++ b/src/grpc/utils/id_decoding.ts @@ -1,10 +1,10 @@ import { A2AError } from '../../server/error.js'; -const TASK_ID_REGEX = /^tasks\/([^/]+)/; -const CONFIG_ID_REGEX = /pushNotificationConfigs\/([^/]+)$/; +const CONFIG_REGEX = /^tasks\/([^/]+)\/pushNotificationConfigs\/([^/]+)$/; +const TASK_ONLY_REGEX = /^tasks\/([^/]+)$/; export const extractTaskId = (name: string): string => { - const match = name.match(TASK_ID_REGEX); + const match = name.match(TASK_ONLY_REGEX); if (!match) { throw A2AError.invalidParams(`Invalid or missing task ID in: "${name}"`); } @@ -15,12 +15,14 @@ export const generateTaskName = (taskId: string): string => { return `tasks/${taskId}`; }; -export const extractPushNotificationConfigId = (name: string): string => { - const match = name.match(CONFIG_ID_REGEX); +export const extractTaskAndPushNotificationConfigId = ( + name: string +): { taskId: string; configId: string } => { + const match = name.match(CONFIG_REGEX); if (!match) { throw A2AError.invalidParams(`Invalid or missing config ID in: "${name}"`); } - return match[1]; + return { taskId: match[1], configId: match[2] }; }; export const generatePushNotificationConfigName = (taskId: string, configId: string): string => { diff --git a/test/server/grpc/from_proto.spec.ts b/test/server/grpc/from_proto.spec.ts index ac43a449..10882466 100644 --- a/test/server/grpc/from_proto.spec.ts +++ b/test/server/grpc/from_proto.spec.ts @@ -6,13 +6,13 @@ import { A2AError } from '../../../src/server/index.js'; vi.mock('../../../src/grpc/utils/id_decoding.js', () => ({ extractTaskId: vi.fn(), - extractPushNotificationConfigId: vi.fn(), + extractTaskAndPushNotificationConfigId: vi.fn(), })); describe('FromProto', () => { beforeEach(() => { vi.mocked(idDecoding.extractTaskId).mockReturnValue('task-123'); - vi.mocked(idDecoding.extractPushNotificationConfigId).mockReturnValue('pnc-456'); + vi.mocked(idDecoding.extractTaskAndPushNotificationConfigId).mockReturnValue({ taskId: 'task-123', configId: 'pnc-456'}); }); it('should convert GetTaskRequest to taskQueryParams', () => { @@ -44,8 +44,7 @@ describe('FromProto', () => { name: 'tasks/task-123/pushNotificationConfigs/pnc-456', }; const result = FromProto.getTaskPushNotificationConfigParams(request); - expect(idDecoding.extractTaskId).toHaveBeenCalledWith(request.name); - expect(idDecoding.extractPushNotificationConfigId).toHaveBeenCalledWith(request.name); + expect(idDecoding.extractTaskAndPushNotificationConfigId).toHaveBeenCalledWith(request.name); expect(result).toEqual({ id: 'task-123', pushNotificationConfigId: 'pnc-456', @@ -97,8 +96,7 @@ describe('FromProto', () => { name: 'tasks/task-123/pushNotificationConfigs/pnc-456', }; const result = FromProto.deleteTaskPushNotificationConfigParams(request); - expect(idDecoding.extractTaskId).toHaveBeenCalledWith(request.name); - expect(idDecoding.extractPushNotificationConfigId).toHaveBeenCalledWith(request.name); + expect(idDecoding.extractTaskAndPushNotificationConfigId).toHaveBeenCalledWith(request.name); expect(result).toEqual({ id: 'task-123', pushNotificationConfigId: 'pnc-456', From 1e8316f4b2d75d25e509f5d44000dafceb0765f9 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Mon, 29 Dec 2025 11:33:01 +0000 Subject: [PATCH 55/64] run linter --- test/server/grpc/from_proto.spec.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/server/grpc/from_proto.spec.ts b/test/server/grpc/from_proto.spec.ts index 10882466..39d61559 100644 --- a/test/server/grpc/from_proto.spec.ts +++ b/test/server/grpc/from_proto.spec.ts @@ -12,7 +12,10 @@ vi.mock('../../../src/grpc/utils/id_decoding.js', () => ({ describe('FromProto', () => { beforeEach(() => { vi.mocked(idDecoding.extractTaskId).mockReturnValue('task-123'); - vi.mocked(idDecoding.extractTaskAndPushNotificationConfigId).mockReturnValue({ taskId: 'task-123', configId: 'pnc-456'}); + vi.mocked(idDecoding.extractTaskAndPushNotificationConfigId).mockReturnValue({ + taskId: 'task-123', + configId: 'pnc-456', + }); }); it('should convert GetTaskRequest to taskQueryParams', () => { From e60330c4de6c4d475fdd55ae26a34642d2ef9da0 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Mon, 29 Dec 2025 18:28:18 +0000 Subject: [PATCH 56/64] wip --- src/client/transports/grpc_transport.ts | 280 ++++++++++++++++++++++++ src/grpc/utils/from_proto.ts | 175 +++++++++++++++ src/grpc/utils/to_proto.ts | 69 +++++- 3 files changed, 523 insertions(+), 1 deletion(-) create mode 100644 src/client/transports/grpc_transport.ts diff --git a/src/client/transports/grpc_transport.ts b/src/client/transports/grpc_transport.ts new file mode 100644 index 00000000..6ace99f0 --- /dev/null +++ b/src/client/transports/grpc_transport.ts @@ -0,0 +1,280 @@ +import { + CallOptions, + credentials, + ServiceError, + Metadata, + ClientUnaryCall, + ClientReadableStream, + status, +} from '@grpc/grpc-js'; +import { TransportProtocolName } from '../../core.js'; +import { A2AServiceClient, StreamResponse } from '../../grpc/a2a.js'; +import { + MessageSendParams, + TaskPushNotificationConfig, + TaskIdParams, + ListTaskPushNotificationConfigParams, + DeleteTaskPushNotificationConfigParams, + TaskQueryParams, + Task, + AgentCard, + GetTaskPushNotificationConfigParams, +} from '../../types.js'; +import { A2AStreamEventData, SendMessageResult } from '../client.js'; +import { RequestOptions } from '../multitransport-client.js'; +import { Transport, TransportFactory } from './transport.js'; +import { ToProto } from '../../grpc/utils/to_proto.js'; +import { FromProto } from '../../grpc/utils/from_proto.js'; +import { + A2A_ERROR_CODE, + AuthenticatedExtendedCardNotConfiguredError, + ContentTypeNotSupportedError, + InvalidAgentResponseError, + PushNotificationNotSupportedError, + TaskNotFoundError, + TaskNotCancelableError, + UnsupportedOperationError, +} from '../../errors.js'; +type GrpcUnaryCall = ( + request: TParams, + metadata: Metadata, + options: Partial, + callback: (error: ServiceError | null, response: TResponse) => void +) => ClientUnaryCall; + +type GrpcStreamCall = ( + request: TParams, + metadata?: Metadata, + options?: Partial +) => ClientReadableStream; + +export interface GrpcTransportOptions { + endpoint: string; + gprcCallOptions?: Partial; +} + +export class GrpcTransport implements Transport { + private readonly gprcCallOptions?: Partial; + private readonly endpoint: string; + private readonly grpcClient: A2AServiceClient; + + constructor(options: GrpcTransportOptions) { + this.endpoint = options.endpoint; + this.gprcCallOptions = options.gprcCallOptions; + this.grpcClient = new A2AServiceClient( + this.endpoint, + credentials.createInsecure() + ); + } + + async getExtendedAgentCard(options?: RequestOptions): Promise { + const rpcResponse = await this._sendGrpcRequest( + 'getAgentCard', + undefined, + options, + () => {}, + FromProto.agentCard + ); + return rpcResponse; + } + + async sendMessage( + params: MessageSendParams, + options?: RequestOptions + ): Promise { + const rpcResponse = await this._sendGrpcRequest( + 'sendMessage', + params, + options, + ToProto.messageSendParams, + FromProto.sendMessageResult + ); + return rpcResponse; + } + + async *sendMessageStream( + params: MessageSendParams, + options?: RequestOptions + ): AsyncGenerator { + yield* this._sendGrpcStreamingRequest('sendStreamingMessage', params, options); + } + + async setTaskPushNotificationConfig( + params: TaskPushNotificationConfig, + options?: RequestOptions, + ): Promise { + const rpcResponse = await this._sendGrpcRequest( + 'createTaskPushNotificationConfig', + params, + options, + ToProto.taskPushNotificationConfig, + FromProto.setTaskPushNotificationConfigParams + ); + return rpcResponse; + } + + async getTaskPushNotificationConfig( + params: GetTaskPushNotificationConfigParams, + options?: RequestOptions, + ): Promise { + const rpcResponse = await this._sendGrpcRequest('getTaskPushNotificationConfig', params, options, ToProto.getTaskPushNotificationConfigRequest, FromProto.getTaskPushNoticationConfig); + return rpcResponse; + } + + async listTaskPushNotificationConfig( + params: ListTaskPushNotificationConfigParams, + options?: RequestOptions, + ): Promise { + const rpcResponse = await this._sendGrpcRequest('listTaskPushNotificationConfig', params, options, ToProto.listTaskPushNotificationConfigRequest, FromProto.listTaskPushNotificationConfig); + return rpcResponse; + } + + async deleteTaskPushNotificationConfig( + params: DeleteTaskPushNotificationConfigParams, + options?: RequestOptions, + ): Promise { + await this._sendGrpcRequest('deleteTaskPushNotificationConfig', params, options, ToProto.deleteTaskPushNotificationConfigRequest, () => {}); + } + + async getTask( + params: TaskQueryParams, + options?: RequestOptions, + ): Promise { + const rpcResponse = await this._sendGrpcRequest( + 'getTask', + params, + options, + ToProto.getTaskRequest, + FromProto.task + ); + return rpcResponse; + } + + async cancelTask( + params: TaskIdParams, + options?: RequestOptions, + ): Promise { + const rpcResponse = await this._sendGrpcRequest( + 'cancelTask', + params, + options, + ToProto.cancelTaskRequest, + FromProto.task + ); + return rpcResponse; + } + + async *resubscribeTask( + params: TaskIdParams, + options?: RequestOptions + ): AsyncGenerator { + yield* this._sendGrpcStreamingRequest('taskSubscription', params, options); + } + + private async _sendGrpcRequest( + method: keyof A2AServiceClient, + params: TParams, + options: RequestOptions | undefined, + parser: (req: TParams) => TReq, + converter: (res: TRes) => TResponse + ): Promise { + return new Promise((resolve, reject) => { + const clientMethod = this.grpcClient[method] as GrpcUnaryCall; + clientMethod( + parser(params), + this._buildMetadata(options), + this.gprcCallOptions ?? {}, + (error, response) => { + if (error) { + return reject(GrpcTransport.mapToError(error)); + } + resolve(converter(response)); + } + ); + }); + } + + private async * _sendGrpcStreamingRequest( + method: 'sendStreamingMessage' | 'taskSubscription', + params: TParams, + options: RequestOptions | undefined +): AsyncGenerator { + const clientMethod = this.grpcClient[method] as GrpcStreamCall; + const streamResponse = clientMethod( + params, + this._buildMetadata(options), + this.gprcCallOptions ?? {}, + ); + try { + for await (const response of streamResponse) { + const payload = response.payload; + switch (payload.$case) { + case 'msg': + yield FromProto.message(payload.value); + break; + case 'task': + yield FromProto.task(payload.value); + break; + case 'statusUpdate': + yield FromProto.taskStatusUpdate(payload.value); + break; + case 'artifactUpdate': + yield FromProto.taskArtifactUpdate(payload.value); + break; + } + } + } catch (error) { + if (error instanceof ServiceError) { + throw error; + } + } +} + + private _buildMetadata(options?: RequestOptions): Metadata { + const metadata = new Metadata(); + if (options?.serviceParameters) { + for (const [key, value] of Object.entries(options.serviceParameters)) { + metadata.set(key, value); + } + } + return metadata; + } + + private static mapToError(error: ServiceError): Error { + switch (error.code) { + case status.NOT_FOUND: + return new TaskNotFoundError(error.details); + case status.FAILED_PRECONDITION: + return new TaskNotCancelableError(error.details); + case status.UNIMPLEMENTED: + return new UnsupportedOperationError(error.details); + case status.INVALID_ARGUMENT: + return new ContentTypeNotSupportedError(error.details); + case status.INTERNAL: + return new InvalidAgentResponseError(error.details); + default: + return error; + } + } +} + +export class GrpcTransportFactoryOptions { + grpcCallOptions?: Partial; +} + +export class GrpcTransportFactory implements TransportFactory { + public static readonly name: TransportProtocolName = 'GRPC'; + + constructor(private readonly options?: GrpcTransportFactoryOptions) {} + + get protocolName(): string { + return GrpcTransportFactory.name; + } + + async create(url: string, _agentCard: AgentCard): Promise { + return new GrpcTransport({ + endpoint: url, + gprcCallOptions: this.options?.grpcCallOptions, + }); + } +} diff --git a/src/grpc/utils/from_proto.ts b/src/grpc/utils/from_proto.ts index 6c1accdc..00ebbca7 100644 --- a/src/grpc/utils/from_proto.ts +++ b/src/grpc/utils/from_proto.ts @@ -13,6 +13,21 @@ import { AuthenticationInfo, SendMessageRequest, Part, + SendMessageResponse, + Task, + TaskStatus, + TaskState, + Artifact, + TaskPushNotificationConfig, + ListTaskPushNotificationConfigResponse, + AgentCard, + Security, + StringList, + SecurityScheme, + AgentSkill, + AgentCardSignature, + TaskStatusUpdateEvent, + TaskArtifactUpdateEvent, } from '../a2a.js'; import * as types from '../../types.js'; import { extractTaskId, extractTaskAndPushNotificationConfigId } from './id_decoding.js'; @@ -194,4 +209,164 @@ export class FromProto { metadata: request.metadata, }; } + + static sendMessageResult(response: SendMessageResponse): types.Task | types.Message { + if (response.payload?.$case === 'task') { + return FromProto.task(response.payload.value); + } else if (response.payload?.$case === 'msg') { + return FromProto.message(response.payload.value); + } + throw A2AError.invalidParams('Invalid SendMessageResponse: missing result'); + } + + static task(task: Task): types.Task { + return { + kind: 'task', + id: task.id, + status: FromProto.taskStatus(task.status), + contextId: task.contextId, + artifacts: task.artifacts?.map((a) => FromProto.artifact(a)), + history: task.history?.map((h) => FromProto.message(h)), + metadata: task.metadata, + }; + } + + static taskStatus(status: TaskStatus): types.TaskStatus { + return { + message: FromProto.message(status.update), + state: FromProto.taskState(status.state), + timestamp: status.timestamp?.toDateString(), + }; + } + + static taskState(state: TaskState): types.TaskState { + switch (state) { + case TaskState.TASK_STATE_SUBMITTED: + return 'submitted'; + case TaskState.TASK_STATE_WORKING: + return 'working'; + case TaskState.TASK_STATE_INPUT_REQUIRED: + return 'input-required'; + case TaskState.TASK_STATE_COMPLETED: + return 'completed'; + case TaskState.TASK_STATE_CANCELLED: + return 'canceled'; + case TaskState.TASK_STATE_FAILED: + return 'failed'; + case TaskState.TASK_STATE_REJECTED: + return 'rejected'; + case TaskState.TASK_STATE_AUTH_REQUIRED: + return 'auth-required'; + case TaskState.TASK_STATE_UNSPECIFIED: + return 'unknown'; + default: + throw A2AError.invalidParams(`Invalid task state: ${state}`); + } + } + + static artifact(artifact: Artifact): types.Artifact { + return { + artifactId: artifact.artifactId, + name: artifact.name, + description: artifact.description, + parts: artifact.parts.map((p) => FromProto.parts(p)), + metadata: artifact.metadata, + }; + } + + static getTaskPushNoticationConfig(request: TaskPushNotificationConfig): types.TaskPushNotificationConfig { + return { + taskId: extractTaskId(request.name), + pushNotificationConfig: FromProto.pushNotificationConfig(request.pushNotificationConfig), + }; + } + + static listTaskPushNotificationConfig(request: ListTaskPushNotificationConfigResponse): types.TaskPushNotificationConfig[] { + return request.configs.map((c) => FromProto.getTaskPushNoticationConfig(c)); + } + + static agentCard(agentCard: AgentCard): types.AgentCard { + return { + additionalInterfaces: agentCard.additionalInterfaces, + capabilities: agentCard.capabilities, + defaultInputModes: agentCard.defaultInputModes, + defaultOutputModes: agentCard.defaultOutputModes, + description: agentCard.description, + documentationUrl: agentCard.documentationUrl, + name: agentCard.name, + preferredTransport: agentCard.preferredTransport, + provider: agentCard.provider, + protocolVersion: agentCard.protocolVersion, + security: agentCard.security?.map(s => FromProto.security(s)), + securitySchemes: FromProto.securitySchemes(agentCard.securitySchemes), + skills: agentCard.skills.map(s => FromProto.skills(s)), + signatures: agentCard.signatures?.map(s => FromProto.signatures(s)), + supportsAuthenticatedExtendedCard: agentCard.supportsAuthenticatedExtendedCard, + url: agentCard.url, + version: agentCard.version, + } + } + + static security(security: Security): { [k: string]: string[] } { + return Object.fromEntries( + Object.entries(security.schemes).map(([key, value]) => [ + key, + value as unknown as string[] + ]) + ); +} + +static securitySchemes(securitySchemes: SecurityScheme): { + [k: string]: types.SecurityScheme; + } { + return Object.fromEntries( + Object.entries(securitySchemes).map(([key, value]) => [ + key, + value, + ]) + ); + } + + static skills(skill: AgentSkill): types.AgentSkill { + return { + id: skill.id, + name: skill.name, + description: skill.description, + tags: skill.tags, + examples: skill.examples, + inputModes: skill.inputModes, + outputModes: skill.outputModes, + security: skill.security?.map(s => FromProto.security(s)), + } + } + + static signatures(signatures: AgentCardSignature): types.AgentCardSignature { + return { + protected: signatures.protected, + signature: signatures.signature, + header: signatures.header, + } +} + +static taskStatusUpdate(event: TaskStatusUpdateEvent): types.TaskStatusUpdateEvent { + return { + kind: 'status-update', + taskId: event.taskId, + status: FromProto.taskStatus(event.status), + contextId: event.contextId, + metadata: event.metadata, + final: event.final, + } +} + +static taskArtifactUpdate(event: TaskArtifactUpdateEvent): types.TaskArtifactUpdateEvent { + return { + kind: 'artifact-update', + taskId: event.taskId, + artifact: FromProto.artifact(event.artifact), + contextId: event.contextId, + metadata: event.metadata, + lastChunk: event.lastChunk, + } +} } diff --git a/src/grpc/utils/to_proto.ts b/src/grpc/utils/to_proto.ts index 25160428..89424c53 100644 --- a/src/grpc/utils/to_proto.ts +++ b/src/grpc/utils/to_proto.ts @@ -27,8 +27,15 @@ import { TaskStatusUpdateEvent, ListTaskPushNotificationConfigResponse, AgentSkill, + SendMessageRequest, + SendMessageConfiguration, + GetTaskPushNotificationConfigRequest, + ListTaskPushNotificationConfigRequest, + DeleteTaskPushNotificationConfigRequest, + GetTaskRequest, + CancelTaskRequest, } from '../a2a.js'; -import { generatePushNotificationConfigName } from './id_decoding.js'; +import { generatePushNotificationConfigName, generateTaskName } from './id_decoding.js'; export class ToProto { static agentCard(agentCard: types.AgentCard): AgentCard { @@ -244,6 +251,32 @@ export class ToProto { }; } + static getTaskPushNotificationConfigRequest( + config: types.GetTaskPushNotificationConfigParams + ): GetTaskPushNotificationConfigRequest { + return { + name: generatePushNotificationConfigName(config.id, config.pushNotificationConfigId), + }; + } + + static listTaskPushNotificationConfigRequest( + config: types.ListTaskPushNotificationConfigParams + ): ListTaskPushNotificationConfigRequest { + return { + parent: generateTaskName(config.id), + pageToken: '', + pageSize: 0, + }; + } + + static deleteTaskPushNotificationConfigRequest( + config: types.DeleteTaskPushNotificationConfigParams + ): DeleteTaskPushNotificationConfigRequest { + return { + name: generatePushNotificationConfigName(config.id, config.pushNotificationConfigId), + } + } + static taskPushNotificationConfig( config: types.TaskPushNotificationConfig ): TaskPushNotificationConfig { @@ -468,4 +501,38 @@ export class ToProto { } throw A2AError.internalError('Invalid part type'); } + + static messageSendParams(params: types.MessageSendParams): SendMessageRequest { + return { + request: ToProto.message(params.message), + configuration: ToProto.configuration(params.configuration), + metadata: params.metadata, + }; + } + + static configuration(configuration: types.MessageSendConfiguration): SendMessageConfiguration { + if (!configuration) { + return undefined; + } + + return { + blocking: configuration.blocking ?? false, + acceptedOutputModes: configuration.acceptedOutputModes ?? [], + pushNotification: ToProto.pushNotificationConfig(configuration.pushNotificationConfig), + historyLength: configuration.historyLength ?? 0, + }; + } + + static getTaskRequest(params: types.TaskQueryParams): GetTaskRequest { + return { + name: generateTaskName(params.id), + historyLength: params.historyLength ?? 0, + }; + } + + static cancelTaskRequest(params: types.TaskIdParams): CancelTaskRequest { + return { + name: generateTaskName(params.id), + }; + } } From 350d6518102eb6fda9e109789d64ec1ebf4fd43e Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Tue, 30 Dec 2025 08:45:38 +0000 Subject: [PATCH 57/64] wip --- src/client/transports/grpc_transport.ts | 158 ++++++++++++++---------- src/grpc/utils/from_proto.ts | 81 ++++++------ src/grpc/utils/to_proto.ts | 2 +- 3 files changed, 132 insertions(+), 109 deletions(-) diff --git a/src/client/transports/grpc_transport.ts b/src/client/transports/grpc_transport.ts index 6ace99f0..353677ac 100644 --- a/src/client/transports/grpc_transport.ts +++ b/src/client/transports/grpc_transport.ts @@ -5,7 +5,6 @@ import { Metadata, ClientUnaryCall, ClientReadableStream, - status, } from '@grpc/grpc-js'; import { TransportProtocolName } from '../../core.js'; import { A2AServiceClient, StreamResponse } from '../../grpc/a2a.js'; @@ -35,6 +34,7 @@ import { TaskNotCancelableError, UnsupportedOperationError, } from '../../errors.js'; + type GrpcUnaryCall = ( request: TParams, metadata: Metadata, @@ -61,10 +61,7 @@ export class GrpcTransport implements Transport { constructor(options: GrpcTransportOptions) { this.endpoint = options.endpoint; this.gprcCallOptions = options.gprcCallOptions; - this.grpcClient = new A2AServiceClient( - this.endpoint, - credentials.createInsecure() - ); + this.grpcClient = new A2AServiceClient(this.endpoint, credentials.createInsecure()); } async getExtendedAgentCard(options?: RequestOptions): Promise { @@ -101,7 +98,7 @@ export class GrpcTransport implements Transport { async setTaskPushNotificationConfig( params: TaskPushNotificationConfig, - options?: RequestOptions, + options?: RequestOptions ): Promise { const rpcResponse = await this._sendGrpcRequest( 'createTaskPushNotificationConfig', @@ -115,31 +112,46 @@ export class GrpcTransport implements Transport { async getTaskPushNotificationConfig( params: GetTaskPushNotificationConfigParams, - options?: RequestOptions, + options?: RequestOptions ): Promise { - const rpcResponse = await this._sendGrpcRequest('getTaskPushNotificationConfig', params, options, ToProto.getTaskPushNotificationConfigRequest, FromProto.getTaskPushNoticationConfig); + const rpcResponse = await this._sendGrpcRequest( + 'getTaskPushNotificationConfig', + params, + options, + ToProto.getTaskPushNotificationConfigRequest, + FromProto.getTaskPushNoticationConfig + ); return rpcResponse; } async listTaskPushNotificationConfig( params: ListTaskPushNotificationConfigParams, - options?: RequestOptions, + options?: RequestOptions ): Promise { - const rpcResponse = await this._sendGrpcRequest('listTaskPushNotificationConfig', params, options, ToProto.listTaskPushNotificationConfigRequest, FromProto.listTaskPushNotificationConfig); + const rpcResponse = await this._sendGrpcRequest( + 'listTaskPushNotificationConfig', + params, + options, + ToProto.listTaskPushNotificationConfigRequest, + FromProto.listTaskPushNotificationConfig + ); return rpcResponse; } async deleteTaskPushNotificationConfig( params: DeleteTaskPushNotificationConfigParams, - options?: RequestOptions, + options?: RequestOptions ): Promise { - await this._sendGrpcRequest('deleteTaskPushNotificationConfig', params, options, ToProto.deleteTaskPushNotificationConfigRequest, () => {}); + await this._sendGrpcRequest( + 'deleteTaskPushNotificationConfig', + params, + options, + ToProto.deleteTaskPushNotificationConfigRequest, + () => {} + ); } - async getTask( - params: TaskQueryParams, - options?: RequestOptions, - ): Promise { + async getTask(params: TaskQueryParams, options?: RequestOptions): Promise { const rpcResponse = await this._sendGrpcRequest( 'getTask', params, @@ -150,10 +162,7 @@ export class GrpcTransport implements Transport { return rpcResponse; } - async cancelTask( - params: TaskIdParams, - options?: RequestOptions, - ): Promise { + async cancelTask(params: TaskIdParams, options?: RequestOptions): Promise { const rpcResponse = await this._sendGrpcRequest( 'cancelTask', params, @@ -186,7 +195,10 @@ export class GrpcTransport implements Transport { this.gprcCallOptions ?? {}, (error, response) => { if (error) { - return reject(GrpcTransport.mapToError(error)); + if (this.isGrpcError(error) && this.isGrpcA2AError(error)) { + return reject(GrpcTransport.mapToError(error)); + } + return reject(new Error(`GRPC error for ${String(method)}! Cause: ${error}`)); } resolve(converter(response)); } @@ -194,41 +206,50 @@ export class GrpcTransport implements Transport { }); } - private async * _sendGrpcStreamingRequest( - method: 'sendStreamingMessage' | 'taskSubscription', - params: TParams, - options: RequestOptions | undefined -): AsyncGenerator { - const clientMethod = this.grpcClient[method] as GrpcStreamCall; - const streamResponse = clientMethod( - params, - this._buildMetadata(options), - this.gprcCallOptions ?? {}, - ); - try { - for await (const response of streamResponse) { - const payload = response.payload; - switch (payload.$case) { - case 'msg': - yield FromProto.message(payload.value); - break; - case 'task': - yield FromProto.task(payload.value); - break; - case 'statusUpdate': - yield FromProto.taskStatusUpdate(payload.value); - break; - case 'artifactUpdate': - yield FromProto.taskArtifactUpdate(payload.value); - break; + private async *_sendGrpcStreamingRequest( + method: 'sendStreamingMessage' | 'taskSubscription', + params: TParams, + options: RequestOptions | undefined + ): AsyncGenerator { + const clientMethod = this.grpcClient[method] as GrpcStreamCall; + const streamResponse = clientMethod( + params, + this._buildMetadata(options), + this.gprcCallOptions ?? {} + ); + try { + for await (const response of streamResponse) { + const payload = response.payload; + switch (payload.$case) { + case 'msg': + yield FromProto.message(payload.value); + break; + case 'task': + yield FromProto.task(payload.value); + break; + case 'statusUpdate': + yield FromProto.taskStatusUpdate(payload.value); + break; + case 'artifactUpdate': + yield FromProto.taskArtifactUpdate(payload.value); + break; + } + } + } catch (error) { + if (this.isGrpcError(error) && this.isGrpcA2AError(error)) { + throw GrpcTransport.mapToError(error); + } else { + throw new Error(`GRPC error for ${method}! Cause: ${error}`); } - } - } catch (error) { - if (error instanceof ServiceError) { - throw error; } } -} + + private isGrpcA2AError(error: ServiceError): boolean { + return error.metadata.get('a2a-error').length > 0; + } + private isGrpcError(error: unknown): error is ServiceError { + return typeof error === 'object' && error !== null && 'code' in error; + } private _buildMetadata(options?: RequestOptions): Metadata { const metadata = new Metadata(); @@ -241,19 +262,26 @@ export class GrpcTransport implements Transport { } private static mapToError(error: ServiceError): Error { - switch (error.code) { - case status.NOT_FOUND: - return new TaskNotFoundError(error.details); - case status.FAILED_PRECONDITION: - return new TaskNotCancelableError(error.details); - case status.UNIMPLEMENTED: - return new UnsupportedOperationError(error.details); - case status.INVALID_ARGUMENT: - return new ContentTypeNotSupportedError(error.details); - case status.INTERNAL: - return new InvalidAgentResponseError(error.details); + const a2aErrorCode = Number(error.metadata.get('a2a-error')[0]); + switch (a2aErrorCode) { + case A2A_ERROR_CODE.TASK_NOT_FOUND: + return new TaskNotFoundError(error.message); + case A2A_ERROR_CODE.TASK_NOT_CANCELABLE: + return new TaskNotCancelableError(error.message); + case A2A_ERROR_CODE.PUSH_NOTIFICATION_NOT_SUPPORTED: + return new PushNotificationNotSupportedError(error.message); + case A2A_ERROR_CODE.UNSUPPORTED_OPERATION: + return new UnsupportedOperationError(error.message); + case A2A_ERROR_CODE.CONTENT_TYPE_NOT_SUPPORTED: + return new ContentTypeNotSupportedError(error.message); + case A2A_ERROR_CODE.INVALID_AGENT_RESPONSE: + return new InvalidAgentResponseError(error.message); + case A2A_ERROR_CODE.AUTHENTICATED_EXTENDED_CARD_NOT_CONFIGURED: + return new AuthenticatedExtendedCardNotConfiguredError(error.message); default: - return error; + return new Error( + `GRPC error: ${error.message} Code: ${error.code} Details: ${error.details}` + ); } } } diff --git a/src/grpc/utils/from_proto.ts b/src/grpc/utils/from_proto.ts index 00ebbca7..b12de832 100644 --- a/src/grpc/utils/from_proto.ts +++ b/src/grpc/utils/from_proto.ts @@ -22,7 +22,6 @@ import { ListTaskPushNotificationConfigResponse, AgentCard, Security, - StringList, SecurityScheme, AgentSkill, AgentCardSignature, @@ -274,14 +273,18 @@ export class FromProto { }; } - static getTaskPushNoticationConfig(request: TaskPushNotificationConfig): types.TaskPushNotificationConfig { + static getTaskPushNoticationConfig( + request: TaskPushNotificationConfig + ): types.TaskPushNotificationConfig { return { taskId: extractTaskId(request.name), pushNotificationConfig: FromProto.pushNotificationConfig(request.pushNotificationConfig), }; } - static listTaskPushNotificationConfig(request: ListTaskPushNotificationConfigResponse): types.TaskPushNotificationConfig[] { + static listTaskPushNotificationConfig( + request: ListTaskPushNotificationConfigResponse + ): types.TaskPushNotificationConfig[] { return request.configs.map((c) => FromProto.getTaskPushNoticationConfig(c)); } @@ -297,34 +300,26 @@ export class FromProto { preferredTransport: agentCard.preferredTransport, provider: agentCard.provider, protocolVersion: agentCard.protocolVersion, - security: agentCard.security?.map(s => FromProto.security(s)), + security: agentCard.security?.map((s) => FromProto.security(s)), securitySchemes: FromProto.securitySchemes(agentCard.securitySchemes), - skills: agentCard.skills.map(s => FromProto.skills(s)), - signatures: agentCard.signatures?.map(s => FromProto.signatures(s)), + skills: agentCard.skills.map((s) => FromProto.skills(s)), + signatures: agentCard.signatures?.map((s) => FromProto.signatures(s)), supportsAuthenticatedExtendedCard: agentCard.supportsAuthenticatedExtendedCard, url: agentCard.url, version: agentCard.version, - } + }; } static security(security: Security): { [k: string]: string[] } { - return Object.fromEntries( - Object.entries(security.schemes).map(([key, value]) => [ - key, - value as unknown as string[] - ]) - ); -} + return Object.fromEntries( + Object.entries(security.schemes).map(([key, value]) => [key, value as unknown as string[]]) + ); + } -static securitySchemes(securitySchemes: SecurityScheme): { + static securitySchemes(securitySchemes: SecurityScheme): { [k: string]: types.SecurityScheme; } { - return Object.fromEntries( - Object.entries(securitySchemes).map(([key, value]) => [ - key, - value, - ]) - ); + return Object.fromEntries(Object.entries(securitySchemes).map(([key, value]) => [key, value])); } static skills(skill: AgentSkill): types.AgentSkill { @@ -336,8 +331,8 @@ static securitySchemes(securitySchemes: SecurityScheme): { examples: skill.examples, inputModes: skill.inputModes, outputModes: skill.outputModes, - security: skill.security?.map(s => FromProto.security(s)), - } + security: skill.security?.map((s) => FromProto.security(s)), + }; } static signatures(signatures: AgentCardSignature): types.AgentCardSignature { @@ -345,28 +340,28 @@ static securitySchemes(securitySchemes: SecurityScheme): { protected: signatures.protected, signature: signatures.signature, header: signatures.header, - } -} + }; + } -static taskStatusUpdate(event: TaskStatusUpdateEvent): types.TaskStatusUpdateEvent { - return { - kind: 'status-update', - taskId: event.taskId, - status: FromProto.taskStatus(event.status), - contextId: event.contextId, - metadata: event.metadata, - final: event.final, + static taskStatusUpdate(event: TaskStatusUpdateEvent): types.TaskStatusUpdateEvent { + return { + kind: 'status-update', + taskId: event.taskId, + status: FromProto.taskStatus(event.status), + contextId: event.contextId, + metadata: event.metadata, + final: event.final, + }; } -} -static taskArtifactUpdate(event: TaskArtifactUpdateEvent): types.TaskArtifactUpdateEvent { - return { - kind: 'artifact-update', - taskId: event.taskId, - artifact: FromProto.artifact(event.artifact), - contextId: event.contextId, - metadata: event.metadata, - lastChunk: event.lastChunk, + static taskArtifactUpdate(event: TaskArtifactUpdateEvent): types.TaskArtifactUpdateEvent { + return { + kind: 'artifact-update', + taskId: event.taskId, + artifact: FromProto.artifact(event.artifact), + contextId: event.contextId, + metadata: event.metadata, + lastChunk: event.lastChunk, + }; } } -} diff --git a/src/grpc/utils/to_proto.ts b/src/grpc/utils/to_proto.ts index 89424c53..29c841ce 100644 --- a/src/grpc/utils/to_proto.ts +++ b/src/grpc/utils/to_proto.ts @@ -274,7 +274,7 @@ export class ToProto { ): DeleteTaskPushNotificationConfigRequest { return { name: generatePushNotificationConfigName(config.id, config.pushNotificationConfigId), - } + }; } static taskPushNotificationConfig( From 09d66e2aab1a1302d55c45c94a97f510827b83d8 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Tue, 30 Dec 2025 10:11:36 +0000 Subject: [PATCH 58/64] wip --- src/client/transports/grpc_transport.ts | 60 ++++++++++++++++--------- src/grpc/utils/to_proto.ts | 7 +++ 2 files changed, 45 insertions(+), 22 deletions(-) diff --git a/src/client/transports/grpc_transport.ts b/src/client/transports/grpc_transport.ts index 353677ac..76ee1397 100644 --- a/src/client/transports/grpc_transport.ts +++ b/src/client/transports/grpc_transport.ts @@ -35,18 +35,18 @@ import { UnsupportedOperationError, } from '../../errors.js'; -type GrpcUnaryCall = ( - request: TParams, +type GrpcUnaryCall = ( + request: TReq, metadata: Metadata, options: Partial, - callback: (error: ServiceError | null, response: TResponse) => void + callback: (error: ServiceError | null, response: TRes) => void ) => ClientUnaryCall; -type GrpcStreamCall = ( - request: TParams, +type GrpcStreamCall = ( + request: TReq, metadata?: Metadata, options?: Partial -) => ClientReadableStream; +) => ClientReadableStream; export interface GrpcTransportOptions { endpoint: string; @@ -93,7 +93,7 @@ export class GrpcTransport implements Transport { params: MessageSendParams, options?: RequestOptions ): AsyncGenerator { - yield* this._sendGrpcStreamingRequest('sendStreamingMessage', params, options); + yield* this._sendGrpcStreamingRequest('sendStreamingMessage', params, options, ToProto.messageSendParams); } async setTaskPushNotificationConfig( @@ -177,7 +177,7 @@ export class GrpcTransport implements Transport { params: TaskIdParams, options?: RequestOptions ): AsyncGenerator { - yield* this._sendGrpcStreamingRequest('taskSubscription', params, options); + yield* this._sendGrpcStreamingRequest('taskSubscription', params, options, ToProto.taskIdParams); } private async _sendGrpcRequest( @@ -195,10 +195,15 @@ export class GrpcTransport implements Transport { this.gprcCallOptions ?? {}, (error, response) => { if (error) { - if (this.isGrpcError(error) && this.isGrpcA2AError(error)) { + if (this.isA2AServiceError(error)) { return reject(GrpcTransport.mapToError(error)); } - return reject(new Error(`GRPC error for ${String(method)}! Cause: ${error}`)); + const statusInfo = 'code' in error ? `(Status: ${error.code})` : ''; + return reject( + new Error(`GRPC error for ${String(method)}! ${statusInfo} ${error.message}`, { + cause: error, + }) + ); } resolve(converter(response)); } @@ -206,14 +211,15 @@ export class GrpcTransport implements Transport { }); } - private async *_sendGrpcStreamingRequest( + private async *_sendGrpcStreamingRequest( method: 'sendStreamingMessage' | 'taskSubscription', params: TParams, - options: RequestOptions | undefined + options: RequestOptions | undefined, + parser: (req: TParams) => TReq ): AsyncGenerator { - const clientMethod = this.grpcClient[method] as GrpcStreamCall; + const clientMethod = this.grpcClient[method] as GrpcStreamCall; const streamResponse = clientMethod( - params, + parser(params), this._buildMetadata(options), this.gprcCallOptions ?? {} ); @@ -236,18 +242,28 @@ export class GrpcTransport implements Transport { } } } catch (error) { - if (this.isGrpcError(error) && this.isGrpcA2AError(error)) { - throw GrpcTransport.mapToError(error); + if (this.isServiceError(error)) { + if (this.isA2AServiceError(error)) { + throw GrpcTransport.mapToError(error); + } + throw new Error(`GRPC error for ${String(method)}! ${error.code} ${error.message}`, { + cause: error, + }); } else { - throw new Error(`GRPC error for ${method}! Cause: ${error}`); + throw error; } + } finally { + streamResponse.cancel(); } } - private isGrpcA2AError(error: ServiceError): boolean { - return error.metadata.get('a2a-error').length > 0; + private isA2AServiceError(error: ServiceError): boolean { + return ( + typeof error === 'object' && error !== null && error.metadata.get('a2a-error').length === 1 + ); } - private isGrpcError(error: unknown): error is ServiceError { + + private isServiceError(error: unknown): error is ServiceError { return typeof error === 'object' && error !== null && 'code' in error; } @@ -262,8 +278,8 @@ export class GrpcTransport implements Transport { } private static mapToError(error: ServiceError): Error { - const a2aErrorCode = Number(error.metadata.get('a2a-error')[0]); - switch (a2aErrorCode) { + const a2aErrorCode = error.metadata.get('a2a-error'); + switch (Number(a2aErrorCode[0])) { case A2A_ERROR_CODE.TASK_NOT_FOUND: return new TaskNotFoundError(error.message); case A2A_ERROR_CODE.TASK_NOT_CANCELABLE: diff --git a/src/grpc/utils/to_proto.ts b/src/grpc/utils/to_proto.ts index 29c841ce..0f2963c8 100644 --- a/src/grpc/utils/to_proto.ts +++ b/src/grpc/utils/to_proto.ts @@ -34,6 +34,7 @@ import { DeleteTaskPushNotificationConfigRequest, GetTaskRequest, CancelTaskRequest, + TaskSubscriptionRequest, } from '../a2a.js'; import { generatePushNotificationConfigName, generateTaskName } from './id_decoding.js'; @@ -535,4 +536,10 @@ export class ToProto { name: generateTaskName(params.id), }; } + + static taskIdParams(params: types.TaskIdParams): TaskSubscriptionRequest { + return { + name: generateTaskName(params.id), + }; + } } From 28be6aaf4a35d31874ee81c24862cc5af906e227 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Tue, 30 Dec 2025 11:19:17 +0000 Subject: [PATCH 59/64] wip tests --- src/client/transports/grpc_transport.ts | 22 +- test/client/transports/grpc_transport.spec.ts | 301 ++++++++++++++++++ 2 files changed, 313 insertions(+), 10 deletions(-) create mode 100644 test/client/transports/grpc_transport.spec.ts diff --git a/src/client/transports/grpc_transport.ts b/src/client/transports/grpc_transport.ts index 76ee1397..ff12da02 100644 --- a/src/client/transports/grpc_transport.ts +++ b/src/client/transports/grpc_transport.ts @@ -5,6 +5,7 @@ import { Metadata, ClientUnaryCall, ClientReadableStream, + ChannelCredentials } from '@grpc/grpc-js'; import { TransportProtocolName } from '../../core.js'; import { A2AServiceClient, StreamResponse } from '../../grpc/a2a.js'; @@ -50,18 +51,17 @@ type GrpcStreamCall = ( export interface GrpcTransportOptions { endpoint: string; - gprcCallOptions?: Partial; + grpcChannelCredentials?: ChannelCredentials; + grpcCallOptions?: Partial; } export class GrpcTransport implements Transport { - private readonly gprcCallOptions?: Partial; - private readonly endpoint: string; + private readonly grpcCallOptions?: Partial; private readonly grpcClient: A2AServiceClient; constructor(options: GrpcTransportOptions) { - this.endpoint = options.endpoint; - this.gprcCallOptions = options.gprcCallOptions; - this.grpcClient = new A2AServiceClient(this.endpoint, credentials.createInsecure()); + this.grpcCallOptions = options.grpcCallOptions; + this.grpcClient = new A2AServiceClient(options.endpoint, options.grpcChannelCredentials ?? credentials.createInsecure()); } async getExtendedAgentCard(options?: RequestOptions): Promise { @@ -188,11 +188,11 @@ export class GrpcTransport implements Transport { converter: (res: TRes) => TResponse ): Promise { return new Promise((resolve, reject) => { - const clientMethod = this.grpcClient[method] as GrpcUnaryCall; + const clientMethod = this.grpcClient[method] as unknown as GrpcUnaryCall; clientMethod( parser(params), this._buildMetadata(options), - this.gprcCallOptions ?? {}, + this.grpcCallOptions ?? {}, (error, response) => { if (error) { if (this.isA2AServiceError(error)) { @@ -221,7 +221,7 @@ export class GrpcTransport implements Transport { const streamResponse = clientMethod( parser(params), this._buildMetadata(options), - this.gprcCallOptions ?? {} + this.grpcCallOptions ?? {} ); try { for await (const response of streamResponse) { @@ -303,6 +303,7 @@ export class GrpcTransport implements Transport { } export class GrpcTransportFactoryOptions { + grpcChannelCredentials?: ChannelCredentials; grpcCallOptions?: Partial; } @@ -318,7 +319,8 @@ export class GrpcTransportFactory implements TransportFactory { async create(url: string, _agentCard: AgentCard): Promise { return new GrpcTransport({ endpoint: url, - gprcCallOptions: this.options?.grpcCallOptions, + grpcChannelCredentials: this.options?.grpcChannelCredentials, + grpcCallOptions: this.options?.grpcCallOptions, }); } } diff --git a/test/client/transports/grpc_transport.spec.ts b/test/client/transports/grpc_transport.spec.ts new file mode 100644 index 00000000..c4aa6358 --- /dev/null +++ b/test/client/transports/grpc_transport.spec.ts @@ -0,0 +1,301 @@ +import { + GrpcTransport, + GrpcTransportFactory, +} from '../../../src/client/transports/grpc_transport.js'; +import { A2AServiceClient } from '../../../src/grpc/a2a.js'; +import { ToProto } from '../../../src/grpc/utils/to_proto.js'; +import { FromProto } from '../../../src/grpc/utils/from_proto.js'; +import { describe, it, beforeEach, afterEach, expect, vi, type Mock } from 'vitest'; +import { ServiceError, Metadata } from '@grpc/grpc-js'; +import { + A2A_ERROR_CODE, + TaskNotFoundError, + TaskNotCancelableError, + PushNotificationNotSupportedError, +} from '../../../src/errors.js'; +import { + createMessageParams, + createMockAgentCard, + createMockMessage, + createMockTask, +} from '../util.js'; +import { TaskPushNotificationConfig } from '../../../src/types.js'; + +vi.mock('../../../src/grpc/utils/from_proto.js'); +vi.mock('../../../src/grpc/utils/to_proto.js'); + +// 1. Use vi.hoisted to ensure these mocks exist before the mock factory runs +const { mockGrpcMethods } = vi.hoisted(() => { + return { + mockGrpcMethods: { + getAgentCard: vi.fn(), + sendMessage: vi.fn(), + sendStreamingMessage: vi.fn(), + createTaskPushNotificationConfig: vi.fn(), + getTaskPushNotificationConfig: vi.fn(), + listTaskPushNotificationConfig: vi.fn(), + deleteTaskPushNotificationConfig: vi.fn(), + getTask: vi.fn(), + cancelTask: vi.fn(), + taskSubscription: vi.fn(), + }, + }; +}); + +// 2. Mock the gRPC Service Client using the hoisted object +vi.mock('../../../src/grpc/a2a.js', () => { + return { + A2AServiceClient: vi.fn().mockImplementation(() => mockGrpcMethods), + }; +}); + +const createGrpcError = (code: number, message: string, a2aCode?: number): ServiceError => { + const metadata = new Metadata(); + if (a2aCode !== undefined) { + metadata.add('a2a-error', a2aCode.toString()); + } + return { + name: 'ServiceError', + message, + code, + details: message, + metadata, + }; +}; + +describe('GrpcTransport', () => { + let transport: GrpcTransport; + const endpoint = 'localhost:50051'; + + beforeEach(() => { + vi.clearAllMocks(); + transport = new GrpcTransport({ endpoint }); + }); + + afterEach(() => { + vi.restoreAllMocks(); + }); + + describe('constructor', () => { + it('should initialize the A2AServiceClient with the correct endpoint', () => { + // Ensure the constructor was called + expect(A2AServiceClient).toHaveBeenCalledWith(endpoint, expect.anything()); + }); + }); + + describe('sendMessage', () => { + it('should send message successfully', async () => { + const params = createMessageParams(); + const mockResponse = createMockMessage(); + + // Setup unary call mock + (mockGrpcMethods.sendMessage as Mock).mockImplementation((req, meta, opts, callback) => { + callback(null, mockResponse); // Success callback + return { cancel: vi.fn() }; + }); + + const result = await transport.sendMessage(params); + + expect(result).to.deep.equal(mockResponse); + expect(ToProto.messageSendParams).toHaveBeenCalledWith(params); + expect(mockGrpcMethods.sendMessage).toHaveBeenCalledTimes(1); + expect(FromProto.sendMessageResult).toHaveBeenCalledWith(mockResponse); + }); + + it('should pass service parameters in metadata', async () => { + const params = createMessageParams(); + const options = { serviceParameters: { 'x-trace-id': '123' } }; + + (mockGrpcMethods.sendMessage as Mock).mockImplementation((req, meta: Metadata, opts, callback) => { + expect(meta.get('x-trace-id')).to.deep.equal(['123']); + callback(null, createMockMessage()); + return { cancel: vi.fn() }; + }); + + await transport.sendMessage(params, options); + }); + + it('should throw TaskNotFoundError on mapped gRPC error', async () => { + const params = createMessageParams(); + const error = createGrpcError( + 5, // NOT_FOUND + 'Task not found', + A2A_ERROR_CODE.TASK_NOT_FOUND + ); + + (mockGrpcMethods.sendMessage as Mock).mockImplementation((req, meta, opts, callback) => { + callback(error, null); + return { cancel: vi.fn() }; + }); + + await expect(transport.sendMessage(params)).rejects.toThrow(TaskNotFoundError); + }); + }); + + describe('sendMessageStream', () => { + it('should yield streaming events successfully', async () => { + const params = createMessageParams(); + const mockMsg = createMockMessage(); + + const streamData = [ + { payload: { $case: 'msg', value: mockMsg } }, + { payload: { $case: 'task', value: { id: 't1' } } }, + ]; + + const mockStream = { + [Symbol.asyncIterator]: async function* () { + for (const item of streamData) yield item; + }, + cancel: vi.fn(), + }; + + (mockGrpcMethods.sendStreamingMessage as Mock).mockReturnValue(mockStream); + + const iterator = transport.sendMessageStream(params); + + const first = await iterator.next(); + expect(first.value).to.deep.equal(mockMsg); + + const second = await iterator.next(); + expect(second.value).to.deep.equal({ id: 't1' }); + + const third = await iterator.next(); + expect(third.done).to.be.true; + }); + }); + + describe('getTask', () => { + it('should get task successfully', async () => { + const taskId = 'task-123'; + const mockTask = createMockTask(taskId); + + (mockGrpcMethods.getTask as Mock).mockImplementation((req, meta, opts, callback) => { + callback(null, mockTask); + return { cancel: vi.fn() }; + }); + + const result = await transport.getTask({ id: taskId }); + expect(result).to.deep.equal(mockTask); + }); + }); + + describe('cancelTask', () => { + it('should cancel task successfully', async () => { + const taskId = 'task-123'; + const mockTask = createMockTask(taskId, 'canceled'); + + (mockGrpcMethods.cancelTask as Mock).mockImplementation((req, meta, opts, callback) => { + callback(null, mockTask); + return { cancel: vi.fn() }; + }); + + const result = await transport.cancelTask({ id: taskId }); + expect(result).to.deep.equal(mockTask); + }); + + it('should throw TaskNotCancelableError on specific A2A code', async () => { + const error = createGrpcError( + 9, // FAILED_PRECONDITION + 'Cannot cancel', + A2A_ERROR_CODE.TASK_NOT_CANCELABLE + ); + + (mockGrpcMethods.cancelTask as Mock).mockImplementation((req, meta, opts, callback) => { + callback(error, null); + return { cancel: vi.fn() }; + }); + + await expect(transport.cancelTask({ id: 'task-123' })).rejects.toThrow( + TaskNotCancelableError + ); + }); + }); + + describe('getExtendedAgentCard', () => { + it('should get agent card successfully', async () => { + const mockCard = { + name: 'Test Agent', + url: endpoint, + }; + + (mockGrpcMethods.getAgentCard as Mock).mockImplementation((req, meta, opts, callback) => { + callback(null, mockCard); + return { cancel: vi.fn() }; + }); + + const result = await transport.getExtendedAgentCard(); + expect(result).to.deep.equal(mockCard); + }); + }); + + describe('Push Notification Config', () => { + const taskId = 'task-123'; + const configId = 'config-456'; + const mockConfig: TaskPushNotificationConfig = { + taskId, + pushNotificationConfig: { + id: configId, + url: 'https://notify.example.com/webhook', + }, + }; + + describe('setTaskPushNotificationConfig', () => { + it('should set config successfully', async () => { + (mockGrpcMethods.createTaskPushNotificationConfig as Mock).mockImplementation((req, meta, opts, callback) => { + callback(null, mockConfig); + return { cancel: vi.fn() }; + }); + + const result = await transport.setTaskPushNotificationConfig(mockConfig); + expect(result).to.deep.equal(mockConfig); + }); + }); + + describe('getTaskPushNotificationConfig', () => { + it('should get config successfully', async () => { + (mockGrpcMethods.getTaskPushNotificationConfig as Mock).mockImplementation((req, meta, opts, callback) => { + callback(null, mockConfig); + return { cancel: vi.fn() }; + }); + + const result = await transport.getTaskPushNotificationConfig({ + id: taskId, + pushNotificationConfigId: configId, + }); + + expect(result).to.deep.equal(mockConfig); + }); + }); + + describe('listTaskPushNotificationConfig', () => { + it('should list configs successfully', async () => { + const mockList = [mockConfig]; + + (mockGrpcMethods.listTaskPushNotificationConfig as Mock).mockImplementation((req, meta, opts, callback) => { + callback(null, mockList); + return { cancel: vi.fn() }; + }); + + const result = await transport.listTaskPushNotificationConfig({ id: taskId }); + + expect(result).to.deep.equal(mockList); + }); + }); + + describe('deleteTaskPushNotificationConfig', () => { + it('should delete config successfully', async () => { + (mockGrpcMethods.deleteTaskPushNotificationConfig as Mock).mockImplementation((req, meta, opts, callback) => { + callback(null, {}); + return { cancel: vi.fn() }; + }); + + await transport.deleteTaskPushNotificationConfig({ + id: taskId, + pushNotificationConfigId: configId, + }); + + expect(mockGrpcMethods.deleteTaskPushNotificationConfig).toHaveBeenCalled(); + }); + }); + }); +}); \ No newline at end of file From bd4615120035e54031d1e9d836e61fd344fc575e Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Tue, 30 Dec 2025 14:20:20 +0000 Subject: [PATCH 60/64] add tests --- src/client/transports/grpc_transport.ts | 46 ++- test/client/transports/grpc_transport.spec.ts | 363 ++++++++++-------- 2 files changed, 237 insertions(+), 172 deletions(-) diff --git a/src/client/transports/grpc_transport.ts b/src/client/transports/grpc_transport.ts index ff12da02..10e36a9a 100644 --- a/src/client/transports/grpc_transport.ts +++ b/src/client/transports/grpc_transport.ts @@ -5,10 +5,10 @@ import { Metadata, ClientUnaryCall, ClientReadableStream, - ChannelCredentials + ChannelCredentials, } from '@grpc/grpc-js'; import { TransportProtocolName } from '../../core.js'; -import { A2AServiceClient, StreamResponse } from '../../grpc/a2a.js'; +import { A2AServiceClient } from '../../grpc/a2a.js'; import { MessageSendParams, TaskPushNotificationConfig, @@ -51,6 +51,7 @@ type GrpcStreamCall = ( export interface GrpcTransportOptions { endpoint: string; + grpcClient?: A2AServiceClient; grpcChannelCredentials?: ChannelCredentials; grpcCallOptions?: Partial; } @@ -61,7 +62,10 @@ export class GrpcTransport implements Transport { constructor(options: GrpcTransportOptions) { this.grpcCallOptions = options.grpcCallOptions; - this.grpcClient = new A2AServiceClient(options.endpoint, options.grpcChannelCredentials ?? credentials.createInsecure()); + this.grpcClient = options.grpcClient ?? new A2AServiceClient( + options.endpoint, + options.grpcChannelCredentials ?? credentials.createInsecure() + ); } async getExtendedAgentCard(options?: RequestOptions): Promise { @@ -69,6 +73,7 @@ export class GrpcTransport implements Transport { 'getAgentCard', undefined, options, + this.grpcClient.getAgentCard.bind(this.grpcClient), () => {}, FromProto.agentCard ); @@ -83,6 +88,7 @@ export class GrpcTransport implements Transport { 'sendMessage', params, options, + this.grpcClient.sendMessage.bind(this.grpcClient), ToProto.messageSendParams, FromProto.sendMessageResult ); @@ -93,7 +99,13 @@ export class GrpcTransport implements Transport { params: MessageSendParams, options?: RequestOptions ): AsyncGenerator { - yield* this._sendGrpcStreamingRequest('sendStreamingMessage', params, options, ToProto.messageSendParams); + yield* this._sendGrpcStreamingRequest( + 'sendStreamingMessage', + params, + options, + this.grpcClient.sendStreamingMessage.bind(this.grpcClient), + ToProto.messageSendParams + ); } async setTaskPushNotificationConfig( @@ -104,6 +116,7 @@ export class GrpcTransport implements Transport { 'createTaskPushNotificationConfig', params, options, + this.grpcClient.createTaskPushNotificationConfig.bind(this.grpcClient), ToProto.taskPushNotificationConfig, FromProto.setTaskPushNotificationConfigParams ); @@ -118,6 +131,7 @@ export class GrpcTransport implements Transport { 'getTaskPushNotificationConfig', params, options, + this.grpcClient.getTaskPushNotificationConfig.bind(this.grpcClient), ToProto.getTaskPushNotificationConfigRequest, FromProto.getTaskPushNoticationConfig ); @@ -132,6 +146,7 @@ export class GrpcTransport implements Transport { 'listTaskPushNotificationConfig', params, options, + this.grpcClient.listTaskPushNotificationConfig.bind(this.grpcClient), ToProto.listTaskPushNotificationConfigRequest, FromProto.listTaskPushNotificationConfig ); @@ -146,6 +161,7 @@ export class GrpcTransport implements Transport { 'deleteTaskPushNotificationConfig', params, options, + this.grpcClient.deleteTaskPushNotificationConfig.bind(this.grpcClient), ToProto.deleteTaskPushNotificationConfigRequest, () => {} ); @@ -156,6 +172,7 @@ export class GrpcTransport implements Transport { 'getTask', params, options, + this.grpcClient.getTask.bind(this.grpcClient), ToProto.getTaskRequest, FromProto.task ); @@ -167,6 +184,7 @@ export class GrpcTransport implements Transport { 'cancelTask', params, options, + this.grpcClient.cancelTask.bind(this.grpcClient), ToProto.cancelTaskRequest, FromProto.task ); @@ -177,19 +195,25 @@ export class GrpcTransport implements Transport { params: TaskIdParams, options?: RequestOptions ): AsyncGenerator { - yield* this._sendGrpcStreamingRequest('taskSubscription', params, options, ToProto.taskIdParams); + yield* this._sendGrpcStreamingRequest( + 'taskSubscription', + params, + options, + this.grpcClient.taskSubscription.bind(this.grpcClient), + ToProto.taskIdParams + ); } private async _sendGrpcRequest( method: keyof A2AServiceClient, params: TParams, options: RequestOptions | undefined, + call: GrpcUnaryCall, parser: (req: TParams) => TReq, converter: (res: TRes) => TResponse ): Promise { return new Promise((resolve, reject) => { - const clientMethod = this.grpcClient[method] as unknown as GrpcUnaryCall; - clientMethod( + call( parser(params), this._buildMetadata(options), this.grpcCallOptions ?? {}, @@ -215,10 +239,10 @@ export class GrpcTransport implements Transport { method: 'sendStreamingMessage' | 'taskSubscription', params: TParams, options: RequestOptions | undefined, + call: GrpcStreamCall, parser: (req: TParams) => TReq ): AsyncGenerator { - const clientMethod = this.grpcClient[method] as GrpcStreamCall; - const streamResponse = clientMethod( + const streamResponse = call( parser(params), this._buildMetadata(options), this.grpcCallOptions ?? {} @@ -259,7 +283,7 @@ export class GrpcTransport implements Transport { private isA2AServiceError(error: ServiceError): boolean { return ( - typeof error === 'object' && error !== null && error.metadata.get('a2a-error').length === 1 + typeof error === 'object' && error !== null && error.metadata?.get('a2a-error').length === 1 ); } @@ -303,6 +327,7 @@ export class GrpcTransport implements Transport { } export class GrpcTransportFactoryOptions { + grpcClient?: A2AServiceClient; grpcChannelCredentials?: ChannelCredentials; grpcCallOptions?: Partial; } @@ -319,6 +344,7 @@ export class GrpcTransportFactory implements TransportFactory { async create(url: string, _agentCard: AgentCard): Promise { return new GrpcTransport({ endpoint: url, + grpcClient: this.options?.grpcClient, grpcChannelCredentials: this.options?.grpcChannelCredentials, grpcCallOptions: this.options?.grpcCallOptions, }); diff --git a/test/client/transports/grpc_transport.spec.ts b/test/client/transports/grpc_transport.spec.ts index c4aa6358..f9db0328 100644 --- a/test/client/transports/grpc_transport.spec.ts +++ b/test/client/transports/grpc_transport.spec.ts @@ -1,3 +1,5 @@ +import { describe, it, beforeEach, afterEach, expect, vi, type Mock } from 'vitest'; +import { credentials, Metadata, ServiceError } from '@grpc/grpc-js'; import { GrpcTransport, GrpcTransportFactory, @@ -5,10 +7,7 @@ import { import { A2AServiceClient } from '../../../src/grpc/a2a.js'; import { ToProto } from '../../../src/grpc/utils/to_proto.js'; import { FromProto } from '../../../src/grpc/utils/from_proto.js'; -import { describe, it, beforeEach, afterEach, expect, vi, type Mock } from 'vitest'; -import { ServiceError, Metadata } from '@grpc/grpc-js'; import { - A2A_ERROR_CODE, TaskNotFoundError, TaskNotCancelableError, PushNotificationNotSupportedError, @@ -19,148 +18,179 @@ import { createMockMessage, createMockTask, } from '../util.js'; -import { TaskPushNotificationConfig } from '../../../src/types.js'; - -vi.mock('../../../src/grpc/utils/from_proto.js'); -vi.mock('../../../src/grpc/utils/to_proto.js'); - -// 1. Use vi.hoisted to ensure these mocks exist before the mock factory runs -const { mockGrpcMethods } = vi.hoisted(() => { - return { - mockGrpcMethods: { - getAgentCard: vi.fn(), - sendMessage: vi.fn(), - sendStreamingMessage: vi.fn(), - createTaskPushNotificationConfig: vi.fn(), - getTaskPushNotificationConfig: vi.fn(), - listTaskPushNotificationConfig: vi.fn(), - deleteTaskPushNotificationConfig: vi.fn(), - getTask: vi.fn(), - cancelTask: vi.fn(), - taskSubscription: vi.fn(), - }, - }; -}); -// 2. Mock the gRPC Service Client using the hoisted object +// --- Mocks --- + +// Mock the gRPC client class vi.mock('../../../src/grpc/a2a.js', () => { - return { - A2AServiceClient: vi.fn().mockImplementation(() => mockGrpcMethods), - }; + const A2AServiceClient = vi.fn(); + A2AServiceClient.prototype.getAgentCard = vi.fn(); + A2AServiceClient.prototype.sendMessage = vi.fn(); + A2AServiceClient.prototype.sendStreamingMessage = vi.fn(); + A2AServiceClient.prototype.createTaskPushNotificationConfig = vi.fn(); + A2AServiceClient.prototype.getTaskPushNotificationConfig = vi.fn(); + A2AServiceClient.prototype.listTaskPushNotificationConfig = vi.fn(); + A2AServiceClient.prototype.deleteTaskPushNotificationConfig = vi.fn(); + A2AServiceClient.prototype.getTask = vi.fn(); + A2AServiceClient.prototype.cancelTask = vi.fn(); + A2AServiceClient.prototype.taskSubscription = vi.fn(); + return { A2AServiceClient }; }); -const createGrpcError = (code: number, message: string, a2aCode?: number): ServiceError => { - const metadata = new Metadata(); - if (a2aCode !== undefined) { - metadata.add('a2a-error', a2aCode.toString()); - } - return { - name: 'ServiceError', - message, - code, - details: message, - metadata, - }; -}; +// Mock ToProto and FromProto to act as pass-throughs or return simple objects for testing flow +vi.mock('../../../src/grpc/utils/to_proto.js', () => ({ + ToProto: { + agentCard: vi.fn((x) => x), + messageSendParams: vi.fn((x) => x), + taskPushNotificationConfig: vi.fn((x) => x), + getTaskPushNotificationConfigRequest: vi.fn((x) => x), + listTaskPushNotificationConfigRequest: vi.fn((x) => x), + deleteTaskPushNotificationConfigRequest: vi.fn((x) => x), + getTaskRequest: vi.fn((x) => x), + cancelTaskRequest: vi.fn((x) => x), + taskIdParams: vi.fn((x) => x), + }, +})); + +vi.mock('../../../src/grpc/utils/from_proto.js', () => ({ + FromProto: { + agentCard: vi.fn((x) => x), + sendMessageResult: vi.fn((x) => x), + message: vi.fn((x) => x), + setTaskPushNotificationConfigParams: vi.fn((x) => x), + getTaskPushNoticationConfig: vi.fn((x) => x), + listTaskPushNotificationConfig: vi.fn((x) => x), + task: vi.fn((x) => x), + taskStatusUpdate: vi.fn((x) => x), + taskArtifactUpdate: vi.fn((x) => x), + }, +})); describe('GrpcTransport', () => { let transport: GrpcTransport; + let mockGrpcClient: A2AServiceClient; const endpoint = 'localhost:50051'; + // Helper to simulate a successful gRPC unary callback + const mockUnarySuccess = (method: Mock, response: any) => { + method.mockImplementation((_req: any, _meta: any, _opts: any, callback: any) => { + callback(null, response); + return {}; + }); + }; + + // Helper to simulate a gRPC error + const mockUnaryError = (method: Mock, code: number, message: string, a2aCode?: number) => { + method.mockImplementation((_req: any, _meta: any, _opts: any, callback: any) => { + const error: Partial = { + code, + message, + details: message, + metadata: new Metadata(), + }; + if (a2aCode !== undefined) { + error.metadata!.set('a2a-error', String(a2aCode)); + } + callback(error, null); + return {}; + }); + }; + beforeEach(() => { - vi.clearAllMocks(); - transport = new GrpcTransport({ endpoint }); + mockGrpcClient = new A2AServiceClient(endpoint, credentials.createInsecure()); + transport = new GrpcTransport({ endpoint, grpcClient: mockGrpcClient}); }); afterEach(() => { - vi.restoreAllMocks(); + vi.clearAllMocks(); }); - describe('constructor', () => { - it('should initialize the A2AServiceClient with the correct endpoint', () => { - // Ensure the constructor was called - expect(A2AServiceClient).toHaveBeenCalledWith(endpoint, expect.anything()); + describe('getExtendedAgentCard', () => { + it('should get agent card successfully', async () => { + const mockCard = createMockAgentCard(); + mockUnarySuccess(mockGrpcClient.getAgentCard as Mock, mockCard); + + const result = await transport.getExtendedAgentCard(); + + expect(result).toEqual(mockCard); + expect(mockGrpcClient.getAgentCard).toHaveBeenCalled(); + expect(FromProto.agentCard).toHaveBeenCalledWith(mockCard); }); }); describe('sendMessage', () => { it('should send message successfully', async () => { const params = createMessageParams(); - const mockResponse = createMockMessage(); - - // Setup unary call mock - (mockGrpcMethods.sendMessage as Mock).mockImplementation((req, meta, opts, callback) => { - callback(null, mockResponse); // Success callback - return { cancel: vi.fn() }; - }); + const mockResult = createMockMessage(); + mockUnarySuccess(mockGrpcClient.sendMessage as Mock, mockResult); const result = await transport.sendMessage(params); - expect(result).to.deep.equal(mockResponse); + expect(result).toEqual(mockResult); expect(ToProto.messageSendParams).toHaveBeenCalledWith(params); - expect(mockGrpcMethods.sendMessage).toHaveBeenCalledTimes(1); - expect(FromProto.sendMessageResult).toHaveBeenCalledWith(mockResponse); + expect(mockGrpcClient.sendMessage).toHaveBeenCalled(); }); - it('should pass service parameters in metadata', async () => { + it('should pass service parameters as metadata', async () => { const params = createMessageParams(); - const options = { serviceParameters: { 'x-trace-id': '123' } }; - - (mockGrpcMethods.sendMessage as Mock).mockImplementation((req, meta: Metadata, opts, callback) => { - expect(meta.get('x-trace-id')).to.deep.equal(['123']); - callback(null, createMockMessage()); - return { cancel: vi.fn() }; - }); + const options = { serviceParameters: { 'x-test-header': 'test-value' } }; + mockUnarySuccess(mockGrpcClient.sendMessage as Mock, {}); await transport.sendMessage(params, options); + + const calledMetadata = (mockGrpcClient.sendMessage as Mock).mock.calls[0][1] as Metadata; + expect(calledMetadata.get('x-test-header')).toEqual(['test-value']); }); - it('should throw TaskNotFoundError on mapped gRPC error', async () => { + it('should throw TaskNotFoundError when mapped from A2A error code', async () => { const params = createMessageParams(); - const error = createGrpcError( - 5, // NOT_FOUND - 'Task not found', - A2A_ERROR_CODE.TASK_NOT_FOUND - ); - - (mockGrpcMethods.sendMessage as Mock).mockImplementation((req, meta, opts, callback) => { - callback(error, null); - return { cancel: vi.fn() }; - }); + mockUnaryError(mockGrpcClient.sendMessage as Mock, 5, 'Task Missing', -32001); await expect(transport.sendMessage(params)).rejects.toThrow(TaskNotFoundError); }); + + it('should throw generic Error for unmapped gRPC errors', async () => { + const params = createMessageParams(); + mockUnaryError(mockGrpcClient.sendMessage as Mock, 13, 'Internal Error'); + + await expect(transport.sendMessage(params)).rejects.toThrow('GRPC error for sendMessage'); + }); }); describe('sendMessageStream', () => { - it('should yield streaming events successfully', async () => { + it('should yield messages from stream', async () => { const params = createMessageParams(); const mockMsg = createMockMessage(); - const streamData = [ - { payload: { $case: 'msg', value: mockMsg } }, - { payload: { $case: 'task', value: { id: 't1' } } }, - ]; - const mockStream = { [Symbol.asyncIterator]: async function* () { - for (const item of streamData) yield item; + yield { payload: { $case: 'msg', value: mockMsg } }; }, cancel: vi.fn(), }; - - (mockGrpcMethods.sendStreamingMessage as Mock).mockReturnValue(mockStream); + (mockGrpcClient.sendStreamingMessage as Mock).mockReturnValue(mockStream); const iterator = transport.sendMessageStream(params); - - const first = await iterator.next(); - expect(first.value).to.deep.equal(mockMsg); + const result = await iterator.next(); - const second = await iterator.next(); - expect(second.value).to.deep.equal({ id: 't1' }); + expect(result.value).toEqual(mockMsg); + expect(FromProto.message).toHaveBeenCalledWith(mockMsg); + expect(mockGrpcClient.sendStreamingMessage).toHaveBeenCalled(); + }); - const third = await iterator.next(); - expect(third.done).to.be.true; + it('should handle stream errors', async () => { + const params = createMessageParams(); + const mockStream = { + [Symbol.asyncIterator]: async function* () { + throw { code: 13, message: 'Stream failed' }; + yield {}; + }, + cancel: vi.fn(), + }; + (mockGrpcClient.sendStreamingMessage as Mock).mockReturnValue(mockStream); + + const iterator = transport.sendMessageStream(params); + await expect(iterator.next()).rejects.toThrow('GRPC error for sendStreamingMessage!'); }); }); @@ -168,14 +198,18 @@ describe('GrpcTransport', () => { it('should get task successfully', async () => { const taskId = 'task-123'; const mockTask = createMockTask(taskId); - - (mockGrpcMethods.getTask as Mock).mockImplementation((req, meta, opts, callback) => { - callback(null, mockTask); - return { cancel: vi.fn() }; - }); + mockUnarySuccess(mockGrpcClient.getTask as Mock, mockTask); const result = await transport.getTask({ id: taskId }); - expect(result).to.deep.equal(mockTask); + + expect(result).toEqual(mockTask); + expect(ToProto.getTaskRequest).toHaveBeenCalled(); + expect(mockGrpcClient.getTask).toHaveBeenCalled(); + }); + + it('should throw TaskNotFoundError', async () => { + mockUnaryError(mockGrpcClient.getTask as Mock, 5, 'Not Found', -32001); + await expect(transport.getTask({ id: 'bad-id' })).rejects.toThrow(TaskNotFoundError); }); }); @@ -183,119 +217,124 @@ describe('GrpcTransport', () => { it('should cancel task successfully', async () => { const taskId = 'task-123'; const mockTask = createMockTask(taskId, 'canceled'); - - (mockGrpcMethods.cancelTask as Mock).mockImplementation((req, meta, opts, callback) => { - callback(null, mockTask); - return { cancel: vi.fn() }; - }); + mockUnarySuccess(mockGrpcClient.cancelTask as Mock, mockTask); const result = await transport.cancelTask({ id: taskId }); - expect(result).to.deep.equal(mockTask); - }); - - it('should throw TaskNotCancelableError on specific A2A code', async () => { - const error = createGrpcError( - 9, // FAILED_PRECONDITION - 'Cannot cancel', - A2A_ERROR_CODE.TASK_NOT_CANCELABLE - ); - (mockGrpcMethods.cancelTask as Mock).mockImplementation((req, meta, opts, callback) => { - callback(error, null); - return { cancel: vi.fn() }; - }); + expect(result).toEqual(mockTask); + expect(mockGrpcClient.cancelTask).toHaveBeenCalled(); + }); + it('should throw TaskNotCancelableError', async () => { + mockUnaryError(mockGrpcClient.cancelTask as Mock, 9, 'Cannot cancel', -32002); await expect(transport.cancelTask({ id: 'task-123' })).rejects.toThrow( TaskNotCancelableError ); }); }); - describe('getExtendedAgentCard', () => { - it('should get agent card successfully', async () => { - const mockCard = { - name: 'Test Agent', - url: endpoint, - }; - - (mockGrpcMethods.getAgentCard as Mock).mockImplementation((req, meta, opts, callback) => { - callback(null, mockCard); - return { cancel: vi.fn() }; - }); - - const result = await transport.getExtendedAgentCard(); - expect(result).to.deep.equal(mockCard); - }); - }); - describe('Push Notification Config', () => { const taskId = 'task-123'; const configId = 'config-456'; - const mockConfig: TaskPushNotificationConfig = { + const mockConfig = { taskId, - pushNotificationConfig: { - id: configId, - url: 'https://notify.example.com/webhook', - }, + pushNotificationConfig: { id: configId, url: 'http://test' }, }; describe('setTaskPushNotificationConfig', () => { it('should set config successfully', async () => { - (mockGrpcMethods.createTaskPushNotificationConfig as Mock).mockImplementation((req, meta, opts, callback) => { - callback(null, mockConfig); - return { cancel: vi.fn() }; - }); + mockUnarySuccess(mockGrpcClient.createTaskPushNotificationConfig as Mock, mockConfig); const result = await transport.setTaskPushNotificationConfig(mockConfig); - expect(result).to.deep.equal(mockConfig); + + expect(result).toEqual(mockConfig); + expect(mockGrpcClient.createTaskPushNotificationConfig).toHaveBeenCalled(); + }); + + it('should throw PushNotificationNotSupportedError', async () => { + mockUnaryError( + mockGrpcClient.createTaskPushNotificationConfig as Mock, + 3, + 'Not supported', + -32003 + ); + await expect(transport.setTaskPushNotificationConfig(mockConfig)).rejects.toThrow( + PushNotificationNotSupportedError + ); }); }); describe('getTaskPushNotificationConfig', () => { it('should get config successfully', async () => { - (mockGrpcMethods.getTaskPushNotificationConfig as Mock).mockImplementation((req, meta, opts, callback) => { - callback(null, mockConfig); - return { cancel: vi.fn() }; - }); + mockUnarySuccess(mockGrpcClient.getTaskPushNotificationConfig as Mock, mockConfig); const result = await transport.getTaskPushNotificationConfig({ id: taskId, pushNotificationConfigId: configId, }); - expect(result).to.deep.equal(mockConfig); + expect(result).toEqual(mockConfig); }); }); describe('listTaskPushNotificationConfig', () => { it('should list configs successfully', async () => { const mockList = [mockConfig]; - - (mockGrpcMethods.listTaskPushNotificationConfig as Mock).mockImplementation((req, meta, opts, callback) => { - callback(null, mockList); - return { cancel: vi.fn() }; - }); + mockUnarySuccess(mockGrpcClient.listTaskPushNotificationConfig as Mock, mockList); const result = await transport.listTaskPushNotificationConfig({ id: taskId }); - expect(result).to.deep.equal(mockList); + expect(result).toEqual(mockList); }); }); describe('deleteTaskPushNotificationConfig', () => { it('should delete config successfully', async () => { - (mockGrpcMethods.deleteTaskPushNotificationConfig as Mock).mockImplementation((req, meta, opts, callback) => { - callback(null, {}); - return { cancel: vi.fn() }; - }); + mockUnarySuccess(mockGrpcClient.deleteTaskPushNotificationConfig as Mock, {}); await transport.deleteTaskPushNotificationConfig({ id: taskId, pushNotificationConfigId: configId, }); - expect(mockGrpcMethods.deleteTaskPushNotificationConfig).toHaveBeenCalled(); + expect(mockGrpcClient.deleteTaskPushNotificationConfig).toHaveBeenCalled(); }); }); }); -}); \ No newline at end of file + + describe('resubscribeTask', () => { + it('should yield task updates from stream', async () => { + const params = { id: 'task-123' }; + const mockUpdate = createMockTask('task-123'); + + const mockStream = { + [Symbol.asyncIterator]: async function* () { + yield { payload: { $case: 'task', value: mockUpdate } }; + }, + cancel: vi.fn(), + }; + (mockGrpcClient.taskSubscription as Mock).mockReturnValue(mockStream); + + const iterator = transport.resubscribeTask(params); + const result = await iterator.next(); + + expect(result.value).toEqual(mockUpdate); + expect(FromProto.task).toHaveBeenCalledWith(mockUpdate); + }); + }); +}); + +describe('GrpcTransportFactory', () => { + it('should have correct protocol name', () => { + const factory = new GrpcTransportFactory(); + expect(factory.protocolName).toBe('GRPC'); + }); + + it('should create transport with correct endpoint', async () => { + const factory = new GrpcTransportFactory(); + const agentCard = createMockAgentCard({ url: 'localhost:50051' }); + const transport = await factory.create(agentCard.url, agentCard); + + expect(transport).toBeInstanceOf(GrpcTransport); + }); +}); From 3dd3d14a55d3c4955f0b4299b33a24854e53fbd1 Mon Sep 17 00:00:00 2001 From: Guglielmo Colombo Date: Tue, 30 Dec 2025 15:45:42 +0100 Subject: [PATCH 61/64] Update src/grpc/utils/from_proto.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- src/grpc/utils/from_proto.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/grpc/utils/from_proto.ts b/src/grpc/utils/from_proto.ts index b12de832..c9e07e80 100644 --- a/src/grpc/utils/from_proto.ts +++ b/src/grpc/utils/from_proto.ts @@ -234,7 +234,7 @@ export class FromProto { return { message: FromProto.message(status.update), state: FromProto.taskState(status.state), - timestamp: status.timestamp?.toDateString(), + timestamp: status.timestamp?.toISOString(), }; } From 97b61e4a8753e72ba40238c70cd18d00eb4fbb1a Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Tue, 30 Dec 2025 15:39:19 +0000 Subject: [PATCH 62/64] fix tests --- src/client/transports/grpc_transport.ts | 14 +-- src/grpc/utils/from_proto.ts | 93 +++++++++++++++++-- src/grpc/utils/to_proto.ts | 11 +++ test/client/transports/grpc_transport.spec.ts | 3 +- vitest.edge.config.ts | 1 + 5 files changed, 109 insertions(+), 13 deletions(-) diff --git a/src/client/transports/grpc_transport.ts b/src/client/transports/grpc_transport.ts index 10e36a9a..1b567ac4 100644 --- a/src/client/transports/grpc_transport.ts +++ b/src/client/transports/grpc_transport.ts @@ -62,10 +62,12 @@ export class GrpcTransport implements Transport { constructor(options: GrpcTransportOptions) { this.grpcCallOptions = options.grpcCallOptions; - this.grpcClient = options.grpcClient ?? new A2AServiceClient( - options.endpoint, - options.grpcChannelCredentials ?? credentials.createInsecure() - ); + this.grpcClient = + options.grpcClient ?? + new A2AServiceClient( + options.endpoint, + options.grpcChannelCredentials ?? credentials.createInsecure() + ); } async getExtendedAgentCard(options?: RequestOptions): Promise { @@ -117,8 +119,8 @@ export class GrpcTransport implements Transport { params, options, this.grpcClient.createTaskPushNotificationConfig.bind(this.grpcClient), - ToProto.taskPushNotificationConfig, - FromProto.setTaskPushNotificationConfigParams + ToProto.taskPushNotificationConfigCreate, + FromProto.getTaskPushNoticationConfig ); return rpcResponse; } diff --git a/src/grpc/utils/from_proto.ts b/src/grpc/utils/from_proto.ts index c9e07e80..017b6634 100644 --- a/src/grpc/utils/from_proto.ts +++ b/src/grpc/utils/from_proto.ts @@ -27,6 +27,7 @@ import { AgentCardSignature, TaskStatusUpdateEvent, TaskArtifactUpdateEvent, + OAuthFlows, } from '../a2a.js'; import * as types from '../../types.js'; import { extractTaskId, extractTaskAndPushNotificationConfigId } from './id_decoding.js'; @@ -301,7 +302,14 @@ export class FromProto { provider: agentCard.provider, protocolVersion: agentCard.protocolVersion, security: agentCard.security?.map((s) => FromProto.security(s)), - securitySchemes: FromProto.securitySchemes(agentCard.securitySchemes), + securitySchemes: agentCard.securitySchemes + ? Object.fromEntries( + Object.entries(agentCard.securitySchemes).map(([key, value]) => [ + key, + FromProto.securityScheme(value), + ]) + ) + : {}, skills: agentCard.skills.map((s) => FromProto.skills(s)), signatures: agentCard.signatures?.map((s) => FromProto.signatures(s)), supportsAuthenticatedExtendedCard: agentCard.supportsAuthenticatedExtendedCard, @@ -312,14 +320,87 @@ export class FromProto { static security(security: Security): { [k: string]: string[] } { return Object.fromEntries( - Object.entries(security.schemes).map(([key, value]) => [key, value as unknown as string[]]) + Object.entries(security.schemes).map(([key, value]) => [key, value.list]) ); } - static securitySchemes(securitySchemes: SecurityScheme): { - [k: string]: types.SecurityScheme; - } { - return Object.fromEntries(Object.entries(securitySchemes).map(([key, value]) => [key, value])); + static securityScheme(securitySchemes: SecurityScheme): types.SecurityScheme { + switch (securitySchemes.scheme?.$case) { + case 'apiKeySecurityScheme': + return { + type: 'apiKey', + name: securitySchemes.scheme.value.name, + in: securitySchemes.scheme.value.location as 'query' | 'header' | 'cookie', + description: securitySchemes.scheme.value.description, + }; + case 'httpAuthSecurityScheme': + return { + type: 'http', + scheme: securitySchemes.scheme.value.scheme, + bearerFormat: securitySchemes.scheme.value.bearerFormat, + description: securitySchemes.scheme.value.description, + }; + case 'mtlsSecurityScheme': + return { + type: 'mutualTLS', + description: securitySchemes.scheme.value.description, + }; + case 'oauth2SecurityScheme': + return { + type: 'oauth2', + description: securitySchemes.scheme.value.description, + flows: FromProto.oauthFlows(securitySchemes.scheme.value.flows), + oauth2MetadataUrl: securitySchemes.scheme.value.oauth2MetadataUrl, + }; + case 'openIdConnectSecurityScheme': + return { + type: 'openIdConnect', + description: securitySchemes.scheme.value.description, + openIdConnectUrl: securitySchemes.scheme.value.openIdConnectUrl, + }; + default: + throw A2AError.internalError(`Unsupported security scheme type`); + } + } + + static oauthFlows(flows: OAuthFlows): types.OAuthFlows { + switch (flows.flow?.$case) { + case 'implicit': + return { + implicit: { + authorizationUrl: flows.flow.value.authorizationUrl, + scopes: flows.flow.value.scopes, + refreshUrl: flows.flow.value.refreshUrl, + }, + }; + case 'password': + return { + password: { + refreshUrl: flows.flow.value.refreshUrl, + scopes: flows.flow.value.scopes, + tokenUrl: flows.flow.value.tokenUrl, + }, + }; + case 'authorizationCode': + return { + authorizationCode: { + refreshUrl: flows.flow.value.refreshUrl, + authorizationUrl: flows.flow.value.authorizationUrl, + scopes: flows.flow.value.scopes, + tokenUrl: flows.flow.value.tokenUrl, + }, + }; + case 'clientCredentials': + return { + clientCredentials: { + refreshUrl: flows.flow.value.refreshUrl, + scopes: flows.flow.value.scopes, + tokenUrl: flows.flow.value.tokenUrl, + }, + }; + default: + throw A2AError.internalError(`Unsupported OAuth flows`); + } } static skills(skill: AgentSkill): types.AgentSkill { diff --git a/src/grpc/utils/to_proto.ts b/src/grpc/utils/to_proto.ts index 0f2963c8..1c65495d 100644 --- a/src/grpc/utils/to_proto.ts +++ b/src/grpc/utils/to_proto.ts @@ -35,6 +35,7 @@ import { GetTaskRequest, CancelTaskRequest, TaskSubscriptionRequest, + CreateTaskPushNotificationConfigRequest, } from '../a2a.js'; import { generatePushNotificationConfigName, generateTaskName } from './id_decoding.js'; @@ -290,6 +291,16 @@ export class ToProto { }; } + static taskPushNotificationConfigCreate( + config: types.TaskPushNotificationConfig + ): CreateTaskPushNotificationConfigRequest { + return { + parent: generateTaskName(config.taskId), + config: ToProto.taskPushNotificationConfig(config), + configId: config.pushNotificationConfig.id ?? '', + }; + } + static pushNotificationConfig(config: types.PushNotificationConfig): PushNotificationConfig { return { id: config.id ?? '', diff --git a/test/client/transports/grpc_transport.spec.ts b/test/client/transports/grpc_transport.spec.ts index f9db0328..2ad51ca9 100644 --- a/test/client/transports/grpc_transport.spec.ts +++ b/test/client/transports/grpc_transport.spec.ts @@ -49,6 +49,7 @@ vi.mock('../../../src/grpc/utils/to_proto.js', () => ({ getTaskRequest: vi.fn((x) => x), cancelTaskRequest: vi.fn((x) => x), taskIdParams: vi.fn((x) => x), + taskPushNotificationConfigCreate: vi.fn((x) => x), }, })); @@ -98,7 +99,7 @@ describe('GrpcTransport', () => { beforeEach(() => { mockGrpcClient = new A2AServiceClient(endpoint, credentials.createInsecure()); - transport = new GrpcTransport({ endpoint, grpcClient: mockGrpcClient}); + transport = new GrpcTransport({ endpoint, grpcClient: mockGrpcClient }); }); afterEach(() => { diff --git a/vitest.edge.config.ts b/vitest.edge.config.ts index 4253f7b2..dd3ffefb 100644 --- a/vitest.edge.config.ts +++ b/vitest.edge.config.ts @@ -10,6 +10,7 @@ export default defineWorkersConfig( 'test/server/express/**', // gRpc test require Node.js-specific gRPC module 'test/server/grpc/*.spec.ts', + 'test/client/trsnasports/grpc_transport.spec.ts', 'test/e2e.spec.ts', 'test/server/push_notification_integration.spec.ts', // Node modules should always be excluded From 54636148005201bdb7f25f100a98860b41dc2eac Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Tue, 30 Dec 2025 15:43:40 +0000 Subject: [PATCH 63/64] exclude tests --- vitest.edge.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vitest.edge.config.ts b/vitest.edge.config.ts index dd3ffefb..284069da 100644 --- a/vitest.edge.config.ts +++ b/vitest.edge.config.ts @@ -10,7 +10,7 @@ export default defineWorkersConfig( 'test/server/express/**', // gRpc test require Node.js-specific gRPC module 'test/server/grpc/*.spec.ts', - 'test/client/trsnasports/grpc_transport.spec.ts', + 'test/client/transports/grpc_transport.spec.ts', 'test/e2e.spec.ts', 'test/server/push_notification_integration.spec.ts', // Node modules should always be excluded From fc451d0e0b0656ca7b26d234bb67e81499b17993 Mon Sep 17 00:00:00 2001 From: guglielmoc Date: Wed, 14 Jan 2026 14:15:38 +0000 Subject: [PATCH 64/64] remove legacy converters --- src/grpc/utils/from_proto.ts | 448 --------------------------- src/grpc/utils/id_decoding.ts | 30 -- src/grpc/utils/to_proto.ts | 556 ---------------------------------- 3 files changed, 1034 deletions(-) delete mode 100644 src/grpc/utils/from_proto.ts delete mode 100644 src/grpc/utils/id_decoding.ts delete mode 100644 src/grpc/utils/to_proto.ts diff --git a/src/grpc/utils/from_proto.ts b/src/grpc/utils/from_proto.ts deleted file mode 100644 index 017b6634..00000000 --- a/src/grpc/utils/from_proto.ts +++ /dev/null @@ -1,448 +0,0 @@ -import { A2AError } from '../../server/error.js'; -import { - CancelTaskRequest, - GetTaskPushNotificationConfigRequest, - ListTaskPushNotificationConfigRequest, - GetTaskRequest, - CreateTaskPushNotificationConfigRequest, - DeleteTaskPushNotificationConfigRequest, - Message, - Role, - SendMessageConfiguration, - PushNotificationConfig, - AuthenticationInfo, - SendMessageRequest, - Part, - SendMessageResponse, - Task, - TaskStatus, - TaskState, - Artifact, - TaskPushNotificationConfig, - ListTaskPushNotificationConfigResponse, - AgentCard, - Security, - SecurityScheme, - AgentSkill, - AgentCardSignature, - TaskStatusUpdateEvent, - TaskArtifactUpdateEvent, - OAuthFlows, -} from '../a2a.js'; -import * as types from '../../types.js'; -import { extractTaskId, extractTaskAndPushNotificationConfigId } from './id_decoding.js'; - -/** - * Converts proto types to internal types. - */ -export class FromProto { - static taskQueryParams(request: GetTaskRequest): types.TaskQueryParams { - return { - id: extractTaskId(request.name), - historyLength: request.historyLength, - }; - } - - static taskIdParams(request: CancelTaskRequest): types.TaskIdParams { - return { - id: extractTaskId(request.name), - }; - } - - static getTaskPushNotificationConfigParams( - request: GetTaskPushNotificationConfigRequest - ): types.GetTaskPushNotificationConfigParams { - const { taskId, configId } = extractTaskAndPushNotificationConfigId(request.name); - return { - id: taskId, - pushNotificationConfigId: configId, - }; - } - - static listTaskPushNotificationConfigParams( - request: ListTaskPushNotificationConfigRequest - ): types.ListTaskPushNotificationConfigParams { - return { - id: extractTaskId(request.parent), - }; - } - - static setTaskPushNotificationConfigParams( - request: CreateTaskPushNotificationConfigRequest - ): types.TaskPushNotificationConfig { - if (!request.config?.pushNotificationConfig) { - throw A2AError.invalidParams( - 'Request must include a `config` object with a `pushNotificationConfig`' - ); - } - return { - taskId: extractTaskId(request.parent), - pushNotificationConfig: FromProto.pushNotificationConfig( - request.config.pushNotificationConfig - ), - }; - } - - static deleteTaskPushNotificationConfigParams( - request: DeleteTaskPushNotificationConfigRequest - ): types.DeleteTaskPushNotificationConfigParams { - const { taskId, configId } = extractTaskAndPushNotificationConfigId(request.name); - return { - id: taskId, - pushNotificationConfigId: configId, - }; - } - - static message(message: Message): types.Message | undefined { - if (!message) { - return undefined; - } - - return { - kind: 'message', - messageId: message.messageId, - parts: message.content.map((p) => FromProto.parts(p)), - contextId: message.contextId, - taskId: message.taskId, - role: FromProto.role(message.role), - metadata: message.metadata, - extensions: message.extensions.length > 0 ? message.extensions : undefined, - }; - } - - static role(role: Role): 'agent' | 'user' { - switch (role) { - case Role.ROLE_AGENT: - return 'agent'; - case Role.ROLE_USER: - return 'user'; - default: - throw A2AError.invalidParams(`Invalid role: ${role}`); - } - } - - static configuration( - configuration: SendMessageConfiguration - ): types.MessageSendConfiguration | undefined { - if (!configuration) { - return undefined; - } - - return { - blocking: configuration.blocking, - acceptedOutputModes: configuration.acceptedOutputModes, - pushNotificationConfig: FromProto.pushNotificationConfig(configuration.pushNotification), - }; - } - - static pushNotificationConfig( - config: PushNotificationConfig - ): types.PushNotificationConfig | undefined { - if (!config) { - return undefined; - } - - return { - id: config.id, - url: config.url, - token: config.token, - authentication: FromProto.authenticationInfo(config.authentication), - }; - } - - static authenticationInfo( - authInfo: AuthenticationInfo - ): types.PushNotificationAuthenticationInfo | undefined { - if (!authInfo) { - return undefined; - } - - return { - schemes: authInfo.schemes, - credentials: authInfo.credentials, - }; - } - - static parts(part: Part): types.Part { - if (part.part?.$case === 'text') { - return { - kind: 'text', - text: part.part.value, - }; - } - - if (part.part?.$case === 'file') { - const filePart = part.part.value; - if (filePart.file?.$case === 'fileWithUri') { - return { - kind: 'file', - file: { - uri: filePart.file.value, - mimeType: filePart.mimeType, - }, - }; - } else if (filePart.file?.$case === 'fileWithBytes') { - return { - kind: 'file', - file: { - bytes: filePart.file.value.toString('base64'), - mimeType: filePart.mimeType, - }, - }; - } - throw A2AError.invalidParams('Invalid file part type'); - } - - if (part.part?.$case === 'data') { - return { - kind: 'data', - data: part.part.value.data, - }; - } - throw A2AError.invalidParams('Invalid part type'); - } - - static messageSendParams(request: SendMessageRequest): types.MessageSendParams { - return { - message: FromProto.message(request.request), - configuration: FromProto.configuration(request.configuration), - metadata: request.metadata, - }; - } - - static sendMessageResult(response: SendMessageResponse): types.Task | types.Message { - if (response.payload?.$case === 'task') { - return FromProto.task(response.payload.value); - } else if (response.payload?.$case === 'msg') { - return FromProto.message(response.payload.value); - } - throw A2AError.invalidParams('Invalid SendMessageResponse: missing result'); - } - - static task(task: Task): types.Task { - return { - kind: 'task', - id: task.id, - status: FromProto.taskStatus(task.status), - contextId: task.contextId, - artifacts: task.artifacts?.map((a) => FromProto.artifact(a)), - history: task.history?.map((h) => FromProto.message(h)), - metadata: task.metadata, - }; - } - - static taskStatus(status: TaskStatus): types.TaskStatus { - return { - message: FromProto.message(status.update), - state: FromProto.taskState(status.state), - timestamp: status.timestamp?.toISOString(), - }; - } - - static taskState(state: TaskState): types.TaskState { - switch (state) { - case TaskState.TASK_STATE_SUBMITTED: - return 'submitted'; - case TaskState.TASK_STATE_WORKING: - return 'working'; - case TaskState.TASK_STATE_INPUT_REQUIRED: - return 'input-required'; - case TaskState.TASK_STATE_COMPLETED: - return 'completed'; - case TaskState.TASK_STATE_CANCELLED: - return 'canceled'; - case TaskState.TASK_STATE_FAILED: - return 'failed'; - case TaskState.TASK_STATE_REJECTED: - return 'rejected'; - case TaskState.TASK_STATE_AUTH_REQUIRED: - return 'auth-required'; - case TaskState.TASK_STATE_UNSPECIFIED: - return 'unknown'; - default: - throw A2AError.invalidParams(`Invalid task state: ${state}`); - } - } - - static artifact(artifact: Artifact): types.Artifact { - return { - artifactId: artifact.artifactId, - name: artifact.name, - description: artifact.description, - parts: artifact.parts.map((p) => FromProto.parts(p)), - metadata: artifact.metadata, - }; - } - - static getTaskPushNoticationConfig( - request: TaskPushNotificationConfig - ): types.TaskPushNotificationConfig { - return { - taskId: extractTaskId(request.name), - pushNotificationConfig: FromProto.pushNotificationConfig(request.pushNotificationConfig), - }; - } - - static listTaskPushNotificationConfig( - request: ListTaskPushNotificationConfigResponse - ): types.TaskPushNotificationConfig[] { - return request.configs.map((c) => FromProto.getTaskPushNoticationConfig(c)); - } - - static agentCard(agentCard: AgentCard): types.AgentCard { - return { - additionalInterfaces: agentCard.additionalInterfaces, - capabilities: agentCard.capabilities, - defaultInputModes: agentCard.defaultInputModes, - defaultOutputModes: agentCard.defaultOutputModes, - description: agentCard.description, - documentationUrl: agentCard.documentationUrl, - name: agentCard.name, - preferredTransport: agentCard.preferredTransport, - provider: agentCard.provider, - protocolVersion: agentCard.protocolVersion, - security: agentCard.security?.map((s) => FromProto.security(s)), - securitySchemes: agentCard.securitySchemes - ? Object.fromEntries( - Object.entries(agentCard.securitySchemes).map(([key, value]) => [ - key, - FromProto.securityScheme(value), - ]) - ) - : {}, - skills: agentCard.skills.map((s) => FromProto.skills(s)), - signatures: agentCard.signatures?.map((s) => FromProto.signatures(s)), - supportsAuthenticatedExtendedCard: agentCard.supportsAuthenticatedExtendedCard, - url: agentCard.url, - version: agentCard.version, - }; - } - - static security(security: Security): { [k: string]: string[] } { - return Object.fromEntries( - Object.entries(security.schemes).map(([key, value]) => [key, value.list]) - ); - } - - static securityScheme(securitySchemes: SecurityScheme): types.SecurityScheme { - switch (securitySchemes.scheme?.$case) { - case 'apiKeySecurityScheme': - return { - type: 'apiKey', - name: securitySchemes.scheme.value.name, - in: securitySchemes.scheme.value.location as 'query' | 'header' | 'cookie', - description: securitySchemes.scheme.value.description, - }; - case 'httpAuthSecurityScheme': - return { - type: 'http', - scheme: securitySchemes.scheme.value.scheme, - bearerFormat: securitySchemes.scheme.value.bearerFormat, - description: securitySchemes.scheme.value.description, - }; - case 'mtlsSecurityScheme': - return { - type: 'mutualTLS', - description: securitySchemes.scheme.value.description, - }; - case 'oauth2SecurityScheme': - return { - type: 'oauth2', - description: securitySchemes.scheme.value.description, - flows: FromProto.oauthFlows(securitySchemes.scheme.value.flows), - oauth2MetadataUrl: securitySchemes.scheme.value.oauth2MetadataUrl, - }; - case 'openIdConnectSecurityScheme': - return { - type: 'openIdConnect', - description: securitySchemes.scheme.value.description, - openIdConnectUrl: securitySchemes.scheme.value.openIdConnectUrl, - }; - default: - throw A2AError.internalError(`Unsupported security scheme type`); - } - } - - static oauthFlows(flows: OAuthFlows): types.OAuthFlows { - switch (flows.flow?.$case) { - case 'implicit': - return { - implicit: { - authorizationUrl: flows.flow.value.authorizationUrl, - scopes: flows.flow.value.scopes, - refreshUrl: flows.flow.value.refreshUrl, - }, - }; - case 'password': - return { - password: { - refreshUrl: flows.flow.value.refreshUrl, - scopes: flows.flow.value.scopes, - tokenUrl: flows.flow.value.tokenUrl, - }, - }; - case 'authorizationCode': - return { - authorizationCode: { - refreshUrl: flows.flow.value.refreshUrl, - authorizationUrl: flows.flow.value.authorizationUrl, - scopes: flows.flow.value.scopes, - tokenUrl: flows.flow.value.tokenUrl, - }, - }; - case 'clientCredentials': - return { - clientCredentials: { - refreshUrl: flows.flow.value.refreshUrl, - scopes: flows.flow.value.scopes, - tokenUrl: flows.flow.value.tokenUrl, - }, - }; - default: - throw A2AError.internalError(`Unsupported OAuth flows`); - } - } - - static skills(skill: AgentSkill): types.AgentSkill { - return { - id: skill.id, - name: skill.name, - description: skill.description, - tags: skill.tags, - examples: skill.examples, - inputModes: skill.inputModes, - outputModes: skill.outputModes, - security: skill.security?.map((s) => FromProto.security(s)), - }; - } - - static signatures(signatures: AgentCardSignature): types.AgentCardSignature { - return { - protected: signatures.protected, - signature: signatures.signature, - header: signatures.header, - }; - } - - static taskStatusUpdate(event: TaskStatusUpdateEvent): types.TaskStatusUpdateEvent { - return { - kind: 'status-update', - taskId: event.taskId, - status: FromProto.taskStatus(event.status), - contextId: event.contextId, - metadata: event.metadata, - final: event.final, - }; - } - - static taskArtifactUpdate(event: TaskArtifactUpdateEvent): types.TaskArtifactUpdateEvent { - return { - kind: 'artifact-update', - taskId: event.taskId, - artifact: FromProto.artifact(event.artifact), - contextId: event.contextId, - metadata: event.metadata, - lastChunk: event.lastChunk, - }; - } -} diff --git a/src/grpc/utils/id_decoding.ts b/src/grpc/utils/id_decoding.ts deleted file mode 100644 index 22a64778..00000000 --- a/src/grpc/utils/id_decoding.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { A2AError } from '../../server/error.js'; - -const CONFIG_REGEX = /^tasks\/([^/]+)\/pushNotificationConfigs\/([^/]+)$/; -const TASK_ONLY_REGEX = /^tasks\/([^/]+)$/; - -export const extractTaskId = (name: string): string => { - const match = name.match(TASK_ONLY_REGEX); - if (!match) { - throw A2AError.invalidParams(`Invalid or missing task ID in: "${name}"`); - } - return match[1]; -}; - -export const generateTaskName = (taskId: string): string => { - return `tasks/${taskId}`; -}; - -export const extractTaskAndPushNotificationConfigId = ( - name: string -): { taskId: string; configId: string } => { - const match = name.match(CONFIG_REGEX); - if (!match) { - throw A2AError.invalidParams(`Invalid or missing config ID in: "${name}"`); - } - return { taskId: match[1], configId: match[2] }; -}; - -export const generatePushNotificationConfigName = (taskId: string, configId: string): string => { - return `tasks/${taskId}/pushNotificationConfigs/${configId}`; -}; diff --git a/src/grpc/utils/to_proto.ts b/src/grpc/utils/to_proto.ts deleted file mode 100644 index 1c65495d..00000000 --- a/src/grpc/utils/to_proto.ts +++ /dev/null @@ -1,556 +0,0 @@ -import { A2AError } from '../../server/error.js'; -import * as types from '../../types.js'; -import { - AgentCard, - AgentCardSignature, - AgentCapabilities, - AgentExtension, - AgentInterface, - AgentProvider, - Artifact, - AuthenticationInfo, - FilePart as ProtoFilePart, - Message, - OAuthFlows, - Part, - PushNotificationConfig, - Role, - Security, - SecurityScheme, - SendMessageResponse, - StreamResponse, - Task, - TaskArtifactUpdateEvent, - TaskPushNotificationConfig, - TaskState, - TaskStatus, - TaskStatusUpdateEvent, - ListTaskPushNotificationConfigResponse, - AgentSkill, - SendMessageRequest, - SendMessageConfiguration, - GetTaskPushNotificationConfigRequest, - ListTaskPushNotificationConfigRequest, - DeleteTaskPushNotificationConfigRequest, - GetTaskRequest, - CancelTaskRequest, - TaskSubscriptionRequest, - CreateTaskPushNotificationConfigRequest, -} from '../a2a.js'; -import { generatePushNotificationConfigName, generateTaskName } from './id_decoding.js'; - -export class ToProto { - static agentCard(agentCard: types.AgentCard): AgentCard { - return { - protocolVersion: agentCard.protocolVersion, - name: agentCard.name, - description: agentCard.description, - url: agentCard.url, - preferredTransport: agentCard.preferredTransport ?? '', - additionalInterfaces: - agentCard.additionalInterfaces?.map((i) => ToProto.agentInterface(i)) ?? [], - provider: ToProto.agentProvider(agentCard.provider), - version: agentCard.version, - documentationUrl: agentCard.documentationUrl ?? '', - capabilities: ToProto.agentCapabilities(agentCard.capabilities), - securitySchemes: agentCard.securitySchemes - ? Object.fromEntries( - Object.entries(agentCard.securitySchemes).map(([key, value]) => [ - key, - ToProto.securityScheme(value), - ]) - ) - : {}, - security: agentCard.security?.map((s) => ToProto.security(s)) ?? [], - defaultInputModes: agentCard.defaultInputModes, - defaultOutputModes: agentCard.defaultOutputModes, - skills: agentCard.skills.map((s) => ToProto.agentSkill(s)), - supportsAuthenticatedExtendedCard: agentCard.supportsAuthenticatedExtendedCard ?? false, - signatures: agentCard.signatures?.map((s) => ToProto.signatures(s)) ?? [], - }; - } - - static signatures(signatures: types.AgentCardSignature): AgentCardSignature { - return { - protected: signatures.protected, - signature: signatures.signature, - header: signatures.header, - }; - } - - static agentSkill(skill: types.AgentSkill): AgentSkill { - return { - id: skill.id, - name: skill.name, - description: skill.description ?? '', - tags: skill.tags ?? [], - examples: skill.examples ?? [], - inputModes: skill.inputModes ?? [], - outputModes: skill.outputModes ?? [], - security: skill.security ? skill.security.map((s) => ToProto.security(s)) : [], - }; - } - - static security(security: { [k: string]: string[] }): Security { - return { - schemes: Object.fromEntries( - Object.entries(security).map(([key, value]) => { - return [key, { list: value }]; - }) - ), - }; - } - - static securityScheme(scheme: types.SecurityScheme): SecurityScheme { - switch (scheme.type) { - case 'apiKey': - return { - scheme: { - $case: 'apiKeySecurityScheme', - value: { - name: scheme.name, - location: scheme.in, - description: scheme.description ?? '', - }, - }, - }; - case 'http': - return { - scheme: { - $case: 'httpAuthSecurityScheme', - value: { - description: scheme.description ?? '', - scheme: scheme.scheme, - bearerFormat: scheme.bearerFormat ?? '', - }, - }, - }; - case 'mutualTLS': - return { - scheme: { - $case: 'mtlsSecurityScheme', - value: { - description: scheme.description ?? '', - }, - }, - }; - case 'oauth2': - return { - scheme: { - $case: 'oauth2SecurityScheme', - value: { - description: scheme.description ?? '', - flows: ToProto.oauthFlows(scheme.flows), - oauth2MetadataUrl: scheme.oauth2MetadataUrl ?? '', - }, - }, - }; - case 'openIdConnect': - return { - scheme: { - $case: 'openIdConnectSecurityScheme', - value: { - description: scheme.description ?? '', - openIdConnectUrl: scheme.openIdConnectUrl, - }, - }, - }; - default: - throw A2AError.internalError(`Unsupported security scheme type`); - } - } - - static oauthFlows(flows: types.OAuthFlows): OAuthFlows { - if (flows.implicit) { - return { - flow: { - $case: 'implicit', - value: { - authorizationUrl: flows.implicit.authorizationUrl, - scopes: flows.implicit.scopes, - refreshUrl: flows.implicit.refreshUrl, - }, - }, - }; - } else if (flows.password) { - return { - flow: { - $case: 'password', - value: { - tokenUrl: flows.password.tokenUrl, - scopes: flows.password.scopes, - refreshUrl: flows.password.refreshUrl, - }, - }, - }; - } else if (flows.clientCredentials) { - return { - flow: { - $case: 'clientCredentials', - value: { - tokenUrl: flows.clientCredentials.tokenUrl, - scopes: flows.clientCredentials.scopes, - refreshUrl: flows.clientCredentials.refreshUrl, - }, - }, - }; - } else if (flows.authorizationCode) { - return { - flow: { - $case: 'authorizationCode', - value: { - authorizationUrl: flows.authorizationCode.authorizationUrl, - tokenUrl: flows.authorizationCode.tokenUrl, - scopes: flows.authorizationCode.scopes, - refreshUrl: flows.authorizationCode.refreshUrl, - }, - }, - }; - } else { - throw A2AError.internalError(`Unsupported OAuth flows`); - } - } - - static agentInterface(agentInterface: types.AgentInterface): AgentInterface { - return { - transport: agentInterface.transport, - url: agentInterface.url, - }; - } - - static agentProvider(agentProvider: types.AgentProvider): AgentProvider { - return { - url: agentProvider.url, - organization: agentProvider.organization, - }; - } - - static agentCapabilities(capabilities: types.AgentCapabilities): AgentCapabilities { - return { - streaming: capabilities.streaming ?? false, - pushNotifications: capabilities.pushNotifications ?? false, - extensions: capabilities.extensions - ? capabilities.extensions.map((e) => ToProto.extension(e)) - : [], - }; - } - - static extension(extension: types.AgentExtension): AgentExtension { - return { - uri: extension.uri, - description: extension.description ?? '', - required: extension.required ?? false, - params: extension.params, - }; - } - - static listTaskPushNotificationConfigs( - config: types.TaskPushNotificationConfig[] - ): ListTaskPushNotificationConfigResponse { - return { - configs: config.map((c) => ToProto.taskPushNotificationConfig(c)), - nextPageToken: '', - }; - } - - static getTaskPushNotificationConfigRequest( - config: types.GetTaskPushNotificationConfigParams - ): GetTaskPushNotificationConfigRequest { - return { - name: generatePushNotificationConfigName(config.id, config.pushNotificationConfigId), - }; - } - - static listTaskPushNotificationConfigRequest( - config: types.ListTaskPushNotificationConfigParams - ): ListTaskPushNotificationConfigRequest { - return { - parent: generateTaskName(config.id), - pageToken: '', - pageSize: 0, - }; - } - - static deleteTaskPushNotificationConfigRequest( - config: types.DeleteTaskPushNotificationConfigParams - ): DeleteTaskPushNotificationConfigRequest { - return { - name: generatePushNotificationConfigName(config.id, config.pushNotificationConfigId), - }; - } - - static taskPushNotificationConfig( - config: types.TaskPushNotificationConfig - ): TaskPushNotificationConfig { - return { - name: generatePushNotificationConfigName( - config.taskId, - config.pushNotificationConfig.id ?? '' - ), - pushNotificationConfig: ToProto.pushNotificationConfig(config.pushNotificationConfig), - }; - } - - static taskPushNotificationConfigCreate( - config: types.TaskPushNotificationConfig - ): CreateTaskPushNotificationConfigRequest { - return { - parent: generateTaskName(config.taskId), - config: ToProto.taskPushNotificationConfig(config), - configId: config.pushNotificationConfig.id ?? '', - }; - } - - static pushNotificationConfig(config: types.PushNotificationConfig): PushNotificationConfig { - return { - id: config.id ?? '', - url: config.url, - token: config.token ?? '', - authentication: ToProto.authenticationInfo(config.authentication), - }; - } - - static authenticationInfo( - authInfo: types.PushNotificationAuthenticationInfo - ): AuthenticationInfo | undefined { - if (!authInfo) { - return undefined; - } - return { - schemes: authInfo.schemes, - credentials: authInfo.credentials ?? '', - }; - } - - static messageStreamResult( - event: types.Message | types.Task | types.TaskStatusUpdateEvent | types.TaskArtifactUpdateEvent - ): StreamResponse { - if (event.kind === 'message') { - return { - payload: { - $case: 'msg', - value: ToProto.message(event), - }, - }; - } else if (event.kind === 'task') { - return { - payload: { - $case: 'task', - value: ToProto.task(event), - }, - }; - } else if (event.kind === 'status-update') { - return { - payload: { - $case: 'statusUpdate', - value: ToProto.taskStatusUpdate(event), - }, - }; - } else if (event.kind === 'artifact-update') { - return { - payload: { - $case: 'artifactUpdate', - value: ToProto.taskArtifactUpdate(event), - }, - }; - } else { - throw A2AError.internalError('Invalid event type'); - } - } - - static taskStatusUpdate(event: types.TaskStatusUpdateEvent): TaskStatusUpdateEvent { - return { - taskId: event.taskId, - status: ToProto.taskStatus(event.status), - contextId: event.contextId, - metadata: event.metadata, - final: event.final, - }; - } - - static taskArtifactUpdate(event: types.TaskArtifactUpdateEvent): TaskArtifactUpdateEvent { - return { - taskId: event.taskId, - artifact: ToProto.artifact(event.artifact), - contextId: event.contextId, - metadata: event.metadata, - append: event.append ?? false, - lastChunk: event.lastChunk ?? false, - }; - } - - static messageSendResult(params: types.Message | types.Task): SendMessageResponse { - if (params.kind === 'message') { - return { - payload: { - $case: 'msg', - value: ToProto.message(params), - }, - }; - } else if (params.kind === 'task') { - return { - payload: { - $case: 'task', - value: ToProto.task(params), - }, - }; - } - } - - static message(message: types.Message): Message | undefined { - if (!message) { - return undefined; - } - - return { - messageId: message.messageId, - content: message.parts.map((p) => ToProto.parts(p)), - contextId: message.contextId ?? '', - taskId: message.taskId ?? '', - role: ToProto.role(message.role), - metadata: message.metadata, - extensions: message.extensions ?? [], - }; - } - - static role(role: string): Role { - switch (role) { - case 'agent': - return Role.ROLE_AGENT; - case 'user': - return Role.ROLE_USER; - default: - throw A2AError.internalError(`Invalid role`); - } - } - - static task(task: types.Task): Task { - return { - id: task.id, - contextId: task.contextId, - status: ToProto.taskStatus(task.status), - artifacts: task.artifacts?.map((a) => ToProto.artifact(a)) ?? [], - history: task.history?.map((m) => ToProto.message(m)) ?? [], - metadata: task.metadata, - }; - } - - static taskStatus(status: types.TaskStatus): TaskStatus { - return { - state: ToProto.taskState(status.state), - update: ToProto.message(status.message), - timestamp: status.timestamp ? new Date(status.timestamp) : undefined, - }; - } - - static artifact(artifact: types.Artifact): Artifact { - return { - artifactId: artifact.artifactId, - name: artifact.name ?? '', - description: artifact.description ?? '', - parts: artifact.parts.map((p) => ToProto.parts(p)), - metadata: artifact.metadata, - extensions: artifact.extensions ? artifact.extensions : [], - }; - } - - static taskState(state: types.TaskState): TaskState { - switch (state) { - case 'submitted': - return TaskState.TASK_STATE_SUBMITTED; - case 'working': - return TaskState.TASK_STATE_WORKING; - case 'input-required': - return TaskState.TASK_STATE_INPUT_REQUIRED; - case 'rejected': - return TaskState.TASK_STATE_REJECTED; - case 'auth-required': - return TaskState.TASK_STATE_AUTH_REQUIRED; - case 'completed': - return TaskState.TASK_STATE_COMPLETED; - case 'failed': - return TaskState.TASK_STATE_FAILED; - case 'canceled': - return TaskState.TASK_STATE_CANCELLED; - case 'unknown': - return TaskState.TASK_STATE_UNSPECIFIED; - default: - return TaskState.UNRECOGNIZED; - } - } - - static parts(part: types.Part): Part { - if (part.kind === 'text') { - return { - part: { $case: 'text', value: part.text }, - }; - } - - if (part.kind === 'file') { - let filePart: ProtoFilePart; - if ('uri' in part.file) { - filePart = { - file: { $case: 'fileWithUri', value: part.file.uri }, - mimeType: part.file.mimeType ?? '', - }; - } else if ('bytes' in part.file) { - filePart = { - file: { $case: 'fileWithBytes', value: Buffer.from(part.file.bytes, 'base64') }, - mimeType: part.file.mimeType ?? '', - }; - } else { - throw A2AError.internalError('Invalid file part'); - } - return { - part: { $case: 'file', value: filePart }, - }; - } - - if (part.kind === 'data') { - return { - part: { $case: 'data', value: { data: part.data } }, - }; - } - throw A2AError.internalError('Invalid part type'); - } - - static messageSendParams(params: types.MessageSendParams): SendMessageRequest { - return { - request: ToProto.message(params.message), - configuration: ToProto.configuration(params.configuration), - metadata: params.metadata, - }; - } - - static configuration(configuration: types.MessageSendConfiguration): SendMessageConfiguration { - if (!configuration) { - return undefined; - } - - return { - blocking: configuration.blocking ?? false, - acceptedOutputModes: configuration.acceptedOutputModes ?? [], - pushNotification: ToProto.pushNotificationConfig(configuration.pushNotificationConfig), - historyLength: configuration.historyLength ?? 0, - }; - } - - static getTaskRequest(params: types.TaskQueryParams): GetTaskRequest { - return { - name: generateTaskName(params.id), - historyLength: params.historyLength ?? 0, - }; - } - - static cancelTaskRequest(params: types.TaskIdParams): CancelTaskRequest { - return { - name: generateTaskName(params.id), - }; - } - - static taskIdParams(params: types.TaskIdParams): TaskSubscriptionRequest { - return { - name: generateTaskName(params.id), - }; - } -}