From 0de54d607ade96e2b3ef07e934080ee1e36c29bf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 15 Jan 2026 22:13:42 +0100 Subject: [PATCH 01/51] chore(deps-dev): bump devalue from 5.6.1 to 5.6.2 (#300) Bumps [devalue](https://github.com/sveltejs/devalue) from 5.6.1 to 5.6.2.
Release notes

Sourced from devalue's releases.

v5.6.2

Patch Changes

Changelog

Sourced from devalue's changelog.

5.6.2

Patch Changes

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=devalue&package-manager=npm_and_yarn&previous-version=5.6.1&new-version=5.6.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index b8d839e1..ddb7c04f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3641,9 +3641,9 @@ } }, "node_modules/devalue": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz", - "integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.2.tgz", + "integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==", "dev": true, "license": "MIT" }, From f1626afa2a017231a55e638ea011aab7793d192c Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Fri, 16 Jan 2026 11:32:52 +0100 Subject: [PATCH 02/51] build: remove gts dev dependency (#301) # Description 1. Set `clean: true` in `tsup.config.ts` which enables `Clean output directory before each build`. 2. Remove `gts` dev dependency as it has a lot of transitive dependencies and was only used in `clean` script which just removes the output directory. --- package-lock.json | 2356 +++------------------------------------------ package.json | 2 - tsup.config.ts | 1 + 3 files changed, 113 insertions(+), 2246 deletions(-) diff --git a/package-lock.json b/package-lock.json index ddb7c04f..16fda4b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,7 +26,6 @@ "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.4", "express": "^5.1.0", - "gts": "^6.0.2", "json-schema-to-typescript": "^15.0.4", "prettier": "^3.6.2", "supertest": "^7.1.4", @@ -88,28 +87,6 @@ "url": "https://github.com/sponsors/philsturgeon" } }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "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", @@ -1155,22 +1132,6 @@ "node": ">=18.18.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", - "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.3", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1185,14 +1146,6 @@ "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", @@ -1770,44 +1723,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "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": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@paralleldrive/cuid2": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz", @@ -2392,13 +2307,6 @@ "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", @@ -2409,13 +2317,6 @@ "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", @@ -2430,13 +2331,6 @@ "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", @@ -2738,13 +2632,6 @@ "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": "3.2.4", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", @@ -2958,22 +2845,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "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": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -3014,26 +2885,6 @@ "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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", @@ -3130,29 +2981,6 @@ "concat-map": "0.0.1" } }, - "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": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "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": { - "semver": "^7.0.0" - } - }, "node_modules/bundle-require": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", @@ -3230,34 +3058,6 @@ "node": ">=6" } }, - "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": "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": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "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", @@ -3292,13 +3092,6 @@ "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" - }, "node_modules/check-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", @@ -3332,29 +3125,6 @@ "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "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": "ISC", - "engines": { - "node": ">= 10" - } - }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -3556,43 +3326,6 @@ } } }, - "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": ">=0.10.0" - } - }, - "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": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": ">=0.10.0" - } - }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", @@ -3658,32 +3391,6 @@ "wrappy": "1" } }, - "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", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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", @@ -3730,16 +3437,6 @@ "node": ">= 0.8" } }, - "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": { - "is-arrayish": "^0.2.1" - } - }, "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", @@ -3954,78 +3651,6 @@ "eslint": ">=7.0.0" } }, - "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": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=4.19.1" - } - }, - "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": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "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": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "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": { - "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_modules/eslint-plugin-prettier": { "version": "5.5.4", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", @@ -4074,35 +3699,6 @@ "url": "https://opencollective.com/eslint" } }, - "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": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "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", @@ -4200,34 +3796,10 @@ "node": ">= 0.6" } }, - "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": { - "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": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit-hook": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz", - "integrity": "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==", + "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": { @@ -4291,34 +3863,6 @@ "url": "https://opencollective.com/express" } }, - "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": ">=4" - } - }, - "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": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.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", @@ -4333,36 +3877,6 @@ "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==", - "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" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "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": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "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", @@ -4384,16 +3898,6 @@ "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==", - "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", @@ -4412,32 +3916,6 @@ } } }, - "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": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -4451,19 +3929,6 @@ "node": ">=16.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==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", @@ -4636,771 +4101,145 @@ }, "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/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", - "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/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-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-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" - } - }, - "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": "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": "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" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "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/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": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": { - "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/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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": ">=18" - }, - "peerDependencies": { - "typescript": ">=5" - } - }, - "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": { - "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": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "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", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "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", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "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": { - "@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": "^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/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": "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" - }, - "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_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": "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_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.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "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", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "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": "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": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "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": { - "@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": "^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/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": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "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": { - "@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": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "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": { - "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_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": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "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": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "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==", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">= 0.8" } }, - "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/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^8.16.0 || ^10.6.0 || >=11.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/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": "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" - }, + "license": "MIT", "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/ljharb" } }, - "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/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": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, + "license": "ISC", "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "6.* || 8.* || >= 10.*" } }, - "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/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": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" + "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": "^10.12.0 || >=12.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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/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": { - "type-fest": "^0.20.2" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.4" } }, - "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/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", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" + "dependencies": { + "resolve-pkg-maps": "^1.0.0" }, "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "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/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": "MIT", + "license": "ISC", "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" + "is-glob": "^4.0.3" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" + "node": ">=10.13.0" } }, - "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==", + "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": "0BSD" + "license": "BSD-2-Clause" }, - "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/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 OR CC0-1.0)", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=18" }, "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==", + "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": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { @@ -5455,19 +4294,6 @@ "node": ">= 0.4" } }, - "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": { - "lru-cache": "^6.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", @@ -5496,16 +4322,6 @@ "url": "https://opencollective.com/express" } }, - "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" - } - }, "node_modules/iconv-lite": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", @@ -5560,28 +4376,6 @@ "node": ">=0.8.19" } }, - "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", - "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_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -5589,31 +4383,6 @@ "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": ">=8.0.0" - } - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -5624,29 +4393,6 @@ "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": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5680,36 +4426,6 @@ "node": ">=0.10.0" } }, - "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": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "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", - "engines": { - "node": ">=8" - } - }, - "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", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", @@ -5717,19 +4433,6 @@ "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", @@ -5844,13 +4547,6 @@ "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==", - "dev": true, - "license": "MIT" - }, "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", @@ -5889,19 +4585,6 @@ "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/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -5912,16 +4595,6 @@ "json-buffer": "3.0.1" } }, - "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", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/kleur": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", @@ -6027,19 +4700,6 @@ "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", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -6068,24 +4728,11 @@ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "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==", - "dev": true, - "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6111,46 +4758,6 @@ "node": ">= 0.8" } }, - "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": { - "@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": ">=10" - }, - "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==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/merge-descriptors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", @@ -6164,23 +4771,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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": ">= 8" - } - }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -6191,33 +4781,6 @@ "node": ">= 0.6" } }, - "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": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "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": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/mime": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", @@ -6258,26 +4821,6 @@ "url": "https://opencollective.com/express" } }, - "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": "MIT", - "engines": { - "node": ">=6" - } - }, - "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": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/miniflare": { "version": "4.20251210.0", "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20251210.0.tgz", @@ -6351,21 +4894,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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": ">= 6" - } - }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -6396,13 +4924,6 @@ "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", @@ -6441,23 +4962,6 @@ "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==", - "dev": true, - "license": "MIT", - "bin": { - "ncp": "bin/ncp" - } - }, "node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", @@ -6468,35 +4972,6 @@ "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==", - "dev": true, - "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": ">=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==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.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", @@ -6543,22 +5018,6 @@ "wrappy": "1" } }, - "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": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -6577,16 +5036,6 @@ "node": ">= 0.8.0" } }, - "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", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -6619,16 +5068,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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": ">=6" - } - }, "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", @@ -6649,25 +5088,6 @@ "node": ">=6" } }, - "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": { - "@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" - } - }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -6688,16 +5108,6 @@ "node": ">=8" } }, - "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": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -6708,13 +5118,6 @@ "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", @@ -6750,16 +5153,6 @@ "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", - "engines": { - "node": ">=8" - } - }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", @@ -6986,210 +5379,39 @@ "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/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/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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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/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": { - "@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/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": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "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==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "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": { - "p-try": "^2.0.0" + "side-channel": "^1.1.0" }, "engines": { - "node": ">=6" + "node": ">=0.6" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "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/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", - "dependencies": { - "p-limit": "^2.2.0" - }, - "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==", - "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=8" + "node": ">= 0.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/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": "^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)", + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.10" } }, "node_modules/readdirp": { @@ -7206,33 +5428,6 @@ "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" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -7243,27 +5438,6 @@ "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.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -7284,48 +5458,6 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "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/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "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": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/rollup": { "version": "4.53.5", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.5.tgz", @@ -7385,53 +5517,6 @@ "node": ">= 18" } }, - "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": ">=0.12.0" - } - }, - "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, - "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/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -7652,13 +5737,6 @@ "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", @@ -7676,16 +5754,6 @@ "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": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", @@ -7706,42 +5774,6 @@ "node": ">=0.10.0" } }, - "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": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "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": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.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", @@ -7835,29 +5867,6 @@ "node": ">=8" } }, - "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", - "engines": { - "node": ">=6" - } - }, - "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": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -7955,19 +5964,6 @@ "node": ">=8" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/synckit": { "version": "0.11.11", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", @@ -8046,13 +6042,6 @@ "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", @@ -8076,13 +6065,6 @@ "node": ">=0.8" } }, - "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", @@ -8144,32 +6126,6 @@ "node": ">=14.0.0" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "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": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -8190,16 +6146,6 @@ "tree-kill": "cli.js" } }, - "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", - "engines": { - "node": ">=8" - } - }, "node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -8220,13 +6166,6 @@ "dev": true, "license": "Apache-2.0" }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true, - "license": "0BSD" - }, "node_modules/tsup": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", @@ -8290,22 +6229,6 @@ "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": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "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/tsx": { "version": "4.21.0", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.21.0.tgz", @@ -8339,19 +6262,6 @@ "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/sindresorhus" - } - }, "node_modules/type-is": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", @@ -8472,17 +6382,6 @@ "uuid": "dist/esm/bin/uuid" } }, - "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": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -9298,20 +7197,6 @@ "dev": true, "license": "ISC" }, - "node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/ws": { "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", @@ -9344,13 +7229,6 @@ "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" - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -9370,16 +7248,6 @@ "node": ">=12" } }, - "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", diff --git a/package.json b/package.json index 17a78b01..7a8e6335 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,6 @@ "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.4", "express": "^5.1.0", - "gts": "^6.0.2", "json-schema-to-typescript": "^15.0.4", "prettier": "^3.6.2", "supertest": "^7.1.4", @@ -87,7 +86,6 @@ "vitest": "^3.2.4" }, "scripts": { - "clean": "gts clean", "build": "tsup", "test": "vitest run", "test:edge": "vitest run --config vitest.edge.config.ts", diff --git a/tsup.config.ts b/tsup.config.ts index 1dff32da..5eba3e27 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -10,4 +10,5 @@ export default defineConfig({ ], format: ['esm', 'cjs'], dts: true, + clean: true, }); From 66a59d0532e7c551f4763fc016ff3cab39bf2260 Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Fri, 16 Jan 2026 13:48:08 +0100 Subject: [PATCH 03/51] test: remove delays in push notification integration tests (#302) # Description `send` is not awaited in the `DefaultRequestHandler`, so returning a final promise has no impact on it. Collect all promises to wait for sending push notifications instead of relying on a static delay. Fixes #148 --- .../default_push_notification_sender.ts | 2 +- .../push_notification_integration.spec.ts | 26 +++++++++++++------ 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/server/push_notification/default_push_notification_sender.ts b/src/server/push_notification/default_push_notification_sender.ts index d3dd50cf..02ffaeb9 100644 --- a/src/server/push_notification/default_push_notification_sender.ts +++ b/src/server/push_notification/default_push_notification_sender.ts @@ -56,7 +56,7 @@ export class DefaultPushNotificationSender implements PushNotificationSender { }); this.notificationChain.set(task.id, newPromise); - newPromise.finally(() => { + return newPromise.finally(() => { // Clean up the chain if it's the last notification if (this.notificationChain.get(task.id) === newPromise) { this.notificationChain.delete(task.id); diff --git a/test/server/push_notification_integration.spec.ts b/test/server/push_notification_integration.spec.ts index 08ce1ec6..bbd5ce8f 100644 --- a/test/server/push_notification_integration.spec.ts +++ b/test/server/push_notification_integration.spec.ts @@ -1,4 +1,4 @@ -import { describe, it, beforeEach, afterEach, assert, vi } from 'vitest'; +import { describe, it, beforeEach, afterEach, assert, vi, type MockInstance } from 'vitest'; import express, { Request, Response } from 'express'; import { Server } from 'http'; import { AddressInfo } from 'net'; @@ -17,6 +17,8 @@ import { } from '../../src/index.js'; import { fakeTaskExecute, MockAgentExecutor } from './mocks/agent-executor.mock.js'; +type PushNotificationSenderSpy = MockInstance<(task: Task) => Promise>; + describe('Push Notification Integration Tests', () => { let testServer: Server; let testServerUrl: string; @@ -32,6 +34,7 @@ describe('Push Notification Integration Tests', () => { let mockAgentExecutor: MockAgentExecutor; let pushNotificationStore: InMemoryPushNotificationStore; let pushNotificationSender: DefaultPushNotificationSender; + let pushNotificationSenderSpy: PushNotificationSenderSpy; const testAgentCard: AgentCard = { name: 'Test Agent', @@ -116,6 +119,7 @@ describe('Push Notification Integration Tests', () => { const executionEventBusManager = new DefaultExecutionEventBusManager(); pushNotificationStore = new InMemoryPushNotificationStore(); pushNotificationSender = new DefaultPushNotificationSender(pushNotificationStore); + pushNotificationSenderSpy = vi.spyOn(pushNotificationSender, 'send'); handler = new DefaultRequestHandler( testAgentCard, @@ -143,6 +147,10 @@ describe('Push Notification Integration Tests', () => { ...(taskId && { taskId }), }); + const waitForPushNotifications = async (spy: PushNotificationSenderSpy) => { + await Promise.all(spy.mock.results.map((r) => r.value)); + }; + describe('End-to-End Push Notification Flow', () => { it('should send push notifications for task status updates', async () => { const pushConfig: PushNotificationConfig = { @@ -173,7 +181,7 @@ describe('Push Notification Integration Tests', () => { await handler.sendMessage(params); // Wait for async push notifications to be sent - await new Promise((resolve) => setTimeout(resolve, 200)); + await waitForPushNotifications(pushNotificationSenderSpy); // Load the task from the store const expectedTaskResult: Task = { @@ -291,7 +299,7 @@ describe('Push Notification Integration Tests', () => { await handler.sendMessage(params); // Wait for async push notifications to be sent - await new Promise((resolve) => setTimeout(resolve, 300)); + await waitForPushNotifications(pushNotificationSenderSpy); // Should now have notifications from both endpoints const notificationsByEndpoint = receivedNotifications.reduce( @@ -347,7 +355,7 @@ describe('Push Notification Integration Tests', () => { const task = result as Task; // Wait for async push notifications to be sent - await new Promise((resolve) => setTimeout(resolve, 200)); + await waitForPushNotifications(pushNotificationSenderSpy); // Load the task from the store const expectedTaskResult: Task = { @@ -412,7 +420,7 @@ describe('Push Notification Integration Tests', () => { await handler.sendMessage(params); // Wait for async push notifications to be sent - await new Promise((resolve) => setTimeout(resolve, 200)); + await waitForPushNotifications(pushNotificationSenderSpy); // Verify default header name is used assert.lengthOf( @@ -443,6 +451,7 @@ describe('Push Notification Integration Tests', () => { tokenHeaderName: 'X-Custom-Auth-Token', } ); + const customSenderSpy = vi.spyOn(customPushNotificationSender, 'send'); const customHandler = new DefaultRequestHandler( testAgentCard, @@ -492,7 +501,7 @@ describe('Push Notification Integration Tests', () => { await customHandler.sendMessage(params); // Wait for async push notifications to be sent - await new Promise((resolve) => setTimeout(resolve, 200)); + await waitForPushNotifications(customSenderSpy); // Verify custom header name is used assert.lengthOf( @@ -559,7 +568,7 @@ describe('Push Notification Integration Tests', () => { await handler.sendMessage(params); // Wait for async push notifications to be sent - await new Promise((resolve) => setTimeout(resolve, 200)); + await waitForPushNotifications(pushNotificationSenderSpy); // Verify no token header is sent assert.lengthOf( @@ -589,6 +598,7 @@ describe('Push Notification Integration Tests', () => { tokenHeaderName: 'X-Custom-Token', } ); + const customSenderSpy = vi.spyOn(customPushNotificationSender, 'send'); const customHandler = new DefaultRequestHandler( testAgentCard, @@ -657,7 +667,7 @@ describe('Push Notification Integration Tests', () => { await customHandler.sendMessage(params); // Wait for async push notifications to be sent - await new Promise((resolve) => setTimeout(resolve, 300)); + await waitForPushNotifications(customSenderSpy); // Verify both endpoints received notifications with correct headers const config1Notifications = receivedNotifications.filter((n) => n.url === '/notify'); From dbdb96eeb14a710ad612f36f371d848fc7cce186 Mon Sep 17 00:00:00 2001 From: Guglielmo Colombo Date: Mon, 19 Jan 2026 16:15:51 +0100 Subject: [PATCH 04/51] feat: implement gRPC client (#299) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description This PR extends the implementation of grpc to Client. A new index.js is created to export the grpc specific functions, preventing the need for every client to install the `grpc/js` package Release-As: 0.3.9 Fixes #275 🦕 --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> Co-authored-by: Ivan Shymko --- package.json | 8 + src/client/transports/grpc/grpc_transport.ts | 349 ++++++++++++++++ src/client/transports/grpc/index.ts | 5 + src/server/grpc/grpc_service.ts | 1 - src/types/converters/from_proto.ts | 13 +- src/types/converters/to_proto.ts | 5 + test/client/transports/grpc_transport.spec.ts | 387 ++++++++++++++++++ test/e2e.spec.ts | 45 +- tsup.config.ts | 1 + vitest.edge.config.ts | 1 + 10 files changed, 801 insertions(+), 14 deletions(-) create mode 100644 src/client/transports/grpc/grpc_transport.ts create mode 100644 src/client/transports/grpc/index.ts create mode 100644 test/client/transports/grpc_transport.spec.ts diff --git a/package.json b/package.json index 7a8e6335..dc3760a4 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,9 @@ ], "client": [ "./dist/client/index.d.ts" + ], + "client/grpc": [ + "./dist/client/transports/grpc/index.d.ts" ] } }, @@ -54,6 +57,11 @@ "types": "./dist/client/index.d.ts", "import": "./dist/client/index.js", "require": "./dist/client/index.cjs" + }, + "./client/grpc": { + "types": "./dist/client/transports/grpc/index.d.ts", + "import": "./dist/client/transports/grpc/index.js", + "require": "./dist/client/transports/grpc/index.cjs" } }, "files": [ diff --git a/src/client/transports/grpc/grpc_transport.ts b/src/client/transports/grpc/grpc_transport.ts new file mode 100644 index 00000000..ce4800bf --- /dev/null +++ b/src/client/transports/grpc/grpc_transport.ts @@ -0,0 +1,349 @@ +import * as grpc from '@grpc/grpc-js'; +import { TransportProtocolName } from '../../../core.js'; +import { A2AServiceClient } from '../../../grpc/pb/a2a_services.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 '../../../types/converters/to_proto.js'; +import { FromProto } from '../../../types/converters/from_proto.js'; + +import { + AuthenticatedExtendedCardNotConfiguredError, + PushNotificationNotSupportedError, + TaskNotFoundError, + TaskNotCancelableError, + UnsupportedOperationError, +} from '../../../errors.js'; + +type GrpcUnaryCall = ( + request: TReq, + metadata: grpc.Metadata, + options: Partial, + callback: (error: grpc.ServiceError | null, response: TRes) => void +) => grpc.ClientUnaryCall; + +type GrpcStreamCall = ( + request: TReq, + metadata?: grpc.Metadata, + options?: Partial +) => grpc.ClientReadableStream; + +export interface GrpcTransportOptions { + endpoint: string; + grpcChannelCredentials?: grpc.ChannelCredentials; + grpcCallOptions?: Partial; +} + +export class GrpcTransport implements Transport { + private readonly grpcCallOptions?: Partial; + private readonly grpcClient: A2AServiceClient; + + constructor(options: GrpcTransportOptions) { + this.grpcCallOptions = options.grpcCallOptions; + this.grpcClient = new A2AServiceClient( + options.endpoint, + options.grpcChannelCredentials ?? grpc.credentials.createInsecure() + ); + } + + async getExtendedAgentCard(options?: RequestOptions): Promise { + const rpcResponse = await this._sendGrpcRequest( + 'getAgentCard', + undefined, + options, + this.grpcClient.getAgentCard.bind(this.grpcClient), + ToProto.getAgentCardRequest, + FromProto.agentCard + ); + return rpcResponse; + } + + async sendMessage( + params: MessageSendParams, + options?: RequestOptions + ): Promise { + const rpcResponse = await this._sendGrpcRequest( + 'sendMessage', + params, + options, + this.grpcClient.sendMessage.bind(this.grpcClient), + ToProto.messageSendParams, + FromProto.sendMessageResult + ); + return rpcResponse; + } + + async *sendMessageStream( + params: MessageSendParams, + options?: RequestOptions + ): AsyncGenerator { + yield* this._sendGrpcStreamingRequest( + 'sendStreamingMessage', + params, + options, + this.grpcClient.sendStreamingMessage.bind(this.grpcClient), + ToProto.messageSendParams + ); + } + + async setTaskPushNotificationConfig( + params: TaskPushNotificationConfig, + options?: RequestOptions + ): Promise { + const rpcResponse = await this._sendGrpcRequest( + 'createTaskPushNotificationConfig', + params, + options, + this.grpcClient.createTaskPushNotificationConfig.bind(this.grpcClient), + ToProto.taskPushNotificationConfigCreate, + FromProto.taskPushNotificationConfig + ); + return rpcResponse; + } + + async getTaskPushNotificationConfig( + params: GetTaskPushNotificationConfigParams, + options?: RequestOptions + ): Promise { + const rpcResponse = await this._sendGrpcRequest( + 'getTaskPushNotificationConfig', + params, + options, + this.grpcClient.getTaskPushNotificationConfig.bind(this.grpcClient), + ToProto.getTaskPushNotificationConfigParams, + FromProto.taskPushNotificationConfig + ); + return rpcResponse; + } + + async listTaskPushNotificationConfig( + params: ListTaskPushNotificationConfigParams, + options?: RequestOptions + ): Promise { + const rpcResponse = await this._sendGrpcRequest( + 'listTaskPushNotificationConfig', + params, + options, + this.grpcClient.listTaskPushNotificationConfig.bind(this.grpcClient), + ToProto.listTaskPushNotificationConfigParams, + FromProto.listTaskPushNotificationConfig + ); + return rpcResponse; + } + + async deleteTaskPushNotificationConfig( + params: DeleteTaskPushNotificationConfigParams, + options?: RequestOptions + ): Promise { + await this._sendGrpcRequest( + 'deleteTaskPushNotificationConfig', + params, + options, + this.grpcClient.deleteTaskPushNotificationConfig.bind(this.grpcClient), + ToProto.deleteTaskPushNotificationConfigParams, + () => {} + ); + } + + async getTask(params: TaskQueryParams, options?: RequestOptions): Promise { + const rpcResponse = await this._sendGrpcRequest( + 'getTask', + params, + options, + this.grpcClient.getTask.bind(this.grpcClient), + ToProto.taskQueryParams, + FromProto.task + ); + return rpcResponse; + } + + async cancelTask(params: TaskIdParams, options?: RequestOptions): Promise { + const rpcResponse = await this._sendGrpcRequest( + 'cancelTask', + params, + options, + this.grpcClient.cancelTask.bind(this.grpcClient), + ToProto.cancelTaskRequest, + FromProto.task + ); + return rpcResponse; + } + + async *resubscribeTask( + params: TaskIdParams, + options?: RequestOptions + ): AsyncGenerator { + 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) => { + let onAbort: (() => void) | undefined; + + const clientCall = call( + parser(params), + this._buildMetadata(options), + this.grpcCallOptions ?? {}, + (error, response) => { + if (options?.signal && onAbort) { + options.signal.removeEventListener('abort', onAbort); + } + if (error) { + return reject(GrpcTransport.mapToError(error, method)); + } + resolve(converter(response)); + } + ); + + if (options?.signal) { + if (options.signal.aborted) { + clientCall.cancel(); + } else { + onAbort = () => clientCall.cancel(); + options.signal.addEventListener('abort', onAbort); + } + } + }); + } + + private async *_sendGrpcStreamingRequest( + method: 'sendStreamingMessage' | 'taskSubscription', + params: TParams, + options: RequestOptions | undefined, + call: GrpcStreamCall, + parser: (req: TParams) => TReq + ): AsyncGenerator { + const streamResponse = call( + parser(params), + this._buildMetadata(options), + this.grpcCallOptions ?? {} + ); + + let onAbort: (() => void) | undefined; + if (options?.signal) { + if (options.signal.aborted) { + streamResponse.cancel(); + } else { + onAbort = () => streamResponse.cancel(); + options.signal.addEventListener('abort', onAbort); + } + } + + try { + for await (const response of streamResponse) { + yield FromProto.messageStreamResult(response); + } + } catch (error) { + if (this.isServiceError(error)) { + throw GrpcTransport.mapToError(error, method); + } else { + throw new Error(`GRPC error for ${String(method)}!`, { + cause: error, + }); + } + } finally { + if (options?.signal && onAbort) { + options.signal.removeEventListener('abort', onAbort); + } + streamResponse.cancel(); + } + } + + private isServiceError(error: unknown): error is grpc.ServiceError { + return typeof error === 'object' && error !== null && 'code' in error; + } + + private _buildMetadata(options: RequestOptions | undefined): grpc.Metadata { + const metadata = new grpc.Metadata(); + if (options?.serviceParameters) { + for (const [key, value] of Object.entries(options.serviceParameters)) { + metadata.set(key, value); + } + } + return metadata; + } + + // TODO: the logic of mapToError will be removed in v1.0.0 with the enriched error model (https://a2a-protocol.org/latest/specification/#106-error-handling) + private static mapToError(error: grpc.ServiceError, method: keyof A2AServiceClient): Error { + switch (error.code) { + case grpc.status.NOT_FOUND: + return new TaskNotFoundError(error.details); + case grpc.status.FAILED_PRECONDITION: + if (method === 'cancelTask') { + return new TaskNotCancelableError(error.details); + } + if (method === 'getAgentCard') { + return new AuthenticatedExtendedCardNotConfiguredError(error.details); + } + break; + case grpc.status.UNIMPLEMENTED: + if ( + [ + 'getTaskPushNotificationConfig', + 'createTaskPushNotificationConfig', + 'deleteTaskPushNotificationConfig', + 'listTaskPushNotificationConfig', + ].includes(method) + ) { + return new PushNotificationNotSupportedError(error.details); + } + if (['getAgentCard', 'taskSubscription'].includes(method)) { + return new UnsupportedOperationError(error.details); + } + break; + //TODO: add case for grpc.status.INVALID_ARGUMENT and grpc.status.INTERNAL (the respective a2a errors are not implemented yet) + default: + break; + } + return new Error(`GRPC error for ${String(method)}! ${error.code} ${error.details}`, { + cause: error, + }); + } +} + +export class GrpcTransportFactoryOptions { + grpcChannelCredentials?: grpc.ChannelCredentials; + 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, + grpcChannelCredentials: this.options?.grpcChannelCredentials, + grpcCallOptions: this.options?.grpcCallOptions, + }); + } +} diff --git a/src/client/transports/grpc/index.ts b/src/client/transports/grpc/index.ts new file mode 100644 index 00000000..8dccd13f --- /dev/null +++ b/src/client/transports/grpc/index.ts @@ -0,0 +1,5 @@ +export { + GrpcTransport, + GrpcTransportFactory, + type GrpcTransportOptions, +} from './grpc_transport.js'; diff --git a/src/server/grpc/grpc_service.ts b/src/server/grpc/grpc_service.ts index f95a5678..4d7c2a2f 100644 --- a/src/server/grpc/grpc_service.ts +++ b/src/server/grpc/grpc_service.ts @@ -249,7 +249,6 @@ const mapping: Record = { [-32006]: grpc.status.INTERNAL, [-32007]: grpc.status.FAILED_PRECONDITION, [-32600]: grpc.status.INVALID_ARGUMENT, - [-32601]: grpc.status.NOT_FOUND, [-32602]: grpc.status.INVALID_ARGUMENT, [-32603]: grpc.status.INTERNAL, }; diff --git a/src/types/converters/from_proto.ts b/src/types/converters/from_proto.ts index 786c4932..93fc4b45 100644 --- a/src/types/converters/from_proto.ts +++ b/src/types/converters/from_proto.ts @@ -107,8 +107,8 @@ export class FromProto { kind: 'message', messageId: message.messageId, parts: message.content.map((p) => FromProto.part(p)), - contextId: message.contextId, - taskId: message.taskId, + contextId: message.contextId || undefined, + taskId: message.taskId || undefined, role: FromProto.role(message.role), metadata: message.metadata, extensions: message.extensions, @@ -488,13 +488,8 @@ export class FromProto { event: StreamResponse ): types.Message | types.Task | types.TaskStatusUpdateEvent | types.TaskArtifactUpdateEvent { switch (event.payload?.$case) { - case 'msg': { - const message = FromProto.message(event.payload.value); - if (!message) { - throw A2AError.internalError('Invalid message in StreamResponse'); - } - return message; - } + case 'msg': + return FromProto.message(event.payload.value); case 'task': return FromProto.task(event.payload.value); case 'statusUpdate': diff --git a/src/types/converters/to_proto.ts b/src/types/converters/to_proto.ts index 24d31540..aa2a5d44 100644 --- a/src/types/converters/to_proto.ts +++ b/src/types/converters/to_proto.ts @@ -36,6 +36,7 @@ import { CancelTaskRequest, TaskSubscriptionRequest, CreateTaskPushNotificationConfigRequest, + GetAgentCardRequest, } from '../pb/a2a_types.js'; import { generatePushNotificationConfigName, generateTaskName } from './id_decoding.js'; @@ -560,4 +561,8 @@ export class ToProto { name: generateTaskName(params.id), }; } + + static getAgentCardRequest(): GetAgentCardRequest { + return {}; + } } diff --git a/test/client/transports/grpc_transport.spec.ts b/test/client/transports/grpc_transport.spec.ts new file mode 100644 index 00000000..6e299db8 --- /dev/null +++ b/test/client/transports/grpc_transport.spec.ts @@ -0,0 +1,387 @@ +import { describe, it, beforeEach, afterEach, expect, vi, type Mock } from 'vitest'; +import { credentials, Metadata, ServiceError, status } from '@grpc/grpc-js'; +import { + GrpcTransport, + GrpcTransportFactory, +} from '../../../src/client/transports/grpc/grpc_transport.js'; +import { A2AServiceClient } from '../../../src/grpc/pb/a2a_services.js'; +import { ToProto } from '../../../src/types/converters/to_proto.js'; +import { FromProto } from '../../../src/types/converters/from_proto.js'; +import { + TaskNotFoundError, + TaskNotCancelableError, + PushNotificationNotSupportedError, +} from '../../../src/errors.js'; +import { + createMessageParams, + createMockAgentCard, + createMockMessage, + createMockTask, +} from '../util.js'; + +// --- Mocks --- + +// Mock the gRPC client class +vi.mock('../../../src/grpc/pb/a2a_services.js', () => { + 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 }; +}); + +// Mock ToProto and FromProto to act as pass-throughs or return simple objects for testing flow +vi.mock('../../../src/types/converters/to_proto.js', () => ({ + ToProto: { + agentCard: vi.fn((x) => x), + messageSendParams: vi.fn((x) => x), + taskPushNotificationConfig: vi.fn((x) => x), + getTaskPushNotificationConfigParams: vi.fn((x) => x), + listTaskPushNotificationConfigParams: vi.fn((x) => x), + deleteTaskPushNotificationConfigParams: vi.fn((x) => x), + getTaskRequest: vi.fn((x) => x), + cancelTaskRequest: vi.fn((x) => x), + taskIdParams: vi.fn((x) => x), + taskPushNotificationConfigCreate: vi.fn((x) => x), + taskQueryParams: vi.fn((x) => x), + getAgentCardRequest: vi.fn((x) => x), + }, +})); + +vi.mock('../../../src/types/converters/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), + taskPushNotificationConfig: vi.fn((x) => x), + messageStreamResult: 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) => { + method.mockImplementation((_req: any, _meta: any, _opts: any, callback: any) => { + const error: Partial = { + code: code, + details: message, + }; + callback(error, null); + return {}; + }); + }; + + beforeEach(() => { + mockGrpcClient = new A2AServiceClient(endpoint, credentials.createInsecure()); + transport = new GrpcTransport({ endpoint }); + }); + + afterEach(() => { + vi.clearAllMocks(); + }); + + 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 mockResult = createMockMessage(); + mockUnarySuccess(mockGrpcClient.sendMessage as Mock, mockResult); + + const result = await transport.sendMessage(params); + + expect(result).toEqual(mockResult); + expect(ToProto.messageSendParams).toHaveBeenCalledWith(params); + expect(mockGrpcClient.sendMessage).toHaveBeenCalled(); + }); + + it('should pass service parameters as metadata', async () => { + const params = createMessageParams(); + 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 when mapped from A2A error code', async () => { + const params = createMessageParams(); + mockUnaryError(mockGrpcClient.sendMessage as Mock, status.NOT_FOUND, 'Task Missing'); + + 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, status.UNKNOWN, 'Internal Error'); + + await expect(transport.sendMessage(params)).rejects.toThrow('GRPC error for sendMessage'); + }); + + it('should cancel request when signal is aborted', async () => { + const params = createMessageParams(); + const cancelMock = vi.fn(); + (mockGrpcClient.sendMessage as Mock).mockImplementation((_req, _meta, _opts, callback) => { + return { + cancel: () => { + cancelMock(); + callback({ code: status.CANCELLED, details: 'Cancelled' }, null); + }, + }; + }); + + const controller = new AbortController(); + const promise = transport.sendMessage(params, { signal: controller.signal }); + + controller.abort(); + + expect(cancelMock).toHaveBeenCalled(); + await expect(promise).rejects.toThrow(); + }); + }); + + describe('sendMessageStream', () => { + it('should yield messages from stream', async () => { + const params = createMessageParams(); + const mockMsg = createMockMessage(); + const mockMsgResponse = { payload: { $case: 'msg', value: mockMsg } }; + + const mockStream = { + [Symbol.asyncIterator]: async function* () { + yield mockMsgResponse; + }, + cancel: vi.fn(), + }; + (mockGrpcClient.sendStreamingMessage as Mock).mockReturnValue(mockStream); + + const iterator = transport.sendMessageStream(params); + const result = await iterator.next(); + + expect(result.value).toEqual(mockMsgResponse); + expect(FromProto.messageStreamResult).toHaveBeenCalledWith(mockMsgResponse); + expect(mockGrpcClient.sendStreamingMessage).toHaveBeenCalled(); + }); + + 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!'); + }); + + it('should cancel stream when signal is aborted', async () => { + const params = createMessageParams(); + const cancelMock = vi.fn(); + const mockStream = { + [Symbol.asyncIterator]: async function* () { + await new Promise((resolve) => setTimeout(resolve, 50)); + yield { payload: { $case: 'msg', value: createMockMessage() } }; + }, + cancel: cancelMock, + }; + (mockGrpcClient.sendStreamingMessage as Mock).mockReturnValue(mockStream); + + const controller = new AbortController(); + const iterator = transport.sendMessageStream(params, { signal: controller.signal }); + + iterator.next(); + controller.abort(); + + expect(cancelMock).toHaveBeenCalled(); + }); + }); + + describe('getTask', () => { + it('should get task successfully', async () => { + const taskId = 'task-123'; + const mockTask = createMockTask(taskId); + mockUnarySuccess(mockGrpcClient.getTask as Mock, mockTask); + + const result = await transport.getTask({ id: taskId }); + + expect(result).toEqual(mockTask); + expect(ToProto.taskQueryParams).toHaveBeenCalled(); + expect(mockGrpcClient.getTask).toHaveBeenCalled(); + }); + + it('should throw TaskNotFoundError', async () => { + mockUnaryError(mockGrpcClient.getTask as Mock, status.NOT_FOUND, 'Not Found'); + await expect(transport.getTask({ id: 'bad-id' })).rejects.toThrow(TaskNotFoundError); + }); + }); + + describe('cancelTask', () => { + it('should cancel task successfully', async () => { + const taskId = 'task-123'; + const mockTask = createMockTask(taskId, 'canceled'); + mockUnarySuccess(mockGrpcClient.cancelTask as Mock, mockTask); + + const result = await transport.cancelTask({ id: taskId }); + + expect(result).toEqual(mockTask); + expect(mockGrpcClient.cancelTask).toHaveBeenCalled(); + }); + + it('should throw TaskNotCancelableError', async () => { + mockUnaryError( + mockGrpcClient.cancelTask as Mock, + status.FAILED_PRECONDITION, + 'Cannot cancel' + ); + await expect(transport.cancelTask({ id: 'task-123' })).rejects.toThrow( + TaskNotCancelableError + ); + }); + }); + + describe('Push Notification Config', () => { + const taskId = 'task-123'; + const configId = 'config-456'; + const mockConfig = { + taskId, + pushNotificationConfig: { id: configId, url: 'http://test' }, + }; + + describe('setTaskPushNotificationConfig', () => { + it('should set config successfully', async () => { + mockUnarySuccess(mockGrpcClient.createTaskPushNotificationConfig as Mock, mockConfig); + + const result = await transport.setTaskPushNotificationConfig(mockConfig); + + expect(result).toEqual(mockConfig); + expect(mockGrpcClient.createTaskPushNotificationConfig).toHaveBeenCalled(); + }); + + it('should throw PushNotificationNotSupportedError', async () => { + mockUnaryError( + mockGrpcClient.createTaskPushNotificationConfig as Mock, + status.UNIMPLEMENTED, + 'Not supported' + ); + await expect(transport.setTaskPushNotificationConfig(mockConfig)).rejects.toThrow( + PushNotificationNotSupportedError + ); + }); + }); + + describe('getTaskPushNotificationConfig', () => { + it('should get config successfully', async () => { + mockUnarySuccess(mockGrpcClient.getTaskPushNotificationConfig as Mock, mockConfig); + + const result = await transport.getTaskPushNotificationConfig({ + id: taskId, + pushNotificationConfigId: configId, + }); + + expect(result).toEqual(mockConfig); + }); + }); + + describe('listTaskPushNotificationConfig', () => { + it('should list configs successfully', async () => { + const mockList = [mockConfig]; + mockUnarySuccess(mockGrpcClient.listTaskPushNotificationConfig as Mock, mockList); + + const result = await transport.listTaskPushNotificationConfig({ id: taskId }); + + expect(result).toEqual(mockList); + }); + }); + + describe('deleteTaskPushNotificationConfig', () => { + it('should delete config successfully', async () => { + mockUnarySuccess(mockGrpcClient.deleteTaskPushNotificationConfig as Mock, {}); + + await transport.deleteTaskPushNotificationConfig({ + id: taskId, + pushNotificationConfigId: configId, + }); + + expect(mockGrpcClient.deleteTaskPushNotificationConfig).toHaveBeenCalled(); + }); + }); + }); + + describe('resubscribeTask', () => { + it('should yield task updates from stream', async () => { + const params = { id: 'task-123' }; + const mockUpdate = createMockTask('task-123'); + const mockResponse = { payload: { $case: 'task', value: mockUpdate } }; + + const mockStream = { + [Symbol.asyncIterator]: async function* () { + yield mockResponse; + }, + cancel: vi.fn(), + }; + (mockGrpcClient.taskSubscription as Mock).mockReturnValue(mockStream); + + const iterator = transport.resubscribeTask(params); + const result = await iterator.next(); + + expect(result.value).toEqual(mockResponse); + expect(FromProto.messageStreamResult).toHaveBeenCalledWith(mockResponse); + }); + }); +}); + +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); + }); +}); diff --git a/test/e2e.spec.ts b/test/e2e.spec.ts index 818bb0c5..735b409c 100644 --- a/test/e2e.spec.ts +++ b/test/e2e.spec.ts @@ -1,4 +1,5 @@ import express, { Express } from 'express'; +import * as grpc from '@grpc/grpc-js'; import { describe, it, beforeEach, afterEach, expect } from 'vitest'; import { AgentExecutionEvent, @@ -17,6 +18,8 @@ import { Server } from 'http'; import { AddressInfo } from 'net'; import { A2AStreamEventData } from '../src/client/client.js'; import { UserBuilder } from '../src/server/express/common.js'; +import { A2AService, grpcService } from '../src/server/grpc/index.js'; +import { GrpcTransportFactory } from '../src/client/transports/grpc/grpc_transport.js'; class TestAgentExecutor implements AgentExecutor { constructor(public events: AgentExecutionEvent[] = []) {} @@ -33,7 +36,7 @@ class TestAgentExecutor implements AgentExecutor { interface TransportConfig { name: string; preferredTransport: string; - serverPath: string; + serverPath?: string; } const transportConfigs: TransportConfig[] = [ @@ -47,19 +50,28 @@ const transportConfigs: TransportConfig[] = [ preferredTransport: 'HTTP+JSON', serverPath: '/a2a/rest', }, + { + name: 'GRPC', + preferredTransport: 'GRPC', + }, ]; describe('Client E2E tests', () => { - const clientFactory = new ClientFactory(ClientFactoryOptions.default); + const clientFactory = new ClientFactory( + ClientFactoryOptions.createFrom(ClientFactoryOptions.default, { + transports: [new GrpcTransportFactory()], + }) + ); transportConfigs.forEach((transportConfig) => { describe(`[${transportConfig.name}]`, () => { let app: Express; let server: Server; + let grpcServer: grpc.Server; let agentExecutor: TestAgentExecutor; let agentCard: AgentCard; - beforeEach(() => { + beforeEach(async () => { agentExecutor = new TestAgentExecutor(); agentCard = { protocolVersion: '0.3.0', @@ -103,13 +115,38 @@ describe('Client E2E tests', () => { ); server = app.listen(); - const address = server.address() as AddressInfo; agentCard.url = `http://localhost:${address.port}${transportConfig.serverPath}`; + + grpcServer = new grpc.Server(); + grpcServer.addService( + A2AService, + grpcService({ + requestHandler: requestHandler, + userBuilder: UserBuilder.noAuthentication, + }) + ); + await new Promise((resolve, reject) => { + grpcServer.bindAsync( + `localhost:0`, + grpc.ServerCredentials.createInsecure(), + (error, port) => { + if (error) { + reject(error); + return; + } + if (transportConfig.name === 'GRPC') { + agentCard.url = `localhost:${port}`; + } + resolve(); + } + ); + }); }); afterEach(() => { server.close(); + grpcServer.forceShutdown(); }); describe('sendMessage', () => { diff --git a/tsup.config.ts b/tsup.config.ts index 5eba3e27..0cf57d87 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -7,6 +7,7 @@ export default defineConfig({ 'src/server/express/index.ts', 'src/server/grpc/index.ts', 'src/client/index.ts', + 'src/client/transports/grpc/index.ts', ], format: ['esm', 'cjs'], dts: true, diff --git a/vitest.edge.config.ts b/vitest.edge.config.ts index 4253f7b2..284069da 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/transports/grpc_transport.spec.ts', 'test/e2e.spec.ts', 'test/server/push_notification_integration.spec.ts', // Node modules should always be excluded From 0215d4232654c356c5d48e93cb94da46093576dd Mon Sep 17 00:00:00 2001 From: Guglielmo Colombo Date: Tue, 20 Jan 2026 09:52:15 +0100 Subject: [PATCH 05/51] fix: use proto default values in generated a2a_types.ts (#303) # Description This PR standardizes the handling of optional fields in the generated a2a_types and converters. It aligns the codebase with Protobuf standards by replacing undefined checks with empty string checks for missing string values. **Key Changes** - Generated Types (a2a_types.ts): - Removed the optionality from generated string fields. - Updated fromJSON and toJSON methods to validate against empty strings ("") instead of undefined for missing values. - Converters: - ToProto: Updated to convert undefined domain fields into empty strings, ensuring compliance with the new non-optional proto types. - FromProto: Updated to convert empty strings from the proto layer back into undefined, preserving the existing undefined semantics for the internal domain model. **Motivation** These changes ensure consistency with the Protobuf specification, where missing strings must default to the empty string rather than undefined. --- src/grpc/buf.gen.yaml | 1 + src/grpc/pb/a2a_services.ts | 9 +- src/types/README.md | 24 + src/types/buf.gen.yaml | 21 + src/types/buf.lock | 6 + src/types/buf.yaml | 6 + src/types/converters/from_proto.ts | 44 +- src/types/converters/to_proto.ts | 46 +- src/types/pb/a2a_types.ts | 679 +++++++++------------- src/types/pb/google/protobuf/timestamp.ts | 145 ----- test/client/util.ts | 2 +- test/server/grpc/to_proto.spec.ts | 4 +- 12 files changed, 384 insertions(+), 603 deletions(-) create mode 100644 src/types/README.md create mode 100644 src/types/buf.gen.yaml create mode 100644 src/types/buf.lock create mode 100644 src/types/buf.yaml delete mode 100644 src/types/pb/google/protobuf/timestamp.ts diff --git a/src/grpc/buf.gen.yaml b/src/grpc/buf.gen.yaml index c7a42db2..d935ea3f 100644 --- a/src/grpc/buf.gen.yaml +++ b/src/grpc/buf.gen.yaml @@ -14,4 +14,5 @@ plugins: - esModuleInterop=true - outputJsonMethods=false - outputPartialMethods=false + - useDate=string out: ./pb \ No newline at end of file diff --git a/src/grpc/pb/a2a_services.ts b/src/grpc/pb/a2a_services.ts index 5fe8b0a2..f29a10f6 100644 --- a/src/grpc/pb/a2a_services.ts +++ b/src/grpc/pb/a2a_services.ts @@ -2,7 +2,7 @@ // versions: // protoc-gen-ts_proto v2.6.1 // protoc unknown -// source: a2a.proto +// source: a2a_services.proto /* eslint-disable */ import { BinaryReader, BinaryWriter } from "@bufbuild/protobuf/wire"; @@ -3608,16 +3608,17 @@ export const A2AServiceClient = makeGenericClientConstructor(A2AServiceService, serviceName: string; }; -function toTimestamp(date: Date): Timestamp { +function toTimestamp(dateStr: string): Timestamp { + const date = new globalThis.Date(dateStr); 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 { +function fromTimestamp(t: Timestamp): string { let millis = (t.seconds || 0) * 1_000; millis += (t.nanos || 0) / 1_000_000; - return new globalThis.Date(millis); + return new globalThis.Date(millis).toISOString(); } export interface MessageFns { diff --git a/src/types/README.md b/src/types/README.md new file mode 100644 index 00000000..069ec35a --- /dev/null +++ b/src/types/README.md @@ -0,0 +1,24 @@ +# Types Generation + +This directory contains the configuration for generating types definitions for the A2A SDK from the proto file. The generation process uses [Buf](https://buf.build/) and `ts-proto`. + +## Prerequisites + +Ensure you have the project dependencies installed: + +```bash +npm install +``` + +This project uses `@bufbuild/buf` which is listed in the `devDependencies`. +Add the `a2a_types.proto` files to the `pb` directory. + +## Generating Code + +To generate the gRPC types definitions, run the following command from this directory (`src/types`): + +```bash +npx buf generate +``` + +This will generate the TypeScript files in the `./pb` directory (as configured in `buf.gen.yaml`). \ No newline at end of file diff --git a/src/types/buf.gen.yaml b/src/types/buf.gen.yaml new file mode 100644 index 00000000..fd2bd42f --- /dev/null +++ b/src/types/buf.gen.yaml @@ -0,0 +1,21 @@ +# buf generate +# Configuration for the buf generate command +# Uses remote plugins, no separate install required. +version: v2 +inputs: + - directory: ./pb +plugins: + - remote: buf.build/community/stephenh-ts-proto:v2.11.0 + out: ./pb + opt: + - oneof=unions-value + - importSuffix=.js + - outputServices=false + - env=node + - esModuleInterop=true + - outputJsonMethods=true + - outputPartialMethods=false + - outputEncodeMethods=false + - snakeToCamel=keys + - emitImportedFiles=false + - useDate=string \ No newline at end of file diff --git a/src/types/buf.lock b/src/types/buf.lock new file mode 100644 index 00000000..5df8acde --- /dev/null +++ b/src/types/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/types/buf.yaml b/src/types/buf.yaml new file mode 100644 index 00000000..750759dd --- /dev/null +++ b/src/types/buf.yaml @@ -0,0 +1,6 @@ +version: v2 +modules: + - path: ./pb +deps: + # Common Protobuf types. + - buf.build/googleapis/googleapis \ No newline at end of file diff --git a/src/types/converters/from_proto.ts b/src/types/converters/from_proto.ts index 93fc4b45..cd1c6013 100644 --- a/src/types/converters/from_proto.ts +++ b/src/types/converters/from_proto.ts @@ -150,7 +150,7 @@ export class FromProto { return { id: config.id, url: config.url, - token: config.token, + token: config.token || undefined, authentication: FromProto.pushNotificationAuthenticationInfo(config.authentication), }; } @@ -240,7 +240,7 @@ export class FromProto { return { message: FromProto.message(status.update), state: FromProto.taskState(status.state), - timestamp: status.timestamp?.toISOString(), + timestamp: status.timestamp, }; } @@ -272,8 +272,8 @@ export class FromProto { static artifact(artifact: Artifact): types.Artifact { return { artifactId: artifact.artifactId, - name: artifact.name, - description: artifact.description, + name: artifact.name || undefined, + description: artifact.description || undefined, parts: artifact.parts.map((p) => FromProto.part(p)), metadata: artifact.metadata, }; @@ -303,7 +303,7 @@ export class FromProto { defaultInputModes: agentCard.defaultInputModes, defaultOutputModes: agentCard.defaultOutputModes, description: agentCard.description, - documentationUrl: agentCard.documentationUrl, + documentationUrl: agentCard.documentationUrl || undefined, name: agentCard.name, preferredTransport: agentCard.preferredTransport, provider: agentCard.provider ? FromProto.agentProvider(agentCard.provider) : undefined, @@ -335,8 +335,8 @@ export class FromProto { static agentExtension(extension: AgentExtension): types.AgentExtension { return { - uri: extension.uri ?? '', - description: extension.description, + uri: extension.uri, + description: extension.description || undefined, required: extension.required, params: extension.params, }; @@ -344,15 +344,15 @@ export class FromProto { static agentInterface(intf: AgentInterface): types.AgentInterface { return { - transport: intf.transport ?? '', - url: intf.url ?? '', + transport: intf.transport, + url: intf.url, }; } static agentProvider(provider: AgentProvider): types.AgentProvider { return { - organization: provider.organization ?? '', - url: provider.url ?? '', + organization: provider.organization, + url: provider.url, }; } @@ -369,31 +369,31 @@ export class FromProto { type: 'apiKey', name: securitySchemes.scheme.value.name, in: securitySchemes.scheme.value.location as 'query' | 'header' | 'cookie', - description: securitySchemes.scheme.value.description, + description: securitySchemes.scheme.value.description || undefined, }; case 'httpAuthSecurityScheme': return { type: 'http', scheme: securitySchemes.scheme.value.scheme, - bearerFormat: securitySchemes.scheme.value.bearerFormat, - description: securitySchemes.scheme.value.description, + bearerFormat: securitySchemes.scheme.value.bearerFormat || undefined, + description: securitySchemes.scheme.value.description || undefined, }; case 'mtlsSecurityScheme': return { type: 'mutualTLS', - description: securitySchemes.scheme.value.description, + description: securitySchemes.scheme.value.description || undefined, }; case 'oauth2SecurityScheme': return { type: 'oauth2', - description: securitySchemes.scheme.value.description, + description: securitySchemes.scheme.value.description || undefined, flows: FromProto.oauthFlows(securitySchemes.scheme.value.flows), - oauth2MetadataUrl: securitySchemes.scheme.value.oauth2MetadataUrl, + oauth2MetadataUrl: securitySchemes.scheme.value.oauth2MetadataUrl || undefined, }; case 'openIdConnectSecurityScheme': return { type: 'openIdConnect', - description: securitySchemes.scheme.value.description, + description: securitySchemes.scheme.value.description || undefined, openIdConnectUrl: securitySchemes.scheme.value.openIdConnectUrl, }; default: @@ -408,13 +408,13 @@ export class FromProto { implicit: { authorizationUrl: flows.flow.value.authorizationUrl, scopes: flows.flow.value.scopes, - refreshUrl: flows.flow.value.refreshUrl, + refreshUrl: flows.flow.value.refreshUrl || undefined, }, }; case 'password': return { password: { - refreshUrl: flows.flow.value.refreshUrl, + refreshUrl: flows.flow.value.refreshUrl || undefined, scopes: flows.flow.value.scopes, tokenUrl: flows.flow.value.tokenUrl, }, @@ -422,7 +422,7 @@ export class FromProto { case 'authorizationCode': return { authorizationCode: { - refreshUrl: flows.flow.value.refreshUrl, + refreshUrl: flows.flow.value.refreshUrl || undefined, authorizationUrl: flows.flow.value.authorizationUrl, scopes: flows.flow.value.scopes, tokenUrl: flows.flow.value.tokenUrl, @@ -431,7 +431,7 @@ export class FromProto { case 'clientCredentials': return { clientCredentials: { - refreshUrl: flows.flow.value.refreshUrl, + refreshUrl: flows.flow.value.refreshUrl || undefined, scopes: flows.flow.value.scopes, tokenUrl: flows.flow.value.tokenUrl, }, diff --git a/src/types/converters/to_proto.ts b/src/types/converters/to_proto.ts index aa2a5d44..cb37cd88 100644 --- a/src/types/converters/to_proto.ts +++ b/src/types/converters/to_proto.ts @@ -47,12 +47,12 @@ export class ToProto { name: agentCard.name, description: agentCard.description, url: agentCard.url, - preferredTransport: agentCard.preferredTransport, + preferredTransport: agentCard.preferredTransport ?? '', additionalInterfaces: agentCard.additionalInterfaces?.map((i) => ToProto.agentInterface(i)) ?? [], provider: ToProto.agentProvider(agentCard.provider), version: agentCard.version, - documentationUrl: agentCard.documentationUrl, + documentationUrl: agentCard.documentationUrl ?? '', capabilities: ToProto.agentCapabilities(agentCard.capabilities), securitySchemes: agentCard.securitySchemes ? Object.fromEntries( @@ -111,7 +111,7 @@ export class ToProto { value: { name: scheme.name, location: scheme.in, - description: scheme.description, + description: scheme.description ?? '', }, }, }; @@ -120,9 +120,9 @@ export class ToProto { scheme: { $case: 'httpAuthSecurityScheme', value: { - description: scheme.description, + description: scheme.description ?? '', scheme: scheme.scheme, - bearerFormat: scheme.bearerFormat, + bearerFormat: scheme.bearerFormat ?? '', }, }, }; @@ -131,7 +131,7 @@ export class ToProto { scheme: { $case: 'mtlsSecurityScheme', value: { - description: scheme.description, + description: scheme.description ?? '', }, }, }; @@ -140,9 +140,9 @@ export class ToProto { scheme: { $case: 'oauth2SecurityScheme', value: { - description: scheme.description, + description: scheme.description ?? '', flows: ToProto.oauthFlows(scheme.flows), - oauth2MetadataUrl: scheme.oauth2MetadataUrl, + oauth2MetadataUrl: scheme.oauth2MetadataUrl ?? '', }, }, }; @@ -151,7 +151,7 @@ export class ToProto { scheme: { $case: 'openIdConnectSecurityScheme', value: { - description: scheme.description, + description: scheme.description ?? '', openIdConnectUrl: scheme.openIdConnectUrl, }, }, @@ -169,7 +169,7 @@ export class ToProto { value: { authorizationUrl: flows.implicit.authorizationUrl, scopes: flows.implicit.scopes, - refreshUrl: flows.implicit.refreshUrl, + refreshUrl: flows.implicit.refreshUrl ?? '', }, }, }; @@ -180,7 +180,7 @@ export class ToProto { value: { tokenUrl: flows.password.tokenUrl, scopes: flows.password.scopes, - refreshUrl: flows.password.refreshUrl, + refreshUrl: flows.password.refreshUrl ?? '', }, }, }; @@ -191,7 +191,7 @@ export class ToProto { value: { tokenUrl: flows.clientCredentials.tokenUrl, scopes: flows.clientCredentials.scopes, - refreshUrl: flows.clientCredentials.refreshUrl, + refreshUrl: flows.clientCredentials.refreshUrl ?? '', }, }, }; @@ -203,7 +203,7 @@ export class ToProto { authorizationUrl: flows.authorizationCode.authorizationUrl, tokenUrl: flows.authorizationCode.tokenUrl, scopes: flows.authorizationCode.scopes, - refreshUrl: flows.authorizationCode.refreshUrl, + refreshUrl: flows.authorizationCode.refreshUrl ?? '', }, }, }; @@ -242,8 +242,8 @@ export class ToProto { static agentExtension(extension: types.AgentExtension): AgentExtension { return { uri: extension.uri, - description: extension.description, - required: extension.required, + description: extension.description ?? '', + required: extension.required ?? false, params: extension.params, }; } @@ -311,9 +311,9 @@ export class ToProto { } return { - id: config.id, + id: config.id ?? '', url: config.url, - token: config.token, + token: config.token ?? '', authentication: ToProto.pushNotificationAuthenticationInfo(config.authentication), }; } @@ -326,7 +326,7 @@ export class ToProto { } return { schemes: authInfo.schemes, - credentials: authInfo.credentials, + credentials: authInfo.credentials ?? '', }; } @@ -413,8 +413,8 @@ export class ToProto { return { messageId: message.messageId, content: message.parts.map((p) => ToProto.part(p)), - contextId: message.contextId, - taskId: message.taskId, + contextId: message.contextId ?? '', + taskId: message.taskId ?? '', role: ToProto.role(message.role), metadata: message.metadata, extensions: message.extensions ?? [], @@ -447,15 +447,15 @@ export class ToProto { return { state: ToProto.taskState(status.state), update: ToProto.message(status.message), - timestamp: status.timestamp ? new Date(status.timestamp) : undefined, + timestamp: status.timestamp, }; } static artifact(artifact: types.Artifact): Artifact { return { artifactId: artifact.artifactId, - name: artifact.name, - description: artifact.description, + name: artifact.name ?? '', + description: artifact.description ?? '', parts: artifact.parts.map((p) => ToProto.part(p)), metadata: artifact.metadata, extensions: artifact.extensions ? artifact.extensions : [], diff --git a/src/types/pb/a2a_types.ts b/src/types/pb/a2a_types.ts index 93c561f0..0bb18a76 100644 --- a/src/types/pb/a2a_types.ts +++ b/src/types/pb/a2a_types.ts @@ -1,11 +1,10 @@ // Code generated by protoc-gen-ts_proto. DO NOT EDIT. // versions: -// protoc-gen-ts_proto v2.10.1 -// protoc v3.21.12 -// source: a2a.proto +// protoc-gen-ts_proto v2.11.0 +// protoc unknown +// source: a2a_types.proto /* eslint-disable */ -import { Timestamp } from "./google/protobuf/timestamp.js"; export const protobufPackage = "a2a.v1"; @@ -162,16 +161,14 @@ export interface SendMessageConfiguration { * The maximum number of messages to include in the history. if 0, the * history will be unlimited. */ - historyLength?: - | number - | undefined; + 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 | undefined; + blocking: boolean; } /** @@ -182,16 +179,12 @@ export interface SendMessageConfiguration { */ export interface Task { /** Unique identifier for a task, created by the A2A server. */ - id?: - | string - | undefined; + id: string; /** * Unique identifier for the contextual collection of interactions (tasks * and messages). Created by the A2A server. */ - contextId?: - | string - | undefined; + contextId: string; /** The current status of a Task, including state and a message. */ status: | TaskStatus @@ -213,9 +206,7 @@ export interface Task { /** A container for the status of a task */ export interface TaskStatus { /** The current state of this task */ - state?: - | TaskState - | undefined; + state: TaskState; /** A message associated with the status. */ update: | Message @@ -224,7 +215,7 @@ export interface TaskStatus { * Timestamp when the status was recorded. * Example: "2023-10-27T10:00:00Z" */ - timestamp: Date | undefined; + timestamp: string | undefined; } /** @@ -248,7 +239,7 @@ export interface Part { */ export interface FilePart { file?: { $case: "fileWithUri"; value: string } | { $case: "fileWithBytes"; value: Buffer } | undefined; - mimeType?: string | undefined; + mimeType: string; } /** DataPart represents a structured blob. This is most commonly a JSON payload. */ @@ -270,27 +261,19 @@ export interface Message { * The message id of the message. This is required and created by the * message creator. */ - messageId?: - | string - | undefined; + 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 - | undefined; + 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 - | undefined; + taskId: string; /** A role for the message. */ - role?: - | Role - | undefined; + role: Role; /** * protolint:disable REPEATED_FIELD_NAMES_PLURALIZED * Content is the container of the message content. @@ -314,17 +297,11 @@ export interface Message { */ export interface Artifact { /** Unique id for the artifact. It must be at least unique within a task. */ - artifactId?: - | string - | undefined; + artifactId: string; /** A human readable name for the artifact. */ - name?: - | string - | undefined; + name: string; /** A human readable description of the artifact, optional. */ - description?: - | string - | undefined; + description: string; /** The content of the artifact. */ parts: Part[]; /** Optional metadata included with the artifact. */ @@ -341,21 +318,15 @@ export interface Artifact { */ export interface TaskStatusUpdateEvent { /** The id of the task that is changed */ - taskId?: - | string - | undefined; + taskId: string; /** The id of the context that the task belongs to */ - contextId?: - | string - | undefined; + contextId: string; /** The new status of the task. */ status: | TaskStatus | undefined; /** Whether this is the last status update expected for this task. */ - final?: - | boolean - | undefined; + final: boolean; /** Optional metadata to associate with the task update. */ metadata: { [key: string]: any } | undefined; } @@ -366,25 +337,17 @@ export interface TaskStatusUpdateEvent { */ export interface TaskArtifactUpdateEvent { /** The id of the task for this artifact */ - taskId?: - | string - | undefined; + taskId: string; /** The id of the context that this task belongs too */ - contextId?: - | string - | undefined; + contextId: string; /** The artifact itself */ artifact: | Artifact | undefined; /** Whether this should be appended to a prior one produced */ - append?: - | boolean - | undefined; + append: boolean; /** Whether this represents the last part of an artifact */ - lastChunk?: - | boolean - | undefined; + lastChunk: boolean; /** Optional metadata associated with the artifact update. */ metadata: { [key: string]: any } | undefined; } @@ -392,17 +355,11 @@ export interface TaskArtifactUpdateEvent { /** Configuration for setting up push notifications for task updates. */ export interface PushNotificationConfig { /** A unique id for this push notification. */ - id?: - | string - | undefined; + id: string; /** Url to send the notification too */ - url?: - | string - | undefined; + url: string; /** Token unique for this task/session */ - token?: - | string - | undefined; + token: string; /** Information about the authentication to sent with the notification */ authentication: AuthenticationInfo | undefined; } @@ -412,21 +369,19 @@ export interface AuthenticationInfo { /** Supported authentication schemes - e.g. Basic, Bearer, etc */ schemes: string[]; /** Optional credentials */ - credentials?: string | undefined; + credentials: string; } /** Defines additional transport information for the agent. */ export interface AgentInterface { /** The url this interface is found at. */ - url?: - | string - | undefined; + url: string; /** * 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. */ - transport?: string | undefined; + transport: string; } /** @@ -439,34 +394,24 @@ export interface AgentInterface { */ export interface AgentCard { /** The version of the A2A protocol this agent supports. */ - protocolVersion?: - | string - | undefined; + protocolVersion: string; /** * A human readable name for the agent. * Example: "Recipe Agent" */ - name?: - | string - | undefined; + name: string; /** * A description of the agent's domain of action/solution space. * Example: "Agent that helps users with recipes and cooking." */ - description?: - | string - | undefined; + description: string; /** * A URL to the address the agent is hosted at. This represents the * preferred endpoint as declared by the agent. */ - url?: - | string - | undefined; + url: string; /** The transport of the preferred endpoint. If empty, defaults to JSONRPC. */ - preferredTransport?: - | string - | undefined; + preferredTransport: string; /** * Announcement of additional supported transports. Client can use any of * the supported transports. @@ -480,13 +425,9 @@ export interface AgentCard { * The version of the agent. * Example: "1.0.0" */ - version?: - | string - | undefined; + 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 @@ -529,15 +470,13 @@ export interface AgentCard { * the user is authenticated, i.e. is the card from .well-known * different than the card from GetAgentCard. */ - supportsAuthenticatedExtendedCard?: - | boolean - | undefined; + supportsAuthenticatedExtendedCard: boolean; /** JSON Web Signatures computed for this AgentCard. */ signatures: AgentCardSignature[]; } export interface AgentCard_SecuritySchemesEntry { - key?: string | undefined; + key: string; value: SecurityScheme | undefined; } @@ -547,26 +486,20 @@ export interface AgentProvider { * The providers reference url * Example: "https://ai.google.dev" */ - url?: - | string - | undefined; + url: string; /** * The providers organization name * Example: "Google" */ - organization?: string | undefined; + organization: string; } /** Defines the A2A feature set supported by the agent */ export interface AgentCapabilities { /** If the agent will support streaming responses */ - streaming?: - | boolean - | undefined; + streaming: boolean; /** If the agent can send push notifications to the clients webhook */ - pushNotifications?: - | boolean - | undefined; + pushNotifications: boolean; /** Extensions supported by this agent. */ extensions: AgentExtension[]; } @@ -577,23 +510,17 @@ export interface AgentExtension { * The URI of the extension. * Example: "https://developers.google.com/identity/protocols/oauth2" */ - uri?: - | string - | undefined; + uri: string; /** * A description of how this agent uses this extension. * Example: "Google OAuth 2.0 authentication" */ - description?: - | string - | undefined; + description: string; /** * Whether the client must follow specific requirements of the extension. * Example: false */ - required?: - | boolean - | undefined; + required: boolean; /** Optional configuration for the extension. */ params: { [key: string]: any } | undefined; } @@ -607,20 +534,14 @@ export interface AgentExtension { */ export interface AgentSkill { /** Unique id of the skill within this agent. */ - id?: - | string - | undefined; + id: string; /** A human readable name for the skill. */ - name?: - | string - | undefined; + name: string; /** * A human (or llm) readable description of the skill * details and behaviors. */ - description?: - | string - | undefined; + description: string; /** * A set of tags for the skill to enhance categorization/utilization. * Example: ["cooking", "customer support", "billing"] @@ -656,20 +577,16 @@ export interface AgentCardSignature { * The protected JWS header for the signature. This is always a * base64url-encoded JSON object. Required. */ - protected?: - | string - | undefined; + protected: string; /** The computed signature, base64url-encoded. Required. */ - signature?: - | string - | undefined; + signature: string; /** The unprotected JWS header values. */ header: { [key: string]: any } | undefined; } export interface TaskPushNotificationConfig { /** name=tasks/{id}/pushNotificationConfigs/{id} */ - name?: string | undefined; + name: string; pushNotificationConfig: PushNotificationConfig | undefined; } @@ -683,7 +600,7 @@ export interface Security { } export interface Security_SchemesEntry { - key?: string | undefined; + key: string; value: StringList | undefined; } @@ -699,44 +616,34 @@ export interface SecurityScheme { export interface APIKeySecurityScheme { /** Description of this security scheme. */ - description?: - | string - | undefined; + description: string; /** Location of the API key, valid values are "query", "header", or "cookie" */ - location?: - | string - | undefined; + location: string; /** Name of the header, query or cookie parameter to be used. */ - name?: string | undefined; + name: string; } export interface HTTPAuthSecurityScheme { /** Description of this security scheme. */ - description?: - | string - | undefined; + description: string; /** * 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 - | undefined; + scheme: string; /** * 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 | undefined; + bearerFormat: string; } export interface OAuth2SecurityScheme { /** Description of this security scheme. */ - description?: - | string - | undefined; + description: string; /** An object containing configuration information for the flow types supported */ flows: | OAuthFlows @@ -745,24 +652,22 @@ export interface OAuth2SecurityScheme { * URL to the oauth2 authorization server metadata * [RFC8414](https://datatracker.ietf.org/doc/html/rfc8414). TLS is required. */ - oauth2MetadataUrl?: string | undefined; + oauth2MetadataUrl: string; } export interface OpenIdConnectSecurityScheme { /** Description of this security scheme. */ - description?: - | string - | undefined; + description: string; /** * Well-known URL to discover the [[OpenID-Connect-Discovery]] provider * metadata. */ - openIdConnectUrl?: string | undefined; + openIdConnectUrl: string; } export interface MutualTlsSecurityScheme { /** Description of this security scheme. */ - description?: string | undefined; + description: string; } export interface OAuthFlows { @@ -779,23 +684,17 @@ export interface AuthorizationCodeOAuthFlow { * 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 - | undefined; + authorizationUrl: string; /** * 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 - | undefined; + tokenUrl: string; /** * 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 - | undefined; + refreshUrl: string; /** * 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. @@ -804,8 +703,8 @@ export interface AuthorizationCodeOAuthFlow { } export interface AuthorizationCodeOAuthFlow_ScopesEntry { - key?: string | undefined; - value?: string | undefined; + key: string; + value: string; } export interface ClientCredentialsOAuthFlow { @@ -813,16 +712,12 @@ export interface ClientCredentialsOAuthFlow { * 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 - | undefined; + tokenUrl: string; /** * 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 - | undefined; + refreshUrl: string; /** * 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. @@ -831,8 +726,8 @@ export interface ClientCredentialsOAuthFlow { } export interface ClientCredentialsOAuthFlow_ScopesEntry { - key?: string | undefined; - value?: string | undefined; + key: string; + value: string; } export interface ImplicitOAuthFlow { @@ -840,16 +735,12 @@ export interface ImplicitOAuthFlow { * 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 - | undefined; + authorizationUrl: string; /** * 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 - | undefined; + refreshUrl: string; /** * 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. @@ -858,8 +749,8 @@ export interface ImplicitOAuthFlow { } export interface ImplicitOAuthFlow_ScopesEntry { - key?: string | undefined; - value?: string | undefined; + key: string; + value: string; } export interface PasswordOAuthFlow { @@ -867,16 +758,12 @@ export interface PasswordOAuthFlow { * 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 - | undefined; + tokenUrl: string; /** * 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 - | undefined; + refreshUrl: string; /** * 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. @@ -885,8 +772,8 @@ export interface PasswordOAuthFlow { } export interface PasswordOAuthFlow_ScopesEntry { - key?: string | undefined; - value?: string | undefined; + key: string; + value: string; } /** /////////// Request Messages /////////// */ @@ -898,23 +785,23 @@ export interface SendMessageRequest { export interface GetTaskRequest { /** name=tasks/{id} */ - name?: string | undefined; - historyLength?: number | undefined; + name: string; + historyLength: number; } export interface CancelTaskRequest { /** name=tasks/{id} */ - name?: string | undefined; + name: string; } export interface GetTaskPushNotificationConfigRequest { /** name=tasks/{id}/pushNotificationConfigs/{push_id} */ - name?: string | undefined; + name: string; } export interface DeleteTaskPushNotificationConfigRequest { /** name=tasks/{id}/pushNotificationConfigs/{push_id} */ - name?: string | undefined; + name: string; } export interface CreateTaskPushNotificationConfigRequest { @@ -922,29 +809,25 @@ export interface CreateTaskPushNotificationConfigRequest { * The task resource for this config. * Format: tasks/{id} */ - parent?: string | undefined; - configId?: string | undefined; + parent: string; + configId: string; config: TaskPushNotificationConfig | undefined; } export interface TaskSubscriptionRequest { /** name=tasks/{id} */ - name?: string | undefined; + name: string; } export interface ListTaskPushNotificationConfigRequest { /** parent=tasks/{id} */ - parent?: - | string - | undefined; + parent: string; /** * 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. */ - pageSize?: - | number - | undefined; + pageSize: number; /** * A page token received from a previous * ListTaskPushNotificationConfigRequest call. @@ -953,7 +836,7 @@ export interface ListTaskPushNotificationConfigRequest { * `ListTaskPushNotificationConfigRequest` must match the call that provided * the page token. */ - pageToken?: string | undefined; + pageToken: string; } /** Empty. Added to fix linter violation. */ @@ -991,7 +874,7 @@ export interface ListTaskPushNotificationConfigResponse { * 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 | undefined; + nextPageToken: string; } export const SendMessageConfiguration: MessageFns = { @@ -1013,8 +896,8 @@ export const SendMessageConfiguration: MessageFns = { ? globalThis.Number(object.historyLength) : isSet(object.history_length) ? globalThis.Number(object.history_length) - : undefined, - blocking: isSet(object.blocking) ? globalThis.Boolean(object.blocking) : undefined, + : 0, + blocking: isSet(object.blocking) ? globalThis.Boolean(object.blocking) : false, }; }, @@ -1026,10 +909,10 @@ export const SendMessageConfiguration: MessageFns = { 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 !== undefined) { + if (message.blocking !== false) { obj.blocking = message.blocking; } return obj; @@ -1039,12 +922,12 @@ export const SendMessageConfiguration: MessageFns = { export const Task: MessageFns = { fromJSON(object: any): Task { return { - id: isSet(object.id) ? globalThis.String(object.id) : undefined, + id: isSet(object.id) ? globalThis.String(object.id) : "", contextId: isSet(object.contextId) ? globalThis.String(object.contextId) : isSet(object.context_id) ? globalThis.String(object.context_id) - : undefined, + : "", status: isSet(object.status) ? TaskStatus.fromJSON(object.status) : undefined, artifacts: globalThis.Array.isArray(object?.artifacts) ? object.artifacts.map((e: any) => Artifact.fromJSON(e)) @@ -1058,10 +941,10 @@ export const Task: MessageFns = { toJSON(message: Task): unknown { const obj: any = {}; - if (message.id !== undefined) { + if (message.id !== "") { obj.id = message.id; } - if (message.contextId !== undefined) { + if (message.contextId !== "") { obj.contextId = message.contextId; } if (message.status !== undefined) { @@ -1083,26 +966,26 @@ export const Task: MessageFns = { export const TaskStatus: MessageFns = { fromJSON(object: any): TaskStatus { return { - state: isSet(object.state) ? taskStateFromJSON(object.state) : undefined, + state: isSet(object.state) ? taskStateFromJSON(object.state) : 0, update: isSet(object.message) ? Message.fromJSON(object.message) : isSet(object.update) ? Message.fromJSON(object.update) : undefined, - timestamp: isSet(object.timestamp) ? fromJsonTimestamp(object.timestamp) : undefined, + timestamp: isSet(object.timestamp) ? globalThis.String(object.timestamp) : undefined, }; }, toJSON(message: TaskStatus): unknown { const obj: any = {}; - if (message.state !== undefined) { + if (message.state !== 0) { obj.state = taskStateToJSON(message.state); } if (message.update !== undefined) { obj.message = Message.toJSON(message.update); } if (message.timestamp !== undefined) { - obj.timestamp = message.timestamp.toISOString(); + obj.timestamp = message.timestamp; } return obj; }, @@ -1150,7 +1033,7 @@ export const FilePart: MessageFns = { ? globalThis.String(object.mimeType) : isSet(object.mime_type) ? globalThis.String(object.mime_type) - : undefined, + : "", }; }, @@ -1161,7 +1044,7 @@ export const FilePart: MessageFns = { } else if (message.file?.$case === "fileWithBytes") { obj.fileWithBytes = base64FromBytes(message.file.value); } - if (message.mimeType !== undefined) { + if (message.mimeType !== "") { obj.mimeType = message.mimeType; } return obj; @@ -1189,18 +1072,18 @@ export const Message: MessageFns = { ? globalThis.String(object.messageId) : isSet(object.message_id) ? globalThis.String(object.message_id) - : undefined, + : "", contextId: isSet(object.contextId) ? globalThis.String(object.contextId) : isSet(object.context_id) ? globalThis.String(object.context_id) - : undefined, + : "", taskId: isSet(object.taskId) ? globalThis.String(object.taskId) : isSet(object.task_id) ? globalThis.String(object.task_id) - : undefined, - role: isSet(object.role) ? roleFromJSON(object.role) : undefined, + : "", + role: isSet(object.role) ? roleFromJSON(object.role) : 0, content: globalThis.Array.isArray(object?.content) ? object.content.map((e: any) => Part.fromJSON(e)) : [], @@ -1213,16 +1096,16 @@ export const Message: MessageFns = { toJSON(message: Message): unknown { const obj: any = {}; - if (message.messageId !== undefined) { + if (message.messageId !== "") { obj.messageId = message.messageId; } - if (message.contextId !== undefined) { + if (message.contextId !== "") { obj.contextId = message.contextId; } - if (message.taskId !== undefined) { + if (message.taskId !== "") { obj.taskId = message.taskId; } - if (message.role !== undefined) { + if (message.role !== 0) { obj.role = roleToJSON(message.role); } if (message.content?.length) { @@ -1245,9 +1128,9 @@ export const Artifact: MessageFns = { ? globalThis.String(object.artifactId) : isSet(object.artifact_id) ? globalThis.String(object.artifact_id) - : undefined, - name: isSet(object.name) ? globalThis.String(object.name) : undefined, - description: isSet(object.description) ? globalThis.String(object.description) : undefined, + : "", + 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)) : [], @@ -1260,13 +1143,13 @@ export const Artifact: MessageFns = { toJSON(message: Artifact): unknown { const obj: any = {}; - if (message.artifactId !== undefined) { + if (message.artifactId !== "") { obj.artifactId = message.artifactId; } - if (message.name !== undefined) { + if (message.name !== "") { obj.name = message.name; } - if (message.description !== undefined) { + if (message.description !== "") { obj.description = message.description; } if (message.parts?.length) { @@ -1289,30 +1172,30 @@ export const TaskStatusUpdateEvent: MessageFns = { ? globalThis.String(object.taskId) : isSet(object.task_id) ? globalThis.String(object.task_id) - : undefined, + : "", contextId: isSet(object.contextId) ? globalThis.String(object.contextId) : isSet(object.context_id) ? globalThis.String(object.context_id) - : undefined, + : "", status: isSet(object.status) ? TaskStatus.fromJSON(object.status) : undefined, - final: isSet(object.final) ? globalThis.Boolean(object.final) : 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 !== undefined) { + if (message.taskId !== "") { obj.taskId = message.taskId; } - if (message.contextId !== undefined) { + if (message.contextId !== "") { obj.contextId = message.contextId; } if (message.status !== undefined) { obj.status = TaskStatus.toJSON(message.status); } - if (message.final !== undefined) { + if (message.final !== false) { obj.final = message.final; } if (message.metadata !== undefined) { @@ -1329,38 +1212,38 @@ export const TaskArtifactUpdateEvent: MessageFns = { ? globalThis.String(object.taskId) : isSet(object.task_id) ? globalThis.String(object.task_id) - : undefined, + : "", contextId: isSet(object.contextId) ? globalThis.String(object.contextId) : isSet(object.context_id) ? globalThis.String(object.context_id) - : undefined, + : "", artifact: isSet(object.artifact) ? Artifact.fromJSON(object.artifact) : undefined, - append: isSet(object.append) ? globalThis.Boolean(object.append) : undefined, + append: isSet(object.append) ? globalThis.Boolean(object.append) : false, lastChunk: isSet(object.lastChunk) ? globalThis.Boolean(object.lastChunk) : isSet(object.last_chunk) ? globalThis.Boolean(object.last_chunk) - : undefined, + : false, metadata: isObject(object.metadata) ? object.metadata : undefined, }; }, toJSON(message: TaskArtifactUpdateEvent): unknown { const obj: any = {}; - if (message.taskId !== undefined) { + if (message.taskId !== "") { obj.taskId = message.taskId; } - if (message.contextId !== undefined) { + if (message.contextId !== "") { obj.contextId = message.contextId; } if (message.artifact !== undefined) { obj.artifact = Artifact.toJSON(message.artifact); } - if (message.append !== undefined) { + if (message.append !== false) { obj.append = message.append; } - if (message.lastChunk !== undefined) { + if (message.lastChunk !== false) { obj.lastChunk = message.lastChunk; } if (message.metadata !== undefined) { @@ -1373,22 +1256,22 @@ export const TaskArtifactUpdateEvent: MessageFns = { export const PushNotificationConfig: MessageFns = { fromJSON(object: any): PushNotificationConfig { return { - id: isSet(object.id) ? globalThis.String(object.id) : undefined, - url: isSet(object.url) ? globalThis.String(object.url) : undefined, - token: isSet(object.token) ? globalThis.String(object.token) : undefined, + 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 !== undefined) { + if (message.id !== "") { obj.id = message.id; } - if (message.url !== undefined) { + if (message.url !== "") { obj.url = message.url; } - if (message.token !== undefined) { + if (message.token !== "") { obj.token = message.token; } if (message.authentication !== undefined) { @@ -1402,7 +1285,7 @@ export const AuthenticationInfo: MessageFns = { 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) : undefined, + credentials: isSet(object.credentials) ? globalThis.String(object.credentials) : "", }; }, @@ -1411,7 +1294,7 @@ export const AuthenticationInfo: MessageFns = { if (message.schemes?.length) { obj.schemes = message.schemes; } - if (message.credentials !== undefined) { + if (message.credentials !== "") { obj.credentials = message.credentials; } return obj; @@ -1421,17 +1304,17 @@ export const AuthenticationInfo: MessageFns = { export const AgentInterface: MessageFns = { fromJSON(object: any): AgentInterface { return { - url: isSet(object.url) ? globalThis.String(object.url) : undefined, - transport: isSet(object.transport) ? globalThis.String(object.transport) : undefined, + url: isSet(object.url) ? globalThis.String(object.url) : "", + transport: isSet(object.transport) ? globalThis.String(object.transport) : "", }; }, toJSON(message: AgentInterface): unknown { const obj: any = {}; - if (message.url !== undefined) { + if (message.url !== "") { obj.url = message.url; } - if (message.transport !== undefined) { + if (message.transport !== "") { obj.transport = message.transport; } return obj; @@ -1445,27 +1328,27 @@ export const AgentCard: MessageFns = { ? globalThis.String(object.protocolVersion) : isSet(object.protocol_version) ? globalThis.String(object.protocol_version) - : undefined, - name: isSet(object.name) ? globalThis.String(object.name) : undefined, - description: isSet(object.description) ? globalThis.String(object.description) : undefined, - url: isSet(object.url) ? globalThis.String(object.url) : undefined, + : "", + name: isSet(object.name) ? globalThis.String(object.name) : "", + description: isSet(object.description) ? globalThis.String(object.description) : "", + url: isSet(object.url) ? globalThis.String(object.url) : "", preferredTransport: isSet(object.preferredTransport) ? globalThis.String(object.preferredTransport) : isSet(object.preferred_transport) ? globalThis.String(object.preferred_transport) - : undefined, + : "", additionalInterfaces: globalThis.Array.isArray(object?.additionalInterfaces) ? object.additionalInterfaces.map((e: any) => AgentInterface.fromJSON(e)) : globalThis.Array.isArray(object?.additional_interfaces) ? object.additional_interfaces.map((e: any) => AgentInterface.fromJSON(e)) : [], provider: isSet(object.provider) ? AgentProvider.fromJSON(object.provider) : undefined, - version: isSet(object.version) ? globalThis.String(object.version) : undefined, + version: isSet(object.version) ? globalThis.String(object.version) : "", documentationUrl: isSet(object.documentationUrl) ? globalThis.String(object.documentationUrl) : isSet(object.documentation_url) ? globalThis.String(object.documentation_url) - : undefined, + : "", capabilities: isSet(object.capabilities) ? AgentCapabilities.fromJSON(object.capabilities) : undefined, securitySchemes: isObject(object.securitySchemes) ? (globalThis.Object.entries(object.securitySchemes) as [string, any][]).reduce( @@ -1504,7 +1387,7 @@ export const AgentCard: MessageFns = { ? globalThis.Boolean(object.supportsAuthenticatedExtendedCard) : isSet(object.supports_authenticated_extended_card) ? globalThis.Boolean(object.supports_authenticated_extended_card) - : undefined, + : false, signatures: globalThis.Array.isArray(object?.signatures) ? object.signatures.map((e: any) => AgentCardSignature.fromJSON(e)) : [], @@ -1513,19 +1396,19 @@ export const AgentCard: MessageFns = { toJSON(message: AgentCard): unknown { const obj: any = {}; - if (message.protocolVersion !== undefined) { + if (message.protocolVersion !== "") { obj.protocolVersion = message.protocolVersion; } - if (message.name !== undefined) { + if (message.name !== "") { obj.name = message.name; } - if (message.description !== undefined) { + if (message.description !== "") { obj.description = message.description; } - 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) { @@ -1534,10 +1417,10 @@ export const AgentCard: MessageFns = { if (message.provider !== undefined) { obj.provider = AgentProvider.toJSON(message.provider); } - if (message.version !== undefined) { + if (message.version !== "") { obj.version = message.version; } - if (message.documentationUrl !== undefined) { + if (message.documentationUrl !== "") { obj.documentationUrl = message.documentationUrl; } if (message.capabilities !== undefined) { @@ -1564,7 +1447,7 @@ export const AgentCard: MessageFns = { if (message.skills?.length) { obj.skills = message.skills.map((e) => AgentSkill.toJSON(e)); } - if (message.supportsAuthenticatedExtendedCard !== undefined) { + if (message.supportsAuthenticatedExtendedCard !== false) { obj.supportsAuthenticatedExtendedCard = message.supportsAuthenticatedExtendedCard; } if (message.signatures?.length) { @@ -1577,14 +1460,14 @@ export const AgentCard: MessageFns = { export const AgentCard_SecuritySchemesEntry: MessageFns = { fromJSON(object: any): AgentCard_SecuritySchemesEntry { return { - key: isSet(object.key) ? globalThis.String(object.key) : undefined, + 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 !== undefined) { + if (message.key !== "") { obj.key = message.key; } if (message.value !== undefined) { @@ -1597,17 +1480,17 @@ export const AgentCard_SecuritySchemesEntry: MessageFns = { fromJSON(object: any): AgentProvider { return { - url: isSet(object.url) ? globalThis.String(object.url) : undefined, - organization: isSet(object.organization) ? globalThis.String(object.organization) : undefined, + 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 !== undefined) { + if (message.url !== "") { obj.url = message.url; } - if (message.organization !== undefined) { + if (message.organization !== "") { obj.organization = message.organization; } return obj; @@ -1617,12 +1500,12 @@ export const AgentProvider: MessageFns = { export const AgentCapabilities: MessageFns = { fromJSON(object: any): AgentCapabilities { return { - streaming: isSet(object.streaming) ? globalThis.Boolean(object.streaming) : undefined, + streaming: isSet(object.streaming) ? globalThis.Boolean(object.streaming) : false, pushNotifications: isSet(object.pushNotifications) ? globalThis.Boolean(object.pushNotifications) : isSet(object.push_notifications) ? globalThis.Boolean(object.push_notifications) - : undefined, + : false, extensions: globalThis.Array.isArray(object?.extensions) ? object.extensions.map((e: any) => AgentExtension.fromJSON(e)) : [], @@ -1631,10 +1514,10 @@ export const AgentCapabilities: MessageFns = { 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) { @@ -1647,22 +1530,22 @@ export const AgentCapabilities: MessageFns = { export const AgentExtension: MessageFns = { fromJSON(object: any): AgentExtension { return { - uri: isSet(object.uri) ? globalThis.String(object.uri) : undefined, - description: isSet(object.description) ? globalThis.String(object.description) : undefined, - required: isSet(object.required) ? globalThis.Boolean(object.required) : undefined, + 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 !== undefined) { + if (message.uri !== "") { obj.uri = message.uri; } - if (message.description !== undefined) { + if (message.description !== "") { obj.description = message.description; } - if (message.required !== undefined) { + if (message.required !== false) { obj.required = message.required; } if (message.params !== undefined) { @@ -1675,9 +1558,9 @@ export const AgentExtension: MessageFns = { export const AgentSkill: MessageFns = { fromJSON(object: any): AgentSkill { return { - id: isSet(object.id) ? globalThis.String(object.id) : undefined, - name: isSet(object.name) ? globalThis.String(object.name) : undefined, - description: isSet(object.description) ? globalThis.String(object.description) : undefined, + 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) @@ -1696,13 +1579,13 @@ export const AgentSkill: MessageFns = { toJSON(message: AgentSkill): unknown { const obj: any = {}; - if (message.id !== undefined) { + if (message.id !== "") { obj.id = message.id; } - if (message.name !== undefined) { + if (message.name !== "") { obj.name = message.name; } - if (message.description !== undefined) { + if (message.description !== "") { obj.description = message.description; } if (message.tags?.length) { @@ -1727,18 +1610,18 @@ export const AgentSkill: MessageFns = { export const AgentCardSignature: MessageFns = { fromJSON(object: any): AgentCardSignature { return { - protected: isSet(object.protected) ? globalThis.String(object.protected) : undefined, - signature: isSet(object.signature) ? globalThis.String(object.signature) : undefined, + 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 !== undefined) { + if (message.protected !== "") { obj.protected = message.protected; } - if (message.signature !== undefined) { + if (message.signature !== "") { obj.signature = message.signature; } if (message.header !== undefined) { @@ -1751,7 +1634,7 @@ export const AgentCardSignature: MessageFns = { export const TaskPushNotificationConfig: MessageFns = { fromJSON(object: any): TaskPushNotificationConfig { return { - name: isSet(object.name) ? globalThis.String(object.name) : undefined, + name: isSet(object.name) ? globalThis.String(object.name) : "", pushNotificationConfig: isSet(object.pushNotificationConfig) ? PushNotificationConfig.fromJSON(object.pushNotificationConfig) : isSet(object.push_notification_config) @@ -1762,7 +1645,7 @@ export const TaskPushNotificationConfig: MessageFns toJSON(message: TaskPushNotificationConfig): unknown { const obj: any = {}; - if (message.name !== undefined) { + if (message.name !== "") { obj.name = message.name; } if (message.pushNotificationConfig !== undefined) { @@ -1819,14 +1702,14 @@ export const Security: MessageFns = { export const Security_SchemesEntry: MessageFns = { fromJSON(object: any): Security_SchemesEntry { return { - key: isSet(object.key) ? globalThis.String(object.key) : undefined, + 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 !== undefined) { + if (message.key !== "") { obj.key = message.key; } if (message.value !== undefined) { @@ -1889,21 +1772,21 @@ export const SecurityScheme: MessageFns = { export const APIKeySecurityScheme: MessageFns = { fromJSON(object: any): APIKeySecurityScheme { return { - description: isSet(object.description) ? globalThis.String(object.description) : undefined, - location: isSet(object.location) ? globalThis.String(object.location) : undefined, - name: isSet(object.name) ? globalThis.String(object.name) : undefined, + 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 !== undefined) { + if (message.description !== "") { obj.description = message.description; } - if (message.location !== undefined) { + if (message.location !== "") { obj.location = message.location; } - if (message.name !== undefined) { + if (message.name !== "") { obj.name = message.name; } return obj; @@ -1913,25 +1796,25 @@ export const APIKeySecurityScheme: MessageFns = { export const HTTPAuthSecurityScheme: MessageFns = { fromJSON(object: any): HTTPAuthSecurityScheme { return { - description: isSet(object.description) ? globalThis.String(object.description) : undefined, - scheme: isSet(object.scheme) ? globalThis.String(object.scheme) : undefined, + description: isSet(object.description) ? globalThis.String(object.description) : "", + scheme: isSet(object.scheme) ? globalThis.String(object.scheme) : "", bearerFormat: isSet(object.bearerFormat) ? globalThis.String(object.bearerFormat) : isSet(object.bearer_format) ? globalThis.String(object.bearer_format) - : undefined, + : "", }; }, toJSON(message: HTTPAuthSecurityScheme): unknown { const obj: any = {}; - if (message.description !== undefined) { + if (message.description !== "") { obj.description = message.description; } - if (message.scheme !== undefined) { + if (message.scheme !== "") { obj.scheme = message.scheme; } - if (message.bearerFormat !== undefined) { + if (message.bearerFormat !== "") { obj.bearerFormat = message.bearerFormat; } return obj; @@ -1941,25 +1824,25 @@ export const HTTPAuthSecurityScheme: MessageFns = { export const OAuth2SecurityScheme: MessageFns = { fromJSON(object: any): OAuth2SecurityScheme { return { - description: isSet(object.description) ? globalThis.String(object.description) : undefined, + 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) : isSet(object.oauth2_metadata_url) ? globalThis.String(object.oauth2_metadata_url) - : undefined, + : "", }; }, toJSON(message: OAuth2SecurityScheme): unknown { const obj: any = {}; - if (message.description !== undefined) { + if (message.description !== "") { obj.description = message.description; } if (message.flows !== undefined) { obj.flows = OAuthFlows.toJSON(message.flows); } - if (message.oauth2MetadataUrl !== undefined) { + if (message.oauth2MetadataUrl !== "") { obj.oauth2MetadataUrl = message.oauth2MetadataUrl; } return obj; @@ -1969,21 +1852,21 @@ export const OAuth2SecurityScheme: MessageFns = { export const OpenIdConnectSecurityScheme: MessageFns = { fromJSON(object: any): OpenIdConnectSecurityScheme { return { - description: isSet(object.description) ? globalThis.String(object.description) : undefined, + description: isSet(object.description) ? globalThis.String(object.description) : "", openIdConnectUrl: isSet(object.openIdConnectUrl) ? globalThis.String(object.openIdConnectUrl) : isSet(object.open_id_connect_url) ? globalThis.String(object.open_id_connect_url) - : undefined, + : "", }; }, toJSON(message: OpenIdConnectSecurityScheme): unknown { const obj: any = {}; - if (message.description !== undefined) { + if (message.description !== "") { obj.description = message.description; } - if (message.openIdConnectUrl !== undefined) { + if (message.openIdConnectUrl !== "") { obj.openIdConnectUrl = message.openIdConnectUrl; } return obj; @@ -1992,12 +1875,12 @@ export const OpenIdConnectSecurityScheme: MessageFns = { fromJSON(object: any): MutualTlsSecurityScheme { - return { description: isSet(object.description) ? globalThis.String(object.description) : undefined }; + return { description: isSet(object.description) ? globalThis.String(object.description) : "" }; }, toJSON(message: MutualTlsSecurityScheme): unknown { const obj: any = {}; - if (message.description !== undefined) { + if (message.description !== "") { obj.description = message.description; } return obj; @@ -2045,17 +1928,17 @@ export const AuthorizationCodeOAuthFlow: MessageFns ? globalThis.String(object.authorizationUrl) : isSet(object.authorization_url) ? globalThis.String(object.authorization_url) - : undefined, + : "", tokenUrl: isSet(object.tokenUrl) ? globalThis.String(object.tokenUrl) : isSet(object.token_url) ? globalThis.String(object.token_url) - : undefined, + : "", refreshUrl: isSet(object.refreshUrl) ? globalThis.String(object.refreshUrl) : isSet(object.refresh_url) ? globalThis.String(object.refresh_url) - : undefined, + : "", scopes: isObject(object.scopes) ? (globalThis.Object.entries(object.scopes) as [string, any][]).reduce( (acc: { [key: string]: string }, [key, value]: [string, any]) => { @@ -2070,13 +1953,13 @@ export const AuthorizationCodeOAuthFlow: MessageFns toJSON(message: AuthorizationCodeOAuthFlow): unknown { const obj: any = {}; - if (message.authorizationUrl !== undefined) { + if (message.authorizationUrl !== "") { obj.authorizationUrl = message.authorizationUrl; } - if (message.tokenUrl !== undefined) { + if (message.tokenUrl !== "") { obj.tokenUrl = message.tokenUrl; } - if (message.refreshUrl !== undefined) { + if (message.refreshUrl !== "") { obj.refreshUrl = message.refreshUrl; } if (message.scopes) { @@ -2095,17 +1978,17 @@ export const AuthorizationCodeOAuthFlow: MessageFns export const AuthorizationCodeOAuthFlow_ScopesEntry: MessageFns = { fromJSON(object: any): AuthorizationCodeOAuthFlow_ScopesEntry { return { - key: isSet(object.key) ? globalThis.String(object.key) : undefined, - value: isSet(object.value) ? globalThis.String(object.value) : undefined, + 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 !== undefined) { + if (message.key !== "") { obj.key = message.key; } - if (message.value !== undefined) { + if (message.value !== "") { obj.value = message.value; } return obj; @@ -2119,12 +2002,12 @@ export const ClientCredentialsOAuthFlow: MessageFns ? globalThis.String(object.tokenUrl) : isSet(object.token_url) ? globalThis.String(object.token_url) - : undefined, + : "", refreshUrl: isSet(object.refreshUrl) ? globalThis.String(object.refreshUrl) : isSet(object.refresh_url) ? globalThis.String(object.refresh_url) - : undefined, + : "", scopes: isObject(object.scopes) ? (globalThis.Object.entries(object.scopes) as [string, any][]).reduce( (acc: { [key: string]: string }, [key, value]: [string, any]) => { @@ -2139,10 +2022,10 @@ export const ClientCredentialsOAuthFlow: MessageFns toJSON(message: ClientCredentialsOAuthFlow): unknown { const obj: any = {}; - if (message.tokenUrl !== undefined) { + if (message.tokenUrl !== "") { obj.tokenUrl = message.tokenUrl; } - if (message.refreshUrl !== undefined) { + if (message.refreshUrl !== "") { obj.refreshUrl = message.refreshUrl; } if (message.scopes) { @@ -2161,17 +2044,17 @@ export const ClientCredentialsOAuthFlow: MessageFns export const ClientCredentialsOAuthFlow_ScopesEntry: MessageFns = { fromJSON(object: any): ClientCredentialsOAuthFlow_ScopesEntry { return { - key: isSet(object.key) ? globalThis.String(object.key) : undefined, - value: isSet(object.value) ? globalThis.String(object.value) : undefined, + 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 !== undefined) { + if (message.key !== "") { obj.key = message.key; } - if (message.value !== undefined) { + if (message.value !== "") { obj.value = message.value; } return obj; @@ -2185,12 +2068,12 @@ export const ImplicitOAuthFlow: MessageFns = { ? globalThis.String(object.authorizationUrl) : isSet(object.authorization_url) ? globalThis.String(object.authorization_url) - : undefined, + : "", refreshUrl: isSet(object.refreshUrl) ? globalThis.String(object.refreshUrl) : isSet(object.refresh_url) ? globalThis.String(object.refresh_url) - : undefined, + : "", scopes: isObject(object.scopes) ? (globalThis.Object.entries(object.scopes) as [string, any][]).reduce( (acc: { [key: string]: string }, [key, value]: [string, any]) => { @@ -2205,10 +2088,10 @@ export const ImplicitOAuthFlow: MessageFns = { toJSON(message: ImplicitOAuthFlow): unknown { const obj: any = {}; - if (message.authorizationUrl !== undefined) { + if (message.authorizationUrl !== "") { obj.authorizationUrl = message.authorizationUrl; } - if (message.refreshUrl !== undefined) { + if (message.refreshUrl !== "") { obj.refreshUrl = message.refreshUrl; } if (message.scopes) { @@ -2227,17 +2110,17 @@ export const ImplicitOAuthFlow: MessageFns = { export const ImplicitOAuthFlow_ScopesEntry: MessageFns = { fromJSON(object: any): ImplicitOAuthFlow_ScopesEntry { return { - key: isSet(object.key) ? globalThis.String(object.key) : undefined, - value: isSet(object.value) ? globalThis.String(object.value) : undefined, + 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 !== undefined) { + if (message.key !== "") { obj.key = message.key; } - if (message.value !== undefined) { + if (message.value !== "") { obj.value = message.value; } return obj; @@ -2251,12 +2134,12 @@ export const PasswordOAuthFlow: MessageFns = { ? globalThis.String(object.tokenUrl) : isSet(object.token_url) ? globalThis.String(object.token_url) - : undefined, + : "", refreshUrl: isSet(object.refreshUrl) ? globalThis.String(object.refreshUrl) : isSet(object.refresh_url) ? globalThis.String(object.refresh_url) - : undefined, + : "", scopes: isObject(object.scopes) ? (globalThis.Object.entries(object.scopes) as [string, any][]).reduce( (acc: { [key: string]: string }, [key, value]: [string, any]) => { @@ -2271,10 +2154,10 @@ export const PasswordOAuthFlow: MessageFns = { toJSON(message: PasswordOAuthFlow): unknown { const obj: any = {}; - if (message.tokenUrl !== undefined) { + if (message.tokenUrl !== "") { obj.tokenUrl = message.tokenUrl; } - if (message.refreshUrl !== undefined) { + if (message.refreshUrl !== "") { obj.refreshUrl = message.refreshUrl; } if (message.scopes) { @@ -2293,17 +2176,17 @@ export const PasswordOAuthFlow: MessageFns = { export const PasswordOAuthFlow_ScopesEntry: MessageFns = { fromJSON(object: any): PasswordOAuthFlow_ScopesEntry { return { - key: isSet(object.key) ? globalThis.String(object.key) : undefined, - value: isSet(object.value) ? globalThis.String(object.value) : undefined, + 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 !== undefined) { + if (message.key !== "") { obj.key = message.key; } - if (message.value !== undefined) { + if (message.value !== "") { obj.value = message.value; } return obj; @@ -2341,21 +2224,21 @@ export const SendMessageRequest: MessageFns = { export const GetTaskRequest: MessageFns = { fromJSON(object: any): GetTaskRequest { return { - name: isSet(object.name) ? globalThis.String(object.name) : undefined, + name: isSet(object.name) ? globalThis.String(object.name) : "", historyLength: isSet(object.historyLength) ? globalThis.Number(object.historyLength) : isSet(object.history_length) ? globalThis.Number(object.history_length) - : undefined, + : 0, }; }, toJSON(message: GetTaskRequest): unknown { const obj: any = {}; - if (message.name !== undefined) { + if (message.name !== "") { obj.name = message.name; } - if (message.historyLength !== undefined) { + if (message.historyLength !== 0) { obj.historyLength = Math.round(message.historyLength); } return obj; @@ -2364,12 +2247,12 @@ export const GetTaskRequest: MessageFns = { export const CancelTaskRequest: MessageFns = { fromJSON(object: any): CancelTaskRequest { - return { name: isSet(object.name) ? globalThis.String(object.name) : undefined }; + return { name: isSet(object.name) ? globalThis.String(object.name) : "" }; }, toJSON(message: CancelTaskRequest): unknown { const obj: any = {}; - if (message.name !== undefined) { + if (message.name !== "") { obj.name = message.name; } return obj; @@ -2378,12 +2261,12 @@ export const CancelTaskRequest: MessageFns = { export const GetTaskPushNotificationConfigRequest: MessageFns = { fromJSON(object: any): GetTaskPushNotificationConfigRequest { - return { name: isSet(object.name) ? globalThis.String(object.name) : undefined }; + return { name: isSet(object.name) ? globalThis.String(object.name) : "" }; }, toJSON(message: GetTaskPushNotificationConfigRequest): unknown { const obj: any = {}; - if (message.name !== undefined) { + if (message.name !== "") { obj.name = message.name; } return obj; @@ -2392,12 +2275,12 @@ export const GetTaskPushNotificationConfigRequest: MessageFns = { fromJSON(object: any): DeleteTaskPushNotificationConfigRequest { - return { name: isSet(object.name) ? globalThis.String(object.name) : undefined }; + return { name: isSet(object.name) ? globalThis.String(object.name) : "" }; }, toJSON(message: DeleteTaskPushNotificationConfigRequest): unknown { const obj: any = {}; - if (message.name !== undefined) { + if (message.name !== "") { obj.name = message.name; } return obj; @@ -2407,22 +2290,22 @@ export const DeleteTaskPushNotificationConfigRequest: MessageFns = { fromJSON(object: any): CreateTaskPushNotificationConfigRequest { return { - parent: isSet(object.parent) ? globalThis.String(object.parent) : undefined, + parent: isSet(object.parent) ? globalThis.String(object.parent) : "", configId: isSet(object.configId) ? globalThis.String(object.configId) : isSet(object.config_id) ? globalThis.String(object.config_id) - : undefined, + : "", config: isSet(object.config) ? TaskPushNotificationConfig.fromJSON(object.config) : undefined, }; }, toJSON(message: CreateTaskPushNotificationConfigRequest): unknown { const obj: any = {}; - if (message.parent !== undefined) { + if (message.parent !== "") { obj.parent = message.parent; } - if (message.configId !== undefined) { + if (message.configId !== "") { obj.configId = message.configId; } if (message.config !== undefined) { @@ -2434,12 +2317,12 @@ export const CreateTaskPushNotificationConfigRequest: MessageFns = { fromJSON(object: any): TaskSubscriptionRequest { - return { name: isSet(object.name) ? globalThis.String(object.name) : undefined }; + return { name: isSet(object.name) ? globalThis.String(object.name) : "" }; }, toJSON(message: TaskSubscriptionRequest): unknown { const obj: any = {}; - if (message.name !== undefined) { + if (message.name !== "") { obj.name = message.name; } return obj; @@ -2449,29 +2332,29 @@ export const TaskSubscriptionRequest: MessageFns = { export const ListTaskPushNotificationConfigRequest: MessageFns = { fromJSON(object: any): ListTaskPushNotificationConfigRequest { return { - parent: isSet(object.parent) ? globalThis.String(object.parent) : undefined, + parent: isSet(object.parent) ? globalThis.String(object.parent) : "", pageSize: isSet(object.pageSize) ? globalThis.Number(object.pageSize) : isSet(object.page_size) ? globalThis.Number(object.page_size) - : undefined, + : 0, pageToken: isSet(object.pageToken) ? globalThis.String(object.pageToken) : isSet(object.page_token) ? globalThis.String(object.page_token) - : undefined, + : "", }; }, toJSON(message: ListTaskPushNotificationConfigRequest): unknown { const obj: any = {}; - if (message.parent !== undefined) { + if (message.parent !== "") { obj.parent = message.parent; } - if (message.pageSize !== undefined) { + if (message.pageSize !== 0) { obj.pageSize = Math.round(message.pageSize); } - if (message.pageToken !== undefined) { + if (message.pageToken !== "") { obj.pageToken = message.pageToken; } return obj; @@ -2559,7 +2442,7 @@ export const ListTaskPushNotificationConfigResponse: MessageFns TaskPushNotificationConfig.toJSON(e)); } - if (message.nextPageToken !== undefined) { + if (message.nextPageToken !== "") { obj.nextPageToken = message.nextPageToken; } return obj; @@ -2583,22 +2466,6 @@ function base64FromBytes(arr: Uint8Array): string { return globalThis.Buffer.from(arr).toString("base64"); } -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 isObject(value: any): boolean { return typeof value === "object" && value !== null; } diff --git a/src/types/pb/google/protobuf/timestamp.ts b/src/types/pb/google/protobuf/timestamp.ts deleted file mode 100644 index d61c930f..00000000 --- a/src/types/pb/google/protobuf/timestamp.ts +++ /dev/null @@ -1,145 +0,0 @@ -// Code generated by protoc-gen-ts_proto. DO NOT EDIT. -// versions: -// protoc-gen-ts_proto v2.6.1 -// protoc unknown -// source: google/protobuf/timestamp.proto - -/* eslint-disable */ - -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; -} - -export const Timestamp: MessageFns = { - 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; - }, -}; - -function isSet(value: any): boolean { - return value !== null && value !== undefined; -} - -export interface MessageFns { - fromJSON(object: any): T; - toJSON(message: T): unknown; -} diff --git a/test/client/util.ts b/test/client/util.ts index 7399ed63..849b671a 100644 --- a/test/client/util.ts +++ b/test/client/util.ts @@ -481,7 +481,7 @@ export function createMockProtoTask( contextId: 'context-123', status: { state: status, - timestamp: new Date('2023-01-01T00:00:00.000Z'), + timestamp: '2023-01-01T00:00:00.000Z', update: undefined, }, artifacts: [], diff --git a/test/server/grpc/to_proto.spec.ts b/test/server/grpc/to_proto.spec.ts index 5411cf83..fca50182 100644 --- a/test/server/grpc/to_proto.spec.ts +++ b/test/server/grpc/to_proto.spec.ts @@ -37,7 +37,7 @@ describe('ToProto', () => { contextId: 'ctx-1', status: { state: proto.TaskState.TASK_STATE_COMPLETED, - timestamp: new Date('2023-01-01T00:00:00.000Z'), + timestamp: '2023-01-01T00:00:00.000Z', update: undefined, }, artifacts: [], @@ -322,7 +322,7 @@ describe('ToProto', () => { pushNotificationConfig: { id: 'pnc-456', url: 'https://example.com/notify', - token: undefined, + token: '', authentication: undefined, }, }); From a0f144df3681daea4b9b13a1285c3f6885dff653 Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Tue, 20 Jan 2026 10:23:34 +0100 Subject: [PATCH 06/51] test: test sendMessageStream fallback to sendMessage in e2e.spec.ts (#304) --- test/e2e.spec.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/test/e2e.spec.ts b/test/e2e.spec.ts index 735b409c..0144db12 100644 --- a/test/e2e.spec.ts +++ b/test/e2e.spec.ts @@ -202,6 +202,22 @@ describe('Client E2E tests', () => { expect(removeUndefinedFields(actual)).to.deep.equal(expected); }); + + it('should fallback to non-streaming sendMessage if agent does not support streaming', async () => { + agentCard.capabilities.streaming = false; + const requestMessage = createTestMessage('1', 'request-message'); + const responseMessage = createTestMessage('2', 'response-message'); + agentExecutor.events = [responseMessage]; + const client = await clientFactory.createFromAgentCard(agentCard); + + const actual: A2AStreamEventData[] = []; + for await (const message of client.sendMessageStream({ message: requestMessage })) { + actual.push(message); + } + + expect(actual).to.have.lengthOf(1); + expect(removeUndefinedFields(actual[0])).to.deep.equal(responseMessage); + }); }); }); }); From 53bfcefc85f8e37d64ddfecd5344b4e455d5f97e Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Tue, 20 Jan 2026 14:07:18 +0100 Subject: [PATCH 07/51] docs: support gRPC in samples/cli (#307) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description Add gRPC factory and add some debug output around transports. Tested against [a2a-go helloworld](https://github.com/a2aproject/a2a-go/tree/main/examples/helloworld/server/grpc) example (`go run main.go`): ``` $ npm run a2a:cli -- http://127.0.0.1:9001 > a2a:cli > tsx cli.ts http://127.0.0.1:9001 A2A Terminal Client Agent Base URL: http://127.0.0.1:9001 Attempting to fetch agent card from agent at: http://127.0.0.1:9001 ✓ Agent Card Found: Name: Hello World Agent Description: Just a hello world agent Version: N/A Streaming: Supported Supported Transports: GRPC ✓ Connected via GrpcTransport No active task or context initially. Use '/new' to start a fresh session or send a message. Enter messages, or use '/new' to start a new session. '/exit' to quit. Hello World Agent > You: hello Sending message... Hello World Agent [11:57:31 AM]: ✉️ Message Stream Event: Part 1: 📝 Text: Hello, world! --- End of response stream for this input --- Hello World Agent > You: ``` --- src/samples/cli.ts | 19 +++++++++++++++++ src/samples/package-lock.json | 40 ++++++++++------------------------- src/samples/package.json | 2 ++ 3 files changed, 32 insertions(+), 29 deletions(-) diff --git a/src/samples/cli.ts b/src/samples/cli.ts index e8342f7b..40f24642 100644 --- a/src/samples/cli.ts +++ b/src/samples/cli.ts @@ -29,6 +29,7 @@ import { JsonRpcTransportFactory, RestTransportFactory, } from '../client/index.js'; +import { GrpcTransportFactory } from '../client/transports/grpc/grpc_transport.js'; // --- ANSI Colors --- const colors = { @@ -94,6 +95,7 @@ const factory = new ClientFactory( transports: [ new JsonRpcTransportFactory({ fetchImpl }), new RestTransportFactory({ fetchImpl }), + new GrpcTransportFactory(), ], }) ); @@ -232,6 +234,23 @@ async function fetchAndDisplayAgentCard() { } else { console.log(` Streaming: ${colorize('yellow', 'Not Supported (or not specified)')}`); } + + const supportedTransports = new Set(); + supportedTransports.add(card.preferredTransport || 'JSONRPC'); + if (card.additionalInterfaces) { + for (const iface of card.additionalInterfaces) { + supportedTransports.add(iface.transport); + } + } + console.log(` Supported Transports: ${Array.from(supportedTransports).join(', ')}`); + + // TODO (https://github.com/a2aproject/a2a-js/issues/179): Add a way to get the protocol name from the transport. + console.log( + colorize( + 'green', + `\n✓ Connected via ${Object.getPrototypeOf(client.transport).constructor.name}` + ) + ); // Update prompt prefix to use the fetched name // The prompt is set dynamically before each rl.prompt() call in the main loop // to reflect the current agentName if it changes (though unlikely after initial fetch). diff --git a/src/samples/package-lock.json b/src/samples/package-lock.json index de83f8e9..0c9ee38e 100644 --- a/src/samples/package-lock.json +++ b/src/samples/package-lock.json @@ -5,6 +5,8 @@ "packages": { "": { "dependencies": { + "@bufbuild/protobuf": "^2.10.2", + "@grpc/grpc-js": "^1.14.3", "google-auth-library": "^10.5.0", "uuid": "^11.1.0" }, @@ -20,6 +22,12 @@ "tsx": "^4.19.3" } }, + "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==", + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, "node_modules/@colors/colors": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", @@ -1302,10 +1310,9 @@ } }, "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, + "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", @@ -1319,7 +1326,6 @@ "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", @@ -1454,7 +1460,6 @@ "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", @@ -3011,35 +3016,30 @@ "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", @@ -3050,35 +3050,30 @@ "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": { @@ -3250,7 +3245,6 @@ "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" @@ -3751,7 +3745,6 @@ "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", @@ -4187,7 +4180,6 @@ "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" @@ -4719,7 +4711,6 @@ "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.*" @@ -5640,7 +5631,6 @@ "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": { @@ -5739,7 +5729,6 @@ "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": { @@ -6300,7 +6289,6 @@ "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": { @@ -6422,7 +6410,6 @@ "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" @@ -7121,7 +7108,6 @@ "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": { @@ -7312,7 +7298,6 @@ "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", @@ -7372,7 +7357,6 @@ "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" @@ -7404,7 +7388,6 @@ "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", @@ -7423,7 +7406,6 @@ "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" diff --git a/src/samples/package.json b/src/samples/package.json index 5cfa38d2..272a94a9 100644 --- a/src/samples/package.json +++ b/src/samples/package.json @@ -20,6 +20,8 @@ "tsx": "^4.19.3" }, "dependencies": { + "@bufbuild/protobuf": "^2.10.2", + "@grpc/grpc-js": "^1.14.3", "google-auth-library": "^10.5.0", "uuid": "^11.1.0" } From 40acbd4d2c3e08f83cd7a8d32efb52c7da4f6062 Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Tue, 20 Jan 2026 14:52:46 +0100 Subject: [PATCH 08/51] ci: properly setup npm install cache (#305) # Description Add `cache` to `actions/setup-node@v4` where it was previously missing. --- .github/workflows/lint.yml | 3 +++ .github/workflows/npm-publish.yml | 1 + .github/workflows/run-tck.yaml | 1 + .github/workflows/unit-tests.yml | 9 +++++---- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d193b6b1..90b68dce 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -22,5 +22,8 @@ jobs: node-version: 18 registry-url: 'https://registry.npmjs.org' cache: 'npm' + cache-dependency-path: | + package-lock.json + src/samples/package-lock.json - run: npm ci && (cd src/samples && npm ci) - run: npm run lint diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index a105b217..6506c477 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -19,6 +19,7 @@ jobs: with: node-version: 18 registry-url: 'https://registry.npmjs.org' + cache: 'npm' - run: npm ci - run: npm run build diff --git a/.github/workflows/run-tck.yaml b/.github/workflows/run-tck.yaml index 10b3e7f3..0ea23bef 100644 --- a/.github/workflows/run-tck.yaml +++ b/.github/workflows/run-tck.yaml @@ -43,6 +43,7 @@ jobs: with: node-version: ${{ matrix.node-version }} registry-url: 'https://registry.npmjs.org' + cache: 'npm' - run: | npm ci npm run build diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 330d0d1e..4e004022 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -53,15 +53,16 @@ jobs: coverage: runs-on: ubuntu-latest steps: - - uses: actions/setup-node@v3 - with: - node-version: 24 - - name: Checkout Main uses: actions/checkout@v4 with: ref: main + - uses: actions/setup-node@v4 + with: + node-version: 24 + cache: 'npm' + - name: Install & Test (Main) timeout-minutes: 10 run: | From 987fbed0a53c7bdc366e60f7a5ce792af6dcbcb1 Mon Sep 17 00:00:00 2001 From: Guglielmo Colombo Date: Wed, 21 Jan 2026 17:13:03 +0100 Subject: [PATCH 09/51] docs: Document supported GRPC transport (#306) # Description Integration of gRpc spec in the documentation --- README.md | 62 +++++++++++++++++++++++++++++++++++++++++++++- tck/agent/index.ts | 2 +- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1be1d014..4170e5db 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,14 @@ If you plan to use the Express integration (imports from `@a2a-js/sdk/server/exp npm install express ``` +### For gRPC Usage + +If you plan to use the GRPC transport (imports from `@a2a-js/sdk/server/grpc` or `@a2a-js/sdk/client/grpc`), you must install the required peer dependencies: + +```bash +npm install @grpc/grpc-js @bufbuild/protobuf +``` + You can also find some samples [here](https://github.com/a2aproject/a2a-js/tree/main/src/samples). --- @@ -41,7 +49,7 @@ This SDK implements the A2A Protocol Specification [`v0.3.0`](https://a2a-protoc | :--- | :---: | :---: | | **JSON-RPC** | ✅ | ✅ | | **HTTP+JSON/REST** | ✅ | ✅ | -| **gRPC** | ❌ | ❌ | +| **GRPC** (Node.js only) | ✅ | ✅ | ## Quickstart @@ -54,6 +62,7 @@ The core of an A2A server is the `AgentExecutor`, which contains your agent's lo ```typescript // server.ts import express from 'express'; +import { Server, ServerCredentials } from '@grpc/grpc-js'; import { v4 as uuidv4 } from 'uuid'; import { AgentCard, Message, AGENT_CARD_PATH } from '@a2a-js/sdk'; import { @@ -64,6 +73,7 @@ import { InMemoryTaskStore, } from '@a2a-js/sdk/server'; import { agentCardHandler, jsonRpcHandler, restHandler, UserBuilder } from '@a2a-js/sdk/server/express'; +import { grpcService, A2AService } from '@a2a-js/sdk/server/grpc'; // 1. Define your agent's identity card. const helloAgentCard: AgentCard = { @@ -81,6 +91,7 @@ const helloAgentCard: AgentCard = { additionalInterfaces: [ { url: 'http://localhost:4000/a2a/jsonrpc', transport: 'JSONRPC' }, // Default JSON-RPC transport { url: 'http://localhost:4000/a2a/rest', transport: 'HTTP+JSON' }, // HTTP+JSON/REST transport + { url: 'localhost:4001', transport: 'GRPC' }, // GRPC transport ], }; @@ -123,6 +134,15 @@ app.use('/a2a/rest', restHandler({ requestHandler, userBuilder: UserBuilder.noAu app.listen(4000, () => { console.log(`🚀 Server started on http://localhost:4000`); }); + +const server = new Server(); +server.addService(A2AService, grpcService({ + requestHandler, + userBuilder: UserBuilder.noAuthentication, +})); +server.bindAsync(`localhost:4001`, ServerCredentials.createInsecure(), () => { + console.log(`🚀 Server started on localhost:4001`); +}); ``` ### Client: Sending a Message @@ -163,6 +183,46 @@ async function run() { await run(); ``` +### gRPC Client: Sending a Message + +The [`ClientFactory`](src/client/factory.ts) has to be created explicitly passing the [`GrpcTransportFactory`](src/client/transports/grpc/grpc_transport.ts). + +```typescript +// client.ts +import { ClientFactory, ClientFactoryOptions } from '@a2a-js/sdk/client'; +import { GrpcTransportFactory } from '@a2a-js/sdk/client/grpc'; +import { Message, MessageSendParams, SendMessageSuccessResponse } from '@a2a-js/sdk'; +import { v4 as uuidv4 } from 'uuid'; + +async function run() { + const factory = new ClientFactory({ + transports: [new GrpcTransportFactory()] + }); + + // createFromUrl accepts baseUrl and optional path, + // (the default path is /.well-known/agent-card.json) + const client = await factory.createFromUrl('http://localhost:4000'); + + const sendParams: MessageSendParams = { + message: { + messageId: uuidv4(), + role: 'user', + parts: [{ kind: 'text', text: 'Hi there!' }], + kind: 'message', + }, + }; + + try { + const response = await client.sendMessage(sendParams); + const result = response as Message; + console.log('Agent response:', result.parts[0].text); // "Hello, world!" + } catch(e) { + console.error('Error:', e); + } +} + +await run(); +``` --- ## A2A `Task` Support diff --git a/tck/agent/index.ts b/tck/agent/index.ts index b8f91feb..358c2863 100644 --- a/tck/agent/index.ts +++ b/tck/agent/index.ts @@ -240,7 +240,7 @@ async function main() { const server = new Server(); server.addService(A2AService, 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 localhost:${GRPC_PORT}`); }); } From 3d9a052fe8cd917fcff1798b03a4865effabf0be Mon Sep 17 00:00:00 2001 From: "Agent2Agent (A2A) Bot" Date: Wed, 21 Jan 2026 10:36:58 -0600 Subject: [PATCH 10/51] chore(main): release 0.3.9 (#298) :robot: I have created a release *beep* *boop* --- ## [0.3.9](https://github.com/a2aproject/a2a-js/compare/v0.3.8...v0.3.9) (2026-01-21) ### Features * implement gRPC client ([#299](https://github.com/a2aproject/a2a-js/issues/299)) ([dbdb96e](https://github.com/a2aproject/a2a-js/commit/dbdb96eeb14a710ad612f36f371d848fc7cce186)) * implement gRPC server ([#279](https://github.com/a2aproject/a2a-js/issues/279)) ([bd4caa2](https://github.com/a2aproject/a2a-js/commit/bd4caa22a09480ba8cebec755528b67b80a95323)) ### Bug Fixes * use proto default values in generated a2a_types.ts ([#303](https://github.com/a2aproject/a2a-js/issues/303)) ([0215d42](https://github.com/a2aproject/a2a-js/commit/0215d4232654c356c5d48e93cb94da46093576dd)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 13 +++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76dbd6c1..89fd5baa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [0.3.9](https://github.com/a2aproject/a2a-js/compare/v0.3.8...v0.3.9) (2026-01-21) + + +### Features + +* implement gRPC client ([#299](https://github.com/a2aproject/a2a-js/issues/299)) ([dbdb96e](https://github.com/a2aproject/a2a-js/commit/dbdb96eeb14a710ad612f36f371d848fc7cce186)) +* implement gRPC server ([#279](https://github.com/a2aproject/a2a-js/issues/279)) ([bd4caa2](https://github.com/a2aproject/a2a-js/commit/bd4caa22a09480ba8cebec755528b67b80a95323)) + + +### Bug Fixes + +* use proto default values in generated a2a_types.ts ([#303](https://github.com/a2aproject/a2a-js/issues/303)) ([0215d42](https://github.com/a2aproject/a2a-js/commit/0215d4232654c356c5d48e93cb94da46093576dd)) + ## [0.3.8](https://github.com/a2aproject/a2a-js/compare/v0.3.7...v0.3.8) (2026-01-15) diff --git a/package-lock.json b/package-lock.json index 16fda4b6..fc342b50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@a2a-js/sdk", - "version": "0.3.8", + "version": "0.3.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@a2a-js/sdk", - "version": "0.3.8", + "version": "0.3.9", "license": "Apache-2.0", "dependencies": { "uuid": "^11.1.0" diff --git a/package.json b/package.json index dc3760a4..9ee0bdff 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@a2a-js/sdk", - "version": "0.3.8", + "version": "0.3.9", "description": "Server & Client SDK for Agent2Agent protocol", "license": "Apache-2.0", "repository": { From fa8a7f5581fb57fe7e45cdce8c2c2c5a1adc3ea5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Jan 2026 08:10:41 +0100 Subject: [PATCH 11/51] chore(deps): bump wrangler and @cloudflare/vitest-pool-workers (#309) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [wrangler](https://github.com/cloudflare/workers-sdk/tree/HEAD/packages/wrangler) to 4.59.3 and updates ancestor dependency [@cloudflare/vitest-pool-workers](https://github.com/cloudflare/workers-sdk/tree/HEAD/packages/vitest-pool-workers). These dependencies need to be updated together. Updates `wrangler` from 4.54.0 to 4.59.3
Release notes

Sourced from wrangler's releases.

wrangler@4.59.3

Patch Changes

  • #9396 75386b1 Thanks @​gnekich! - Fix wrangler login with custom callback-host/callback-port

    The Cloudflare OAuth API always requires the redirect_uri to be localhost:8976. However, sometimes the Wrangler OAuth server needed to listen on a different host/port, for example when running from inside a container. We were previously incorrectly setting the redirect_uri to the configured callback host/port, but it needs to be up to the user to map localhost:8976 to the Wrangler OAuth server in the container.

    Example:

    You might run Wrangler inside a docker container like this: docker run -p 8989:8976 <image>, which forwards port 8976 on your host to 8989 inside the container.

    Then inside the container, run wrangler login --callback-host=0.0.0.0 --callback-port=8989

    The OAuth link still has a redirect_uri set tolocalhost:8976. For example https://dash.cloudflare.com/oauth2/auth?...&redirect_uri=http%3A%2F%2Flocalhost%3A8976%2Foauth%2Fcallback&...

    However the redirect to localhost:8976 is then forwarded to the Wrangler OAuth server inside your container, allowing the login to complete.

  • #11925 8e4a0e5 Thanks @​dependabot! - chore: update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260114.0 1.20260115.0
  • #11942 133bf95 Thanks @​penalosa! - chore: update dependencies of "miniflare", "wrangler"

    The following dependency versions have been updated:

    Dependency From To
    workerd 1.20260115.0 1.20260116.0
  • #11922 93d8d78 Thanks @​dario-piotrowicz! - Improve telemetry errors being sent to Sentry by wrangler init when it delegates to C3 by ensuring that they contain the output of the C3 execution.

  • #11940 69ff962 Thanks @​penalosa! - Show helpful messages for file not found errors (ENOENT)

    When users encounter file not found errors, Wrangler now displays a helpful message with the missing file path and common causes, instead of reporting to Sentry.

  • #11904 22727c2 Thanks @​danielrs! - Fix false positive infinite loop detection for exact path redirects

    Fixed an issue where the redirect validation incorrectly flagged exact path redirects like / /index.html 200 as infinite loops. This was particularly problematic when html_handling is set to "none", where such redirects are valid.

    The fix makes the validation more specific to only block wildcard patterns (like /* /index.html) that would actually cause infinite loops, while allowing exact path matches that are valid in certain configurations.

    Fixes: cloudflare/workers-sdk#11824

  • #11946 fa39a73 Thanks @​MattieTK! - Fix configFileName returning wrong filename for .jsonc config files

    Previously, users with a wrangler.jsonc config file would see error messages and hints referring to wrangler.json instead of wrangler.jsonc. This was because the configFormat function collapsed both .json and .jsonc files into a single "jsonc" value, losing the distinction between them.

... (truncated)

Commits
  • 0c7e1f4 Version Packages (#11937)
  • 75386b1 Always pass a valid redirect_uri callback parameter (localhost:8976) to C...
  • d58fbd1 Wrangler: Make name the positional argument for wrangler delete instead o...
  • 133bf95 Add MessageBuilder support for Email Sending API in local mode (#11942)
  • 4ac7c82 [wrangler] Include version components in command event metrics (#11968)
  • 69ff962 Reduce more Sentry noise (#11940)
  • 029531a Wrangler: cache chosen account in memory to avoid repeated prompts (#11962)
  • bc70bfa Re-enable Media binding e2e tests (#11954)
  • 93d8d78 Ensure that wrangler init includes C3 error details when reporting to Sentr...
  • fa39a73 fix(wrangler): return correct config filename for .jsonc files (#11946)
  • Additional commits viewable in compare view

Updates `@cloudflare/vitest-pool-workers` from 0.10.15 to 0.12.5
Release notes

Sourced from @​cloudflare/vitest-pool-workers's releases.

@​cloudflare/vitest-pool-workers@​0.12.5

Patch Changes

@​cloudflare/vitest-pool-workers@​0.12.4

Patch Changes

  • #11898 c17e971 Thanks @​petebacondarwin! - Bundle more third-party dependencies to reduce supply chain risk

    Previously, several small utility packages were listed as runtime dependencies and installed separately. These are now bundled directly into the published packages, reducing the number of external dependencies users need to trust.

    Bundled dependencies:

    • miniflare: acorn, acorn-walk, exit-hook, glob-to-regexp, stoppable
    • kv-asset-handler: mime
    • vite-plugin-cloudflare: @remix-run/node-fetch-server, defu, get-port, picocolors, tinyglobby
    • vitest-pool-workers: birpc, devalue, get-port, semver
  • Updated dependencies [e78186d, fe4faa3, 4714ca1, c17e971, 695b043]:

    • miniflare@4.20260114.0
    • wrangler@4.59.2

@​cloudflare/vitest-pool-workers@​0.12.3

Patch Changes

  • Updated dependencies [99b1f32]:
    • wrangler@4.59.1

@​cloudflare/vitest-pool-workers@​0.12.2

Patch Changes

... (truncated)

Changelog

Sourced from @​cloudflare/vitest-pool-workers's changelog.

0.12.5

Patch Changes

0.12.4

Patch Changes

  • #11898 c17e971 Thanks @​petebacondarwin! - Bundle more third-party dependencies to reduce supply chain risk

    Previously, several small utility packages were listed as runtime dependencies and installed separately. These are now bundled directly into the published packages, reducing the number of external dependencies users need to trust.

    Bundled dependencies:

    • miniflare: acorn, acorn-walk, exit-hook, glob-to-regexp, stoppable
    • kv-asset-handler: mime
    • vite-plugin-cloudflare: @remix-run/node-fetch-server, defu, get-port, picocolors, tinyglobby
    • vitest-pool-workers: birpc, devalue, get-port, semver
  • Updated dependencies [e78186d, fe4faa3, 4714ca1, c17e971, 695b043]:

    • miniflare@4.20260114.0
    • wrangler@4.59.2

0.12.3

Patch Changes

  • Updated dependencies [99b1f32]:
    • wrangler@4.59.1

0.12.2

Patch Changes

... (truncated)

Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 1103 ++++++++++++++++++++++++++++++++------------- package.json | 2 +- 2 files changed, 779 insertions(+), 326 deletions(-) diff --git a/package-lock.json b/package-lock.json index fc342b50..b4a8ae42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,7 @@ "devDependencies": { "@bufbuild/buf": "^1.61.0", "@bufbuild/protobuf": "^2.10.2", - "@cloudflare/vitest-pool-workers": "^0.10.15", + "@cloudflare/vitest-pool-workers": "^0.12.5", "@eslint/js": "^9.39.1", "@grpc/grpc-js": "^1.11.0", "@types/express": "^5.0.3", @@ -299,72 +299,538 @@ "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", - "integrity": "sha512-Nu8ahitGFFJztxUml9oD/DLb7Z28C8cd8F46IVQ7y5Btz575pvMY8AqZsXkX7Gds29eCKdMgIHjIvzskHgPSFg==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.2.tgz", + "integrity": "sha512-SIOD2DxrRRwQ+jgzlXCqoEFiKOFqaPjhnNTGKXSRLvp1HiOvapLaFG2kEr9dYQTYe8rKrd9uvDUzmAITeNyaHQ==", + "dev": true, + "license": "MIT OR Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@cloudflare/unenv-preset": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.10.0.tgz", + "integrity": "sha512-/uII4vLQXhzCAZzEVeYAjFLBNg2nqTJ1JGzd2lRF6ItYe6U2zVoYGfeKpGx/EkBF6euiU+cyBXgMdtJih+nQ6g==", "dev": true, "license": "MIT OR Apache-2.0", + "peerDependencies": { + "unenv": "2.0.0-rc.24", + "workerd": "^1.20251221.0" + }, + "peerDependenciesMeta": { + "workerd": { + "optional": true + } + } + }, + "node_modules/@cloudflare/vitest-pool-workers": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/@cloudflare/vitest-pool-workers/-/vitest-pool-workers-0.12.5.tgz", + "integrity": "sha512-VF98f7kCPoBn1YDVzUywENcCblD44wcXjF8ejPgYjoHAMepbNpb/NTT9isei7F5PTUM5vOWUSFPVfqw3Rvd3uA==", + "dev": true, + "license": "MIT", "dependencies": { - "mime": "^3.0.0" + "cjs-module-lexer": "^1.2.3", + "esbuild": "0.27.0", + "miniflare": "4.20260116.0", + "wrangler": "4.59.3", + "zod": "^3.25.76" }, + "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/vitest-pool-workers/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": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@cloudflare/vitest-pool-workers/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": ">=18.0.0" + "node": ">=18" } }, - "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==", + "node_modules/@cloudflare/vitest-pool-workers/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": { - "mime": "cli.js" + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=10.0.0" - } - }, - "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" + "node": ">=18" }, - "peerDependencies": { - "@vitest/runner": "2.0.x - 3.2.x", - "@vitest/snapshot": "2.0.x - 3.2.x", - "vitest": "2.0.x - 3.2.x" + "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/@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==", + "version": "1.20260116.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20260116.0.tgz", + "integrity": "sha512-0LF2jR/5bfCIMYsqtCXHqaZRlXEMgnz4NzG/8KVmHROlKb06SJezYYoNKw+7s6ji4fgi1BcYAJBmWbC4nzMbqw==", "cpu": [ "x64" ], @@ -379,9 +845,9 @@ } }, "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==", + "version": "1.20260116.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20260116.0.tgz", + "integrity": "sha512-a9OHts4jMoOkPedc4CnuHPeo9XRG3VCMMgr0ER5HtSfEDRQhh7MwIuPEmqI27KKrYj+DeoCazIgbp3gW9bFTAg==", "cpu": [ "arm64" ], @@ -396,9 +862,9 @@ } }, "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==", + "version": "1.20260116.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20260116.0.tgz", + "integrity": "sha512-nCMy7D7BeH/feGiD7C5Z1LG19Wvs3qmHSRe3cwz6HYRQHdDXUHTjXwEVid7Vejf9QFNe3iAn49Sy/h2XY2Rqeg==", "cpu": [ "x64" ], @@ -413,9 +879,9 @@ } }, "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==", + "version": "1.20260116.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20260116.0.tgz", + "integrity": "sha512-Hve4ciPI69aIzwfSD12PVZJoEnKIkdR3Vd0w8rD1hDVxk75xAA65KqVYf5qW+8KOYrYkU3pg7hBTMjeyDF//IQ==", "cpu": [ "arm64" ], @@ -430,9 +896,9 @@ } }, "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==", + "version": "1.20260116.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20260116.0.tgz", + "integrity": "sha512-7QA6OTXQtBdszkXw3rzxpkk1RoINZJY1ADQjF0vFNAbVXD1VEXLZnk0jc505tqARI8w/0DdVjaJszqL7K5k00w==", "cpu": [ "x64" ], @@ -471,9 +937,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", - "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", "dev": true, "license": "MIT", "optional": true, @@ -481,14 +947,6 @@ "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.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", @@ -1160,10 +1618,20 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", - "integrity": "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", "cpu": [ "arm64" ], @@ -1180,13 +1648,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.0.4" + "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz", - "integrity": "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", "cpu": [ "x64" ], @@ -1203,13 +1671,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.0.4" + "@img/sharp-libvips-darwin-x64": "1.2.4" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz", - "integrity": "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", "cpu": [ "arm64" ], @@ -1224,9 +1692,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz", - "integrity": "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", "cpu": [ "x64" ], @@ -1241,9 +1709,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz", - "integrity": "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", "cpu": [ "arm" ], @@ -1258,9 +1726,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz", - "integrity": "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", "cpu": [ "arm64" ], @@ -1274,10 +1742,44 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz", - "integrity": "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", "cpu": [ "s390x" ], @@ -1292,9 +1794,9 @@ } }, "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==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", "cpu": [ "x64" ], @@ -1309,9 +1811,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz", - "integrity": "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", "cpu": [ "arm64" ], @@ -1326,9 +1828,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz", - "integrity": "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", "cpu": [ "x64" ], @@ -1343,9 +1845,9 @@ } }, "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==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", "cpu": [ "arm" ], @@ -1362,13 +1864,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.0.5" + "@img/sharp-libvips-linux-arm": "1.2.4" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz", - "integrity": "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", "cpu": [ "arm64" ], @@ -1385,13 +1887,59 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.0.4" + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz", - "integrity": "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", "cpu": [ "s390x" ], @@ -1408,13 +1956,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.0.4" + "@img/sharp-libvips-linux-s390x": "1.2.4" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz", - "integrity": "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", "cpu": [ "x64" ], @@ -1431,13 +1979,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.0.4" + "@img/sharp-libvips-linux-x64": "1.2.4" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz", - "integrity": "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", "cpu": [ "arm64" ], @@ -1454,13 +2002,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz", - "integrity": "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", "cpu": [ "x64" ], @@ -1477,13 +2025,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.0.4" + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz", - "integrity": "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", "cpu": [ "wasm32" ], @@ -1491,8 +2039,28 @@ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.2.0" + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, @@ -1501,9 +2069,9 @@ } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz", - "integrity": "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", "cpu": [ "ia32" ], @@ -1521,9 +2089,9 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz", - "integrity": "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", "cpu": [ "x64" ], @@ -2182,9 +2750,9 @@ ] }, "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==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz", + "integrity": "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw==", "dev": true, "license": "MIT", "engines": { @@ -2195,9 +2763,9 @@ } }, "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==", + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.14.tgz", + "integrity": "sha512-G4ewlBNhUtlLvrJTb88d2mdy2KRijzs4UhnlrOSRT4bmjh/IqNElZa3zkrZ+TC47TwtlDWzVLFADljF1Ijp5hA==", "dev": true, "license": "CC0-1.0" }, @@ -2818,16 +3386,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.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==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2928,16 +3486,6 @@ "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==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/blake3-wasm": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", @@ -3140,20 +3688,6 @@ "node": ">=12" } }, - "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": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3174,17 +3708,6 @@ "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==", - "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", @@ -3373,13 +3896,6 @@ "node": ">=8" } }, - "node_modules/devalue": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.2.tgz", - "integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==", - "dev": true, - "license": "MIT" - }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -3796,19 +4312,6 @@ "node": ">= 0.6" } }, - "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": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/expect-type": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", @@ -4209,13 +4712,6 @@ "node": ">=10.13.0" } }, - "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/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -4822,24 +5318,19 @@ } }, "node_modules/miniflare": { - "version": "4.20251210.0", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20251210.0.tgz", - "integrity": "sha512-k6kIoXwGVqlPZb0hcn+X7BmnK+8BjIIkusQPY22kCo2RaQJ/LzAjtxHQdGXerlHSnJyQivDQsL6BJHMpQfUFyw==", + "version": "4.20260116.0", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20260116.0.tgz", + "integrity": "sha512-fCU1thOdiKfcauYp/gAchhesOTqTPy3K7xY6g72RiJ2xkna18QJ3Mh5sgDmnqlOEqSW9vpmYeK8vd/aqkrtlUA==", "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", + "sharp": "^0.34.5", + "undici": "7.18.2", + "workerd": "1.20260116.0", "ws": "8.18.0", "youch": "4.1.0-beta.10", - "zod": "3.22.3" + "zod": "^3.25.76" }, "bin": { "miniflare": "bootstrap.js" @@ -4848,29 +5339,6 @@ "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" - }, - "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" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -5592,16 +6060,16 @@ "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==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.3", - "semver": "^7.6.3" + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -5610,25 +6078,30 @@ "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" + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" } }, "node_modules/shebang-command": { @@ -5737,23 +6210,6 @@ "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, - "license": "MIT" - }, "node_modules/source-map": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", @@ -5798,17 +6254,6 @@ "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", @@ -6166,6 +6611,14 @@ "dev": true, "license": "Apache-2.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", + "optional": true + }, "node_modules/tsup": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", @@ -6323,9 +6776,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.14.0.tgz", - "integrity": "sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.18.2.tgz", + "integrity": "sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==", "dev": true, "license": "MIT", "engines": { @@ -6607,9 +7060,9 @@ } }, "node_modules/workerd": { - "version": "1.20251210.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20251210.0.tgz", - "integrity": "sha512-9MUUneP1BnRE9XAYi94FXxHmiLGbO75EHQZsgWqSiOXjoXSqJCw8aQbIEPxCy19TclEl/kHUFYce8ST2W+Qpjw==", + "version": "1.20260116.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20260116.0.tgz", + "integrity": "sha512-tVdBes3qkZKm9ntrgSDlvKzk4g2mcMp4bNM1+UgZMpTesb0x7e59vYYcKclbSNypmVkdLWpEc2TOpO0WF/rrZw==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -6620,28 +7073,28 @@ "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" + "@cloudflare/workerd-darwin-64": "1.20260116.0", + "@cloudflare/workerd-darwin-arm64": "1.20260116.0", + "@cloudflare/workerd-linux-64": "1.20260116.0", + "@cloudflare/workerd-linux-arm64": "1.20260116.0", + "@cloudflare/workerd-windows-64": "1.20260116.0" } }, "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==", + "version": "4.59.3", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.59.3.tgz", + "integrity": "sha512-zl+nqoGzWJ4K+NEMjy4GiaIi9ix59FkOzd7UsDb8CQADwy3li1DSNAzHty/BWYa3ZvMxr/G4pogMBb5vcSrNvQ==", "dev": true, "license": "MIT OR Apache-2.0", "dependencies": { - "@cloudflare/kv-asset-handler": "0.4.1", - "@cloudflare/unenv-preset": "2.7.13", + "@cloudflare/kv-asset-handler": "0.4.2", + "@cloudflare/unenv-preset": "2.10.0", "blake3-wasm": "2.1.5", "esbuild": "0.27.0", - "miniflare": "4.20251210.0", + "miniflare": "4.20260116.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", - "workerd": "1.20251210.0" + "workerd": "1.20260116.0" }, "bin": { "wrangler": "bin/wrangler.js", @@ -6654,7 +7107,7 @@ "fsevents": "~2.3.2" }, "peerDependencies": { - "@cloudflare/workers-types": "^4.20251210.0" + "@cloudflare/workers-types": "^4.20260116.0" }, "peerDependenciesMeta": { "@cloudflare/workers-types": { diff --git a/package.json b/package.json index 9ee0bdff..c9dedfbf 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "devDependencies": { "@bufbuild/buf": "^1.61.0", "@bufbuild/protobuf": "^2.10.2", - "@cloudflare/vitest-pool-workers": "^0.10.15", + "@cloudflare/vitest-pool-workers": "^0.12.5", "@eslint/js": "^9.39.1", "@grpc/grpc-js": "^1.11.0", "@types/express": "^5.0.3", From f31e0c596088859c837e3adc674f31972066c4eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Jan 2026 07:17:33 +0000 Subject: [PATCH 12/51] chore(deps-dev): bump lodash from 4.17.21 to 4.17.23 (#310) --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4a8ae42..740ee3d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5162,9 +5162,9 @@ } }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", "dev": true, "license": "MIT" }, From 5359fa802fc3a3dcf35438f3cee18f7ab9bc3ca3 Mon Sep 17 00:00:00 2001 From: Luca Bertelli Date: Fri, 23 Jan 2026 14:41:02 +0100 Subject: [PATCH 13/51] fix: do not use ReadableStream async iterator in SSE stream parsing (#311) # Description The async iterator in `ReadableStream` is not available in browsers like Safari: [MDN](https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream#browser_compatibility). This PR changes it to a lower-level API which has better support across different environments. Fixes #308. --- src/sse_utils.ts | 29 +++++++++++++++++- test/sse_utils.spec.ts | 67 ++++++++++++++++++++++++++++++++---------- 2 files changed, 80 insertions(+), 16 deletions(-) diff --git a/src/sse_utils.ts b/src/sse_utils.ts index c79d0f83..6da110c3 100644 --- a/src/sse_utils.ts +++ b/src/sse_utils.ts @@ -108,7 +108,9 @@ export async function* parseSseStream( let eventType = 'message'; let eventData = ''; - for await (const value of response.body.pipeThrough(new TextDecoderStream())) { + const stream = response.body.pipeThrough(new TextDecoderStream()); + + for await (const value of readFrom(stream)) { buffer += value; let lineEndIndex: number; @@ -137,3 +139,28 @@ export async function* parseSseStream( yield { type: eventType, data: eventData }; } } + +/** + * Reads string chunks from a ReadableStream using the reader API. + * + * We use the manual reader approach the native async iterator directly on the stream + * because ReadableStream async iteration is not supported in all environments. + * @see https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream#browser_compatibility + * + * @param stream - The ReadableStream to read from + * @yields String chunks from the stream + */ +async function* readFrom(stream: ReadableStream): AsyncGenerator { + const reader = stream.getReader(); + try { + while (true) { + const { done, value } = await reader.read(); + if (done) { + break; + } + yield value; + } + } finally { + reader.releaseLock(); + } +} diff --git a/test/sse_utils.spec.ts b/test/sse_utils.spec.ts index 8c96d770..a8aad259 100644 --- a/test/sse_utils.spec.ts +++ b/test/sse_utils.spec.ts @@ -1,20 +1,14 @@ import { describe, it, expect } from 'vitest'; import { formatSSEEvent, formatSSEErrorEvent, parseSseStream, SseEvent } from '../src/sse_utils.js'; +const MOCK_CHUNK_SIZE = 2; + /** - * Creates a mock Response object from SSE-formatted strings. - * Used to test that the parser can understand what the formatter produces. + * Creates a ReadableStream from chunks of Uint8Array data. */ -function createMockResponse(sseData: string, chunkSize: number = 2): Response { - const encoder = new TextEncoder(); - const chunks: Uint8Array[] = []; - - for (let i = 0; i < sseData.length; i += chunkSize) { - chunks.push(encoder.encode(sseData.slice(i, i + chunkSize))); - } - +function createStream(chunks: Uint8Array[]): ReadableStream { let chunkIndex = 0; - const stream = new ReadableStream({ + return new ReadableStream({ pull(controller) { if (chunkIndex < chunks.length) { controller.enqueue(chunks[chunkIndex]); @@ -24,6 +18,46 @@ function createMockResponse(sseData: string, chunkSize: number = 2): Response { } }, }); +} + +/** + * Encodes a string into chunks of Uint8Array data. + */ +function encodeChunks(data: string): Uint8Array[] { + const encoder = new TextEncoder(); + const chunks: Uint8Array[] = []; + for (let i = 0; i < data.length; i += MOCK_CHUNK_SIZE) { + chunks.push(encoder.encode(data.slice(i, i + MOCK_CHUNK_SIZE))); + } + return chunks; +} + +/** + * Creates a mock Response object from SSE-formatted strings. + * Used to test that the parser can understand what the formatter produces. + */ +function createMockResponse(sseData: string): Response { + const chunks = encodeChunks(sseData); + return new Response(createStream(chunks), { + headers: { 'Content-Type': 'text/event-stream' }, + }); +} + +/** + * Creates a mock Response where the decoded stream has no native async iterator. + * Simulates environments where ReadableStream async iteration is not supported. + * @see https://developer.mozilla.org/en-US/docs/Web/API/ReadableStream#browser_compatibility + */ +function createMockResponseWithoutAsyncIterator(sseData: string): Response { + const chunks = encodeChunks(sseData); + const stream = createStream(chunks); + + const originalPipeThrough = stream.pipeThrough.bind(stream); + stream.pipeThrough = function (transform: ReadableWritablePair) { + const result = originalPipeThrough(transform); + delete result[Symbol.asyncIterator]; + return result; + } as typeof stream.pipeThrough; return new Response(stream, { headers: { 'Content-Type': 'text/event-stream' }, @@ -59,10 +93,13 @@ describe('SSE Utils', () => { }); }); - describe('parseSseStream', () => { + describe.each([ + ['with native async iterator', createMockResponse], + ['without native async iterator', createMockResponseWithoutAsyncIterator], + ])('parseSseStream (%s)', (_, createResponse) => { it('should parse a single data event', async () => { const sseData = 'data: {"kind":"message"}\n\n'; - const response = createMockResponse(sseData); + const response = createResponse(sseData); const events: SseEvent[] = []; for await (const event of parseSseStream(response)) { @@ -76,7 +113,7 @@ describe('SSE Utils', () => { it('should parse an error event', async () => { const sseData = 'event: error\ndata: {"code":-32001}\n\n'; - const response = createMockResponse(sseData); + const response = createResponse(sseData); const events: SseEvent[] = []; for await (const event of parseSseStream(response)) { @@ -90,7 +127,7 @@ describe('SSE Utils', () => { it('should parse multiple events', async () => { const sseData = 'data: {"id":1}\n\ndata: {"id":2}\n\n'; - const response = createMockResponse(sseData); + const response = createResponse(sseData); const events: SseEvent[] = []; for await (const event of parseSseStream(response)) { From 33be02c72fd80a7f8c7f36b635f84ef874e40ffe Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Mon, 26 Jan 2026 17:13:42 +0100 Subject: [PATCH 14/51] docs: use artifacts for agent result in movie-agent sample (#313) Same as #297 but for `movie-agent`. Artifacts should be used for this: https://github.com/a2aproject/A2A/issues/822#issuecomment-3084892313. --- src/samples/agents/movie-agent/index.ts | 28 ++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/samples/agents/movie-agent/index.ts b/src/samples/agents/movie-agent/index.ts index 5225806a..ff5c1f44 100644 --- a/src/samples/agents/movie-agent/index.ts +++ b/src/samples/agents/movie-agent/index.ts @@ -9,6 +9,9 @@ import { TextPart, Message, AGENT_CARD_PATH, + TaskArtifactUpdateEvent, + Artifact, + Part, } from '../../../index.js'; import { InMemoryTaskStore, @@ -192,25 +195,44 @@ class MovieAgentExecutor implements AgentExecutor { finalA2AState = 'completed'; // Default if LLM deviates } - // 5. Publish final task status update + // 5. Publish artifact with the result + const parts: Part[] = [{ kind: 'text', text: agentReplyText || 'Completed.' }]; + const artifactId = uuidv4(); + const resultArtifact: Artifact = { + artifactId: artifactId, + name: 'Result', + description: 'The result of the movie agent.', + parts: parts, + }; + + const artifactUpdate: TaskArtifactUpdateEvent = { + kind: 'artifact-update', + taskId: taskId, + contextId: contextId, + artifact: resultArtifact, + lastChunk: true, + }; + eventBus.publish(artifactUpdate); + + // 6. Update local history context (internal only) const agentMessage: Message = { kind: 'message', role: 'agent', messageId: uuidv4(), - parts: [{ kind: 'text', text: agentReplyText || 'Completed.' }], // Ensure some text + parts: parts, taskId: taskId, contextId: contextId, }; historyForGenkit.push(agentMessage); contexts.set(contextId, historyForGenkit); + // 7. Publish final task status update const finalUpdate: TaskStatusUpdateEvent = { kind: 'status-update', taskId: taskId, contextId: contextId, status: { state: finalA2AState, - message: agentMessage, timestamp: new Date().toISOString(), }, final: true, From b8158fdb7d99366e51e9941a83834a3a9d34c0dd Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Mon, 26 Jan 2026 17:17:25 +0100 Subject: [PATCH 15/51] ci: do not run TCK and unit tests on samples folder updates (#314) Follow-up for #282. --- .github/workflows/run-tck.yaml | 1 + .github/workflows/unit-tests.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/run-tck.yaml b/.github/workflows/run-tck.yaml index 0ea23bef..07b2937a 100644 --- a/.github/workflows/run-tck.yaml +++ b/.github/workflows/run-tck.yaml @@ -10,6 +10,7 @@ on: - 'LICENSE' - '.github/CODEOWNERS' - 'test/**' + - 'src/samples/**' env: diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index 4e004022..b1606c6e 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -12,6 +12,7 @@ on: - '**.md' - 'LICENSE' - '.github/CODEOWNERS' + - 'src/samples/**' jobs: test: From d39544ea4ba0db004fcca15b9fac870a97725e5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20Br=C3=BCderl?= Date: Tue, 27 Jan 2026 19:48:23 +0100 Subject: [PATCH 16/51] fix: preserve typed error as cause in SSE errors (#315) ## What Wrap the typed error from `mapToError()` as the `cause` when throwing SSE stream errors. ## Why When an SSE stream contains a JSON-RPC error, we throw an Error with a formatted message string. The structured error data (code, message, data) is serialized into that string and lost. Consumers who need the structured data have to parse it back out with regex. ## Implementation details Use the standard JS error `cause` option to preserve the typed error: ```typescript throw new Error( `SSE event contained an error: ${err.message} (Code: ${err.code}) Data: ${JSON.stringify(err.data || {})}`, { cause: JsonRpcTransport.mapToError(a2aStreamResponse as JSONRPCErrorResponse) } ); ``` Backward compatible - the message string is unchanged. Consumers can access structured data via: ```typescript const cause = error.cause as JSONRPCTransportError; const { code, message, data } = cause.errorResponse.error; ``` --- src/client/transports/json_rpc_transport.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/client/transports/json_rpc_transport.ts b/src/client/transports/json_rpc_transport.ts index 35aa18af..d1140eb2 100644 --- a/src/client/transports/json_rpc_transport.ts +++ b/src/client/transports/json_rpc_transport.ts @@ -329,7 +329,8 @@ export class JsonRpcTransport implements Transport { if ('error' in a2aStreamResponse) { const err = a2aStreamResponse.error; throw new Error( - `SSE event contained an error: ${err.message} (Code: ${err.code}) Data: ${JSON.stringify(err.data || {})}` + `SSE event contained an error: ${err.message} (Code: ${err.code}) Data: ${JSON.stringify(err.data || {})}`, + { cause: JsonRpcTransport.mapToError(a2aStreamResponse) } ); } From e056416335923584bc8b36e6d3e17ea925094da4 Mon Sep 17 00:00:00 2001 From: "Agent2Agent (A2A) Bot" Date: Tue, 3 Feb 2026 02:59:14 -0600 Subject: [PATCH 17/51] chore(main): release 0.3.10 (#312) :robot: I have created a release *beep* *boop* --- ## [0.3.10](https://github.com/a2aproject/a2a-js/compare/v0.3.9...v0.3.10) (2026-01-27) ### Bug Fixes * do not use ReadableStream async iterator in SSE stream parsing ([#311](https://github.com/a2aproject/a2a-js/issues/311)) ([5359fa8](https://github.com/a2aproject/a2a-js/commit/5359fa802fc3a3dcf35438f3cee18f7ab9bc3ca3)) * preserve typed error as cause in SSE errors ([#315](https://github.com/a2aproject/a2a-js/issues/315)) ([d39544e](https://github.com/a2aproject/a2a-js/commit/d39544ea4ba0db004fcca15b9fac870a97725e5c)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 8 ++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89fd5baa..40e31235 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.3.10](https://github.com/a2aproject/a2a-js/compare/v0.3.9...v0.3.10) (2026-01-27) + + +### Bug Fixes + +* do not use ReadableStream async iterator in SSE stream parsing ([#311](https://github.com/a2aproject/a2a-js/issues/311)) ([5359fa8](https://github.com/a2aproject/a2a-js/commit/5359fa802fc3a3dcf35438f3cee18f7ab9bc3ca3)) +* preserve typed error as cause in SSE errors ([#315](https://github.com/a2aproject/a2a-js/issues/315)) ([d39544e](https://github.com/a2aproject/a2a-js/commit/d39544ea4ba0db004fcca15b9fac870a97725e5c)) + ## [0.3.9](https://github.com/a2aproject/a2a-js/compare/v0.3.8...v0.3.9) (2026-01-21) diff --git a/package-lock.json b/package-lock.json index 740ee3d6..41629be0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@a2a-js/sdk", - "version": "0.3.9", + "version": "0.3.10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@a2a-js/sdk", - "version": "0.3.9", + "version": "0.3.10", "license": "Apache-2.0", "dependencies": { "uuid": "^11.1.0" diff --git a/package.json b/package.json index c9dedfbf..b56c6239 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@a2a-js/sdk", - "version": "0.3.9", + "version": "0.3.10", "description": "Server & Client SDK for Agent2Agent protocol", "license": "Apache-2.0", "repository": { From 5ea1c94acaf2cae5aa1bc10ea5816f5400a62423 Mon Sep 17 00:00:00 2001 From: Corvid Agent <95454608+corvid-agent@users.noreply.github.com> Date: Wed, 11 Feb 2026 00:36:45 -0700 Subject: [PATCH 18/51] fix: throw on JSON-RPC response id mismatch (#318) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Replaces `console.error`/`console.warn` calls with thrown errors when a JSON-RPC response id does not match the request id. Per the JSON-RPC 2.0 specification, this is a protocol invariant violation — continuing execution with a mismatched response can lead to silent data corruption. ### Changes - **`_sendRpcRequest`**: `console.error` → `throw new Error` on id mismatch - **`_processSseEventData`**: `console.warn` → `throw new Error` on id mismatch - **`_processSseEventData` catch block**: Added the new error message to the pass-through condition so it is not swallowed and re-wrapped as a parse error ### Context From the code review on PR #169: *"Go SDK doesn't perform any validation, but I'd probably be throwing in case of a mismatch"* — @yarolegovich Fixes #176 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.6 --- src/client/transports/json_rpc_transport.ts | 62 +++++++++------------ 1 file changed, 26 insertions(+), 36 deletions(-) diff --git a/src/client/transports/json_rpc_transport.ts b/src/client/transports/json_rpc_transport.ts index d1140eb2..0bb8247a 100644 --- a/src/client/transports/json_rpc_transport.ts +++ b/src/client/transports/json_rpc_transport.ts @@ -232,8 +232,8 @@ export class JsonRpcTransport implements Transport { const rpcResponse: JSONRPCResponse = await httpResponse.json(); if (rpcResponse.id !== requestId) { - console.error( - `CRITICAL: RPC response ID mismatch for method ${method}. Expected ${requestId}, got ${rpcResponse.id}.` + throw new Error( + `JSON-RPC response ID mismatch for method ${method}. Expected ${requestId}, got ${rpcResponse.id}.` ); } @@ -316,46 +316,36 @@ export class JsonRpcTransport implements Transport { if (!jsonData.trim()) { throw new Error('Attempted to process empty SSE event data.'); } - try { - const sseJsonRpcResponse = JSON.parse(jsonData); - const a2aStreamResponse: JSONRPCResponse = sseJsonRpcResponse as JSONRPCResponse; - - if (a2aStreamResponse.id !== originalRequestId) { - console.warn( - `SSE Event's JSON-RPC response ID mismatch. Client request ID: ${originalRequestId}, event response ID: ${a2aStreamResponse.id}.` - ); - } - - if ('error' in a2aStreamResponse) { - const err = a2aStreamResponse.error; - throw new Error( - `SSE event contained an error: ${err.message} (Code: ${err.code}) Data: ${JSON.stringify(err.data || {})}`, - { cause: JsonRpcTransport.mapToError(a2aStreamResponse) } - ); - } - if (!('result' in a2aStreamResponse) || typeof a2aStreamResponse.result === 'undefined') { - throw new Error(`SSE event JSON-RPC response is missing 'result' field. Data: ${jsonData}`); - } - - return a2aStreamResponse.result as TStreamItem; + let a2aStreamResponse: JSONRPCResponse; + try { + a2aStreamResponse = JSON.parse(jsonData) as JSONRPCResponse; } catch (e) { - if ( - e instanceof Error && - (e.message.startsWith('SSE event contained an error') || - e.message.startsWith("SSE event JSON-RPC response is missing 'result' field")) - ) { - throw e; - } - console.error( - 'Failed to parse SSE event data string or unexpected JSON-RPC structure:', - jsonData, - e + throw new Error( + `Failed to parse SSE event data: "${jsonData.substring(0, 100)}...". Original error: ${(e instanceof Error && e.message) || 'Unknown error'}`, + { cause: e } ); + } + + if (a2aStreamResponse.id !== originalRequestId) { throw new Error( - `Failed to parse SSE event data: "${jsonData.substring(0, 100)}...". Original error: ${(e instanceof Error && e.message) || 'Unknown error'}` + `JSON-RPC response ID mismatch in SSE event. Expected ${originalRequestId}, got ${a2aStreamResponse.id}.` ); } + + if ('error' in a2aStreamResponse) { + const err = a2aStreamResponse.error; + throw new Error( + `SSE event contained an error: ${err.message} (Code: ${err.code}) Data: ${JSON.stringify(err.data || {})}`, + { cause: JsonRpcTransport.mapToError(a2aStreamResponse) } + ); + } + + if (!('result' in a2aStreamResponse) || typeof a2aStreamResponse.result === 'undefined') { + throw new Error(`SSE event JSON-RPC response is missing 'result' field. Data: ${jsonData}`); + } + + return a2aStreamResponse.result as TStreamItem; } private static mapToError(response: JSONRPCErrorResponse): Error { From 40b840d75452404be8131dc2e6e34d7c51e81410 Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Thu, 12 Feb 2026 11:58:46 +0100 Subject: [PATCH 19/51] build: integrate betterer to progress with strict mode (#329) 1. Integrate [betterer](https://phenomnomnominal.github.io/betterer/docs/introduction) and enable strict mode test to stop introducing more errors. 2. Refactor `npm` scripts to integrate this workflow better: `npm run lint` will do all safe automatic fixes (from both linters and betterer), while `npm run lint:ci` will strictly fail if formatting changes or betterer update is required. Doing this before 1.0 work (#321) as many code changes are going to be required either way. Re #182 --------- Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- .betterer.results | 92 +++++ .betterer.ts | 8 + .gemini/settings.json | 2 +- .github/workflows/lint.yml | 2 +- AGENTS.md | 4 +- eslint.config.mjs | 2 +- package-lock.json | 782 +++++++++++++++++++++++++++++++++++++ package.json | 6 +- 8 files changed, 891 insertions(+), 7 deletions(-) create mode 100644 .betterer.results create mode 100644 .betterer.ts diff --git a/.betterer.results b/.betterer.results new file mode 100644 index 00000000..85925986 --- /dev/null +++ b/.betterer.results @@ -0,0 +1,92 @@ +// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use `betterer merge` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[`TypeScript Strict Mode`] = { + value: `{ + "src/client/client.ts:1182451551": [ + [444, 45, 6, "tsc: Argument of type \'TParams | undefined\' is not assignable to parameter of type \'TParams\'.\\n \'TParams | undefined\' is assignable to the constraint of type \'TParams\', but \'TParams\' could be instantiated with a different subtype of constraint \'JsonRpcParams\'.\\n Type \'undefined\' is not assignable to type \'TParams\'.\\n \'undefined\' is assignable to the constraint of type \'TParams\', but \'TParams\' could be instantiated with a different subtype of constraint \'JsonRpcParams\'.", "1898504825"], + [474, 4, 6, "tsc: Type \'undefined\' is not assignable to type \'JSONRPCErrorResponse\'.", "2123913871"] + ], + "src/client/factory.ts:3559992563": [ + [119, 29, 37, "tsc: Argument of type \'string | undefined\' is not assignable to parameter of type \'string\'.\\n Type \'undefined\' is not assignable to type \'string\'.", "176554761"] + ], + "src/client/multitransport-client.ts:1457951880": [ + [82, 24, 44, "tsc: Type \'Promise\' is not assignable to type \'Promise\'.\\n Type \'AgentCard\' is not assignable to type \'never\'.", "1356744557"], + [101, 6, 47, "tsc: Argument of type \'(params: MessageSendParams, options?: RequestOptions | undefined) => Promise\' is not assignable to parameter of type \'(params: MessageSendParams, options?: RequestOptions | undefined) => Promise\'.\\n Type \'Promise\' is not assignable to type \'Promise\'.\\n Type \'SendMessageResult\' is not assignable to type \'never\'.\\n Type \'Message\' is not assignable to type \'never\'.", "2571452626"], + [178, 6, 65, "tsc: Argument of type \'(params: TaskPushNotificationConfig, options?: RequestOptions | undefined) => Promise\' is not assignable to parameter of type \'(params: TaskPushNotificationConfig, options?: RequestOptions | undefined) => Promise\'.\\n Type \'Promise\' is not assignable to type \'Promise\'.\\n Type \'TaskPushNotificationConfig\' is not assignable to type \'never\'.", "2789685747"], + [197, 6, 65, "tsc: Argument of type \'(params: GetTaskPushNotificationConfigParams, options?: RequestOptions | undefined) => Promise\' is not assignable to parameter of type \'(params: TaskIdParams, options?: RequestOptions | undefined) => Promise\'.\\n Type \'Promise\' is not assignable to type \'Promise\'.\\n Type \'TaskPushNotificationConfig\' is not assignable to type \'never\'.", "1581152103"], + [216, 6, 66, "tsc: Argument of type \'(params: ListTaskPushNotificationConfigParams, options?: RequestOptions | undefined) => Promise\' is not assignable to parameter of type \'(params: ListTaskPushNotificationConfigParams, options?: RequestOptions | undefined) => Promise\'.\\n Type \'Promise\' is not assignable to type \'Promise\'.\\n Type \'TaskPushNotificationConfig[]\' is not assignable to type \'never\'.", "4161961235"], + [230, 6, 68, "tsc: Argument of type \'(params: DeleteTaskPushNotificationConfigParams, options?: RequestOptions | undefined) => Promise\' is not assignable to parameter of type \'(params: DeleteTaskPushNotificationConfigParams, options?: RequestOptions | undefined) => Promise\'.\\n Type \'Promise\' is not assignable to type \'Promise\'.\\n Type \'void\' is not assignable to type \'never\'.", "1244975368"], + [241, 6, 43, "tsc: Argument of type \'(params: TaskQueryParams, options?: RequestOptions | undefined) => Promise\' is not assignable to parameter of type \'(params: TaskQueryParams, options?: RequestOptions | undefined) => Promise\'.\\n Type \'Promise\' is not assignable to type \'Promise\'.\\n Type \'Task\' is not assignable to type \'never\'.", "2875666270"], + [253, 6, 46, "tsc: Argument of type \'(params: TaskIdParams, options?: RequestOptions | undefined) => Promise\' is not assignable to parameter of type \'(params: TaskIdParams, options?: RequestOptions | undefined) => Promise\'.\\n Type \'Promise\' is not assignable to type \'Promise\'.\\n Type \'Task\' is not assignable to type \'never\'.", "588661070"] + ], + "src/client/transports/json_rpc_transport.ts:956778244": [ + [54, 6, 9, "tsc: Type \'undefined\' does not satisfy the constraint \'{ [key: string]: any; }\'.", "2620553983"], + [169, 38, 16, "tsc: Type \'TExtensionParams\' does not satisfy the constraint \'{ [key: string]: any; }\'.", "3740514676"] + ], + "src/server/events/execution_event_bus.ts:341476271": [ + [248, 15, 4, "tsc: Expected 2 arguments, but got 1.", "2087764327"], + [271, 15, 4, "tsc: Expected 2 arguments, but got 1.", "2087764327"] + ], + "src/server/events/execution_event_queue.ts:132062659": [ + [12, 10, 16, "tsc: Property \'boundHandleEvent\' has no initializer and is not definitely assigned in the constructor.", "1937789361"] + ], + "src/server/express/rest_handler.ts:684800976": [ + [154, 35, 4, "tsc: Argument of type \'T | undefined\' is not assignable to parameter of type \'T\'.\\n \'T\' could be instantiated with an arbitrary type which could be unrelated to \'T | undefined\'.", "2087730517"], + [204, 50, 17, "tsc: Argument of type \'unknown\' is not assignable to parameter of type \'Message | Task | TaskArtifactUpdateEvent | TaskStatusUpdateEvent\'.", "3749434707"] + ], + "src/server/request_handler/default_request_handler.ts:1208203039": [ + [433, 22, 23, "tsc: Type \'Message1 | Message2 | undefined\' is not assignable to type \'Message1\'.\\n Type \'undefined\' is not assignable to type \'Message1\'.", "1479072653"], + [433, 47, 19, "tsc: Type \'Message2 | undefined\' is not assignable to type \'Message1\'.\\n Type \'undefined\' is not assignable to type \'Message1\'.", "2682097303"], + [619, 6, 6, "tsc: Type \'string | undefined\' is not assignable to type \'string\'.\\n Type \'undefined\' is not assignable to type \'string\'.", "1741934565"] + ], + "src/server/transports/jsonrpc/jsonrpc_transport_handler.ts:3071717608": [ + [55, 12, 10, "tsc: Variable \'rpcRequest\' is used before being assigned.", "3927050741"] + ], + "src/types/converters/from_proto.ts:3167572508": [ + [84, 6, 22, "tsc: Type \'PushNotificationConfig | undefined\' is not assignable to type \'PushNotificationConfig1\'.\\n Type \'undefined\' is not assignable to type \'PushNotificationConfig1\'.", "2368778428"], + [138, 63, 30, "tsc: Argument of type \'PushNotificationConfig | undefined\' is not assignable to parameter of type \'PushNotificationConfig\'.\\n Type \'undefined\' is not assignable to type \'PushNotificationConfig\'.", "4185699816"], + [153, 67, 21, "tsc: Argument of type \'AuthenticationInfo | undefined\' is not assignable to parameter of type \'AuthenticationInfo\'.\\n Type \'undefined\' is not assignable to type \'AuthenticationInfo\'.", "243589825"], + [203, 8, 4, "tsc: Type \'undefined | { [key: string]: any; }\' is not assignable to type \'{ [k: string]: unknown; }\'.\\n Type \'undefined\' is not assignable to type \'{ [k: string]: unknown; }\'.", "2087377941"], + [211, 6, 7, "tsc: Type \'Message | undefined\' is not assignable to type \'Message\'.\\n Type \'undefined\' is not assignable to type \'Message\'.", "1236122734"], + [211, 33, 15, "tsc: Argument of type \'Message | undefined\' is not assignable to parameter of type \'Message\'.\\n Type \'undefined\' is not assignable to type \'Message\'.", "1725852363"], + [212, 56, 21, "tsc: Argument of type \'SendMessageConfiguration | undefined\' is not assignable to parameter of type \'SendMessageConfiguration\'.\\n Type \'undefined\' is not assignable to type \'SendMessageConfiguration\'.", "2141283338"], + [221, 6, 6, "tsc: Type \'Message | undefined\' is not assignable to type \'Message | Task\'.\\n Type \'undefined\' is not assignable to type \'Message | Task\'.", "2123913871"], + [230, 35, 11, "tsc: Argument of type \'TaskStatus | undefined\' is not assignable to parameter of type \'TaskStatus\'.\\n Type \'undefined\' is not assignable to type \'TaskStatus\'.", "3290243250"], + [233, 6, 7, "tsc: Type \'(Message | undefined)[]\' is not assignable to type \'Message1[]\'.\\n Type \'Message | undefined\' is not assignable to type \'Message1\'.\\n Type \'undefined\' is not assignable to type \'Message1\'.", "502375463"], + [240, 33, 13, "tsc: Argument of type \'Message | undefined\' is not assignable to parameter of type \'Message\'.\\n Type \'undefined\' is not assignable to type \'Message\'.", "586067534"], + [286, 6, 22, "tsc: Type \'PushNotificationConfig | undefined\' is not assignable to type \'PushNotificationConfig1\'.\\n Type \'undefined\' is not assignable to type \'PushNotificationConfig1\'.", "2368778428"], + [286, 63, 30, "tsc: Argument of type \'PushNotificationConfig | undefined\' is not assignable to parameter of type \'PushNotificationConfig\'.\\n Type \'undefined\' is not assignable to type \'PushNotificationConfig\'.", "1238494243"], + [389, 38, 34, "tsc: Argument of type \'OAuthFlows | undefined\' is not assignable to parameter of type \'OAuthFlows\'.\\n Type \'undefined\' is not assignable to type \'OAuthFlows\'.", "2386187236"], + [468, 35, 12, "tsc: Argument of type \'TaskStatus | undefined\' is not assignable to parameter of type \'TaskStatus\'.\\n Type \'undefined\' is not assignable to type \'TaskStatus\'.", "3657456819"], + [479, 35, 14, "tsc: Argument of type \'Artifact | undefined\' is not assignable to parameter of type \'Artifact\'.\\n Type \'undefined\' is not assignable to type \'Artifact\'.", "3619116505"], + [491, 8, 6, "tsc: Type \'Message | undefined\' is not assignable to type \'Message | Task | TaskArtifactUpdateEvent | TaskStatusUpdateEvent\'.\\n Type \'undefined\' is not assignable to type \'Message | Task | TaskArtifactUpdateEvent | TaskStatusUpdateEvent\'.", "2123913871"] + ], + "src/types/converters/to_proto.ts:3424105456": [ + [52, 38, 18, "tsc: Argument of type \'AgentProvider | undefined\' is not assignable to parameter of type \'AgentProvider\'.\\n Type \'undefined\' is not assignable to type \'AgentProvider\'.", "1428962279"], + [68, 6, 33, "tsc: Type \'boolean | undefined\' is not assignable to type \'boolean\'.\\n Type \'undefined\' is not assignable to type \'boolean\'.", "212802179"], + [223, 6, 6, "tsc: Type \'undefined\' is not assignable to type \'AgentProvider\'.", "2123913871"], + [233, 6, 9, "tsc: Type \'boolean | undefined\' is not assignable to type \'boolean\'.\\n Type \'undefined\' is not assignable to type \'boolean\'.", "4113723737"], + [234, 6, 17, "tsc: Type \'boolean | undefined\' is not assignable to type \'boolean\'.\\n Type \'undefined\' is not assignable to type \'boolean\'.", "4249068261"], + [263, 58, 31, "tsc: Argument of type \'string | undefined\' is not assignable to parameter of type \'string\'.\\n Type \'undefined\' is not assignable to type \'string\'.", "113348213"], + [303, 6, 8, "tsc: Type \'string | undefined\' is not assignable to type \'string\'.\\n Type \'undefined\' is not assignable to type \'string\'.", "2373810498"], + [309, 6, 6, "tsc: Type \'undefined\' is not assignable to type \'PushNotificationConfig\'.", "2123913871"], + [316, 65, 21, "tsc: Argument of type \'PushNotificationAuthenticationInfo | undefined\' is not assignable to parameter of type \'PushNotificationAuthenticationInfo\'.\\n Type \'undefined\' is not assignable to type \'PushNotificationAuthenticationInfo\'.", "243589825"], + [339, 10, 5, "tsc: Type \'Message | undefined\' is not assignable to type \'Message\'.\\n Type \'undefined\' is not assignable to type \'Message\'.", "189936718"], + [384, 6, 6, "tsc: Type \'boolean | undefined\' is not assignable to type \'boolean\'.\\n Type \'undefined\' is not assignable to type \'boolean\'.", "1326815083"], + [385, 6, 9, "tsc: Type \'boolean | undefined\' is not assignable to type \'boolean\'.\\n Type \'undefined\' is not assignable to type \'boolean\'.", "11251860"], + [389, 64, 19, "tsc: Function lacks ending return statement and return type does not include \'undefined\'.", "2245381585"], + [394, 10, 5, "tsc: Type \'Message | undefined\' is not assignable to type \'Message\'.\\n Type \'undefined\' is not assignable to type \'Message\'.", "189936718"], + [440, 6, 7, "tsc: Type \'(Message | undefined)[]\' is not assignable to type \'Message[]\'.\\n Type \'Message | undefined\' is not assignable to type \'Message\'.\\n Type \'undefined\' is not assignable to type \'Message\'.", "502375463"], + [448, 30, 14, "tsc: Argument of type \'Message2 | undefined\' is not assignable to parameter of type \'Message\'.\\n Type \'undefined\' is not assignable to type \'Message\'.", "3366941076"], + [501, 10, 8, "tsc: Type \'string | undefined\' is not assignable to type \'string\'.\\n Type \'undefined\' is not assignable to type \'string\'.", "3750463409"], + [506, 10, 8, "tsc: Type \'string | undefined\' is not assignable to type \'string\'.\\n Type \'undefined\' is not assignable to type \'string\'.", "3750463409"], + [527, 43, 20, "tsc: Argument of type \'MessageSendConfiguration | undefined\' is not assignable to parameter of type \'MessageSendConfiguration\'.\\n Type \'undefined\' is not assignable to type \'MessageSendConfiguration\'.", "2639404487"], + [534, 6, 6, "tsc: Type \'undefined\' is not assignable to type \'SendMessageConfiguration\'.", "2123913871"], + [538, 6, 8, "tsc: Type \'boolean | undefined\' is not assignable to type \'boolean\'.\\n Type \'undefined\' is not assignable to type \'boolean\'.", "3894148428"], + [540, 55, 36, "tsc: Argument of type \'PushNotificationConfig | undefined\' is not assignable to parameter of type \'PushNotificationConfig\'.\\n Type \'undefined\' is not assignable to type \'PushNotificationConfig\'.", "1308984194"] + ] + }` +}; diff --git a/.betterer.ts b/.betterer.ts new file mode 100644 index 00000000..03354028 --- /dev/null +++ b/.betterer.ts @@ -0,0 +1,8 @@ +import { typescript } from '@betterer/typescript'; + +export default { + 'TypeScript Strict Mode': () => + typescript('./tsconfig.json', { + strict: true, + }).include('./src/**/*.ts', './tck/**/*.ts'), +}; diff --git a/.gemini/settings.json b/.gemini/settings.json index 1921d948..e78de66c 100644 --- a/.gemini/settings.json +++ b/.gemini/settings.json @@ -8,7 +8,7 @@ "run_shell_command(npm run test-build)", "run_shell_command(npm run coverage)", "run_shell_command(npm run lint)", - "run_shell_command(npm run lint:fix)", + "run_shell_command(npm run lint:ci)", "run_shell_command(npm run format:readme)" ] } diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 90b68dce..ef4b33b6 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -26,4 +26,4 @@ jobs: package-lock.json src/samples/package-lock.json - run: npm ci && (cd src/samples && npm ci) - - run: npm run lint + - run: npm run lint:ci diff --git a/AGENTS.md b/AGENTS.md index a2f2ae26..da0681e4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -53,8 +53,8 @@ The project is structured into modular entry points to allow tree-shaking and se | :--- | :--- | | `npm run build` | Builds the SDK using `tsup` into `dist/`. | | `npm test` | Runs unit tests using `vitest`. | -| `npm run lint` | Runs linting checks (ESLint + Prettier). | -| `npm run lint:fix` | Fixes linting issues which can be fixed automatically. | +| `npm run lint` | Runs all linting checks and applies automatic fixes (ESLint + Prettier + betterer). | +| `npm run lint:ci` | Runs all linting checks without applying fixes. Fails if any issues are found. | | `npm run format:readme` | Formats the README file. | ## Samples diff --git a/eslint.config.mjs b/eslint.config.mjs index 93aafa95..c3226943 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -11,7 +11,7 @@ export default defineConfig( tseslint.configs.recommended, eslintPluginPrettier, // Automatically disables eslint formatting rules and enables `prettier` { - ignores: ['dist/', 'node_modules/', 'src/types.ts'], + ignores: ['dist/', 'node_modules/', 'src/types.ts', 'build/'], }, { rules: { diff --git a/package-lock.json b/package-lock.json index 41629be0..2d30cc20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,8 @@ "uuid": "^11.1.0" }, "devDependencies": { + "@betterer/cli": "^6.0.0-alpha.1", + "@betterer/typescript": "^6.0.0-alpha.1", "@bufbuild/buf": "^1.61.0", "@bufbuild/protobuf": "^2.10.2", "@cloudflare/vitest-pool-workers": "^0.12.5", @@ -87,6 +89,28 @@ "url": "https://github.com/sponsors/philsturgeon" } }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "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", @@ -147,6 +171,417 @@ "node": ">=18" } }, + "node_modules/@betterer/betterer": { + "version": "6.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@betterer/betterer/-/betterer-6.0.0-alpha.1.tgz", + "integrity": "sha512-017fvrmljSI8KKCcn34NfuyLkueLtFoAJH/568btXkqfglPOSzhW7ptFIu9dpSkhnBvTi8+maObsLV7TX/gbfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@betterer/constraints": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1", + "@betterer/logger": "^6.0.0-alpha.1", + "@betterer/reporter": "^6.0.0-alpha.1", + "@betterer/time": "^6.0.0-alpha.1", + "@betterer/worker": "^6.0.0-alpha.1", + "chokidar": "^3.6.0", + "core-js": "^3.38.1", + "djb2a": "^2.0.0", + "fast-memoize": "^2.5.2", + "ignore-walk": "^7.0.0", + "lines-and-columns": "^2.0.3", + "minimatch": "^5.0.1", + "prettier": "^3.2.5", + "simple-git": "^3.6.0" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "esbuild": "*" + } + }, + "node_modules/@betterer/betterer/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/@betterer/betterer/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/@betterer/betterer/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": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@betterer/betterer/node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@betterer/betterer/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@betterer/betterer/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": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@betterer/betterer/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/@betterer/cli": { + "version": "6.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@betterer/cli/-/cli-6.0.0-alpha.1.tgz", + "integrity": "sha512-xd4GO2V/1EoBijwv4RPMu4Uxs08hbAqAWTqIen1Tnf5/7jxh9K9dG+x0d/EoVE5GqwseL+4E49n3s2EcTjWiHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1", + "@betterer/logger": "^6.0.0-alpha.1", + "@betterer/render": "^6.0.0-alpha.1", + "@betterer/tasks": "^6.0.0-alpha.1", + "@betterer/worker": "^6.0.0-alpha.1", + "@phenomnomnominal/tsquery": "^6.1.3", + "@phenomnomnominal/tstemplate": "^0.1.0", + "chalk": "^5.3.0", + "commander": "^8.3.0", + "find-up": "^7.0.0", + "prettier": "^3.2.5" + }, + "bin": { + "betterer": "bin/betterer.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@betterer/cli/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@betterer/cli/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@betterer/cli/node_modules/find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@betterer/cli/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@betterer/cli/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@betterer/cli/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@betterer/cli/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@betterer/cli/node_modules/yocto-queue": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz", + "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@betterer/constraints": { + "version": "6.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@betterer/constraints/-/constraints-6.0.0-alpha.1.tgz", + "integrity": "sha512-Kb5koinF4kSHIw1LrjkhUpG7JFxQCNILI9Mi+dDhYQlJSGlcae2TMQt4l86SvXtQeeac0eRM1IIJAzQEE0gMMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/@betterer/errors": { + "version": "6.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@betterer/errors/-/errors-6.0.0-alpha.1.tgz", + "integrity": "sha512-rw1cOeurhsV3qk+Kg0kVTI3aZBg6dkPgTETAjICOc393o6YGcI+9RdO0alGpltzdU1udAVzvV0pvpD4Ci9KYng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/@betterer/logger": { + "version": "6.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@betterer/logger/-/logger-6.0.0-alpha.1.tgz", + "integrity": "sha512-XjGg10tAyX2OH6NNg69weRIQnq8rpM7egzJFCP16qwR4rOytWBLLOoFvhk90oWt+mKvgURlXSML8wvX2L39OwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.3", + "jest-diff": "^27.0.6", + "lines-and-columns": "^2.0.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@betterer/logger/node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@betterer/render": { + "version": "6.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@betterer/render/-/render-6.0.0-alpha.1.tgz", + "integrity": "sha512-h2aUg5AqTweHSU46F7zYZDHjgXLjA7WQS42pCoH4WKw2kQA0w6Diwvz5z/IBSIQCc5An70vkWWwRyxQ3X3Rczw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/@betterer/reporter": { + "version": "6.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@betterer/reporter/-/reporter-6.0.0-alpha.1.tgz", + "integrity": "sha512-7Ia8uPdaQEcXdPSiEqwiq9pSG+8VZz65DnmCUs+Q69JSQT/fhOYVuQ2UTe7e6224TaP9y3JCEetyhIW0T6Mv5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1", + "@betterer/logger": "^6.0.0-alpha.1", + "@betterer/render": "^6.0.0-alpha.1", + "@betterer/tasks": "^6.0.0-alpha.1", + "@betterer/time": "^6.0.0-alpha.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@betterer/tasks": { + "version": "6.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@betterer/tasks/-/tasks-6.0.0-alpha.1.tgz", + "integrity": "sha512-knOf9Hx+LorFAjMFXI/3jP2pL95Lva3/oLRvrmtF0DuoMSa85ROmDiQAL5wtU2yymFyKTXcXAXgSMV/+vwQasg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@betterer/errors": "^6.0.0-alpha.1", + "@betterer/logger": "^6.0.0-alpha.1", + "@betterer/render": "^6.0.0-alpha.1", + "@betterer/time": "^6.0.0-alpha.1", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@betterer/tasks/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@betterer/time": { + "version": "6.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@betterer/time/-/time-6.0.0-alpha.1.tgz", + "integrity": "sha512-dTybsdBM5smUPAajZ/5AV+H3HDSqjJTosq81ruRQV9DRvkvHgVBn8KMe6ZG0STWQLw8hcdrLfT6fg0AmQpjJlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "node_modules/@betterer/typescript": { + "version": "6.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@betterer/typescript/-/typescript-6.0.0-alpha.1.tgz", + "integrity": "sha512-ryHQFXXHNlfrOFV8DgakKOOMRqDOrGIQx5v0ucAAAVb/fOMeNFev2AMsLVTjc1n5GbncAcHTMiTzAgN9rk2SBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/@betterer/worker": { + "version": "6.0.0-alpha.1", + "resolved": "https://registry.npmjs.org/@betterer/worker/-/worker-6.0.0-alpha.1.tgz", + "integrity": "sha512-JUASLtYzUPdFmm1nSq+ABoVvxUJsU9IhNVY3g8RHM1ZhYs3YTx7IczjqYHc0SjKkqz/S2ejMBrrXyWdFBmv/0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@betterer/errors": "^6.0.0-alpha.1", + "callsite": "^1.0.0", + "comlink": "^4.4.1" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/@bufbuild/buf": { "version": "1.61.0", "resolved": "https://registry.npmjs.org/@bufbuild/buf/-/buf-1.61.0.tgz", @@ -2278,6 +2713,23 @@ "dev": true, "license": "MIT" }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", + "dev": true, + "license": "MIT" + }, "node_modules/@noble/hashes": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", @@ -2301,6 +2753,27 @@ "@noble/hashes": "^1.1.5" } }, + "node_modules/@phenomnomnominal/tsquery": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-6.1.4.tgz", + "integrity": "sha512-3tHlGy/fxjJCHqIV8nelAzbRTNkCUY+k7lqBGKNuQz99H2OKGRt6oU+U2SZs6LYrbOe8mxMFl6kq6gzHapFRkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/esquery": "^1.5.0", + "esquery": "^1.5.0" + }, + "peerDependencies": { + "typescript": "^3 || ^4 || ^5" + } + }, + "node_modules/@phenomnomnominal/tstemplate": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@phenomnomnominal/tstemplate/-/tstemplate-0.1.0.tgz", + "integrity": "sha512-/v+GIVNFHAz4+nQtgy9e5ZAXK3xj6TbP5s9JTpnFuqkcLB+gB2lJ6x/nsDhkKhzR6o4REuzhsYoWYnXqKC/UnQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -2815,6 +3288,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/esquery": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/esquery/-/esquery-1.5.4.tgz", + "integrity": "sha512-yYO4Q8H+KJHKW1rEeSzHxcZi90durqYgWVfnh5K6ZADVBjBv2e1NEveYX5yT2bffgN7RqzH3k9930m+i2yBoMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -3436,6 +3919,33 @@ "dev": true, "license": "MIT" }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/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": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -3486,6 +3996,19 @@ "dev": true, "license": "MIT" }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/blake3-wasm": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz", @@ -3529,6 +4052,19 @@ "concat-map": "0.0.1" } }, + "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": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/bundle-require": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", @@ -3596,6 +4132,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -3721,6 +4266,13 @@ "node": ">= 0.8" } }, + "node_modules/comlink": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", + "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", @@ -3816,6 +4368,18 @@ "dev": true, "license": "MIT" }, + "node_modules/core-js": { + "version": "3.48.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.48.0.tgz", + "integrity": "sha512-zpEHTy1fjTMZCKLHUZoVeylt9XrzaIN2rbPXEt0k+q7JE5CkCZdo6bNq55bn24a69CH7ErAVLKijxJja4fw+UQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -3907,6 +4471,29 @@ "wrappy": "1" } }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/djb2a": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/djb2a/-/djb2a-2.0.0.tgz", + "integrity": "sha512-mSkCTNSJRGjNUADzWx1ubTGxJh2IVY9uoc/WGozUIu0mgBUEvIyBn9uTs9jqFBbJxQthJMF3uDx0cnpdlAUo4Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -4394,6 +4981,13 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==", + "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", @@ -4432,6 +5026,19 @@ "node": ">=16.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/finalhandler": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", @@ -4845,6 +5452,45 @@ "node": ">= 4" } }, + "node_modules/ignore-walk": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", + "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/ignore-walk/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/ignore-walk/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/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -4889,6 +5535,19 @@ "node": ">= 0.10" } }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4922,6 +5581,16 @@ "node": ">=0.10.0" } }, + "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": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", @@ -5006,6 +5675,32 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/joycon": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", @@ -5440,6 +6135,16 @@ "node": ">= 0.6" } }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5791,6 +6496,34 @@ "node": ">=6.0.0" } }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/protobufjs": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", @@ -5882,6 +6615,13 @@ "node": ">= 0.10" } }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" + }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", @@ -6210,6 +6950,22 @@ "dev": true, "license": "ISC" }, + "node_modules/simple-git": { + "version": "3.30.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.30.0.tgz", + "integrity": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, "node_modules/source-map": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", @@ -6571,6 +7327,19 @@ "node": ">=14.0.0" } }, + "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": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -6802,6 +7571,19 @@ "pathe": "^2.0.3" } }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/package.json b/package.json index b56c6239..9b411d62 100644 --- a/package.json +++ b/package.json @@ -70,6 +70,8 @@ "README.md" ], "devDependencies": { + "@betterer/cli": "^6.0.0-alpha.1", + "@betterer/typescript": "^6.0.0-alpha.1", "@bufbuild/buf": "^1.61.0", "@bufbuild/protobuf": "^2.10.2", "@cloudflare/vitest-pool-workers": "^0.12.5", @@ -97,9 +99,9 @@ "build": "tsup", "test": "vitest run", "test:edge": "vitest run --config vitest.edge.config.ts", - "lint": "tsc --noEmit && npx eslint .", + "lint": "tsc --noEmit && npx eslint . --fix && betterer precommit", + "lint:ci": "tsc --noEmit && npx eslint . && betterer ci", "format:readme": "prettier --write ./README.md", - "lint:fix": "npx eslint . --fix", "coverage": "vitest run --coverage", "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": "esbuild ./dist/client/index.js ./dist/server/index.js ./dist/index.js --bundle --platform=neutral --outdir=dist/tmp-checks --outbase=./dist" From 95543f88e980ac6cd8531dd322987b339fa48a5f Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Fri, 13 Feb 2026 09:15:47 +0100 Subject: [PATCH 20/51] refactor: strict mode fixes (#331) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mainly to test Betterer workflow. ``` 🎉 Betterer (5,538ms): 1 test done! ✅ TypeScript Strict Mode: "TypeScript Strict Mode" got better! (3 fixed issues, 58 remaining) 😍 ・ 1 fixed issue in "src/client/factory.ts". ・ 1 fixed issue in "src/server/events/execution_event_queue.ts". ・ 1 fixed, 1 existing issues in "src/server/express/rest_handler.ts". ``` Re #182 --- .betterer.results | 9 +-------- src/client/factory.ts | 17 +++++++---------- src/server/events/execution_event_queue.ts | 1 - src/server/express/rest_handler.ts | 4 ++-- 4 files changed, 10 insertions(+), 21 deletions(-) diff --git a/.betterer.results b/.betterer.results index 85925986..7586638d 100644 --- a/.betterer.results +++ b/.betterer.results @@ -9,9 +9,6 @@ exports[`TypeScript Strict Mode`] = { [444, 45, 6, "tsc: Argument of type \'TParams | undefined\' is not assignable to parameter of type \'TParams\'.\\n \'TParams | undefined\' is assignable to the constraint of type \'TParams\', but \'TParams\' could be instantiated with a different subtype of constraint \'JsonRpcParams\'.\\n Type \'undefined\' is not assignable to type \'TParams\'.\\n \'undefined\' is assignable to the constraint of type \'TParams\', but \'TParams\' could be instantiated with a different subtype of constraint \'JsonRpcParams\'.", "1898504825"], [474, 4, 6, "tsc: Type \'undefined\' is not assignable to type \'JSONRPCErrorResponse\'.", "2123913871"] ], - "src/client/factory.ts:3559992563": [ - [119, 29, 37, "tsc: Argument of type \'string | undefined\' is not assignable to parameter of type \'string\'.\\n Type \'undefined\' is not assignable to type \'string\'.", "176554761"] - ], "src/client/multitransport-client.ts:1457951880": [ [82, 24, 44, "tsc: Type \'Promise\' is not assignable to type \'Promise\'.\\n Type \'AgentCard\' is not assignable to type \'never\'.", "1356744557"], [101, 6, 47, "tsc: Argument of type \'(params: MessageSendParams, options?: RequestOptions | undefined) => Promise\' is not assignable to parameter of type \'(params: MessageSendParams, options?: RequestOptions | undefined) => Promise\'.\\n Type \'Promise\' is not assignable to type \'Promise\'.\\n Type \'SendMessageResult\' is not assignable to type \'never\'.\\n Type \'Message\' is not assignable to type \'never\'.", "2571452626"], @@ -30,11 +27,7 @@ exports[`TypeScript Strict Mode`] = { [248, 15, 4, "tsc: Expected 2 arguments, but got 1.", "2087764327"], [271, 15, 4, "tsc: Expected 2 arguments, but got 1.", "2087764327"] ], - "src/server/events/execution_event_queue.ts:132062659": [ - [12, 10, 16, "tsc: Property \'boundHandleEvent\' has no initializer and is not definitely assigned in the constructor.", "1937789361"] - ], - "src/server/express/rest_handler.ts:684800976": [ - [154, 35, 4, "tsc: Argument of type \'T | undefined\' is not assignable to parameter of type \'T\'.\\n \'T\' could be instantiated with an arbitrary type which could be unrelated to \'T | undefined\'.", "2087730517"], + "src/server/express/rest_handler.ts:2741309436": [ [204, 50, 17, "tsc: Argument of type \'unknown\' is not assignable to parameter of type \'Message | Task | TaskArtifactUpdateEvent | TaskStatusUpdateEvent\'.", "3749434707"] ], "src/server/request_handler/default_request_handler.ts:1208203039": [ diff --git a/src/client/factory.ts b/src/client/factory.ts index 61b5f736..b3c3edc4 100644 --- a/src/client/factory.ts +++ b/src/client/factory.ts @@ -109,18 +109,15 @@ export class ClientFactory { ...additionalInterfaces.map((i) => i.transport), ]; for (const transport of transportsByPreference) { - if (!urlsPerAgentTransports.has(transport)) { - continue; - } + const url = urlsPerAgentTransports.get(transport); const factory = this.transportsByName.get(transport); - if (!factory) { - continue; + if (factory && url) { + return new Client( + await factory.create(url, agentCard), + agentCard, + this.options.clientConfig + ); } - return new Client( - await factory.create(urlsPerAgentTransports.get(transport), agentCard), - agentCard, - this.options.clientConfig - ); } throw new Error( 'No compatible transport found, available transports: ' + diff --git a/src/server/events/execution_event_queue.ts b/src/server/events/execution_event_queue.ts index 7e78136a..8f39928d 100644 --- a/src/server/events/execution_event_queue.ts +++ b/src/server/events/execution_event_queue.ts @@ -10,7 +10,6 @@ export class ExecutionEventQueue { private eventQueue: AgentExecutionEvent[] = []; private resolvePromise?: (value: void | PromiseLike) => void; private stopped: boolean = false; - private boundHandleEvent: (event: AgentExecutionEvent) => void; constructor(eventBus: ExecutionEventBus) { this.eventBus = eventBus; diff --git a/src/server/express/rest_handler.ts b/src/server/express/rest_handler.ts index 67b3ef72..0e5c675e 100644 --- a/src/server/express/rest_handler.ts +++ b/src/server/express/rest_handler.ts @@ -149,8 +149,8 @@ export function restHandler(options: RestHandlerOptions): RequestHandler { if (statusCode === HTTP_STATUS.NO_CONTENT) { res.end(); } else { - if (!responseType) { - throw new Error('Bug: toJson serializer must be provided for non-204 responses.'); + if (!responseType || body === undefined) { + throw new Error('Bug: toJson serializer and body must be provided for non-204 responses.'); } res.json(responseType.toJSON(body)); } From 1140122adff746e848f670cfbc5474e497f8a179 Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Fri, 13 Feb 2026 09:50:04 +0100 Subject: [PATCH 21/51] ci: fix lint.yml syntax (#332) Was broken in #329 accidentially. image i.e. https://github.com/a2aproject/a2a-js/actions/runs/21979649269 --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index ef4b33b6..ace6db5a 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -26,4 +26,4 @@ jobs: package-lock.json src/samples/package-lock.json - run: npm ci && (cd src/samples && npm ci) - - run: npm run lint:ci + - run: npm run lint:ci From d9ae6919808ea980f78643c753f5b26b33c52b9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 13 Feb 2026 09:53:09 +0100 Subject: [PATCH 22/51] chore(deps-dev): bump qs from 6.14.1 to 6.14.2 in /src/samples (#333) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [qs](https://github.com/ljharb/qs) from 6.14.1 to 6.14.2.
Changelog

Sourced from qs's changelog.

6.14.2

  • [Fix] parse: mark overflow objects for indexed notation exceeding arrayLimit (#546)
  • [Fix] arrayLimit means max count, not max index, in combine/merge/parseArrayValue
  • [Fix] parse: throw on arrayLimit exceeded with indexed notation when throwOnLimitExceeded is true (#529)
  • [Fix] parse: enforce arrayLimit on comma-parsed values
  • [Fix] parse: fix error message to reflect arrayLimit as max index; remove extraneous comments (#545)
  • [Robustness] avoid .push, use void
  • [readme] document that addQueryPrefix does not add ? to empty output (#418)
  • [readme] clarify parseArrays and arrayLimit documentation (#543)
  • [readme] replace runkit CI badge with shields.io check-runs badge
  • [meta] fix changelog typo (arrayLengtharrayLimit)
  • [actions] fix rebase workflow permissions
Commits
  • bdcf0c7 v6.14.2
  • 294db90 [readme] document that addQueryPrefix does not add ? to empty output
  • 5c308e5 [readme] clarify parseArrays and arrayLimit documentation
  • 6addf8c [Fix] parse: mark overflow objects for indexed notation exceeding arrayLimit
  • cfc108f [Fix] arrayLimit means max count, not max index, in combine/merge/`pars...
  • febb644 [Fix] parse: throw on arrayLimit exceeded with indexed notation when `thr...
  • f6a7abf [Fix] parse: enforce arrayLimit on comma-parsed values
  • fbc5206 [Fix] parse: fix error message to reflect arrayLimit as max index; remove e...
  • 1b9a8b4 [actions] fix rebase workflow permissions
  • 2a35775 [meta] fix changelog typo (arrayLengtharrayLimit)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=qs&package-manager=npm_and_yarn&previous-version=6.14.1&new-version=6.14.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/samples/package-lock.json | 446 +++++++++++++++++++++++++++++++++- 1 file changed, 443 insertions(+), 3 deletions(-) diff --git a/src/samples/package-lock.json b/src/samples/package-lock.json index 0c9ee38e..2e77a78f 100644 --- a/src/samples/package-lock.json +++ b/src/samples/package-lock.json @@ -52,6 +52,278 @@ "kuler": "^2.0.0" } }, + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "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" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@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/@esbuild/linux-x64": { "version": "0.25.12", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", @@ -69,6 +341,159 @@ "node": ">=18" } }, + "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/@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/@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/@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/@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/@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/@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/@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/@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/@fastify/busboy": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.2.0.tgz", @@ -4595,6 +5020,21 @@ "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", @@ -6349,9 +6789,9 @@ } }, "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { From 3f625b49324f971cd576e3bc056c98cd892a97e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Feb 2026 08:05:38 +0100 Subject: [PATCH 23/51] chore(deps): bump fast-xml-parser and @google-cloud/storage in /src/samples (#334) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) and [@google-cloud/storage](https://github.com/googleapis/nodejs-storage). These dependencies needed to be updated together. Updates `fast-xml-parser` from 4.5.3 to 5.3.6
Release notes

Sourced from fast-xml-parser's releases.

Entity security and performance

  • Improve security and performance of entity processing
    • new options maxEntitySize, maxExpansionDepth, maxTotalExpansions, maxExpandedLength, allowedTags,tagFilter
    • fast return when no edtity is present
    • improvement replacement logic to reduce number of calls

Full Changelog: https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.5...v5.3.6

v5.3.5

What's Changed

New Contributors

Full Changelog: https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.4...v5.3.5

fix: handle HTML numeric and hex entities when out of range

No release notes provided.

bug fix and performance improvements

  • fix #775: transformTagName with allowBooleanAttributes adds an unnecessary attribute
  • Performance improvement for stopNodes (By Maciek Lamberski)

Replace Buffer with Uint8Array

  • Launched Separate CLI module
  • Replace Buffer with Uint8Array

Support EMPTY and ANY with ELEMENT in DOCTYPE

Full Changelog: https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.2.4...v5.2.4

upgrade to ESM module and fixing value parsing issues

  • Support ESM modules
  • fix value parsing issues
  • a feature to access tag location is added (metadata)
  • fix to read DOCTYPE correctly

Full Changelog: https://github.com/NaturalIntelligence/fast-xml-parser/blob/master/CHANGELOG.md

Summary update on all the previous releases from v4.2.4

  • Multiple minor fixes provided in the validator and parser
  • v6 is added for experimental use.
  • ignoreAttributes support function, and array of string or regex
  • Add support for parsing HTML numeric entities
  • v5 of the application is ESM module now. However, JS is also supported

... (truncated)

Changelog

Sourced from fast-xml-parser's changelog.

Note: If you find missing information about particular minor version, that version must have been changed without any functional change in this library.

5.3.6 / 2026-02-14

  • Improve security and performance of entity processing
    • new options maxEntitySize, maxExpansionDepth, maxTotalExpansions, maxExpandedLength, allowedTags,tagFilter
    • fast return when no edtity is present
    • improvement replacement logic to reduce number of calls

5.3.5 / 2026-02-08

  • fix: Escape regex char in entity name
  • update strnum to 2.1.2
  • add missing exports in CJS typings

5.3.4 / 2026-01-30

  • fix: handle HTML numeric and hex entities when out of range

5.3.3 / 2025-12-12

  • fix #775: transformTagName with allowBooleanAttributes adds an unnecessary attribute

5.3.2 / 2025-11-14

  • fix for import statement for v6

5.3.1 / 2025-11-03

5.3.0 / 2025-10-03

  • Use Uint8Array in place of Buffer in Parser

5.2.5 / 2025-06-08

  • Inform user to use fxp-cli instead of in-built CLI feature
  • Export typings for direct use

5.2.4 / 2025-06-06

  • fix (#747): fix EMPTY and ANY with ELEMENT in DOCTYPE

5.2.3 / 2025-05-11

  • fix (#747): support EMPTY and ANY with ELEMENT in DOCTYPE

5.2.2 / 2025-05-05

  • fix (#746): update strnum to fix parsing issues related to enotations

5.2.1 / 2025-04-22

  • fix: read DOCTYPE entity value correctly
  • read DOCTYPE NOTATION, ELEMENT exp but not using read values

5.2.0 / 2025-04-03

... (truncated)

Commits

Updates `@google-cloud/storage` from 7.17.3 to 7.19.0
Release notes

Sourced from @​google-cloud/storage's releases.

v7.19.0

7.19.0 (2026-02-05)

Features

  • Enable full object checksum validation on JSON path (#2687) (08a8962)

Bug Fixes

  • deps: Update dependency fast-xml-parser to v5 [security] (#2713) (420935a)

v7.18.0

7.18.0 (2025-11-28)

Features

  • listBuckets: Add support for returning partial success (#2678) (c7004da)
Changelog

Sourced from @​google-cloud/storage's changelog.

7.19.0 (2026-02-05)

Features

  • Enable full object checksum validation on JSON path (#2687) (08a8962)

Bug Fixes

  • deps: Update dependency fast-xml-parser to v5 [security] (#2713) (420935a)

7.18.0 (2025-11-28)

Features

  • listBuckets: Add support for returning partial success (#2678) (c7004da)
Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/samples/package-lock.json | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/samples/package-lock.json b/src/samples/package-lock.json index 2e77a78f..cd7d6bf4 100644 --- a/src/samples/package-lock.json +++ b/src/samples/package-lock.json @@ -1648,9 +1648,9 @@ } }, "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==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-7.19.0.tgz", + "integrity": "sha512-n2FjE7NAOYyshogdc7KQOl/VZb4sneqPjWouSyia9CMDdMhRX5+RIbqalNmC7LOLzuLAN89VlF2HvG8na9G+zQ==", "dev": true, "license": "Apache-2.0", "optional": true, @@ -1662,7 +1662,7 @@ "abort-controller": "^3.0.0", "async-retry": "^1.3.3", "duplexify": "^4.1.3", - "fast-xml-parser": "^4.4.1", + "fast-xml-parser": "^5.3.4", "gaxios": "^6.0.2", "google-auth-library": "^9.6.3", "html-entities": "^2.5.2", @@ -4750,9 +4750,9 @@ "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==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.6.tgz", + "integrity": "sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==", "dev": true, "funding": [ { @@ -4764,7 +4764,7 @@ "optional": true, "peer": true, "dependencies": { - "strnum": "^1.1.1" + "strnum": "^2.1.2" }, "bin": { "fxparser": "src/cli/cli.js" @@ -7306,9 +7306,9 @@ } }, "node_modules/strnum": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", + "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", "dev": true, "funding": [ { From d4c261a4aad1b041965d2efe199e45942819d03a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Feb 2026 08:38:19 +0100 Subject: [PATCH 24/51] chore(deps): bump qs from 6.14.1 to 6.15.0 (#335) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [qs](https://github.com/ljharb/qs) from 6.14.1 to 6.15.0.
Changelog

Sourced from qs's changelog.

6.15.0

  • [New] parse: add strictMerge option to wrap object/primitive conflicts in an array (#425, #122)
  • [Fix] duplicates option should not apply to bracket notation keys (#514)

6.14.2

  • [Fix] parse: mark overflow objects for indexed notation exceeding arrayLimit (#546)
  • [Fix] arrayLimit means max count, not max index, in combine/merge/parseArrayValue
  • [Fix] parse: throw on arrayLimit exceeded with indexed notation when throwOnLimitExceeded is true (#529)
  • [Fix] parse: enforce arrayLimit on comma-parsed values
  • [Fix] parse: fix error message to reflect arrayLimit as max index; remove extraneous comments (#545)
  • [Robustness] avoid .push, use void
  • [readme] document that addQueryPrefix does not add ? to empty output (#418)
  • [readme] clarify parseArrays and arrayLimit documentation (#543)
  • [readme] replace runkit CI badge with shields.io check-runs badge
  • [meta] fix changelog typo (arrayLengtharrayLimit)
  • [actions] fix rebase workflow permissions
Commits
  • d9b4c66 v6.15.0
  • cb41a54 [New] parse: add strictMerge option to wrap object/primitive conflicts in...
  • 88e1563 [Fix] duplicates option should not apply to bracket notation keys
  • 9d441d2 Merge backport release tags v6.0.6–v6.13.3 into main
  • 85cc8ca v6.12.5
  • ffc12aa v6.11.4
  • 0506b11 [actions] update reusable workflows
  • 6a37faf [actions] update reusable workflows
  • 8e8df5a [Fix] fix regressions from robustness refactor
  • d60bab3 v6.10.7
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=qs&package-manager=npm_and_yarn&previous-version=6.14.1&new-version=6.15.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2d30cc20..4365b61c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6574,9 +6574,9 @@ } }, "node_modules/qs": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", - "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", + "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { From b3ad0cbc637377e829a7020f0918ede24f1c1252 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2026 10:11:16 +0100 Subject: [PATCH 25/51] chore(deps): bump minimatch (#342) Bumps and [minimatch](https://github.com/isaacs/minimatch). These dependencies needed to be updated together. Updates `minimatch` from 9.0.5 to 9.0.9
Commits

Updates `minimatch` from 5.1.6 to 5.1.9
Commits

Updates `minimatch` from 3.1.2 to 3.1.5
Commits

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4365b61c..1aec8009 100644 --- a/package-lock.json +++ b/package-lock.json @@ -260,9 +260,9 @@ } }, "node_modules/@betterer/betterer/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "license": "ISC", "dependencies": { @@ -3626,13 +3626,13 @@ } }, "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==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -5476,13 +5476,13 @@ } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -6035,9 +6035,9 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -7228,13 +7228,13 @@ } }, "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==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" From 7f9907496c17a421ea6be4f32e6a82247a4cd2bc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2026 10:15:16 +0100 Subject: [PATCH 26/51] chore(deps-dev): bump fast-xml-parser from 5.3.6 to 5.4.1 in /src/samples (#341) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 5.3.6 to 5.4.1.
Release notes

Sourced from fast-xml-parser's releases.

Separate Builder

XML Builder was the part of fast-xml-parser for years. But considering that any bug in builder may false-alarm the users who are only using parser and vice-versa, we have decided to split it into a separate package.

Migration

To migrate to fast-xml-builder;

From

import { XMLBuilder } from
"fast-xml-parser";

To

import XMLBuilder from
"fast-xml-builder";

XMLBuilder will be removed from current package in any next major version of this library. So better to migrate.

support strictReservedNames

Full Changelog: https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.9...v5.3.9

handle non-array input for XML builder && support maxNestedTags

CJS typing fix

What's Changed

New Contributors

Full Changelog: https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.3.6...v5.3.7

Changelog

Sourced from fast-xml-parser's changelog.

Note: If you find missing information about particular minor version, that version must have been changed without any functional change in this library.

Note: Due to some last quick changes on v4, detail of v4.5.3 & v4.5.4 are not updated here. v4.5.4x is the last tag of v4 in github repository. I'm extremely sorry for the confusion

5.4.1 / 2026-02-25

  • fix (#785) unpairedTag node should not have tag content

5.4.0 / 2026-02-25

  • migrate to fast-xml-builder

5.3.9 / 2026-02-25

  • support strictReservedNames

5.3.8 / 2026-02-25

  • support maxNestedTags
  • handle non-array input for XML builder when preserveOrder is true (By Angelo Coetzee)
  • save use of js properies

5.3.7 / 2026-02-20

5.3.6 / 2026-02-14

  • Improve security and performance of entity processing
    • new options maxEntitySize, maxExpansionDepth, maxTotalExpansions, maxExpandedLength, allowedTags,tagFilter
    • fast return when no edtity is present
    • improvement replacement logic to reduce number of calls

5.3.5 / 2026-02-08

  • fix: Escape regex char in entity name
  • update strnum to 2.1.2
  • add missing exports in CJS typings

5.3.4 / 2026-01-30

  • fix: handle HTML numeric and hex entities when out of range

5.3.3 / 2025-12-12

  • fix #775: transformTagName with allowBooleanAttributes adds an unnecessary attribute

5.3.2 / 2025-11-14

  • fix for import statement for v6

5.3.1 / 2025-11-03

5.3.0 / 2025-10-03

... (truncated)

Commits
  • 4e7ca80 update release info
  • 36023b4 fix (#785) unpairedTag node should not have tag content
  • b366026 separate builder
  • 6f333a8 update release info
  • c3ffbab support strictReservedNames
  • c692040 update release info
  • 107e34c avoid {} to create an empty object
  • 60835a4 support maxNestedTags
  • f55657c avoid direct call to hasOwnProperty
  • c13a961 handle non-array input for XML builder when preserveOrder is true
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=fast-xml-parser&package-manager=npm_and_yarn&previous-version=5.3.6&new-version=5.4.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/samples/package-lock.json | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/samples/package-lock.json b/src/samples/package-lock.json index cd7d6bf4..3fe10391 100644 --- a/src/samples/package-lock.json +++ b/src/samples/package-lock.json @@ -4749,10 +4749,25 @@ ], "license": "BSD-3-Clause" }, + "node_modules/fast-xml-builder": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.0.0.tgz", + "integrity": "sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/fast-xml-parser": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.6.tgz", - "integrity": "sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz", + "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", "dev": true, "funding": [ { @@ -4764,6 +4779,7 @@ "optional": true, "peer": true, "dependencies": { + "fast-xml-builder": "^1.0.0", "strnum": "^2.1.2" }, "bin": { From 867b4720471a2659ab4fe8e4c4942297604cb1a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2026 12:31:01 +0100 Subject: [PATCH 27/51] chore(deps): bump rollup from 4.53.5 to 4.59.0 (#340) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [rollup](https://github.com/rollup/rollup) from 4.53.5 to 4.59.0.
Release notes

Sourced from rollup's releases.

v4.59.0

4.59.0

2026-02-22

Features

  • Throw when the generated bundle contains paths that would leave the output directory (#6276)

Pull Requests

v4.58.0

4.58.0

2026-02-20

Features

  • Also support __NO_SIDE_EFFECTS__ annotation before variable declarations declaring function expressions (#6272)

Pull Requests

v4.57.1

4.57.1

2026-01-30

Bug Fixes

  • Fix heap corruption issue in Windows (#6251)
  • Ensure exports of a dynamic import are fully included when called from a try...catch (#6254)

Pull Requests

... (truncated)

Changelog

Sourced from rollup's changelog.

4.59.0

2026-02-22

Features

  • Throw when the generated bundle contains paths that would leave the output directory (#6276)

Pull Requests

4.58.0

2026-02-20

Features

  • Also support __NO_SIDE_EFFECTS__ annotation before variable declarations declaring function expressions (#6272)

Pull Requests

4.57.1

2026-01-30

Bug Fixes

  • Fix heap corruption issue in Windows (#6251)
  • Ensure exports of a dynamic import are fully included when called from a try...catch (#6254)

Pull Requests

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=rollup&package-manager=npm_and_yarn&previous-version=4.53.5&new-version=4.59.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ivan Shymko --- package-lock.json | 227 +++++++++++++++++++++++++++------------------- 1 file changed, 136 insertions(+), 91 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1aec8009..5437fcf7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2915,9 +2915,9 @@ "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", - "integrity": "sha512-iDGS/h7D8t7tvZ1t6+WPK04KD0MwzLZrG0se1hzBjSi5fyxlsiggoJHwh18PCFNn7tG43OWb6pdZ6Y+rMlmyNQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "cpu": [ "arm" ], @@ -2929,9 +2929,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.53.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.53.5.tgz", - "integrity": "sha512-wrSAViWvZHBMMlWk6EJhvg8/rjxzyEhEdgfMMjREHEq11EtJ6IP6yfcCH57YAEca2Oe3FNCE9DSTgU70EIGmVw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "cpu": [ "arm64" ], @@ -2943,9 +2943,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ "arm64" ], @@ -2957,9 +2957,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "cpu": [ "x64" ], @@ -2971,9 +2971,9 @@ ] }, "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "cpu": [ "arm64" ], @@ -2985,9 +2985,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "cpu": [ "x64" ], @@ -2999,9 +2999,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "cpu": [ "arm" ], @@ -3013,9 +3013,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "cpu": [ "arm" ], @@ -3027,9 +3027,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], @@ -3041,9 +3041,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], @@ -3055,9 +3055,23 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "cpu": [ "loong64" ], @@ -3069,9 +3083,23 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "cpu": [ "ppc64" ], @@ -3083,9 +3111,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "cpu": [ "riscv64" ], @@ -3097,9 +3125,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "cpu": [ "riscv64" ], @@ -3111,9 +3139,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "cpu": [ "s390x" ], @@ -3125,9 +3153,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "cpu": [ "x64" ], @@ -3139,9 +3167,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ "x64" ], @@ -3152,10 +3180,24 @@ "linux" ] }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.53.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.53.5.tgz", - "integrity": "sha512-3DFiLPnTxiOQV993fMc+KO8zXHTcIjgaInrqlG8zDp1TlhYl6WgrOHuJkJQ6M8zHEcntSJsUp1XFZSY8C1DYbg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", "cpu": [ "arm64" ], @@ -3167,9 +3209,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ "arm64" ], @@ -3181,9 +3223,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ "ia32" ], @@ -3195,9 +3237,9 @@ ] }, "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", "cpu": [ "x64" ], @@ -3209,9 +3251,9 @@ ] }, "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==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ "x64" ], @@ -6667,9 +6709,9 @@ } }, "node_modules/rollup": { - "version": "4.53.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.53.5.tgz", - "integrity": "sha512-iTNAbFSlRpcHeeWu73ywU/8KuU/LZmNCSxp6fjQkJBD3ivUb8tpDrXhIxEzA05HlYMEwmtaUnb3RP+YNv162OQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dev": true, "license": "MIT", "dependencies": { @@ -6683,28 +6725,31 @@ "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", + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" } }, From 0338ed38ed661a9bc0ce091c2e766639d0393425 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Mar 2026 17:29:57 +0100 Subject: [PATCH 28/51] chore(deps): bump minimatch from 9.0.5 to 9.0.8 in /src/samples (#339) Bumps [minimatch](https://github.com/isaacs/minimatch) from 9.0.5 to 9.0.8.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=minimatch&package-manager=npm_and_yarn&previous-version=9.0.5&new-version=9.0.8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ivan Shymko --- src/samples/package-lock.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/samples/package-lock.json b/src/samples/package-lock.json index 3fe10391..818d4aa1 100644 --- a/src/samples/package-lock.json +++ b/src/samples/package-lock.json @@ -6301,12 +6301,12 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" From 98293b899a89c6f94550617efd6eabd35481ed90 Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Mon, 9 Mar 2026 17:37:39 +0100 Subject: [PATCH 29/51] docs: allow specifying transport preferences in samples CLI (#345) Now one can do `--transport=` to specify `JSONRPC`, `HTTP+JSON` or `GRPC` (constants as in the A2A spec). --- src/samples/cli.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/samples/cli.ts b/src/samples/cli.ts index 40f24642..0f276b9c 100644 --- a/src/samples/cli.ts +++ b/src/samples/cli.ts @@ -82,7 +82,13 @@ export class ADCHandler implements AuthenticationHandler { // --- State --- let currentTaskId: string | undefined = undefined; // Initialize as undefined let currentContextId: string | undefined = undefined; // Initialize as undefined -const serverUrl = process.argv[2] || 'http://localhost:41241'; // Agent's base URL + +const preferredTransport = process.argv + .find((arg) => arg.startsWith('--transport=')) + ?.split('=')[1]; +const serverUrlArg = process.argv.slice(2).find((arg) => !arg.startsWith('--')); +const serverUrl = serverUrlArg || 'http://localhost:41241'; // Agent's base URL + let fetchImpl: typeof fetch = fetch; let agentCardPath = AGENT_CARD_PATH; if (process.argv.includes('--agent-engine')) { @@ -97,6 +103,7 @@ const factory = new ClientFactory( new RestTransportFactory({ fetchImpl }), new GrpcTransportFactory(), ], + preferredTransports: preferredTransport ? [preferredTransport] : undefined, }) ); const client = await factory.createFromUrl(serverUrl, agentCardPath); From e71221cbc87b54acd96fbb4e7a46439a33ccbed6 Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Tue, 10 Mar 2026 09:50:20 +0100 Subject: [PATCH 30/51] fix: support proto-based AgentCard in AgentCardResolver (#344) ## Description Fixes an issue where the SDK fails to resolve Agent Cards served in Protobuf JSON format. In the v0.3.0 specification, there was a structural drift between the JSON Schema data model and the Protobuf data model: - **JSON Schema:** Uses a `"type"` discriminator (e.g., `{"type": "openIdConnect"}`). [Source](https://github.com/a2aproject/A2A/blob/8d57eba286de756176892518a8fc39b0ac2ccefb/specification/json/a2a.json#L1757-L1782) - **Protobuf:** Uses the `oneof` field name as the discriminator (e.g., `{"oauth2SecurityScheme": {...}}`). [Source](https://github.com/a2aproject/A2A/blob/8d57eba286de756176892518a8fc39b0ac2ccefb/specification/grpc/a2a.proto#L502-L510) --- src/client/card-resolver.ts | 65 ++++++++++++++- test/client/card-resolver.spec.ts | 131 ++++++++++++++++++++++++++++++ 2 files changed, 195 insertions(+), 1 deletion(-) diff --git a/src/client/card-resolver.ts b/src/client/card-resolver.ts index a3fb7c74..932a04a1 100644 --- a/src/client/card-resolver.ts +++ b/src/client/card-resolver.ts @@ -1,5 +1,7 @@ import { AGENT_CARD_PATH } from '../constants.js'; import { AgentCard } from '../types.js'; +import { AgentCard as PBAgentCard } from '../types/pb/a2a_types.js'; +import { FromProto } from '../types/converters/from_proto.js'; export interface AgentCardResolverOptions { path?: string; @@ -29,7 +31,8 @@ export class DefaultAgentCardResolver implements AgentCardResolver { if (!response.ok) { throw new Error(`Failed to fetch Agent Card from ${agentCardUrl}: ${response.status}`); } - return await response.json(); + const rawCard = await response.json(); + return this.normalizeAgentCard(rawCard); } private fetchImpl(...args: Parameters): ReturnType { @@ -38,6 +41,66 @@ export class DefaultAgentCardResolver implements AgentCardResolver { } return fetch(...args); } + + /* + * In the v0.3.0 specification, there was a structural drift between the JSON Schema data model + * and the Protobuf-based data model for AgentCards. + * The JSON Schema format uses a `"type"` discriminator (e.g., `{"type": "openIdConnect"}`), + * while the Protobuf JSON representation uses the `oneof` field name as the discriminator + * (e.g., `{"openIdConnectSecurityScheme": {...}}`). + * + * The A2A SDK internal logic expects the JSON Schema-based format. This fallback detection + * allows us to parse cards served by endpoints returning the Protobuf JSON structure by + * identifying the lack of the "type" field in security schemes or the presence of the + * "schemes" wrapper in security entries, and normalizing it before use. + */ + private normalizeAgentCard(card: unknown): AgentCard { + if (this.isProtoAgentCard(card)) { + const parsedProto = PBAgentCard.fromJSON(card); + return FromProto.agentCard(parsedProto); + } + return card as AgentCard; + } + + private isProtoAgentCard(card: unknown): boolean { + if (!card || typeof card !== 'object') return false; + const c = card as Record; + + if (this.hasProtoSecurity(c.security)) return true; + + if (this.hasProtoSecuritySchemes(c.securitySchemes)) return true; + + if (Array.isArray(c.skills)) { + return c.skills.some( + (skill) => + skill && + typeof skill === 'object' && + this.hasProtoSecurity((skill as Record).security) + ); + } + + return false; + } + + private hasProtoSecurity(securityArray: unknown): boolean { + if (Array.isArray(securityArray) && securityArray.length > 0) { + const first = securityArray[0]; + return first && typeof first === 'object' && 'schemes' in first; + } + return false; + } + + private hasProtoSecuritySchemes(securitySchemes: unknown): boolean { + if (securitySchemes && typeof securitySchemes === 'object') { + const schemes = Object.values(securitySchemes); + if (schemes.length > 0) { + const first = schemes[0]; + // Proto JSON maps use the oneof field name directly rather than a "type" property + return first && typeof first === 'object' && !('type' in first); + } + } + return false; + } } export const AgentCardResolver = { diff --git a/test/client/card-resolver.spec.ts b/test/client/card-resolver.spec.ts index e8bffc6f..8da90c24 100644 --- a/test/client/card-resolver.spec.ts +++ b/test/client/card-resolver.spec.ts @@ -1,6 +1,7 @@ import { describe, it, beforeEach, expect, vi, Mock } from 'vitest'; import { DefaultAgentCardResolver } from '../../src/client/card-resolver.js'; import { AgentCard } from '../../src/types.js'; +import { AgentCard as PBAgentCard } from '../../src/types/pb/a2a_types.js'; describe('DefaultAgentCardResolver', () => { let mockFetch: Mock; @@ -136,4 +137,134 @@ describe('DefaultAgentCardResolver', () => { expect(e.message).to.include('Failed to fetch Agent Card from https://example.com'); } }); + + const expectedAgentCard: AgentCard = { + protocolVersion: '1.0.0', + name: 'Unified Agent', + description: '', + documentationUrl: undefined, + version: '1.0.0', + capabilities: {}, + additionalInterfaces: [], + provider: undefined, + defaultInputModes: [], + defaultOutputModes: [], + supportsAuthenticatedExtendedCard: false, + signatures: [], + url: 'https://unified-agent.example.com/a2a/v1', + preferredTransport: 'GRPC', + securitySchemes: { + google: { + type: 'openIdConnect', + openIdConnectUrl: 'https://accounts.google.com/.well-known/openid-configuration', + }, + }, + security: [{ google: ['openid', 'profile', 'email'] }], + skills: [], + }; + + const v03AgentCard: AgentCard = { + // A v0.3 json-schema shape is essentially identical to the internal format + ...expectedAgentCard, + }; + + const v1ProtoAgentCard: PBAgentCard = { + protocolVersion: '1.0.0', + name: 'Unified Agent', + description: '', + documentationUrl: '', + version: '1.0.0', + capabilities: undefined, + additionalInterfaces: [], + provider: undefined, + defaultInputModes: [], + defaultOutputModes: [], + supportsAuthenticatedExtendedCard: false, + signatures: [], + url: 'https://unified-agent.example.com/a2a/v1', + preferredTransport: 'GRPC', + securitySchemes: { + google: { + scheme: { + $case: 'openIdConnectSecurityScheme', + value: { + description: '', + openIdConnectUrl: 'https://accounts.google.com/.well-known/openid-configuration', + }, + }, + }, + }, + security: [ + { + schemes: { + google: { list: ['openid', 'profile', 'email'] }, + }, + }, + ], + skills: [], + }; + + const expectedAgentCardWithSkill: AgentCard = { + ...expectedAgentCard, + security: [], + securitySchemes: {}, + skills: [ + { + id: 'test-skill', + name: 'Test Skill', + description: 'A skill for testing', + tags: [], + examples: [], + inputModes: [], + outputModes: [], + security: [{ google: ['openid'] }], + }, + ], + }; + + const v1ProtoAgentCardWithSkill: PBAgentCard = { + ...v1ProtoAgentCard, + security: [], + securitySchemes: {}, + skills: [ + { + id: 'test-skill', + name: 'Test Skill', + description: 'A skill for testing', + tags: [], + examples: [], + inputModes: [], + outputModes: [], + security: [ + { + schemes: { + google: { list: ['openid'] }, + }, + }, + ], + }, + ], + }; + + it.each([ + ['v0.3 JSON schema', v03AgentCard, expectedAgentCard], + ['v1.0 protobuf mapping', PBAgentCard.toJSON(v1ProtoAgentCard), expectedAgentCard], + [ + 'v1.0 protobuf mapping (skills only)', + PBAgentCard.toJSON(v1ProtoAgentCardWithSkill), + expectedAgentCardWithSkill, + ], + ])('should parse and normalize %s agent card correctly', async (_, payload, expectedResult) => { + const resolver = new DefaultAgentCardResolver({ fetchImpl: mockFetch }); + mockFetch.mockResolvedValue(new Response(JSON.stringify(payload), { status: 200 })); + + const actual = await resolver.resolve('https://example.com'); + + // Both should normalize to the exact same internal AgentCard format + // Strip undefined properties before comparison using JSON + const expected = JSON.parse(JSON.stringify(expectedResult)); + const actualClean = JSON.parse(JSON.stringify(actual)); + + expect(actualClean).to.deep.equal(expected); + }); }); From d45c212ea6008a4b29ce36e8bec7e6561fce738b Mon Sep 17 00:00:00 2001 From: "Agent2Agent (A2A) Bot" Date: Tue, 10 Mar 2026 04:04:36 -0500 Subject: [PATCH 31/51] chore(main): release 0.3.11 (#320) :robot: I have created a release *beep* *boop* --- ## [0.3.11](https://github.com/a2aproject/a2a-js/compare/v0.3.10...v0.3.11) (2026-03-10) ### Bug Fixes * support proto-based AgentCard in AgentCardResolver ([#344](https://github.com/a2aproject/a2a-js/issues/344)) ([e71221c](https://github.com/a2aproject/a2a-js/commit/e71221cbc87b54acd96fbb4e7a46439a33ccbed6)) * throw on JSON-RPC response id mismatch ([#318](https://github.com/a2aproject/a2a-js/issues/318)) ([5ea1c94](https://github.com/a2aproject/a2a-js/commit/5ea1c94acaf2cae5aa1bc10ea5816f5400a62423)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 8 ++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 40e31235..c123f58d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## [0.3.11](https://github.com/a2aproject/a2a-js/compare/v0.3.10...v0.3.11) (2026-03-10) + + +### Bug Fixes + +* support proto-based AgentCard in AgentCardResolver ([#344](https://github.com/a2aproject/a2a-js/issues/344)) ([e71221c](https://github.com/a2aproject/a2a-js/commit/e71221cbc87b54acd96fbb4e7a46439a33ccbed6)) +* throw on JSON-RPC response id mismatch ([#318](https://github.com/a2aproject/a2a-js/issues/318)) ([5ea1c94](https://github.com/a2aproject/a2a-js/commit/5ea1c94acaf2cae5aa1bc10ea5816f5400a62423)) + ## [0.3.10](https://github.com/a2aproject/a2a-js/compare/v0.3.9...v0.3.10) (2026-01-27) diff --git a/package-lock.json b/package-lock.json index 5437fcf7..83ab174f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@a2a-js/sdk", - "version": "0.3.10", + "version": "0.3.11", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@a2a-js/sdk", - "version": "0.3.10", + "version": "0.3.11", "license": "Apache-2.0", "dependencies": { "uuid": "^11.1.0" diff --git a/package.json b/package.json index 9b411d62..fb9cf047 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@a2a-js/sdk", - "version": "0.3.10", + "version": "0.3.11", "description": "Server & Client SDK for Agent2Agent protocol", "license": "Apache-2.0", "repository": { From c03e80780d69a91d9996148ca75c0667a51fea47 Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Tue, 10 Mar 2026 15:44:01 +0100 Subject: [PATCH 32/51] test: fix naming in card-resolver.spec.ts (#347) It had nothing to do with 0.3 and 1.0. Re #344 --- test/client/card-resolver.spec.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/test/client/card-resolver.spec.ts b/test/client/card-resolver.spec.ts index 8da90c24..d69d18a5 100644 --- a/test/client/card-resolver.spec.ts +++ b/test/client/card-resolver.spec.ts @@ -139,7 +139,7 @@ describe('DefaultAgentCardResolver', () => { }); const expectedAgentCard: AgentCard = { - protocolVersion: '1.0.0', + protocolVersion: '0.3.0', name: 'Unified Agent', description: '', documentationUrl: undefined, @@ -163,13 +163,13 @@ describe('DefaultAgentCardResolver', () => { skills: [], }; - const v03AgentCard: AgentCard = { - // A v0.3 json-schema shape is essentially identical to the internal format + const JsonSchemaAgentCard: AgentCard = { + // A JSON Schema shape is essentially identical to the internal format ...expectedAgentCard, }; - const v1ProtoAgentCard: PBAgentCard = { - protocolVersion: '1.0.0', + const ProtoAgentCard: PBAgentCard = { + protocolVersion: '0.3.0', name: 'Unified Agent', description: '', documentationUrl: '', @@ -222,8 +222,8 @@ describe('DefaultAgentCardResolver', () => { ], }; - const v1ProtoAgentCardWithSkill: PBAgentCard = { - ...v1ProtoAgentCard, + const ProtoAgentCardWithSkill: PBAgentCard = { + ...ProtoAgentCard, security: [], securitySchemes: {}, skills: [ @@ -247,11 +247,11 @@ describe('DefaultAgentCardResolver', () => { }; it.each([ - ['v0.3 JSON schema', v03AgentCard, expectedAgentCard], - ['v1.0 protobuf mapping', PBAgentCard.toJSON(v1ProtoAgentCard), expectedAgentCard], + ['JSON schema', JsonSchemaAgentCard, expectedAgentCard], + ['protobuf', PBAgentCard.toJSON(ProtoAgentCard), expectedAgentCard], [ - 'v1.0 protobuf mapping (skills only)', - PBAgentCard.toJSON(v1ProtoAgentCardWithSkill), + 'protobuf (skills only)', + PBAgentCard.toJSON(ProtoAgentCardWithSkill), expectedAgentCardWithSkill, ], ])('should parse and normalize %s agent card correctly', async (_, payload, expectedResult) => { From 54ac8c41cacc54fb0d80526b79c87ba3aede14af Mon Sep 17 00:00:00 2001 From: bartek-gralewicz Date: Tue, 10 Mar 2026 16:22:09 +0100 Subject: [PATCH 33/51] fix: Fixing missing push configuration after normalization for rest transport (#346) # Description This PR solves a bug that was mentioned here: #336. The issue occurred due to missing mapping of `pushNotificationConfig` in the mapping method. Since mapping is no longer needed, all logic related to field mapping was removed in this PR. Changes: - Extension to an existing unit test to check for `pushNotificationConfig` presence. This test failed as expected before removing the normalization, hence, catching the bug for the future. - Remove rest types and related unions. - Removed snake_case cases from unit testes. - Removed normalization functions but remained field checks to align with currently existing unit tests. Fixes #336 --------- Co-authored-by: Bartek Gralewicz --- .../transports/rest/rest_transport_handler.ts | 174 +++--------------- src/server/transports/rest/rest_types.ts | 120 ------------ test/server/rest_transport_handler.spec.ts | 66 ++----- 3 files changed, 38 insertions(+), 322 deletions(-) delete mode 100644 src/server/transports/rest/rest_types.ts diff --git a/src/server/transports/rest/rest_transport_handler.ts b/src/server/transports/rest/rest_transport_handler.ts index 4dc13e8b..5f813076 100644 --- a/src/server/transports/rest/rest_transport_handler.ts +++ b/src/server/transports/rest/rest_transport_handler.ts @@ -17,21 +17,8 @@ import { TaskPushNotificationConfig, TaskQueryParams, TaskIdParams, - Part, AgentCard, - FileWithBytes, - FileWithUri, } from '../../../types.js'; -import { - RestMessage, - RestMessageSendParams, - RestTaskPushNotificationConfig, - PartInput, - MessageInput, - MessageSendParamsInput, - TaskPushNotificationConfigInput, - FileInput, -} from './rest_types.js'; import { A2A_ERROR_CODE } from '../../../errors.js'; // ============================================================================ @@ -150,25 +137,35 @@ export class RestTransportHandler { return this.requestHandler.getAuthenticatedExtendedAgentCard(context); } + /** + * Validate MessageSendParams. + */ + private validateMessageSendParams(params: MessageSendParams): void { + if (!params.message) { + throw A2AError.invalidParams('message is required'); + } + if (!params.message.messageId) { + throw A2AError.invalidParams('message.messageId is required'); + } + } + /** * Sends a message to the agent. - * Accepts both snake_case and camelCase input, returns camelCase. */ async sendMessage( - params: MessageSendParamsInput, + params: MessageSendParams, context: ServerCallContext ): Promise { - const normalized = this.normalizeMessageParams(params); - return this.requestHandler.sendMessage(normalized, context); + this.validateMessageSendParams(params); + 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: MessageSendParamsInput, + params: MessageSendParams, context: ServerCallContext ): Promise< AsyncGenerator< @@ -178,8 +175,8 @@ export class RestTransportHandler { > > { await this.requireCapability('streaming'); - const normalized = this.normalizeMessageParams(params); - return this.requestHandler.sendMessageStream(normalized, context); + this.validateMessageSendParams(params); + return this.requestHandler.sendMessageStream(params, context); } /** @@ -224,16 +221,20 @@ export class RestTransportHandler { /** * 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: TaskPushNotificationConfigInput, + config: TaskPushNotificationConfig, context: ServerCallContext ): Promise { await this.requireCapability('pushNotifications'); - const normalized = this.normalizeTaskPushNotificationConfig(config); - return this.requestHandler.setTaskPushNotificationConfig(normalized, context); + if (!config.taskId) { + throw A2AError.invalidParams('taskId is required'); + } + if (!config.pushNotificationConfig) { + throw A2AError.invalidParams('pushNotificationConfig is required'); + } + return this.requestHandler.setTaskPushNotificationConfig(config, context); } /** @@ -274,31 +275,6 @@ export class RestTransportHandler { ); } - // ========================================================================== - // Private Transformation Methods - // ========================================================================== - // All type conversion between REST (snake_case) and internal (camelCase) formats - - /** - * Validates and normalizes message parameters. - * Accepts both snake_case and camelCase input. - * @throws {A2AError} InvalidParams if message is missing or conversion fails - */ - private normalizeMessageParams(input: MessageSendParamsInput): MessageSendParams { - if (!input.message) { - throw A2AError.invalidParams('message is required'); - } - - try { - return this.normalizeMessageSendParams(input); - } catch (error) { - if (error instanceof A2AError) throw error; - throw A2AError.invalidParams( - error instanceof Error ? error.message : 'Invalid message parameters' - ); - } - } - /** * Static map of capability to error for missing capabilities. */ @@ -337,102 +313,4 @@ export class RestTransportHandler { } return parsed; } - - /** - * Normalizes Part input - accepts both snake_case and camelCase for file mimeType. - */ - private normalizePart(part: PartInput): Part { - if (part.kind === 'text') return { kind: 'text', text: part.text }; - if (part.kind === 'file') { - const file = this.normalizeFile(part.file); - return { kind: 'file', file, metadata: part.metadata }; - } - return { kind: 'data', data: part.data, metadata: part.metadata }; - } - - /** - * Normalizes File input - accepts both snake_case (mime_type) and camelCase (mimeType). - */ - private normalizeFile(f: FileInput): FileWithBytes | FileWithUri { - // Access both formats via intersection cast - const file = f as FileInput & { mimeType?: string; mime_type?: string }; - const mimeType = file.mimeType ?? file.mime_type; - if ('bytes' in file) { - return { bytes: file.bytes, mimeType, name: file.name }; - } - return { uri: file.uri, mimeType, name: file.name }; - } - - /** - * Normalizes Message input - accepts both snake_case and camelCase. - */ - private normalizeMessage(input: MessageInput): Message { - // Cast to access both formats - const m = input as Message & RestMessage; - const messageId = m.messageId ?? m.message_id; - if (!messageId) { - throw A2AError.invalidParams('message.messageId is required'); - } - if (!m.parts || !Array.isArray(m.parts)) { - throw A2AError.invalidParams('message.parts must be an array'); - } - - return { - contextId: m.contextId ?? m.context_id, - extensions: m.extensions, - kind: 'message', - messageId, - metadata: m.metadata, - parts: m.parts.map((p) => this.normalizePart(p)), - referenceTaskIds: m.referenceTaskIds ?? m.reference_task_ids, - role: m.role, - taskId: m.taskId ?? m.task_id, - }; - } - - /** - * Normalizes MessageSendParams - accepts both snake_case and camelCase. - */ - private normalizeMessageSendParams(input: MessageSendParamsInput): MessageSendParams { - // Cast to access both formats - const p = input as MessageSendParams & RestMessageSendParams; - const config = p.configuration as - | (MessageSendParams['configuration'] & RestMessageSendParams['configuration']) - | undefined; - - return { - configuration: config - ? { - acceptedOutputModes: config.acceptedOutputModes ?? config.accepted_output_modes, - blocking: config.blocking, - historyLength: config.historyLength ?? config.history_length, - } - : undefined, - message: this.normalizeMessage(p.message), - metadata: p.metadata, - }; - } - - /** - * Normalizes TaskPushNotificationConfig - accepts both snake_case and camelCase. - */ - private normalizeTaskPushNotificationConfig( - input: TaskPushNotificationConfigInput - ): TaskPushNotificationConfig { - // Cast to access both formats - const c = input as TaskPushNotificationConfig & RestTaskPushNotificationConfig; - const taskId = c.taskId ?? c.task_id; - if (!taskId) { - throw A2AError.invalidParams('taskId is required'); - } - const pnConfig = c.pushNotificationConfig ?? c.push_notification_config; - if (!pnConfig) { - throw A2AError.invalidParams('pushNotificationConfig is required'); - } - - return { - pushNotificationConfig: pnConfig, - taskId, - }; - } } diff --git a/src/server/transports/rest/rest_types.ts b/src/server/transports/rest/rest_types.ts deleted file mode 100644 index 9e876c50..00000000 --- a/src/server/transports/rest/rest_types.ts +++ /dev/null @@ -1,120 +0,0 @@ -/** - * REST API Types (snake_case format) - * - * These types mirror the internal types but use snake_case naming - * to support TCK and clients that send snake_case payloads. - */ - -import { - Part, - Message, - MessageSendParams, - TaskPushNotificationConfig, - FileWithBytes, - FileWithUri, -} from '../../../types.js'; - -// ============================================================================ -// REST Types (snake_case format) -// ============================================================================ - -/** - * REST file with bytes (snake_case mime_type). - */ -export interface RestFileWithBytes { - bytes: string; - mime_type?: string; - name?: string; -} - -/** - * REST file with URI (snake_case mime_type). - */ -export interface RestFileWithUri { - uri: string; - mime_type?: string; - name?: string; -} - -/** - * REST file union. - */ -export type RestFile = RestFileWithBytes | RestFileWithUri; - -/** - * File input - accepts both camelCase and snake_case. - */ -export type FileInput = FileWithBytes | FileWithUri | RestFileWithBytes | RestFileWithUri; - -/** - * REST Part with snake_case file fields. - */ -export type RestPart = - | { kind: 'text'; text: string; metadata?: Record } - | { kind: 'file'; file: RestFile; metadata?: Record } - | { kind: 'data'; data: Record; metadata?: Record }; - -/** - * REST Message with snake_case fields. - */ -export interface RestMessage { - kind: 'message'; - role: 'agent' | 'user'; - parts: RestPart[]; - message_id: string; - context_id?: string; - task_id?: string; - reference_task_ids?: string[]; - extensions?: string[]; - metadata?: Record; -} - -/** - * REST PushNotificationConfig (same as internal, no snake_case fields). - */ -export interface RestPushNotificationConfig { - id: string; - url: string; - authentication?: { - schemes: string[]; - credentials?: string; - }; -} - -/** - * REST MessageSendConfiguration with snake_case fields. - */ -export interface RestMessageSendConfiguration { - blocking?: boolean; - accepted_output_modes?: string[]; - history_length?: number; - push_notification_config?: RestPushNotificationConfig; -} - -/** - * REST MessageSendParams with snake_case configuration. - */ -export interface RestMessageSendParams { - message: RestMessage; - configuration?: RestMessageSendConfiguration; - metadata?: Record; -} - -/** - * REST TaskPushNotificationConfig with snake_case fields. - */ -export interface RestTaskPushNotificationConfig { - task_id: string; - push_notification_config: RestPushNotificationConfig; -} - -// ============================================================================ -// Input Types - Accept both camelCase and snake_case -// ============================================================================ - -export type PartInput = Part | RestPart; -export type MessageInput = Message | RestMessage; -export type MessageSendParamsInput = MessageSendParams | RestMessageSendParams; -export type TaskPushNotificationConfigInput = - | TaskPushNotificationConfig - | RestTaskPushNotificationConfig; diff --git a/test/server/rest_transport_handler.spec.ts b/test/server/rest_transport_handler.spec.ts index 4e4c3c80..a8e02a4c 100644 --- a/test/server/rest_transport_handler.spec.ts +++ b/test/server/rest_transport_handler.spec.ts @@ -137,18 +137,6 @@ describe('RestTransportHandler', () => { }, expectedMessageId: 'msg-1', }, - { - name: 'snake_case', - input: { - message: { - message_id: 'msg-2', - role: 'user' as const, - parts: [{ kind: 'text' as const, text: 'Hello snake' }], - kind: 'message' as const, - }, - }, - expectedMessageId: 'msg-2', - }, ])( 'should normalize $name message and call request handler', async ({ input, expectedMessageId }) => { @@ -188,8 +176,13 @@ describe('RestTransportHandler', () => { const inputWithConfig = { message: testMessage, configuration: { - accepted_output_modes: ['text/plain'], - history_length: 5, + blocking: true, + acceptedOutputModes: ['text/plain'], + historyLength: 5, + pushNotificationConfig: { + id: 'push-1', + url: 'https://example.com', + }, }, }; @@ -198,8 +191,13 @@ describe('RestTransportHandler', () => { expect(mockRequestHandler.sendMessage as Mock).toHaveBeenCalledWith( expect.objectContaining({ configuration: expect.objectContaining({ + blocking: true, acceptedOutputModes: ['text/plain'], historyLength: 5, + pushNotificationConfig: { + id: 'push-1', + url: 'https://example.com', + }, }), }), mockContext @@ -343,28 +341,6 @@ describe('RestTransportHandler', () => { expect(result).to.deep.equal(mockConfig); }); - it('should normalize snake_case config', async () => { - (mockRequestHandler.setTaskPushNotificationConfig as Mock).mockResolvedValue(mockConfig); - - const snakeCaseConfig = { - task_id: 'task-1', - push_notification_config: { - id: 'config-1', - url: 'https://example.com/webhook', - }, - }; - - await transportHandler.setTaskPushNotificationConfig(snakeCaseConfig as any, mockContext); - - expect(mockRequestHandler.setTaskPushNotificationConfig as Mock).toHaveBeenCalledWith( - expect.objectContaining({ - taskId: 'task-1', - pushNotificationConfig: expect.objectContaining({ id: 'config-1' }), - }), - mockContext - ); - }); - it('should throw InvalidParams if taskId is missing', async () => { const invalidConfig = { pushNotificationConfig: { id: 'config-1', url: 'https://example.com/webhook' }, @@ -456,24 +432,6 @@ describe('RestTransportHandler', () => { kind: 'message' as const, }, }, - { - name: 'snake_case', - message: { - message_id: 'msg-file', - role: 'user' as const, - parts: [ - { - kind: 'file' as const, - file: { - uri: 'https://example.com/file.pdf', - mime_type: 'application/pdf', - name: 'document.pdf', - }, - }, - ], - kind: 'message' as const, - }, - }, ])('should normalize $name file parts to camelCase', async ({ message }) => { await transportHandler.sendMessage({ message } as any, mockContext); From 321d331b678bf0c0cf5849ed323c9db2b067a19c Mon Sep 17 00:00:00 2001 From: "Agent2Agent (A2A) Bot" Date: Tue, 10 Mar 2026 10:29:26 -0500 Subject: [PATCH 34/51] chore(main): release 0.3.12 (#348) :robot: I have created a release *beep* *boop* --- ## [0.3.12](https://github.com/a2aproject/a2a-js/compare/v0.3.11...v0.3.12) (2026-03-10) ### Bug Fixes * Fixing missing push configuration after normalization for rest transport ([#346](https://github.com/a2aproject/a2a-js/issues/346)) ([54ac8c4](https://github.com/a2aproject/a2a-js/commit/54ac8c41cacc54fb0d80526b79c87ba3aede14af)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c123f58d..245de29b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.3.12](https://github.com/a2aproject/a2a-js/compare/v0.3.11...v0.3.12) (2026-03-10) + + +### Bug Fixes + +* Fixing missing push configuration after normalization for rest transport ([#346](https://github.com/a2aproject/a2a-js/issues/346)) ([54ac8c4](https://github.com/a2aproject/a2a-js/commit/54ac8c41cacc54fb0d80526b79c87ba3aede14af)) + ## [0.3.11](https://github.com/a2aproject/a2a-js/compare/v0.3.10...v0.3.11) (2026-03-10) diff --git a/package-lock.json b/package-lock.json index 83ab174f..362f4bb8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@a2a-js/sdk", - "version": "0.3.11", + "version": "0.3.12", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@a2a-js/sdk", - "version": "0.3.11", + "version": "0.3.12", "license": "Apache-2.0", "dependencies": { "uuid": "^11.1.0" diff --git a/package.json b/package.json index fb9cf047..9ea0cef2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@a2a-js/sdk", - "version": "0.3.11", + "version": "0.3.12", "description": "Server & Client SDK for Agent2Agent protocol", "license": "Apache-2.0", "repository": { From 1323897b5e852066dad5f63f0f214cdbf1868fb1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Mar 2026 12:47:00 +0100 Subject: [PATCH 35/51] chore(deps-dev): bump simple-git from 3.30.0 to 3.33.0 (#349) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [simple-git](https://github.com/steveukx/git-js/tree/HEAD/simple-git) from 3.30.0 to 3.33.0.
Release notes

Sourced from simple-git's releases.

simple-git@3.33.0

Minor Changes

  • a263635: Use pathspec wrappers for remote and local paths when running either git.clone or git.mirror to avoid leaving them less open for unexpected outcomes when passing unsanitised data into these tasks.

Patch Changes

  • e253a0d: Enhanced git -c checks in unsafe plugin.

    Thanks to @​JohannesLks for identifying the issue

simple-git@3.32.3

Patch Changes

  • f704208: Enhanced protocol.allow checks in allowUnsafeExtProtocol handling.

    Thanks to @​CodeAnt-AI-Security for identifying the issue

simple-git@3.32.2

Patch Changes

  • 8d02097: Enhanced clone unsafe switch detection.

simple-git@3.32.1

Patch Changes

  • 23b070f: Fix regex for detecting unsafe clone options

    Thanks to @​stevenwdv for reporting this issue.

simple-git@3.32.0

Minor Changes

  • 1effd8e: Enhances the unsafe plugin to block additional cases where the -u switch may be disguised along with other single character options.

    Thanks to @​JuHwiSang for identifying this as vulnerability.

Patch Changes

  • d5fd4fe: Use task runner for logging use of deprecated (already no-op) functions.

simple-git@3.31.1

Patch Changes

  • a44184f: Resolve NPM publish steps
Changelog

Sourced from simple-git's changelog.

3.33.0

Minor Changes

  • a263635: Use pathspec wrappers for remote and local paths when running either git.clone or git.mirror to avoid leaving them less open for unexpected outcomes when passing unsanitised data into these tasks.

Patch Changes

  • e253a0d: Enhanced git -c checks in unsafe plugin.

    Thanks to @​JohannesLks for identifying the issue

3.32.3

Patch Changes

  • f704208: Enhanced protocol.allow checks in allowUnsafeExtProtocol handling.

    Thanks to @​CodeAnt-AI-Security for identifying the issue

3.32.2

Patch Changes

  • 8d02097: Enhanced clone unsafe switch detection.

3.32.1

Patch Changes

  • 23b070f: Fix regex for detecting unsafe clone options

    Thanks to @​stevenwdv for reporting this issue.

3.32.0

Minor Changes

  • 1effd8e: Enhances the unsafe plugin to block additional cases where the -u switch may be disguised along with other single character options.

    Thanks to @​JuHwiSang for identifying this as vulnerability.

Patch Changes

  • d5fd4fe: Use task runner for logging use of deprecated (already no-op) functions.

3.31.1

... (truncated)

Commits
Maintainer changes

This version was pushed to npm by [GitHub Actions](https://www.npmjs.com/~GitHub Actions), a new releaser for simple-git since your current version.


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=simple-git&package-manager=npm_and_yarn&previous-version=3.30.0&new-version=3.33.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 362f4bb8..e074d4d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6996,9 +6996,9 @@ "license": "ISC" }, "node_modules/simple-git": { - "version": "3.30.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.30.0.tgz", - "integrity": "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg==", + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.33.0.tgz", + "integrity": "sha512-D4V/tGC2sjsoNhoMybKyGoE+v8A60hRawKQ1iFRA1zwuDgGZCBJ4ByOzZ5J8joBbi4Oam0qiPH+GhzmSBwbJng==", "dev": true, "license": "MIT", "dependencies": { From 57696a8001416ae2c5c592406c1f46b3e9209eca Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Mon, 16 Mar 2026 11:30:55 +0100 Subject: [PATCH 36/51] fix: properly parse ProtoJSON body for POST pushNotificationConfigs (#352) Apparently the code removed in #346 wasn't "dead", this method wasn't properly migrated in #292. Tests are updated to cover this. Fixes #336 --- .betterer.results | 2 +- src/server/express/rest_handler.ts | 9 +- test/server/express/rest_handler.spec.ts | 230 +++++++++++++++++++---- 3 files changed, 202 insertions(+), 39 deletions(-) diff --git a/.betterer.results b/.betterer.results index 7586638d..97917d38 100644 --- a/.betterer.results +++ b/.betterer.results @@ -27,7 +27,7 @@ exports[`TypeScript Strict Mode`] = { [248, 15, 4, "tsc: Expected 2 arguments, but got 1.", "2087764327"], [271, 15, 4, "tsc: Expected 2 arguments, but got 1.", "2087764327"] ], - "src/server/express/rest_handler.ts:2741309436": [ + "src/server/express/rest_handler.ts:2436698925": [ [204, 50, 17, "tsc: Argument of type \'unknown\' is not assignable to parameter of type \'Message | Task | TaskArtifactUpdateEvent | TaskStatusUpdateEvent\'.", "3749434707"] ], "src/server/request_handler/default_request_handler.ts:1208203039": [ diff --git a/src/server/express/rest_handler.ts b/src/server/express/rest_handler.ts index 0e5c675e..35324c51 100644 --- a/src/server/express/rest_handler.ts +++ b/src/server/express/rest_handler.ts @@ -425,12 +425,9 @@ export function restHandler(options: RestHandlerOptions): RequestHandler { '/v1/tasks/:taskId/pushNotificationConfigs', asyncHandler(async (req, res) => { const context = await buildContext(req); - const config = { - ...req.body, - taskId: req.params.taskId, - task_id: req.params.taskId, - }; - const result = await restTransportHandler.setTaskPushNotificationConfig(config, context); + const protoReq = a2a.CreateTaskPushNotificationConfigRequest.fromJSON(req.body); + const params = FromProto.createTaskPushNotificationConfig(protoReq); + const result = await restTransportHandler.setTaskPushNotificationConfig(params, context); const protoResult = ToProto.taskPushNotificationConfig(result); sendResponse( res, diff --git a/test/server/express/rest_handler.spec.ts b/test/server/express/rest_handler.spec.ts index edd788e5..ca77c740 100644 --- a/test/server/express/rest_handler.spec.ts +++ b/test/server/express/rest_handler.spec.ts @@ -119,6 +119,24 @@ describe('restHandler', () => { const response = await request(app).post('/v1/message:send').send({ message }).expect(201); + expect(mockRequestHandler.sendMessage).toHaveBeenCalledWith( + { + message: { + messageId: 'msg-1', + role: 'user', + parts: [{ kind: 'text', text: 'Hello' }], + kind: 'message', + contextId: undefined, + extensions: [], + metadata: undefined, + taskId: undefined, + }, + configuration: undefined, + metadata: undefined, + }, + expect.anything() + ); + const converted_result = FromProto.sendMessageResult( SendMessageResponse.fromJSON(response.body) ); @@ -148,6 +166,24 @@ describe('restHandler', () => { const response = await request(app).post('/v1/message:stream').send({ message }).expect(200); assert.equal(response.headers['content-type'], 'text/event-stream'); + + expect(mockRequestHandler.sendMessageStream).toHaveBeenCalledWith( + { + message: { + messageId: 'msg-1', + role: 'user', + parts: [{ kind: 'text', text: 'Hello' }], + kind: 'message', + contextId: undefined, + extensions: [], + metadata: undefined, + taskId: undefined, + }, + configuration: undefined, + metadata: undefined, + }, + expect.anything() + ); }); it('should return 400 if streaming is not supported', async () => { @@ -227,7 +263,8 @@ describe('restHandler', () => { assert.deepEqual(response.body.id, cancelledTask.id); assert.deepEqual(response.body.status.state, 'TASK_STATE_CANCELLED'); - expect(mockRequestHandler.cancelTask as Mock).toHaveBeenCalledWith( + + expect(mockRequestHandler.cancelTask).toHaveBeenCalledWith( { id: 'task-1' }, expect.anything() ); @@ -265,7 +302,8 @@ describe('restHandler', () => { const response = await request(app).post('/v1/tasks/task-1:subscribe').expect(200); assert.equal(response.headers['content-type'], 'text/event-stream'); - expect(mockRequestHandler.resubscribe as Mock).toHaveBeenCalledWith( + + expect(mockRequestHandler.resubscribe).toHaveBeenCalledWith( { id: 'task-1' }, expect.anything() ); @@ -309,7 +347,29 @@ describe('restHandler', () => { { name: 'camelCase', payload: { - pushNotificationConfig: { id: 'config-1', url: 'https://example.com/webhook' }, + parent: 'tasks/task-1', + configId: 'push-954f670f-598d-49bf-9981-642d523f7746', + config: { + name: 'tasks/task-1/pushNotificationConfigs/push-954f670f-598d-49bf-9981-642d523f7746', + pushNotificationConfig: { + id: 'push-954f670f-598d-49bf-9981-642d523f7746', + url: 'http://127.0.0.1:9999/webhook', + }, + }, + }, + }, + { + name: 'snake_case', + payload: { + parent: 'tasks/task-1', + config_id: 'push-954f670f-598d-49bf-9981-642d523f7746', + config: { + name: 'tasks/task-1/pushNotificationConfigs/push-954f670f-598d-49bf-9981-642d523f7746', + push_notification_config: { + id: 'push-954f670f-598d-49bf-9981-642d523f7746', + url: 'http://127.0.0.1:9999/webhook', + }, + }, }, }, ])('should accept $name config and return 201', async ({ payload }) => { @@ -324,6 +384,19 @@ describe('restHandler', () => { TaskPushNotificationConfig.fromJSON(response.body) ); assert.deepEqual(protoResponse.taskId, mockConfig.taskId); + + expect(mockRequestHandler.setTaskPushNotificationConfig).toHaveBeenCalledWith( + { + taskId: 'task-1', + pushNotificationConfig: { + id: 'push-954f670f-598d-49bf-9981-642d523f7746', + url: 'http://127.0.0.1:9999/webhook', + token: undefined, + authentication: undefined, + }, + }, + expect.anything() + ); }); it('should return 400 if push notifications not supported', async () => { @@ -363,6 +436,11 @@ describe('restHandler', () => { ); assert.isArray(convertedResult); assert.lengthOf(convertedResult, configs.length); + + expect(mockRequestHandler.listTaskPushNotificationConfigs).toHaveBeenCalledWith( + { id: 'task-1' }, + expect.anything() + ); }); }); @@ -379,11 +457,9 @@ describe('restHandler', () => { TaskPushNotificationConfig.fromJSON(response.body) ); assert.deepEqual(convertedResult.taskId, mockConfig.taskId); - expect(mockRequestHandler.getTaskPushNotificationConfig as Mock).toHaveBeenCalledWith( - { - id: 'task-1', - pushNotificationConfigId: 'config-1', - }, + + expect(mockRequestHandler.getTaskPushNotificationConfig).toHaveBeenCalledWith( + { id: 'task-1', pushNotificationConfigId: 'config-1' }, expect.anything() ); }); @@ -408,11 +484,8 @@ describe('restHandler', () => { await request(app).delete('/v1/tasks/task-1/pushNotificationConfigs/config-1').expect(204); - expect(mockRequestHandler.deleteTaskPushNotificationConfig as Mock).toHaveBeenCalledWith( - { - id: 'task-1', - pushNotificationConfigId: 'config-1', - }, + expect(mockRequestHandler.deleteTaskPushNotificationConfig).toHaveBeenCalledWith( + { id: 'task-1', pushNotificationConfigId: 'config-1' }, expect.anything() ); }); @@ -439,27 +512,93 @@ describe('restHandler', () => { it.each([ { name: 'camelCase', - message: { - messageId: 'msg-file', - role: 'user', - kind: 'message', - parts: [ - { - kind: 'file', - file: { - uri: 'https://example.com/file.pdf', - mimeType: 'application/pdf', - name: 'document.pdf', + payload: { + message: { + messageId: 'msg-parts', + role: 'ROLE_USER', + kind: 'message', + content: [ + { + file: { + fileWithUri: 'https://example.com/file.pdf', + mimeType: 'application/pdf', + }, }, - }, - ], + { + text: 'Hello world', + }, + { + data: { + data: { foo: 'bar' }, + }, + }, + ], + }, }, }, - ])('should accept $name file parts', async ({ message }) => { + { + name: 'snake_case', + payload: { + message: { + message_id: 'msg-parts', + role: 'ROLE_USER', + kind: 'message', + content: [ + { + file: { + file_with_uri: 'https://example.com/file.pdf', + mime_type: 'application/pdf', + }, + }, + { + text: 'Hello world', + }, + { + data: { + data: { foo: 'bar' }, + }, + }, + ], + }, + }, + }, + ])('should accept $name message parts', async ({ payload }) => { (mockRequestHandler.sendMessage as Mock).mockResolvedValue(testTask); + await request(app).post('/v1/message:send').send(payload).expect(201); - const protoMessage = ProtoMessage.toJSON(ToProto.message(message as Message)); - await request(app).post('/v1/message:send').send({ message: protoMessage }).expect(201); + expect(mockRequestHandler.sendMessage).toHaveBeenCalledWith( + { + message: { + kind: 'message', + messageId: 'msg-parts', + role: 'user', // ROLE_USER is converted to 'user' + parts: [ + { + kind: 'file', + file: { + uri: 'https://example.com/file.pdf', + mimeType: 'application/pdf', + }, + }, + { + kind: 'text', + text: 'Hello world', + }, + { + kind: 'data', + data: { foo: 'bar' }, + }, + ], + contextId: undefined, + extensions: [], + metadata: undefined, + taskId: undefined, + }, + configuration: undefined, + metadata: undefined, + }, + expect.anything() + ); }); }); @@ -471,15 +610,42 @@ describe('restHandler', () => { { name: 'camelCase', payload: { - message: testMessage, + message: { messageId: 'msg-1', role: 'ROLE_USER', kind: 'message' }, configuration: { acceptedOutputModes: ['text/plain'], historyLength: 5 }, }, }, + { + name: 'snake_case', + payload: { + message: { message_id: 'msg-1', role: 'ROLE_USER', kind: 'message' }, + configuration: { accepted_output_modes: ['text/plain'], history_length: 5 }, + }, + }, ])('should accept $name configuration fields', async ({ payload }) => { (mockRequestHandler.sendMessage as Mock).mockResolvedValue(testTask); + await request(app).post('/v1/message:send').send(payload).expect(201); - const protoMessage = ProtoMessage.toJSON(ToProto.message(payload.message as Message)); - await request(app).post('/v1/message:send').send({ message: protoMessage }).expect(201); + expect(mockRequestHandler.sendMessage).toHaveBeenCalledWith( + { + message: { + kind: 'message', + messageId: 'msg-1', + role: 'user', // ROLE_USER is converted to 'user' + parts: [], // empty content converts to empty parts + contextId: undefined, + extensions: [], + metadata: undefined, + taskId: undefined, + }, + configuration: { + acceptedOutputModes: ['text/plain'], + blocking: false, + pushNotificationConfig: undefined, + }, + metadata: undefined, + }, + expect.anything() + ); }); }); From 82d36c7fdb1cac6223cefedf0204008d9954dd09 Mon Sep 17 00:00:00 2001 From: "Agent2Agent (A2A) Bot" Date: Mon, 16 Mar 2026 06:03:41 -0500 Subject: [PATCH 37/51] chore(main): release 0.3.13 (#354) :robot: I have created a release *beep* *boop* --- ## [0.3.13](https://github.com/a2aproject/a2a-js/compare/v0.3.12...v0.3.13) (2026-03-16) ### Bug Fixes * properly parse ProtoJSON body for POST pushNotificationConfigs ([#352](https://github.com/a2aproject/a2a-js/issues/352)) ([57696a8](https://github.com/a2aproject/a2a-js/commit/57696a8001416ae2c5c592406c1f46b3e9209eca)), closes [#336](https://github.com/a2aproject/a2a-js/issues/336) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --- CHANGELOG.md | 7 +++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 245de29b..8652510a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## [0.3.13](https://github.com/a2aproject/a2a-js/compare/v0.3.12...v0.3.13) (2026-03-16) + + +### Bug Fixes + +* properly parse ProtoJSON body for POST pushNotificationConfigs ([#352](https://github.com/a2aproject/a2a-js/issues/352)) ([57696a8](https://github.com/a2aproject/a2a-js/commit/57696a8001416ae2c5c592406c1f46b3e9209eca)), closes [#336](https://github.com/a2aproject/a2a-js/issues/336) + ## [0.3.12](https://github.com/a2aproject/a2a-js/compare/v0.3.11...v0.3.12) (2026-03-10) diff --git a/package-lock.json b/package-lock.json index e074d4d9..1931a833 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@a2a-js/sdk", - "version": "0.3.12", + "version": "0.3.13", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@a2a-js/sdk", - "version": "0.3.12", + "version": "0.3.13", "license": "Apache-2.0", "dependencies": { "uuid": "^11.1.0" diff --git a/package.json b/package.json index 9ea0cef2..9061d9c7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@a2a-js/sdk", - "version": "0.3.12", + "version": "0.3.13", "description": "Server & Client SDK for Agent2Agent protocol", "license": "Apache-2.0", "repository": { From 0f433ed8025b8dd13387f83bfd89a61e0d27d620 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 11:13:05 +0100 Subject: [PATCH 38/51] chore(deps-dev): bump fast-xml-parser from 5.4.1 to 5.5.6 in /src/samples (#357) Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 5.4.1 to 5.5.6.
Release notes

Sourced from fast-xml-parser's releases.

fix entity expansion and incorrect replacement and performance

Full Changelog: https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.5...v5.5.6

support onDangerousProperty

Full Changelog: https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.3...v5.5.5

update dependecies to fix typings

Full Changelog: https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.1...v5.5.2

integrate path-expression-matcher

  • support path-expression-matcher
  • fix: stopNode should not be parsed
  • performance improvement for stopNode checking
Changelog

Sourced from fast-xml-parser's changelog.

Note: If you find missing information about particular minor version, that version must have been changed without any functional change in this library.

Note: Due to some last quick changes on v4, detail of v4.5.3 & v4.5.4 are not updated here. v4.5.4x is the last tag of v4 in github repository. I'm extremely sorry for the confusion

5.5.6 / 2026-03-16

  • update builder dependency
  • fix incorrect regex to replace . in entity name
  • fix check for entitiy expansion for lastEntities and html entities too

5.5.5 / 2026-03-13

  • sanitize dangerous tag or attribute name
  • error on critical property name
  • support onDangerousProperty option

5.5.4 / 2026-03-13

  • declare Matcher & Expression as unknown so user is not forced to install path-expression-matcher

5.5.3 / 2026-03-11

  • upgrade builder

5.5.2 / 2026-03-11

  • update dependency to fix typings

5.5.1 / 2026-03-10

  • fix dependency

5.5.0 / 2026-03-10

  • support path-expression-matcher
  • fix: stopNode should not be parsed
  • performance improvement for stopNode checking

5.4.2 / 2026-03-03

  • support maxEntityCount option

5.4.1 / 2026-02-25

  • fix (#785) unpairedTag node should not have tag content

5.4.0 / 2026-02-25

  • migrate to fast-xml-builder

5.3.9 / 2026-02-25

  • support strictReservedNames

5.3.8 / 2026-02-25

  • support maxNestedTags
  • handle non-array input for XML builder when preserveOrder is true (By Angelo Coetzee)
  • save use of js properies

5.3.7 / 2026-02-20

... (truncated)

Commits
  • 870043e update release info
  • 6df401e update builder dependency
  • bd26122 check for entitiy expansion for lastEntities and html entities too
  • 7e70dd8 fix incorrect regex to replace . in entity name
  • e54155f update package info
  • 3308fd7 handle critical properties
  • 0500f6b refactor
  • ea07bb2 declare Matcher & Expression as unknown
  • 0a4dc92 upgrade builder
  • e0a14f7 update dependency to fix typings
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=fast-xml-parser&package-manager=npm_and_yarn&previous-version=5.4.1&new-version=5.5.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/samples/package-lock.json | 38 +++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/samples/package-lock.json b/src/samples/package-lock.json index 818d4aa1..97cd9a59 100644 --- a/src/samples/package-lock.json +++ b/src/samples/package-lock.json @@ -4750,9 +4750,9 @@ "license": "BSD-3-Clause" }, "node_modules/fast-xml-builder": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.0.0.tgz", - "integrity": "sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", + "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", "dev": true, "funding": [ { @@ -4762,12 +4762,15 @@ ], "license": "MIT", "optional": true, - "peer": true + "peer": true, + "dependencies": { + "path-expression-matcher": "^1.1.3" + } }, "node_modules/fast-xml-parser": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz", - "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.6.tgz", + "integrity": "sha512-3+fdZyBRVg29n4rXP0joHthhcHdPUHaIC16cuyyd1iLsuaO6Vea36MPrxgAzbZna8lhvZeRL8Bc9GP56/J9xEw==", "dev": true, "funding": [ { @@ -4779,7 +4782,8 @@ "optional": true, "peer": true, "dependencies": { - "fast-xml-builder": "^1.0.0", + "fast-xml-builder": "^1.1.4", + "path-expression-matcher": "^1.1.3", "strnum": "^2.1.2" }, "bin": { @@ -6579,6 +6583,24 @@ "node": ">= 0.4.0" } }, + "node_modules/path-expression-matcher": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", + "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", From 2220644539c8717ad09c995b1d9346299f4a77af Mon Sep 17 00:00:00 2001 From: bartek-gralewicz Date: Thu, 19 Mar 2026 11:11:14 +0100 Subject: [PATCH 39/51] ci: Update coverage workflow (#362) # Description Modification to code coverage calculation workflow so that the comparison is made against target branch and not `main`. This is valuable when PR targets some epic branch. Comparing the coverage with `main` branch is not accurate if the epic branch already drifted from `main`. # IMPORTANT NOTE An attempt to test this change was done on a draft PR: #363 but the coverage comment workflow is executed from the `main` branch and not from the branch checkout. This means that in order to properly test this functionality in action, it needs to reach `main` state. In case any issues occur, I will provide an update to this logic or revert back to the original state. --- .github/workflows/coverage-comment.yml | 18 +++++++++--------- .github/workflows/unit-tests.yml | 20 ++++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/coverage-comment.yml b/.github/workflows/coverage-comment.yml index e62d754a..8aa5dcb7 100644 --- a/.github/workflows/coverage-comment.yml +++ b/.github/workflows/coverage-comment.yml @@ -52,10 +52,10 @@ jobs: } }; - const mainSummary = loadSummary('./coverage-main-summary.json'); + const baseSummary = loadSummary('./coverage-base-summary.json'); const prSummary = loadSummary('./coverage-pr-summary.json'); - if (!mainSummary || !prSummary) { + if (!baseSummary || !prSummary) { console.log("Missing coverage data, skipping comment."); return; } @@ -81,7 +81,7 @@ jobs: const fileUrl = (path) => `https://github.com/${owner}/${repo}/blob/${headSha}/${path}`; - const allFiles = new Set([...Object.keys(mainSummary), ...Object.keys(prSummary)]); + const allFiles = new Set([...Object.keys(baseSummary), ...Object.keys(prSummary)]); allFiles.delete('total'); const workspacePath = process.env.GITHUB_WORKSPACE ? process.env.GITHUB_WORKSPACE + '/' : ''; @@ -89,18 +89,18 @@ jobs: let newRows = []; for (const file of allFiles) { - const mainFile = mainSummary[file]; + const baseFile = baseSummary[file]; const prFile = prSummary[file]; if (!prFile) continue; - const oldPct = getPct(mainFile, metric); + const oldPct = getPct(baseFile, metric); const newPct = getPct(prFile, metric); const relativeFilePath = file.replace(workspacePath, ''); const linkedPath = `[${relativeFilePath}](${fileUrl(relativeFilePath)})`; - if (!mainFile && prFile) { + if (!baseFile && prFile) { newRows.push(`| ${linkedPath} (**new**) | — | ${newPct}% | — |\n`); } else if (oldPct !== newPct) { changedRows.push(`| ${linkedPath} | ${oldPct}% | ${newPct}% | ${formatDiff(oldPct, newPct)} |\n`); @@ -110,7 +110,7 @@ jobs: if (changedRows.length === 0 && newRows.length === 0) { markdown += `\n_No coverage changes._\n`; } else { - markdown += `| | Main | PR | Delta |\n`; + markdown += `| | Base | PR | Delta |\n`; markdown += `| :--- | :---: | :---: | :---: |\n`; if (changedRows.length > 0) { @@ -120,7 +120,7 @@ jobs: markdown += newRows.sort().join(''); } - const oldTotalPct = getPct(mainSummary.total, metric); + const oldTotalPct = getPct(baseSummary.total, metric); const newTotalPct = getPct(prSummary.total, metric); if (oldTotalPct !== newTotalPct) { markdown += `| **Total** | ${oldTotalPct}% | ${newTotalPct}% | ${formatDiff(oldTotalPct, newTotalPct)} |\n`; @@ -161,4 +161,4 @@ jobs: issue_number: prNumber, body: markdown }); - } \ No newline at end of file + } diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index b1606c6e..71b22759 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -5,9 +5,9 @@ name: Run Unit Tests on: push: - branches: [ "main" ] + branches: [ "main", "epic/**" ] pull_request: - branches: [ "main" ] + branches: [ "main", "epic/**" ] paths-ignore: - '**.md' - 'LICENSE' @@ -54,24 +54,25 @@ jobs: coverage: runs-on: ubuntu-latest steps: - - name: Checkout Main + - name: Checkout Base Branch uses: actions/checkout@v4 with: - ref: main + ref: ${{ github.event.pull_request.base.ref || 'main' }} + clean: true - uses: actions/setup-node@v4 with: node-version: 24 cache: 'npm' - - name: Install & Test (Main) + - name: Install & Test (Base Branch) timeout-minutes: 10 run: | npm ci npm run coverage - mv coverage/coverage-summary.json ${{ runner.temp }}/coverage-main-summary.json + mv coverage/coverage-summary.json ${{ runner.temp }}/coverage-base-summary.json - - name: Upload Artifact (main) + - name: Upload Artifact (base) uses: actions/upload-artifact@v4 if: github.event_name != 'pull_request' with: @@ -92,7 +93,7 @@ jobs: npm ci npm run coverage mv coverage/coverage-summary.json coverage-pr-summary.json - mv ${{ runner.temp }}/coverage-main-summary.json coverage-main-summary.json + mv ${{ runner.temp }}/coverage-base-summary.json coverage-base-summary.json - name: Save PR number run: | @@ -104,9 +105,8 @@ jobs: with: name: coverage-data path: | - coverage-main-summary.json + coverage-base-summary.json coverage-pr-summary.json coverage/ PR_NUMBER retention-days: 1 - From 1f219b0c8518a07dcb745fc0122d6b661fce9f98 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Mar 2026 10:09:01 +0100 Subject: [PATCH 40/51] chore(deps-dev): bump fast-xml-parser from 5.5.6 to 5.5.7 in /src/samples (#365) Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 5.5.6 to 5.5.7.
Changelog

Sourced from fast-xml-parser's changelog.

Note: If you find missing information about particular minor version, that version must have been changed without any functional change in this library.

Note: Due to some last quick changes on v4, detail of v4.5.3 & v4.5.4 are not updated here. v4.5.4x is the last tag of v4 in github repository. I'm extremely sorry for the confusion

5.5.7 / 2026-03-19

  • fix: entity expansion limits
  • update strnum package to 2.2.0

5.5.6 / 2026-03-16

  • update builder dependency
  • fix incorrect regex to replace . in entity name
  • fix check for entitiy expansion for lastEntities and html entities too

5.5.5 / 2026-03-13

  • sanitize dangerous tag or attribute name
  • error on critical property name
  • support onDangerousProperty option

5.5.4 / 2026-03-13

  • declare Matcher & Expression as unknown so user is not forced to install path-expression-matcher

5.5.3 / 2026-03-11

  • upgrade builder

5.5.2 / 2026-03-11

  • update dependency to fix typings

5.5.1 / 2026-03-10

  • fix dependency

5.5.0 / 2026-03-10

  • support path-expression-matcher
  • fix: stopNode should not be parsed
  • performance improvement for stopNode checking

5.4.2 / 2026-03-03

  • support maxEntityCount option

5.4.1 / 2026-02-25

  • fix (#785) unpairedTag node should not have tag content

5.4.0 / 2026-02-25

  • migrate to fast-xml-builder

5.3.9 / 2026-02-25

  • support strictReservedNames

5.3.8 / 2026-02-25

  • support maxNestedTags

... (truncated)

Commits
  • a21c441 update package detail
  • 239b64a check for min value for entity exapantion options
  • 61cb666 restrict more properties to be unsafe
  • 41abd66 performance improvement of reading DOCTYPE
  • 3dfcd20 refactor: performance improvement
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=fast-xml-parser&package-manager=npm_and_yarn&previous-version=5.5.6&new-version=5.5.7)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/samples/package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/samples/package-lock.json b/src/samples/package-lock.json index 97cd9a59..4eba9ffb 100644 --- a/src/samples/package-lock.json +++ b/src/samples/package-lock.json @@ -4768,9 +4768,9 @@ } }, "node_modules/fast-xml-parser": { - "version": "5.5.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.6.tgz", - "integrity": "sha512-3+fdZyBRVg29n4rXP0joHthhcHdPUHaIC16cuyyd1iLsuaO6Vea36MPrxgAzbZna8lhvZeRL8Bc9GP56/J9xEw==", + "version": "5.5.7", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.7.tgz", + "integrity": "sha512-LteOsISQ2GEiDHZch6L9hB0+MLoYVLToR7xotrzU0opCICBkxOPgHAy1HxAvtxfJNXDJpgAsQN30mkrfpO2Prg==", "dev": true, "funding": [ { @@ -4784,7 +4784,7 @@ "dependencies": { "fast-xml-builder": "^1.1.4", "path-expression-matcher": "^1.1.3", - "strnum": "^2.1.2" + "strnum": "^2.2.0" }, "bin": { "fxparser": "src/cli/cli.js" @@ -7344,9 +7344,9 @@ } }, "node_modules/strnum": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", - "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.1.tgz", + "integrity": "sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg==", "dev": true, "funding": [ { From e2dc048b2afa0ce1fbca4b524581b75bed4a88b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 20 Mar 2026 11:37:39 +0100 Subject: [PATCH 41/51] chore(deps-dev): bump flatted from 3.3.3 to 3.4.2 (#366) Bumps [flatted](https://github.com/WebReflection/flatted) from 3.3.3 to 3.4.2.
Commits
  • 3bf0909 3.4.2
  • 885ddcc fix CWE-1321
  • 0bdba70 added flatted-view to the benchmark
  • 2a02dce 3.4.1
  • fba4e8f Merge pull request #89 from WebReflection/python-fix
  • 5fe8648 added "when in Rome" also a test for PHP
  • 53517ad some minor improvement
  • b3e2a0c Fixing recursion issue in Python too
  • c4b46db Add SECURITY.md for security policy and reporting
  • f86d071 Create dependabot.yml for version updates
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=flatted&package-manager=npm_and_yarn&previous-version=3.3.3&new-version=3.4.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1931a833..79750b77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5147,9 +5147,9 @@ } }, "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==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, From 6bacf4f605e57982a21953b9c280a1edec87b777 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 09:35:14 +0200 Subject: [PATCH 42/51] chore(deps): bump vite from 7.3.0 to 7.3.2 (#386) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.3.0 to 7.3.2.
Release notes

Sourced from vite's releases.

v7.3.2

Please refer to CHANGELOG.md for details.

v7.3.1

Please refer to CHANGELOG.md for details.

Changelog

Sourced from vite's changelog.

7.3.2 (2026-04-06)

Bug Fixes

7.3.1 (2026-01-07)

Features

  • add ignoreOutdatedRequests option to optimizeDeps (#21364) (9d39d37)
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=vite&package-manager=npm_and_yarn&previous-version=7.3.0&new-version=7.3.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 79750b77..ac5385cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7673,9 +7673,9 @@ } }, "node_modules/vite": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.0.tgz", - "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", + "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", "dev": true, "license": "MIT", "dependencies": { From c8b40684c8107ea5b1f85752e8f02b13b01d0fa0 Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Tue, 7 Apr 2026 10:08:18 +0200 Subject: [PATCH 43/51] ci: enable groups for dependabot (#388) Currently it creates some noise with individual upgrades PRs. Reference: https://docs.github.com/en/code-security/reference/supply-chain-security/dependabot-options-reference --- .github/dependabot.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..579161dc --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,18 @@ +version: 2 +updates: + - package-ecosystem: 'npm' + directories: + - '/' + - '/src/samples' + schedule: + interval: 'weekly' + commit-message: + prefix: 'chore' + include: 'scope' + groups: + npm-minor-patch: + patterns: + - '*' + update-types: + - 'minor' + - 'patch' From 87cd79774fa9662afc4188ae1af168a599286d67 Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Tue, 7 Apr 2026 10:27:23 +0200 Subject: [PATCH 44/51] ci: enable groups for dependabot (#394) Bring back the previous behavior of only having security updates. --- .github/dependabot.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 579161dc..d62a88f4 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,13 +6,12 @@ updates: - '/src/samples' schedule: interval: 'weekly' + open-pull-requests-limit: 0 commit-message: prefix: 'chore' include: 'scope' groups: - npm-minor-patch: + security-patches: + applies-to: security-updates patterns: - '*' - update-types: - - 'minor' - - 'patch' From e1d6c768308f645b910f7c5f6c41f0380a38b729 Mon Sep 17 00:00:00 2001 From: Ivan Shymko Date: Tue, 7 Apr 2026 10:58:03 +0200 Subject: [PATCH 45/51] chore: remove dependabot.yml (#400) --- .github/dependabot.yml | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index d62a88f4..00000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,17 +0,0 @@ -version: 2 -updates: - - package-ecosystem: 'npm' - directories: - - '/' - - '/src/samples' - schedule: - interval: 'weekly' - open-pull-requests-limit: 0 - commit-message: - prefix: 'chore' - include: 'scope' - groups: - security-patches: - applies-to: security-updates - patterns: - - '*' From fefb42e4063ad9352a684e4edf689b5b5b49a1f2 Mon Sep 17 00:00:00 2001 From: bartek-gralewicz Date: Mon, 11 May 2026 16:56:20 +0200 Subject: [PATCH 46/51] ci: Port npm-publish to main (#459) # Description Port npm-publish to main --- .github/workflows/npm-publish.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index 6506c477..cdfb7b9e 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -28,6 +28,13 @@ jobs: with: node-version: 18 registry-url: 'https://wombat-dressing-room.appspot.com/' - - run: npm publish --provenance --access public + + - name: Publish to NPM + run: | + if [ "${{ github.event.release.prerelease }}" = "true" ]; then + npm publish --provenance --access public --tag next + else + npm publish --provenance --access public + fi env: NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} From dbaccb964f9bb5d9ae7e993f797cebaeae52ac62 Mon Sep 17 00:00:00 2001 From: bartek-gralewicz Date: Tue, 12 May 2026 11:25:46 +0200 Subject: [PATCH 47/51] docs: Add info about alpha-release to the readme. (#466) # Description Add a note about an existing `alpha-release` in the main `README.md`. Mentioned the `epic/1.0...` branch and the ongoing v0.3 compatibility support tracked by #452. image --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4170e5db..7a54394b 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,14 @@ You can also find some samples [here](https://github.com/a2aproject/a2a-js/tree/ ## Compatibility -This SDK implements the A2A Protocol Specification [`v0.3.0`](https://a2a-protocol.org/v0.3.0/specification). +This SDK implements the A2A Protocol Specification [`v0.3`](https://a2a-protocol.org/v0.3.0/specification). + +> [!IMPORTANT] +> There is an [**alpha version**](https://github.com/a2aproject/a2a-js/releases?q=%22v1.0.0-alpha%22&expanded=true) available with support for [`v1.0`](https://a2a-protocol.org/v1.0.0/specification/) version. Development for this version is taking place in the [`epic/1.0_breaking_changes`](https://github.com/a2aproject/a2a-js/tree/epic/1.0_breaking_changes) branch. The work to add backward compatibility with the [`v0.3`](https://a2a-protocol.org/v0.3.0/specification) version is tracked in [issue #452](https://github.com/a2aproject/a2a-js/issues/452). +> You can install the latest alpha version using: +> ```bash +> npm install @a2a-js/sdk@next +> ``` | Transport | Client | Server | | :--- | :---: | :---: | From a7e4d5f53806551ee2483fe4389aab6f459f38aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 08:20:42 +0200 Subject: [PATCH 48/51] chore(deps-dev): bump fast-xml-parser from 5.5.7 to 5.7.1 in /src/samples (#421) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) from 5.5.7 to 5.7.1.
Release notes

Sourced from fast-xml-parser's releases.

upgrade @​nodable/entities and FXB

  • Use @nodable/entities v2.1.0
    • breaking changes
      • single entity scan. You're not allowed to use entity value to form another entity name.
      • you cant add numeric external entity
      • entity error message when expantion limit is crossed might change
    • typings are updated for new options related to process entity
    • please follow documentation of @nodable/entities for more detail.
    • performance
      • if processEntities is false, then there should not be impact on performance.
      • if processEntities is true, but you dont pass entity decoder separately then performance may degrade by approx 8-10%
      • if processEntities is true, and you pass entity decoder separately
        • if no entity then performance should be same as before
        • if there are entities then performance should be increased from past versions
    • ignoreAttributes is not required to be set to set xml version for NCR entity value
  • update 'fast-xml-builder' to sanitize malicious CDATA and comment's content

use @​nodable/entities to replace entities

  • No API change
  • No change in performance for basic usage
  • No typing change
  • No config change
  • new dependency
  • breaking: error messages for entities might have been changed.

Full Changelog: https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.12...v5.6.0

performance improvment, increase entity expansion default limit

  • increase default entity explansion limit as many projects demand for that
maxEntitySize: 10000,
maxExpansionDepth: 10000,
maxTotalExpansions: Infinity,
maxExpandedLength: 100000,
maxEntityCount: 1000,
  • performance improvement
    • reduce calls to toString
    • early return when entities are not present
    • prepare rawAttrsForMatcher only if user sets jPath: false

Full Changelog: https://github.com/NaturalIntelligence/fast-xml-parser/compare/v5.5.9...v5.5.10

fix typins and matcher instance in callbacks

combine typings file to avoid configuration changes pass readonly instance of matcher to the call backs to avoid accidental push/pop call

Changelog

Sourced from fast-xml-parser's changelog.

Note: If you find missing information about particular minor version, that version must have been changed without any functional change in this library.

Note: Due to some last quick changes on v4, detail of v4.5.3 & v4.5.4 are not updated here. v4.5.4x is the last tag of v4 in github repository. I'm extremely sorry for the confusion

5.7.1 / 2026-04-20

  • fix #705: attributesGroupName working with preserveOrder
  • fix #817: stackoverflow when tag expression is very long

5.7.0 / 2026-04-17

  • Use @nodable/entities v2.1.0
    • breaking changes
      • single entity scan. You're not allowed to user entity value to form another entity name.
      • you cant add numeric external entity
      • entity error message when expantion limit is crossed might change
    • typings are updated for new options related to process entity
    • please follow documentation of @nodable/entities for more detail.
    • performance
      • if processEntities is false, then there should not be impact on performance.
      • if processEntities is true, but you dont pass entity decoder separately then performance may degrade by approx 8-10%
      • if processEntities is true, and you pass entity decoder separately
        • if no entity then performance should be same as before
        • if there are entities then performance should be increased from past versions
    • ignoreAttributes is not required to be set to set xml version for NCR entity value
  • update 'fast-xml-builder' to sanitize malicious CDATA and comment's content

5.6.0 / 2026-04-15

  • fix: entity replacement for numeric entities
  • use @​nodable/entities to replace entities
    • this may change some error messages related to entities expansion limit or inavlid use
    • post check would be exposed in future version

5.5.12 / 2026-04-13

  • Performance Improvement: update path-expression-matcher
    • use proxy pattern than Proxy class

5.5.11 / 2026-04-08

  • Performance Improvement
    • integrate ExpressionSet for stopNodes

5.5.10 / 2026-04-03

  • increase default entity explansion limit as many projects demand for that
  • performance improvement
    • reduce calls to toString
    • early return when entities are not present
    • prepare rawAttrsForMatcher only if user sets jPath: false

5.5.9 / 2026-03-23

  • combine typing files

... (truncated)

Commits
  • 0f08303 fix typo
  • f529642 update to release v5.7.0
  • 52a8583 Revert "improve performance of attributes reading"
  • 8d187f9 update builder
  • e174168 improve performance of attributes reading
  • 79a8dde update docs
  • f5cd5a5 set xml version to decoder even if attributes are ignored
  • f44b923 remove unwanted tests
  • 869ec8b Use @​nodable/entities v2.1.0
  • 7cb49e5 update release detail
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=fast-xml-parser&package-manager=npm_and_yarn&previous-version=5.5.7&new-version=5.7.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ivan Shymko --- src/samples/package-lock.json | 46 +++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/src/samples/package-lock.json b/src/samples/package-lock.json index 4eba9ffb..df02001b 100644 --- a/src/samples/package-lock.json +++ b/src/samples/package-lock.json @@ -1891,6 +1891,21 @@ "url": "https://opencollective.com/js-sdsl" } }, + "node_modules/@nodable/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-nyT7T3nbMyBI/lvr6L5TyWbFJAI9FTgVRakNoBqCD+PmID8DzFrrNdLLtHMwMszOtqZa8PAOV24ZqDnQrhQINA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/nodable" + } + ], + "license": "MIT", + "optional": true, + "peer": true + }, "node_modules/@opentelemetry/api": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", @@ -4750,9 +4765,9 @@ "license": "BSD-3-Clause" }, "node_modules/fast-xml-builder": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", - "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.5.tgz", + "integrity": "sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==", "dev": true, "funding": [ { @@ -4768,9 +4783,9 @@ } }, "node_modules/fast-xml-parser": { - "version": "5.5.7", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.7.tgz", - "integrity": "sha512-LteOsISQ2GEiDHZch6L9hB0+MLoYVLToR7xotrzU0opCICBkxOPgHAy1HxAvtxfJNXDJpgAsQN30mkrfpO2Prg==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.7.1.tgz", + "integrity": "sha512-8Cc3f8GUGUULg34pBch/KGyPLglS+OFs05deyOlY7fL2MTagYPKrVQNmR1fLF/yJ9PH5ZSTd3YDF6pnmeZU+zA==", "dev": true, "funding": [ { @@ -4782,9 +4797,10 @@ "optional": true, "peer": true, "dependencies": { - "fast-xml-builder": "^1.1.4", - "path-expression-matcher": "^1.1.3", - "strnum": "^2.2.0" + "@nodable/entities": "^2.1.0", + "fast-xml-builder": "^1.1.5", + "path-expression-matcher": "^1.5.0", + "strnum": "^2.2.3" }, "bin": { "fxparser": "src/cli/cli.js" @@ -6584,9 +6600,9 @@ } }, "node_modules/path-expression-matcher": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", - "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz", + "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==", "dev": true, "funding": [ { @@ -7344,9 +7360,9 @@ } }, "node_modules/strnum": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.1.tgz", - "integrity": "sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.3.tgz", + "integrity": "sha512-oKx6RUCuHfT3oyVjtnrmn19H1SiCqgJSg+54XqURKp5aCMbrXrhLjRN9TjuwMjiYstZ0MzDrHqkGZ5dFTKd+zg==", "dev": true, "funding": [ { From 12df0bce0e45f44ed496667f6d29a528db8b822e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 08:23:18 +0200 Subject: [PATCH 49/51] chore(deps-dev): bump fast-xml-builder from 1.1.5 to 1.2.0 in /src/samples (#456) Bumps [fast-xml-builder](https://github.com/NaturalIntelligence/fast-xml-builder) from 1.1.5 to 1.2.0.
Changelog

Sourced from fast-xml-builder's changelog.

1.2.0 (2026-05-08)

  • Add support for sanitizeName option
  • Support xml-naming for validating and sanitizing tag and attribute names

1.1.9 (2026-05-06)

  • fix: format output for preserve order when indent by is set to empty string

1.1.8 (2026-05-05)

  • fix: skip text property for PI tags
  • improve typings

1.1.7 (2026--05-04)

  • fix security issues when attribute value contains quotes

1.1.6 (2026--05-04)

  • fix security issues related to comment
  • skip comment with null value

1.1.5 (2026-04-17)

  • fix security issues related to comment and cdata

1.1.4 (2026-03-16)

  • support maxNestedTags option

1.1.3 (2026-03-13)

  • declare Matcher & Expression as unknown so user is not forced to install path-expression-matcher

1.1.2 (2026-03-11)

  • fix typings

1.1.1 (2026-03-11)

  • upgrade path-expression-matcher to 1.1.3

1.1.0 (2026-03-10)

Commits

Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- src/samples/package-lock.json | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/samples/package-lock.json b/src/samples/package-lock.json index df02001b..e159bdff 100644 --- a/src/samples/package-lock.json +++ b/src/samples/package-lock.json @@ -4765,9 +4765,9 @@ "license": "BSD-3-Clause" }, "node_modules/fast-xml-builder": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.5.tgz", - "integrity": "sha512-4TJn/8FKLeslLAH3dnohXqE3QSoxkhvaMzepOIZytwJXZO69Bfz0HBdDHzOTOon6G59Zrk6VQ2bEiv1t61rfkA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz", + "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==", "dev": true, "funding": [ { @@ -4779,7 +4779,8 @@ "optional": true, "peer": true, "dependencies": { - "path-expression-matcher": "^1.1.3" + "path-expression-matcher": "^1.5.0", + "xml-naming": "^0.1.0" } }, "node_modules/fast-xml-parser": { @@ -7830,6 +7831,24 @@ "dev": true, "license": "ISC" }, + "node_modules/xml-naming": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz", + "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/xorshift": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/xorshift/-/xorshift-1.2.0.tgz", From f7a6c7eb97ff9c7073dba7cd5486314b2dc00772 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 08:30:21 +0200 Subject: [PATCH 50/51] chore(deps-dev): bump protobufjs from 7.5.4 to 7.5.8 (#469) Bumps [protobufjs](https://github.com/protobufjs/protobuf.js) from 7.5.4 to 7.5.8.
Release notes

Sourced from protobufjs's releases.

protobufjs: v7.5.8

7.5.8 (2026-05-12)

Bug Fixes

protobufjs: v7.5.7

7.5.7 (2026-05-09)

Bug Fixes

protobufjs: v7.5.6

7.5.6 (2026-04-27)

Bug Fixes

  • Backport input hardening and CLI fixes to 7.x (#2173) (75392ea)

v7.5.5

This release backports two reported security issues to 7.x branch.

  • fix: do not allow setting __proto__ in Message constructor (#2126)
  • fix: filter invalid characters from the type name (#2127)

Full Changelog: https://github.com/protobufjs/protobuf.js/compare/protobufjs-v7.5.4...protobufjs-v7.5.5

Changelog

Sourced from protobufjs's changelog.

7.5.8 (2026-05-12)

Bug Fixes

7.5.7 (2026-05-09)

Bug Fixes

7.5.6 (2026-04-27)

Bug Fixes

  • Backport input hardening and CLI fixes to 7.x (#2173) (75392ea)
Commits
Maintainer changes

This version was pushed to npm by GitHub Actions, a new releaser for protobufjs since your current version.


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=protobufjs&package-manager=npm_and_yarn&previous-version=7.5.4&new-version=7.5.8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ivan Shymko --- package-lock.json | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index ac5385cd..cf2468bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2855,9 +2855,9 @@ "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==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", "dev": true, "license": "BSD-3-Clause" }, @@ -2887,9 +2887,9 @@ "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.1.tgz", + "integrity": "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==", "dev": true, "license": "BSD-3-Clause" }, @@ -2908,9 +2908,9 @@ "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", + "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", "dev": true, "license": "BSD-3-Clause" }, @@ -6567,23 +6567,23 @@ } }, "node_modules/protobufjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.8.tgz", + "integrity": "sha512-dvpCIeLPbXZS/Ete7yLaO7RenOdken2NHKykBXbsaGxZT0UTltcarBciw+A78SRQs9iMAAVpsYA+l8b1hTePIA==", "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/codegen": "^2.0.5", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", + "@protobufjs/inquire": "^1.1.1", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", "long": "^5.0.0" }, From 06fc41a67184e9d7c6ef0349c4b5506c5c2a011b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 May 2026 08:31:52 +0200 Subject: [PATCH 51/51] chore(deps): bump protobufjs from 7.5.4 to 7.5.8 in /src/samples (#470) Bumps [protobufjs](https://github.com/protobufjs/protobuf.js) from 7.5.4 to 7.5.8.
Release notes

Sourced from protobufjs's releases.

protobufjs: v7.5.8

7.5.8 (2026-05-12)

Bug Fixes

protobufjs: v7.5.7

7.5.7 (2026-05-09)

Bug Fixes

protobufjs: v7.5.6

7.5.6 (2026-04-27)

Bug Fixes

  • Backport input hardening and CLI fixes to 7.x (#2173) (75392ea)

v7.5.5

This release backports two reported security issues to 7.x branch.

  • fix: do not allow setting __proto__ in Message constructor (#2126)
  • fix: filter invalid characters from the type name (#2127)

Full Changelog: https://github.com/protobufjs/protobuf.js/compare/protobufjs-v7.5.4...protobufjs-v7.5.5

Changelog

Sourced from protobufjs's changelog.

7.5.8 (2026-05-12)

Bug Fixes

7.5.7 (2026-05-09)

Bug Fixes

7.5.6 (2026-04-27)

Bug Fixes

  • Backport input hardening and CLI fixes to 7.x (#2173) (75392ea)
Commits
Maintainer changes

This version was pushed to npm by GitHub Actions, a new releaser for protobufjs since your current version.


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=protobufjs&package-manager=npm_and_yarn&previous-version=7.5.4&new-version=7.5.8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself) You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/a2aproject/a2a-js/network/alerts).
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ivan Shymko --- src/samples/package-lock.json | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/samples/package-lock.json b/src/samples/package-lock.json index e159bdff..4eded078 100644 --- a/src/samples/package-lock.json +++ b/src/samples/package-lock.json @@ -3465,9 +3465,9 @@ "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==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/eventemitter": { @@ -3493,9 +3493,9 @@ "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.1.tgz", + "integrity": "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==", "license": "BSD-3-Clause" }, "node_modules/@protobufjs/path": { @@ -3511,9 +3511,9 @@ "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", + "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", "license": "BSD-3-Clause" }, "node_modules/@so-ric/colorspace": { @@ -6781,22 +6781,22 @@ } }, "node_modules/protobufjs": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.4.tgz", - "integrity": "sha512-CvexbZtbov6jW2eXAvLukXjXUW1TzFaivC46BpWc/3BpcCysb5Vffu+B3XHMm8lVEuy2Mm4XGex8hBSg1yapPg==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.8.tgz", + "integrity": "sha512-dvpCIeLPbXZS/Ete7yLaO7RenOdken2NHKykBXbsaGxZT0UTltcarBciw+A78SRQs9iMAAVpsYA+l8b1hTePIA==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.4", + "@protobufjs/codegen": "^2.0.5", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.0", + "@protobufjs/inquire": "^1.1.1", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.0", + "@protobufjs/utf8": "^1.1.1", "@types/node": ">=13.7.0", "long": "^5.0.0" },