diff --git a/.yarn/cache/@biomejs-biome-npm-1.9.4-9e22cce864-0bb448d9cf.zip b/.yarn/cache/@biomejs-biome-npm-1.9.4-9e22cce864-0bb448d9cf.zip new file mode 100644 index 0000000..488f568 Binary files /dev/null and b/.yarn/cache/@biomejs-biome-npm-1.9.4-9e22cce864-0bb448d9cf.zip differ diff --git a/.yarn/cache/@biomejs-cli-linux-x64-npm-1.9.4-2d8259aa1b-8.zip b/.yarn/cache/@biomejs-cli-linux-x64-npm-1.9.4-2d8259aa1b-8.zip new file mode 100644 index 0000000..7942953 Binary files /dev/null and b/.yarn/cache/@biomejs-cli-linux-x64-npm-1.9.4-2d8259aa1b-8.zip differ diff --git a/.yarn/cache/@cloudflare-workers-types-npm-4.20250429.0-a9a776918f-5e7a79f051.zip b/.yarn/cache/@cloudflare-workers-types-npm-4.20250429.0-a9a776918f-5e7a79f051.zip new file mode 100644 index 0000000..7310b60 Binary files /dev/null and b/.yarn/cache/@cloudflare-workers-types-npm-4.20250429.0-a9a776918f-5e7a79f051.zip differ diff --git a/.yarn/cache/@modelcontextprotocol-sdk-npm-1.6.1-b46313efe7-fe1f6a4e08.zip b/.yarn/cache/@modelcontextprotocol-sdk-npm-1.6.1-b46313efe7-fe1f6a4e08.zip new file mode 100644 index 0000000..1a2249d Binary files /dev/null and b/.yarn/cache/@modelcontextprotocol-sdk-npm-1.6.1-b46313efe7-fe1f6a4e08.zip differ diff --git a/.yarn/cache/@tsconfig-bun-npm-1.0.7-9ba40218ab-04f6c2af3b.zip b/.yarn/cache/@tsconfig-bun-npm-1.0.7-9ba40218ab-04f6c2af3b.zip new file mode 100644 index 0000000..5929f83 Binary files /dev/null and b/.yarn/cache/@tsconfig-bun-npm-1.0.7-9ba40218ab-04f6c2af3b.zip differ diff --git a/.yarn/cache/@types-bun-npm-1.2.10-9a19aedb24-562b349a62.zip b/.yarn/cache/@types-bun-npm-1.2.10-9a19aedb24-562b349a62.zip new file mode 100644 index 0000000..ff31aa8 Binary files /dev/null and b/.yarn/cache/@types-bun-npm-1.2.10-9a19aedb24-562b349a62.zip differ diff --git a/.yarn/cache/@types-node-fetch-npm-2.6.12-bc850f58da-9647e68f9a.zip b/.yarn/cache/@types-node-fetch-npm-2.6.12-bc850f58da-9647e68f9a.zip new file mode 100644 index 0000000..d1fb5c5 Binary files /dev/null and b/.yarn/cache/@types-node-fetch-npm-2.6.12-bc850f58da-9647e68f9a.zip differ diff --git a/.yarn/cache/@types-node-npm-18.19.87-e7673b0f5a-83ca9e0c6b.zip b/.yarn/cache/@types-node-npm-18.19.87-e7673b0f5a-83ca9e0c6b.zip new file mode 100644 index 0000000..2574ce2 Binary files /dev/null and b/.yarn/cache/@types-node-npm-18.19.87-e7673b0f5a-83ca9e0c6b.zip differ diff --git a/.yarn/cache/@types-node-npm-22.15.3-ab71dd4f9d-26618a9fdf.zip b/.yarn/cache/@types-node-npm-22.15.3-ab71dd4f9d-26618a9fdf.zip new file mode 100644 index 0000000..6bc6a49 Binary files /dev/null and b/.yarn/cache/@types-node-npm-22.15.3-ab71dd4f9d-26618a9fdf.zip differ diff --git a/.yarn/cache/@types-uuid-npm-9.0.8-3eeeaa5abb-b8c60b7ba8.zip b/.yarn/cache/@types-uuid-npm-9.0.8-3eeeaa5abb-b8c60b7ba8.zip new file mode 100644 index 0000000..3e5c2a3 Binary files /dev/null and b/.yarn/cache/@types-uuid-npm-9.0.8-3eeeaa5abb-b8c60b7ba8.zip differ diff --git a/.yarn/cache/abort-controller-npm-3.0.0-2f3a9a2bcb-170bdba9b4.zip b/.yarn/cache/abort-controller-npm-3.0.0-2f3a9a2bcb-170bdba9b4.zip new file mode 100644 index 0000000..c9b0273 Binary files /dev/null and b/.yarn/cache/abort-controller-npm-3.0.0-2f3a9a2bcb-170bdba9b4.zip differ diff --git a/.yarn/cache/accepts-npm-2.0.0-134226d1d0-49fe6c050c.zip b/.yarn/cache/accepts-npm-2.0.0-134226d1d0-49fe6c050c.zip new file mode 100644 index 0000000..42c5bf4 Binary files /dev/null and b/.yarn/cache/accepts-npm-2.0.0-134226d1d0-49fe6c050c.zip differ diff --git a/.yarn/cache/agentkeepalive-npm-4.6.0-6b61ca2a37-b3cdd10efc.zip b/.yarn/cache/agentkeepalive-npm-4.6.0-6b61ca2a37-b3cdd10efc.zip new file mode 100644 index 0000000..c0e0cb9 Binary files /dev/null and b/.yarn/cache/agentkeepalive-npm-4.6.0-6b61ca2a37-b3cdd10efc.zip differ diff --git a/.yarn/cache/asynckit-npm-0.4.0-c718858525-7b78c451df.zip b/.yarn/cache/asynckit-npm-0.4.0-c718858525-7b78c451df.zip new file mode 100644 index 0000000..bb08c24 Binary files /dev/null and b/.yarn/cache/asynckit-npm-0.4.0-c718858525-7b78c451df.zip differ diff --git a/.yarn/cache/available-typed-arrays-npm-1.0.7-e5e5d79687-1aa3ffbfe6.zip b/.yarn/cache/available-typed-arrays-npm-1.0.7-e5e5d79687-1aa3ffbfe6.zip new file mode 100644 index 0000000..b95bc91 Binary files /dev/null and b/.yarn/cache/available-typed-arrays-npm-1.0.7-e5e5d79687-1aa3ffbfe6.zip differ diff --git a/.yarn/cache/aws-sdk-npm-2.1692.0-2af365c888-7b245fab02.zip b/.yarn/cache/aws-sdk-npm-2.1692.0-2af365c888-7b245fab02.zip new file mode 100644 index 0000000..7a1c058 Binary files /dev/null and b/.yarn/cache/aws-sdk-npm-2.1692.0-2af365c888-7b245fab02.zip differ diff --git a/.yarn/cache/aws4fetch-npm-1.0.18-5f5dbffd9a-a8185388a6.zip b/.yarn/cache/aws4fetch-npm-1.0.18-5f5dbffd9a-a8185388a6.zip new file mode 100644 index 0000000..d09bd6d Binary files /dev/null and b/.yarn/cache/aws4fetch-npm-1.0.18-5f5dbffd9a-a8185388a6.zip differ diff --git a/.yarn/cache/base64-js-npm-1.5.1-b2f7275641-669632eb37.zip b/.yarn/cache/base64-js-npm-1.5.1-b2f7275641-669632eb37.zip new file mode 100644 index 0000000..a49ec87 Binary files /dev/null and b/.yarn/cache/base64-js-npm-1.5.1-b2f7275641-669632eb37.zip differ diff --git a/.yarn/cache/body-parser-npm-2.2.0-b3d2aaf918-7fe3a2d288.zip b/.yarn/cache/body-parser-npm-2.2.0-b3d2aaf918-7fe3a2d288.zip new file mode 100644 index 0000000..aff092e Binary files /dev/null and b/.yarn/cache/body-parser-npm-2.2.0-b3d2aaf918-7fe3a2d288.zip differ diff --git a/.yarn/cache/buffer-npm-4.9.2-9e40b5e87a-8801bc1ba0.zip b/.yarn/cache/buffer-npm-4.9.2-9e40b5e87a-8801bc1ba0.zip new file mode 100644 index 0000000..d2ab6cb Binary files /dev/null and b/.yarn/cache/buffer-npm-4.9.2-9e40b5e87a-8801bc1ba0.zip differ diff --git a/.yarn/cache/bun-types-npm-1.2.10-793599e7e7-f011c6c94a.zip b/.yarn/cache/bun-types-npm-1.2.10-793599e7e7-f011c6c94a.zip new file mode 100644 index 0000000..549aa74 Binary files /dev/null and b/.yarn/cache/bun-types-npm-1.2.10-793599e7e7-f011c6c94a.zip differ diff --git a/.yarn/cache/bytes-npm-3.1.2-28b8643004-e4bcd3948d.zip b/.yarn/cache/bytes-npm-3.1.2-28b8643004-e4bcd3948d.zip new file mode 100644 index 0000000..07737e5 Binary files /dev/null and b/.yarn/cache/bytes-npm-3.1.2-28b8643004-e4bcd3948d.zip differ diff --git a/.yarn/cache/call-bind-apply-helpers-npm-1.0.2-3eedbea3bb-b2863d74fc.zip b/.yarn/cache/call-bind-apply-helpers-npm-1.0.2-3eedbea3bb-b2863d74fc.zip new file mode 100644 index 0000000..4f13176 Binary files /dev/null and b/.yarn/cache/call-bind-apply-helpers-npm-1.0.2-3eedbea3bb-b2863d74fc.zip differ diff --git a/.yarn/cache/call-bind-npm-1.0.8-4145a20621-aa2899bce9.zip b/.yarn/cache/call-bind-npm-1.0.8-4145a20621-aa2899bce9.zip new file mode 100644 index 0000000..307f097 Binary files /dev/null and b/.yarn/cache/call-bind-npm-1.0.8-4145a20621-aa2899bce9.zip differ diff --git a/.yarn/cache/call-bound-npm-1.0.4-359cfa32c7-2f6399488d.zip b/.yarn/cache/call-bound-npm-1.0.4-359cfa32c7-2f6399488d.zip new file mode 100644 index 0000000..961643e Binary files /dev/null and b/.yarn/cache/call-bound-npm-1.0.4-359cfa32c7-2f6399488d.zip differ diff --git a/.yarn/cache/cloudflare-npm-4.2.0-d966111482-695f463291.zip b/.yarn/cache/cloudflare-npm-4.2.0-d966111482-695f463291.zip new file mode 100644 index 0000000..bf91562 Binary files /dev/null and b/.yarn/cache/cloudflare-npm-4.2.0-d966111482-695f463291.zip differ diff --git a/.yarn/cache/combined-stream-npm-1.0.8-dc14d4a63a-49fa4aeb49.zip b/.yarn/cache/combined-stream-npm-1.0.8-dc14d4a63a-49fa4aeb49.zip new file mode 100644 index 0000000..89c8caa Binary files /dev/null and b/.yarn/cache/combined-stream-npm-1.0.8-dc14d4a63a-49fa4aeb49.zip differ diff --git a/.yarn/cache/content-disposition-npm-1.0.0-3349ca3b40-b27e2579fe.zip b/.yarn/cache/content-disposition-npm-1.0.0-3349ca3b40-b27e2579fe.zip new file mode 100644 index 0000000..3f16797 Binary files /dev/null and b/.yarn/cache/content-disposition-npm-1.0.0-3349ca3b40-b27e2579fe.zip differ diff --git a/.yarn/cache/content-type-npm-1.0.5-3e037bf9ab-566271e0a2.zip b/.yarn/cache/content-type-npm-1.0.5-3e037bf9ab-566271e0a2.zip new file mode 100644 index 0000000..728f06f Binary files /dev/null and b/.yarn/cache/content-type-npm-1.0.5-3e037bf9ab-566271e0a2.zip differ diff --git a/.yarn/cache/cookie-npm-0.7.2-6ea9ee4231-9bf8555e33.zip b/.yarn/cache/cookie-npm-0.7.2-6ea9ee4231-9bf8555e33.zip new file mode 100644 index 0000000..02da380 Binary files /dev/null and b/.yarn/cache/cookie-npm-0.7.2-6ea9ee4231-9bf8555e33.zip differ diff --git a/.yarn/cache/cookie-signature-npm-1.2.2-8474a8ac29-1ad4f9b390.zip b/.yarn/cache/cookie-signature-npm-1.2.2-8474a8ac29-1ad4f9b390.zip new file mode 100644 index 0000000..4babab4 Binary files /dev/null and b/.yarn/cache/cookie-signature-npm-1.2.2-8474a8ac29-1ad4f9b390.zip differ diff --git a/.yarn/cache/core-util-is-npm-1.0.3-ca74b76c90-9de8597363.zip b/.yarn/cache/core-util-is-npm-1.0.3-ca74b76c90-9de8597363.zip new file mode 100644 index 0000000..2c844fe Binary files /dev/null and b/.yarn/cache/core-util-is-npm-1.0.3-ca74b76c90-9de8597363.zip differ diff --git a/.yarn/cache/cors-npm-2.8.5-c9935a2d12-ced838404c.zip b/.yarn/cache/cors-npm-2.8.5-c9935a2d12-ced838404c.zip new file mode 100644 index 0000000..b7ab2c5 Binary files /dev/null and b/.yarn/cache/cors-npm-2.8.5-c9935a2d12-ced838404c.zip differ diff --git a/.yarn/cache/debug-npm-4.4.0-f6efe76023-fb42df878d.zip b/.yarn/cache/debug-npm-4.4.0-f6efe76023-fb42df878d.zip new file mode 100644 index 0000000..9d9b13a Binary files /dev/null and b/.yarn/cache/debug-npm-4.4.0-f6efe76023-fb42df878d.zip differ diff --git a/.yarn/cache/define-data-property-npm-1.1.4-4cbd8efc51-8068ee6cab.zip b/.yarn/cache/define-data-property-npm-1.1.4-4cbd8efc51-8068ee6cab.zip new file mode 100644 index 0000000..908aa3c Binary files /dev/null and b/.yarn/cache/define-data-property-npm-1.1.4-4cbd8efc51-8068ee6cab.zip differ diff --git a/.yarn/cache/delayed-stream-npm-1.0.0-c5a4c4cc02-46fe6e83e2.zip b/.yarn/cache/delayed-stream-npm-1.0.0-c5a4c4cc02-46fe6e83e2.zip new file mode 100644 index 0000000..7151434 Binary files /dev/null and b/.yarn/cache/delayed-stream-npm-1.0.0-c5a4c4cc02-46fe6e83e2.zip differ diff --git a/.yarn/cache/depd-npm-2.0.0-b6c51a4b43-abbe19c768.zip b/.yarn/cache/depd-npm-2.0.0-b6c51a4b43-abbe19c768.zip new file mode 100644 index 0000000..30053d1 Binary files /dev/null and b/.yarn/cache/depd-npm-2.0.0-b6c51a4b43-abbe19c768.zip differ diff --git a/.yarn/cache/dunder-proto-npm-1.0.1-90eb6829db-149207e36f.zip b/.yarn/cache/dunder-proto-npm-1.0.1-90eb6829db-149207e36f.zip new file mode 100644 index 0000000..930579f Binary files /dev/null and b/.yarn/cache/dunder-proto-npm-1.0.1-90eb6829db-149207e36f.zip differ diff --git a/.yarn/cache/ee-first-npm-1.1.1-33f8535b39-1b4cac778d.zip b/.yarn/cache/ee-first-npm-1.1.1-33f8535b39-1b4cac778d.zip new file mode 100644 index 0000000..458439c Binary files /dev/null and b/.yarn/cache/ee-first-npm-1.1.1-33f8535b39-1b4cac778d.zip differ diff --git a/.yarn/cache/encodeurl-npm-2.0.0-3660bcc92a-abf5cd51b7.zip b/.yarn/cache/encodeurl-npm-2.0.0-3660bcc92a-abf5cd51b7.zip new file mode 100644 index 0000000..2a60a77 Binary files /dev/null and b/.yarn/cache/encodeurl-npm-2.0.0-3660bcc92a-abf5cd51b7.zip differ diff --git a/.yarn/cache/es-define-property-npm-1.0.1-3fc6324f1c-0512f4e5d5.zip b/.yarn/cache/es-define-property-npm-1.0.1-3fc6324f1c-0512f4e5d5.zip new file mode 100644 index 0000000..96e58e9 Binary files /dev/null and b/.yarn/cache/es-define-property-npm-1.0.1-3fc6324f1c-0512f4e5d5.zip differ diff --git a/.yarn/cache/es-errors-npm-1.3.0-fda0c9b8a8-ec1414527a.zip b/.yarn/cache/es-errors-npm-1.3.0-fda0c9b8a8-ec1414527a.zip new file mode 100644 index 0000000..0ed2323 Binary files /dev/null and b/.yarn/cache/es-errors-npm-1.3.0-fda0c9b8a8-ec1414527a.zip differ diff --git a/.yarn/cache/es-object-atoms-npm-1.1.1-362d8043c2-214d376728.zip b/.yarn/cache/es-object-atoms-npm-1.1.1-362d8043c2-214d376728.zip new file mode 100644 index 0000000..32b4ce8 Binary files /dev/null and b/.yarn/cache/es-object-atoms-npm-1.1.1-362d8043c2-214d376728.zip differ diff --git a/.yarn/cache/es-set-tostringtag-npm-2.1.0-4e55705d3f-789f35de4b.zip b/.yarn/cache/es-set-tostringtag-npm-2.1.0-4e55705d3f-789f35de4b.zip new file mode 100644 index 0000000..571541a Binary files /dev/null and b/.yarn/cache/es-set-tostringtag-npm-2.1.0-4e55705d3f-789f35de4b.zip differ diff --git a/.yarn/cache/escape-html-npm-1.0.3-376c22ee74-6213ca9ae0.zip b/.yarn/cache/escape-html-npm-1.0.3-376c22ee74-6213ca9ae0.zip new file mode 100644 index 0000000..d12a72b Binary files /dev/null and b/.yarn/cache/escape-html-npm-1.0.3-376c22ee74-6213ca9ae0.zip differ diff --git a/.yarn/cache/etag-npm-1.8.1-54a3b989d9-571aeb3dbe.zip b/.yarn/cache/etag-npm-1.8.1-54a3b989d9-571aeb3dbe.zip new file mode 100644 index 0000000..e4f07e5 Binary files /dev/null and b/.yarn/cache/etag-npm-1.8.1-54a3b989d9-571aeb3dbe.zip differ diff --git a/.yarn/cache/event-target-shim-npm-5.0.1-cb48709025-1ffe3bb22a.zip b/.yarn/cache/event-target-shim-npm-5.0.1-cb48709025-1ffe3bb22a.zip new file mode 100644 index 0000000..565cdc6 Binary files /dev/null and b/.yarn/cache/event-target-shim-npm-5.0.1-cb48709025-1ffe3bb22a.zip differ diff --git a/.yarn/cache/events-npm-1.1.1-ca9e5d580e-40431eb005.zip b/.yarn/cache/events-npm-1.1.1-ca9e5d580e-40431eb005.zip new file mode 100644 index 0000000..826f7d0 Binary files /dev/null and b/.yarn/cache/events-npm-1.1.1-ca9e5d580e-40431eb005.zip differ diff --git a/.yarn/cache/eventsource-npm-3.0.6-4c28c6ce52-ac3bc3cc33.zip b/.yarn/cache/eventsource-npm-3.0.6-4c28c6ce52-ac3bc3cc33.zip new file mode 100644 index 0000000..e07bfb0 Binary files /dev/null and b/.yarn/cache/eventsource-npm-3.0.6-4c28c6ce52-ac3bc3cc33.zip differ diff --git a/.yarn/cache/eventsource-parser-npm-3.0.1-4edb8913c9-737f78d133.zip b/.yarn/cache/eventsource-parser-npm-3.0.1-4edb8913c9-737f78d133.zip new file mode 100644 index 0000000..fb525e4 Binary files /dev/null and b/.yarn/cache/eventsource-parser-npm-3.0.1-4edb8913c9-737f78d133.zip differ diff --git a/.yarn/cache/express-npm-5.1.0-e44442bf7d-06e6141780.zip b/.yarn/cache/express-npm-5.1.0-e44442bf7d-06e6141780.zip new file mode 100644 index 0000000..9be6dad Binary files /dev/null and b/.yarn/cache/express-npm-5.1.0-e44442bf7d-06e6141780.zip differ diff --git a/.yarn/cache/express-rate-limit-npm-7.5.0-e9898135bd-2807341039.zip b/.yarn/cache/express-rate-limit-npm-7.5.0-e9898135bd-2807341039.zip new file mode 100644 index 0000000..89deaf8 Binary files /dev/null and b/.yarn/cache/express-rate-limit-npm-7.5.0-e9898135bd-2807341039.zip differ diff --git a/.yarn/cache/finalhandler-npm-2.1.0-395f86ed5d-27ca9cc83b.zip b/.yarn/cache/finalhandler-npm-2.1.0-395f86ed5d-27ca9cc83b.zip new file mode 100644 index 0000000..b5a40f3 Binary files /dev/null and b/.yarn/cache/finalhandler-npm-2.1.0-395f86ed5d-27ca9cc83b.zip differ diff --git a/.yarn/cache/for-each-npm-0.3.5-b74c5c5ba7-3c986d7e11.zip b/.yarn/cache/for-each-npm-0.3.5-b74c5c5ba7-3c986d7e11.zip new file mode 100644 index 0000000..4dd141c Binary files /dev/null and b/.yarn/cache/for-each-npm-0.3.5-b74c5c5ba7-3c986d7e11.zip differ diff --git a/.yarn/cache/form-data-encoder-npm-1.7.2-e6028ef027-aeebd87a1c.zip b/.yarn/cache/form-data-encoder-npm-1.7.2-e6028ef027-aeebd87a1c.zip new file mode 100644 index 0000000..6c1b9e1 Binary files /dev/null and b/.yarn/cache/form-data-encoder-npm-1.7.2-e6028ef027-aeebd87a1c.zip differ diff --git a/.yarn/cache/form-data-npm-4.0.2-d2e89057d5-e887298b22.zip b/.yarn/cache/form-data-npm-4.0.2-d2e89057d5-e887298b22.zip new file mode 100644 index 0000000..ead14ba Binary files /dev/null and b/.yarn/cache/form-data-npm-4.0.2-d2e89057d5-e887298b22.zip differ diff --git a/.yarn/cache/formdata-node-npm-4.4.1-1fb15d9b89-d91d4f667c.zip b/.yarn/cache/formdata-node-npm-4.4.1-1fb15d9b89-d91d4f667c.zip new file mode 100644 index 0000000..b8a0b82 Binary files /dev/null and b/.yarn/cache/formdata-node-npm-4.4.1-1fb15d9b89-d91d4f667c.zip differ diff --git a/.yarn/cache/forwarded-npm-0.2.0-6473dabe35-fd27e2394d.zip b/.yarn/cache/forwarded-npm-0.2.0-6473dabe35-fd27e2394d.zip new file mode 100644 index 0000000..64cd57a Binary files /dev/null and b/.yarn/cache/forwarded-npm-0.2.0-6473dabe35-fd27e2394d.zip differ diff --git a/.yarn/cache/fresh-npm-2.0.0-b0c1795dff-38b9828352.zip b/.yarn/cache/fresh-npm-2.0.0-b0c1795dff-38b9828352.zip new file mode 100644 index 0000000..ea8027e Binary files /dev/null and b/.yarn/cache/fresh-npm-2.0.0-b0c1795dff-38b9828352.zip differ diff --git a/.yarn/cache/function-bind-npm-1.1.2-7a55be9b03-2b0ff4ce70.zip b/.yarn/cache/function-bind-npm-1.1.2-7a55be9b03-2b0ff4ce70.zip new file mode 100644 index 0000000..55fbdad Binary files /dev/null and b/.yarn/cache/function-bind-npm-1.1.2-7a55be9b03-2b0ff4ce70.zip differ diff --git a/.yarn/cache/get-intrinsic-npm-1.3.0-35558f27b6-301008e448.zip b/.yarn/cache/get-intrinsic-npm-1.3.0-35558f27b6-301008e448.zip new file mode 100644 index 0000000..071390a Binary files /dev/null and b/.yarn/cache/get-intrinsic-npm-1.3.0-35558f27b6-301008e448.zip differ diff --git a/.yarn/cache/get-proto-npm-1.0.1-4d30bac614-4fc96afdb5.zip b/.yarn/cache/get-proto-npm-1.0.1-4d30bac614-4fc96afdb5.zip new file mode 100644 index 0000000..65fbfe0 Binary files /dev/null and b/.yarn/cache/get-proto-npm-1.0.1-4d30bac614-4fc96afdb5.zip differ diff --git a/.yarn/cache/gopd-npm-1.2.0-df89ffa78e-cc6d8e655e.zip b/.yarn/cache/gopd-npm-1.2.0-df89ffa78e-cc6d8e655e.zip new file mode 100644 index 0000000..54fd29f Binary files /dev/null and b/.yarn/cache/gopd-npm-1.2.0-df89ffa78e-cc6d8e655e.zip differ diff --git a/.yarn/cache/has-property-descriptors-npm-1.0.2-d7077d09f1-fcbb246ea2.zip b/.yarn/cache/has-property-descriptors-npm-1.0.2-d7077d09f1-fcbb246ea2.zip new file mode 100644 index 0000000..c331755 Binary files /dev/null and b/.yarn/cache/has-property-descriptors-npm-1.0.2-d7077d09f1-fcbb246ea2.zip differ diff --git a/.yarn/cache/has-symbols-npm-1.1.0-9aa7dc2ac1-b2316c7302.zip b/.yarn/cache/has-symbols-npm-1.1.0-9aa7dc2ac1-b2316c7302.zip new file mode 100644 index 0000000..cba99a4 Binary files /dev/null and b/.yarn/cache/has-symbols-npm-1.1.0-9aa7dc2ac1-b2316c7302.zip differ diff --git a/.yarn/cache/has-tostringtag-npm-1.0.2-74a4800369-999d60bb75.zip b/.yarn/cache/has-tostringtag-npm-1.0.2-74a4800369-999d60bb75.zip new file mode 100644 index 0000000..012a725 Binary files /dev/null and b/.yarn/cache/has-tostringtag-npm-1.0.2-74a4800369-999d60bb75.zip differ diff --git a/.yarn/cache/hasown-npm-2.0.2-80fe6c9901-e8516f776a.zip b/.yarn/cache/hasown-npm-2.0.2-80fe6c9901-e8516f776a.zip new file mode 100644 index 0000000..d7f873c Binary files /dev/null and b/.yarn/cache/hasown-npm-2.0.2-80fe6c9901-e8516f776a.zip differ diff --git a/.yarn/cache/hono-npm-4.7.4-5dd1008544-fcc4b48eaa.zip b/.yarn/cache/hono-npm-4.7.4-5dd1008544-fcc4b48eaa.zip new file mode 100644 index 0000000..6fa0ffb Binary files /dev/null and b/.yarn/cache/hono-npm-4.7.4-5dd1008544-fcc4b48eaa.zip differ diff --git a/.yarn/cache/hono-npm-4.7.8-885a1daed8-fcfcf5d815.zip b/.yarn/cache/hono-npm-4.7.8-885a1daed8-fcfcf5d815.zip new file mode 100644 index 0000000..447b8e7 Binary files /dev/null and b/.yarn/cache/hono-npm-4.7.8-885a1daed8-fcfcf5d815.zip differ diff --git a/.yarn/cache/http-errors-npm-2.0.0-3f1c503428-9b0a378266.zip b/.yarn/cache/http-errors-npm-2.0.0-3f1c503428-9b0a378266.zip new file mode 100644 index 0000000..de7d022 Binary files /dev/null and b/.yarn/cache/http-errors-npm-2.0.0-3f1c503428-9b0a378266.zip differ diff --git a/.yarn/cache/humanize-ms-npm-1.2.1-e942bd7329-9c7a74a282.zip b/.yarn/cache/humanize-ms-npm-1.2.1-e942bd7329-9c7a74a282.zip new file mode 100644 index 0000000..c09856b Binary files /dev/null and b/.yarn/cache/humanize-ms-npm-1.2.1-e942bd7329-9c7a74a282.zip differ diff --git a/.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip b/.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip new file mode 100644 index 0000000..f3f767a Binary files /dev/null and b/.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip differ diff --git a/.yarn/cache/ieee754-npm-1.1.13-a57522ba12-102df1ba66.zip b/.yarn/cache/ieee754-npm-1.1.13-a57522ba12-102df1ba66.zip new file mode 100644 index 0000000..c98e87b Binary files /dev/null and b/.yarn/cache/ieee754-npm-1.1.13-a57522ba12-102df1ba66.zip differ diff --git a/.yarn/cache/ieee754-npm-1.2.1-fb63b3caeb-5144c0c981.zip b/.yarn/cache/ieee754-npm-1.2.1-fb63b3caeb-5144c0c981.zip new file mode 100644 index 0000000..74128ad Binary files /dev/null and b/.yarn/cache/ieee754-npm-1.2.1-fb63b3caeb-5144c0c981.zip differ diff --git a/.yarn/cache/immediate-npm-3.0.6-c27588a2d3-f9b3486477.zip b/.yarn/cache/immediate-npm-3.0.6-c27588a2d3-f9b3486477.zip new file mode 100644 index 0000000..d3f7498 Binary files /dev/null and b/.yarn/cache/immediate-npm-3.0.6-c27588a2d3-f9b3486477.zip differ diff --git a/.yarn/cache/inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip b/.yarn/cache/inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip new file mode 100644 index 0000000..62c31cb Binary files /dev/null and b/.yarn/cache/inherits-npm-2.0.4-c66b3957a0-4a48a73384.zip differ diff --git a/.yarn/cache/ipaddr.js-npm-1.9.1-19ae7878b4-f88d382598.zip b/.yarn/cache/ipaddr.js-npm-1.9.1-19ae7878b4-f88d382598.zip new file mode 100644 index 0000000..fe29634 Binary files /dev/null and b/.yarn/cache/ipaddr.js-npm-1.9.1-19ae7878b4-f88d382598.zip differ diff --git a/.yarn/cache/is-arguments-npm-1.2.0-ecfcc85b28-aae9307fed.zip b/.yarn/cache/is-arguments-npm-1.2.0-ecfcc85b28-aae9307fed.zip new file mode 100644 index 0000000..5f4c06f Binary files /dev/null and b/.yarn/cache/is-arguments-npm-1.2.0-ecfcc85b28-aae9307fed.zip differ diff --git a/.yarn/cache/is-callable-npm-1.2.7-808a303e61-61fd57d03b.zip b/.yarn/cache/is-callable-npm-1.2.7-808a303e61-61fd57d03b.zip new file mode 100644 index 0000000..0e383ae Binary files /dev/null and b/.yarn/cache/is-callable-npm-1.2.7-808a303e61-61fd57d03b.zip differ diff --git a/.yarn/cache/is-generator-function-npm-1.1.0-e96e2ba973-f7f7276131.zip b/.yarn/cache/is-generator-function-npm-1.1.0-e96e2ba973-f7f7276131.zip new file mode 100644 index 0000000..e8a9e08 Binary files /dev/null and b/.yarn/cache/is-generator-function-npm-1.1.0-e96e2ba973-f7f7276131.zip differ diff --git a/.yarn/cache/is-promise-npm-4.0.0-1e3c05420c-0b46517ad4.zip b/.yarn/cache/is-promise-npm-4.0.0-1e3c05420c-0b46517ad4.zip new file mode 100644 index 0000000..a470974 Binary files /dev/null and b/.yarn/cache/is-promise-npm-4.0.0-1e3c05420c-0b46517ad4.zip differ diff --git a/.yarn/cache/is-regex-npm-1.2.1-70a484f2c8-99ee0b6d30.zip b/.yarn/cache/is-regex-npm-1.2.1-70a484f2c8-99ee0b6d30.zip new file mode 100644 index 0000000..735e8a4 Binary files /dev/null and b/.yarn/cache/is-regex-npm-1.2.1-70a484f2c8-99ee0b6d30.zip differ diff --git a/.yarn/cache/is-typed-array-npm-1.1.15-33aa18e28f-ea7cfc46c2.zip b/.yarn/cache/is-typed-array-npm-1.1.15-33aa18e28f-ea7cfc46c2.zip new file mode 100644 index 0000000..9771fc7 Binary files /dev/null and b/.yarn/cache/is-typed-array-npm-1.1.15-33aa18e28f-ea7cfc46c2.zip differ diff --git a/.yarn/cache/isarray-npm-1.0.0-db4f547720-f032df8e02.zip b/.yarn/cache/isarray-npm-1.0.0-db4f547720-f032df8e02.zip new file mode 100644 index 0000000..67c393d Binary files /dev/null and b/.yarn/cache/isarray-npm-1.0.0-db4f547720-f032df8e02.zip differ diff --git a/.yarn/cache/jmespath-npm-0.16.0-d47535c65a-2d602493a1.zip b/.yarn/cache/jmespath-npm-0.16.0-d47535c65a-2d602493a1.zip new file mode 100644 index 0000000..b78e5e1 Binary files /dev/null and b/.yarn/cache/jmespath-npm-0.16.0-d47535c65a-2d602493a1.zip differ diff --git a/.yarn/cache/jose-npm-4.15.9-a725b711d7-41abe1c99b.zip b/.yarn/cache/jose-npm-4.15.9-a725b711d7-41abe1c99b.zip new file mode 100644 index 0000000..a970cb6 Binary files /dev/null and b/.yarn/cache/jose-npm-4.15.9-a725b711d7-41abe1c99b.zip differ diff --git a/.yarn/cache/jose-npm-5.2.3-11c452707f-7c41025d3e.zip b/.yarn/cache/jose-npm-5.2.3-11c452707f-7c41025d3e.zip new file mode 100644 index 0000000..b702009 Binary files /dev/null and b/.yarn/cache/jose-npm-5.2.3-11c452707f-7c41025d3e.zip differ diff --git a/.yarn/cache/jszip-npm-3.10.1-2862546cfb-abc77bfbe3.zip b/.yarn/cache/jszip-npm-3.10.1-2862546cfb-abc77bfbe3.zip new file mode 100644 index 0000000..aa825de Binary files /dev/null and b/.yarn/cache/jszip-npm-3.10.1-2862546cfb-abc77bfbe3.zip differ diff --git a/.yarn/cache/lie-npm-3.3.0-35ddd11a4d-33102302cf.zip b/.yarn/cache/lie-npm-3.3.0-35ddd11a4d-33102302cf.zip new file mode 100644 index 0000000..bc2fb94 Binary files /dev/null and b/.yarn/cache/lie-npm-3.3.0-35ddd11a4d-33102302cf.zip differ diff --git a/.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip b/.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip new file mode 100644 index 0000000..1635dac Binary files /dev/null and b/.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip differ diff --git a/.yarn/cache/math-intrinsics-npm-1.1.0-9204d80e7d-0e513b29d1.zip b/.yarn/cache/math-intrinsics-npm-1.1.0-9204d80e7d-0e513b29d1.zip new file mode 100644 index 0000000..5614ed5 Binary files /dev/null and b/.yarn/cache/math-intrinsics-npm-1.1.0-9204d80e7d-0e513b29d1.zip differ diff --git a/.yarn/cache/media-typer-npm-1.1.0-eccc8b846d-a58dd60804.zip b/.yarn/cache/media-typer-npm-1.1.0-eccc8b846d-a58dd60804.zip new file mode 100644 index 0000000..94328ff Binary files /dev/null and b/.yarn/cache/media-typer-npm-1.1.0-eccc8b846d-a58dd60804.zip differ diff --git a/.yarn/cache/merge-descriptors-npm-2.0.0-abd9f0b061-e383332e70.zip b/.yarn/cache/merge-descriptors-npm-2.0.0-abd9f0b061-e383332e70.zip new file mode 100644 index 0000000..e7d6e3e Binary files /dev/null and b/.yarn/cache/merge-descriptors-npm-2.0.0-abd9f0b061-e383332e70.zip differ diff --git a/.yarn/cache/mime-db-npm-1.52.0-b5371d6fd2-0d99a03585.zip b/.yarn/cache/mime-db-npm-1.52.0-b5371d6fd2-0d99a03585.zip new file mode 100644 index 0000000..8db7263 Binary files /dev/null and b/.yarn/cache/mime-db-npm-1.52.0-b5371d6fd2-0d99a03585.zip differ diff --git a/.yarn/cache/mime-db-npm-1.54.0-82cccb9d70-e99aaf2f23.zip b/.yarn/cache/mime-db-npm-1.54.0-82cccb9d70-e99aaf2f23.zip new file mode 100644 index 0000000..bf04308 Binary files /dev/null and b/.yarn/cache/mime-db-npm-1.54.0-82cccb9d70-e99aaf2f23.zip differ diff --git a/.yarn/cache/mime-types-npm-2.1.35-dd9ea9f3e2-89a5b7f1de.zip b/.yarn/cache/mime-types-npm-2.1.35-dd9ea9f3e2-89a5b7f1de.zip new file mode 100644 index 0000000..166d332 Binary files /dev/null and b/.yarn/cache/mime-types-npm-2.1.35-dd9ea9f3e2-89a5b7f1de.zip differ diff --git a/.yarn/cache/mime-types-npm-3.0.1-20b43499d0-8d497ad5cb.zip b/.yarn/cache/mime-types-npm-3.0.1-20b43499d0-8d497ad5cb.zip new file mode 100644 index 0000000..72c9621 Binary files /dev/null and b/.yarn/cache/mime-types-npm-3.0.1-20b43499d0-8d497ad5cb.zip differ diff --git a/.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip b/.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip new file mode 100644 index 0000000..2b635f2 Binary files /dev/null and b/.yarn/cache/ms-npm-2.1.3-81ff3cfac1-aa92de6080.zip differ diff --git a/.yarn/cache/negotiator-npm-1.0.0-47d727e27e-20ebfe79b2.zip b/.yarn/cache/negotiator-npm-1.0.0-47d727e27e-20ebfe79b2.zip new file mode 100644 index 0000000..1a21494 Binary files /dev/null and b/.yarn/cache/negotiator-npm-1.0.0-47d727e27e-20ebfe79b2.zip differ diff --git a/.yarn/cache/node-domexception-npm-1.0.0-e1e813b76f-ee1d37dd2a.zip b/.yarn/cache/node-domexception-npm-1.0.0-e1e813b76f-ee1d37dd2a.zip new file mode 100644 index 0000000..d58ba92 Binary files /dev/null and b/.yarn/cache/node-domexception-npm-1.0.0-e1e813b76f-ee1d37dd2a.zip differ diff --git a/.yarn/cache/node-fetch-npm-2.7.0-587d57004e-d76d2f5edb.zip b/.yarn/cache/node-fetch-npm-2.7.0-587d57004e-d76d2f5edb.zip new file mode 100644 index 0000000..a067dc7 Binary files /dev/null and b/.yarn/cache/node-fetch-npm-2.7.0-587d57004e-d76d2f5edb.zip differ diff --git a/.yarn/cache/object-assign-npm-4.1.1-1004ad6dec-fcc6e4ea8c.zip b/.yarn/cache/object-assign-npm-4.1.1-1004ad6dec-fcc6e4ea8c.zip new file mode 100644 index 0000000..8c8ab03 Binary files /dev/null and b/.yarn/cache/object-assign-npm-4.1.1-1004ad6dec-fcc6e4ea8c.zip differ diff --git a/.yarn/cache/object-hash-npm-2.2.0-d97a921cc1-55ba841e3a.zip b/.yarn/cache/object-hash-npm-2.2.0-d97a921cc1-55ba841e3a.zip new file mode 100644 index 0000000..de34076 Binary files /dev/null and b/.yarn/cache/object-hash-npm-2.2.0-d97a921cc1-55ba841e3a.zip differ diff --git a/.yarn/cache/object-inspect-npm-1.13.4-4e741f9806-582810c6a8.zip b/.yarn/cache/object-inspect-npm-1.13.4-4e741f9806-582810c6a8.zip new file mode 100644 index 0000000..fbe7649 Binary files /dev/null and b/.yarn/cache/object-inspect-npm-1.13.4-4e741f9806-582810c6a8.zip differ diff --git a/.yarn/cache/oidc-token-hash-npm-5.1.0-9ca0f067f2-b1ac3bf073.zip b/.yarn/cache/oidc-token-hash-npm-5.1.0-9ca0f067f2-b1ac3bf073.zip new file mode 100644 index 0000000..724c1fb Binary files /dev/null and b/.yarn/cache/oidc-token-hash-npm-5.1.0-9ca0f067f2-b1ac3bf073.zip differ diff --git a/.yarn/cache/on-finished-npm-2.4.1-907af70f88-d20929a25e.zip b/.yarn/cache/on-finished-npm-2.4.1-907af70f88-d20929a25e.zip new file mode 100644 index 0000000..806952b Binary files /dev/null and b/.yarn/cache/on-finished-npm-2.4.1-907af70f88-d20929a25e.zip differ diff --git a/.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip b/.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip new file mode 100644 index 0000000..1b943ee Binary files /dev/null and b/.yarn/cache/once-npm-1.4.0-ccf03ef07a-cd0a885013.zip differ diff --git a/.yarn/cache/opencontrol-npm-0.0.6-10cbef5833-112c409d27.zip b/.yarn/cache/opencontrol-npm-0.0.6-10cbef5833-112c409d27.zip new file mode 100644 index 0000000..282945e Binary files /dev/null and b/.yarn/cache/opencontrol-npm-0.0.6-10cbef5833-112c409d27.zip differ diff --git a/.yarn/cache/openid-client-npm-5.6.4-9b740f7bb0-69843f078d.zip b/.yarn/cache/openid-client-npm-5.6.4-9b740f7bb0-69843f078d.zip new file mode 100644 index 0000000..3486cae Binary files /dev/null and b/.yarn/cache/openid-client-npm-5.6.4-9b740f7bb0-69843f078d.zip differ diff --git a/.yarn/cache/pako-npm-1.0.11-b8f1b69d3e-1be2bfa1f8.zip b/.yarn/cache/pako-npm-1.0.11-b8f1b69d3e-1be2bfa1f8.zip new file mode 100644 index 0000000..4a6767b Binary files /dev/null and b/.yarn/cache/pako-npm-1.0.11-b8f1b69d3e-1be2bfa1f8.zip differ diff --git a/.yarn/cache/parseurl-npm-1.3.3-1542397e00-407cee8e0a.zip b/.yarn/cache/parseurl-npm-1.3.3-1542397e00-407cee8e0a.zip new file mode 100644 index 0000000..794eb17 Binary files /dev/null and b/.yarn/cache/parseurl-npm-1.3.3-1542397e00-407cee8e0a.zip differ diff --git a/.yarn/cache/path-to-regexp-npm-8.2.0-71c92fc0c6-56e13e4596.zip b/.yarn/cache/path-to-regexp-npm-8.2.0-71c92fc0c6-56e13e4596.zip new file mode 100644 index 0000000..91856c0 Binary files /dev/null and b/.yarn/cache/path-to-regexp-npm-8.2.0-71c92fc0c6-56e13e4596.zip differ diff --git a/.yarn/cache/pkce-challenge-npm-4.1.0-fbc51695a3-b85c50cefe.zip b/.yarn/cache/pkce-challenge-npm-4.1.0-fbc51695a3-b85c50cefe.zip new file mode 100644 index 0000000..88f7f91 Binary files /dev/null and b/.yarn/cache/pkce-challenge-npm-4.1.0-fbc51695a3-b85c50cefe.zip differ diff --git a/.yarn/cache/possible-typed-array-names-npm-1.1.0-ce60ca4401-cfcd4f0526.zip b/.yarn/cache/possible-typed-array-names-npm-1.1.0-ce60ca4401-cfcd4f0526.zip new file mode 100644 index 0000000..cd5fb9c Binary files /dev/null and b/.yarn/cache/possible-typed-array-names-npm-1.1.0-ce60ca4401-cfcd4f0526.zip differ diff --git a/.yarn/cache/process-nextick-args-npm-2.0.1-b8d7971609-1d38588e52.zip b/.yarn/cache/process-nextick-args-npm-2.0.1-b8d7971609-1d38588e52.zip new file mode 100644 index 0000000..33fadfd Binary files /dev/null and b/.yarn/cache/process-nextick-args-npm-2.0.1-b8d7971609-1d38588e52.zip differ diff --git a/.yarn/cache/proxy-addr-npm-2.0.7-dae6552872-29c6990ce9.zip b/.yarn/cache/proxy-addr-npm-2.0.7-dae6552872-29c6990ce9.zip new file mode 100644 index 0000000..cd0d662 Binary files /dev/null and b/.yarn/cache/proxy-addr-npm-2.0.7-dae6552872-29c6990ce9.zip differ diff --git a/.yarn/cache/punycode-npm-1.3.2-3727a84cea-b8807fd594.zip b/.yarn/cache/punycode-npm-1.3.2-3727a84cea-b8807fd594.zip new file mode 100644 index 0000000..22be1b6 Binary files /dev/null and b/.yarn/cache/punycode-npm-1.3.2-3727a84cea-b8807fd594.zip differ diff --git a/.yarn/cache/qs-npm-6.14.0-6b298311eb-189b52ad4e.zip b/.yarn/cache/qs-npm-6.14.0-6b298311eb-189b52ad4e.zip new file mode 100644 index 0000000..4be3341 Binary files /dev/null and b/.yarn/cache/qs-npm-6.14.0-6b298311eb-189b52ad4e.zip differ diff --git a/.yarn/cache/querystring-npm-0.2.0-421b870c92-8258d6734f.zip b/.yarn/cache/querystring-npm-0.2.0-421b870c92-8258d6734f.zip new file mode 100644 index 0000000..161c2bf Binary files /dev/null and b/.yarn/cache/querystring-npm-0.2.0-421b870c92-8258d6734f.zip differ diff --git a/.yarn/cache/range-parser-npm-1.2.1-1a470fa390-0a268d4fea.zip b/.yarn/cache/range-parser-npm-1.2.1-1a470fa390-0a268d4fea.zip new file mode 100644 index 0000000..7b40d59 Binary files /dev/null and b/.yarn/cache/range-parser-npm-1.2.1-1a470fa390-0a268d4fea.zip differ diff --git a/.yarn/cache/raw-body-npm-3.0.0-cd8403b401-25b7cf7964.zip b/.yarn/cache/raw-body-npm-3.0.0-cd8403b401-25b7cf7964.zip new file mode 100644 index 0000000..079eef8 Binary files /dev/null and b/.yarn/cache/raw-body-npm-3.0.0-cd8403b401-25b7cf7964.zip differ diff --git a/.yarn/cache/readable-stream-npm-2.3.8-67a94c2cb1-6564546703.zip b/.yarn/cache/readable-stream-npm-2.3.8-67a94c2cb1-6564546703.zip new file mode 100644 index 0000000..e52c545 Binary files /dev/null and b/.yarn/cache/readable-stream-npm-2.3.8-67a94c2cb1-6564546703.zip differ diff --git a/.yarn/cache/router-npm-2.2.0-745100319e-4c3bec8011.zip b/.yarn/cache/router-npm-2.2.0-745100319e-4c3bec8011.zip new file mode 100644 index 0000000..bf93fd1 Binary files /dev/null and b/.yarn/cache/router-npm-2.2.0-745100319e-4c3bec8011.zip differ diff --git a/.yarn/cache/safe-buffer-npm-5.1.2-c27fedf6c4-f2f1f7943c.zip b/.yarn/cache/safe-buffer-npm-5.1.2-c27fedf6c4-f2f1f7943c.zip new file mode 100644 index 0000000..53c2813 Binary files /dev/null and b/.yarn/cache/safe-buffer-npm-5.1.2-c27fedf6c4-f2f1f7943c.zip differ diff --git a/.yarn/cache/safe-buffer-npm-5.2.1-3481c8aa9b-b99c4b41fd.zip b/.yarn/cache/safe-buffer-npm-5.2.1-3481c8aa9b-b99c4b41fd.zip new file mode 100644 index 0000000..c80798a Binary files /dev/null and b/.yarn/cache/safe-buffer-npm-5.2.1-3481c8aa9b-b99c4b41fd.zip differ diff --git a/.yarn/cache/safe-regex-test-npm-1.1.0-453eb81b83-3c809abeb8.zip b/.yarn/cache/safe-regex-test-npm-1.1.0-453eb81b83-3c809abeb8.zip new file mode 100644 index 0000000..a0b7b26 Binary files /dev/null and b/.yarn/cache/safe-regex-test-npm-1.1.0-453eb81b83-3c809abeb8.zip differ diff --git a/.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip b/.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip new file mode 100644 index 0000000..1a93be6 Binary files /dev/null and b/.yarn/cache/safer-buffer-npm-2.1.2-8d5c0b705e-cab8f25ae6.zip differ diff --git a/.yarn/cache/sax-npm-1.2.1-fd2ad7b223-8dca7d5e1c.zip b/.yarn/cache/sax-npm-1.2.1-fd2ad7b223-8dca7d5e1c.zip new file mode 100644 index 0000000..e6fce3e Binary files /dev/null and b/.yarn/cache/sax-npm-1.2.1-fd2ad7b223-8dca7d5e1c.zip differ diff --git a/.yarn/cache/sax-npm-1.4.1-503b1923cb-3ad64df16b.zip b/.yarn/cache/sax-npm-1.4.1-503b1923cb-3ad64df16b.zip new file mode 100644 index 0000000..611601e Binary files /dev/null and b/.yarn/cache/sax-npm-1.4.1-503b1923cb-3ad64df16b.zip differ diff --git a/.yarn/cache/send-npm-1.2.0-6a1006154e-7557ee6c1c.zip b/.yarn/cache/send-npm-1.2.0-6a1006154e-7557ee6c1c.zip new file mode 100644 index 0000000..b21e2e7 Binary files /dev/null and b/.yarn/cache/send-npm-1.2.0-6a1006154e-7557ee6c1c.zip differ diff --git a/.yarn/cache/serve-static-npm-2.2.0-a71bf524e0-74f39e88f0.zip b/.yarn/cache/serve-static-npm-2.2.0-a71bf524e0-74f39e88f0.zip new file mode 100644 index 0000000..5e55d8f Binary files /dev/null and b/.yarn/cache/serve-static-npm-2.2.0-a71bf524e0-74f39e88f0.zip differ diff --git a/.yarn/cache/set-function-length-npm-1.2.2-243073748b-a8248bdacd.zip b/.yarn/cache/set-function-length-npm-1.2.2-243073748b-a8248bdacd.zip new file mode 100644 index 0000000..69b4320 Binary files /dev/null and b/.yarn/cache/set-function-length-npm-1.2.2-243073748b-a8248bdacd.zip differ diff --git a/.yarn/cache/setimmediate-npm-1.0.5-54587459b6-c9a6f2c5b5.zip b/.yarn/cache/setimmediate-npm-1.0.5-54587459b6-c9a6f2c5b5.zip new file mode 100644 index 0000000..ec2aee7 Binary files /dev/null and b/.yarn/cache/setimmediate-npm-1.0.5-54587459b6-c9a6f2c5b5.zip differ diff --git a/.yarn/cache/setprototypeof-npm-1.2.0-0fedbdcd3a-be18cbbf70.zip b/.yarn/cache/setprototypeof-npm-1.2.0-0fedbdcd3a-be18cbbf70.zip new file mode 100644 index 0000000..f6bd1cb Binary files /dev/null and b/.yarn/cache/setprototypeof-npm-1.2.0-0fedbdcd3a-be18cbbf70.zip differ diff --git a/.yarn/cache/side-channel-list-npm-1.0.0-14f74146d1-603b928997.zip b/.yarn/cache/side-channel-list-npm-1.0.0-14f74146d1-603b928997.zip new file mode 100644 index 0000000..8307ac9 Binary files /dev/null and b/.yarn/cache/side-channel-list-npm-1.0.0-14f74146d1-603b928997.zip differ diff --git a/.yarn/cache/side-channel-map-npm-1.0.1-5903573b3c-42501371cd.zip b/.yarn/cache/side-channel-map-npm-1.0.1-5903573b3c-42501371cd.zip new file mode 100644 index 0000000..ae704d0 Binary files /dev/null and b/.yarn/cache/side-channel-map-npm-1.0.1-5903573b3c-42501371cd.zip differ diff --git a/.yarn/cache/side-channel-npm-1.1.0-4993930974-bf73d6d668.zip b/.yarn/cache/side-channel-npm-1.1.0-4993930974-bf73d6d668.zip new file mode 100644 index 0000000..65b6685 Binary files /dev/null and b/.yarn/cache/side-channel-npm-1.1.0-4993930974-bf73d6d668.zip differ diff --git a/.yarn/cache/side-channel-weakmap-npm-1.0.2-027acaf499-a815c89bc7.zip b/.yarn/cache/side-channel-weakmap-npm-1.0.2-027acaf499-a815c89bc7.zip new file mode 100644 index 0000000..9e15dea Binary files /dev/null and b/.yarn/cache/side-channel-weakmap-npm-1.0.2-027acaf499-a815c89bc7.zip differ diff --git a/.yarn/cache/sst-linux-x64-npm-3.13.20-b1b3fd8c8e-8.zip b/.yarn/cache/sst-linux-x64-npm-3.13.20-b1b3fd8c8e-8.zip new file mode 100644 index 0000000..ce1c15e Binary files /dev/null and b/.yarn/cache/sst-linux-x64-npm-3.13.20-b1b3fd8c8e-8.zip differ diff --git a/.yarn/cache/sst-npm-3.13.20-0e40f853fd-9e07f5d3c7.zip b/.yarn/cache/sst-npm-3.13.20-0e40f853fd-9e07f5d3c7.zip new file mode 100644 index 0000000..aaa1242 Binary files /dev/null and b/.yarn/cache/sst-npm-3.13.20-0e40f853fd-9e07f5d3c7.zip differ diff --git a/.yarn/cache/statuses-npm-2.0.1-81d2b97fee-18c7623fdb.zip b/.yarn/cache/statuses-npm-2.0.1-81d2b97fee-18c7623fdb.zip new file mode 100644 index 0000000..d54195d Binary files /dev/null and b/.yarn/cache/statuses-npm-2.0.1-81d2b97fee-18c7623fdb.zip differ diff --git a/.yarn/cache/string_decoder-npm-1.1.1-e46a6c1353-9ab7e56f9d.zip b/.yarn/cache/string_decoder-npm-1.1.1-e46a6c1353-9ab7e56f9d.zip new file mode 100644 index 0000000..8f86a62 Binary files /dev/null and b/.yarn/cache/string_decoder-npm-1.1.1-e46a6c1353-9ab7e56f9d.zip differ diff --git a/.yarn/cache/toidentifier-npm-1.0.1-f759712599-952c29e2a8.zip b/.yarn/cache/toidentifier-npm-1.0.1-f759712599-952c29e2a8.zip new file mode 100644 index 0000000..595363e Binary files /dev/null and b/.yarn/cache/toidentifier-npm-1.0.1-f759712599-952c29e2a8.zip differ diff --git a/.yarn/cache/tr46-npm-0.0.3-de53018915-726321c5ea.zip b/.yarn/cache/tr46-npm-0.0.3-de53018915-726321c5ea.zip new file mode 100644 index 0000000..2e6949b Binary files /dev/null and b/.yarn/cache/tr46-npm-0.0.3-de53018915-726321c5ea.zip differ diff --git a/.yarn/cache/type-is-npm-2.0.1-8ef194d26e-0266e7c782.zip b/.yarn/cache/type-is-npm-2.0.1-8ef194d26e-0266e7c782.zip new file mode 100644 index 0000000..a4dda8d Binary files /dev/null and b/.yarn/cache/type-is-npm-2.0.1-8ef194d26e-0266e7c782.zip differ diff --git a/.yarn/cache/typescript-npm-5.8.3-fbd7aef456-cb1d081c88.zip b/.yarn/cache/typescript-npm-5.8.3-fbd7aef456-cb1d081c88.zip new file mode 100644 index 0000000..4040bea Binary files /dev/null and b/.yarn/cache/typescript-npm-5.8.3-fbd7aef456-cb1d081c88.zip differ diff --git a/.yarn/cache/typescript-patch-f10b42f40c-1b503525a8.zip b/.yarn/cache/typescript-patch-f10b42f40c-1b503525a8.zip new file mode 100644 index 0000000..21d46c0 Binary files /dev/null and b/.yarn/cache/typescript-patch-f10b42f40c-1b503525a8.zip differ diff --git a/.yarn/cache/undici-types-npm-5.26.5-de4f7c7bb9-3192ef6f3f.zip b/.yarn/cache/undici-types-npm-5.26.5-de4f7c7bb9-3192ef6f3f.zip new file mode 100644 index 0000000..6ab5ae6 Binary files /dev/null and b/.yarn/cache/undici-types-npm-5.26.5-de4f7c7bb9-3192ef6f3f.zip differ diff --git a/.yarn/cache/undici-types-npm-6.21.0-eb2b0ed56a-46331c7d60.zip b/.yarn/cache/undici-types-npm-6.21.0-eb2b0ed56a-46331c7d60.zip new file mode 100644 index 0000000..0f8cbe3 Binary files /dev/null and b/.yarn/cache/undici-types-npm-6.21.0-eb2b0ed56a-46331c7d60.zip differ diff --git a/.yarn/cache/unpipe-npm-1.0.0-2ed2a3c2bf-4fa18d8d8d.zip b/.yarn/cache/unpipe-npm-1.0.0-2ed2a3c2bf-4fa18d8d8d.zip new file mode 100644 index 0000000..380809c Binary files /dev/null and b/.yarn/cache/unpipe-npm-1.0.0-2ed2a3c2bf-4fa18d8d8d.zip differ diff --git a/.yarn/cache/url-npm-0.10.3-37c0b27c3c-7b83ddb106.zip b/.yarn/cache/url-npm-0.10.3-37c0b27c3c-7b83ddb106.zip new file mode 100644 index 0000000..e3fc763 Binary files /dev/null and b/.yarn/cache/url-npm-0.10.3-37c0b27c3c-7b83ddb106.zip differ diff --git a/.yarn/cache/util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip b/.yarn/cache/util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip new file mode 100644 index 0000000..c2309cf Binary files /dev/null and b/.yarn/cache/util-deprecate-npm-1.0.2-e3fe1a219c-474acf1146.zip differ diff --git a/.yarn/cache/util-npm-0.12.5-3668276f26-705e51f0de.zip b/.yarn/cache/util-npm-0.12.5-3668276f26-705e51f0de.zip new file mode 100644 index 0000000..61e97ee Binary files /dev/null and b/.yarn/cache/util-npm-0.12.5-3668276f26-705e51f0de.zip differ diff --git a/.yarn/cache/uuid-npm-11.1.0-61d0d08928-840f197585.zip b/.yarn/cache/uuid-npm-11.1.0-61d0d08928-840f197585.zip new file mode 100644 index 0000000..2ee3514 Binary files /dev/null and b/.yarn/cache/uuid-npm-11.1.0-61d0d08928-840f197585.zip differ diff --git a/.yarn/cache/uuid-npm-8.0.0-591e3a2e23-56d4e23aa7.zip b/.yarn/cache/uuid-npm-8.0.0-591e3a2e23-56d4e23aa7.zip new file mode 100644 index 0000000..c2ad9a0 Binary files /dev/null and b/.yarn/cache/uuid-npm-8.0.0-591e3a2e23-56d4e23aa7.zip differ diff --git a/.yarn/cache/vary-npm-1.1.2-b49f70ae63-ae0123222c.zip b/.yarn/cache/vary-npm-1.1.2-b49f70ae63-ae0123222c.zip new file mode 100644 index 0000000..6ef0831 Binary files /dev/null and b/.yarn/cache/vary-npm-1.1.2-b49f70ae63-ae0123222c.zip differ diff --git a/.yarn/cache/web-streams-polyfill-npm-4.0.0-beta.3-0dc6d160ed-dfec1fbf52.zip b/.yarn/cache/web-streams-polyfill-npm-4.0.0-beta.3-0dc6d160ed-dfec1fbf52.zip new file mode 100644 index 0000000..39b640a Binary files /dev/null and b/.yarn/cache/web-streams-polyfill-npm-4.0.0-beta.3-0dc6d160ed-dfec1fbf52.zip differ diff --git a/.yarn/cache/webidl-conversions-npm-3.0.1-60310f6a2b-c92a0a6ab9.zip b/.yarn/cache/webidl-conversions-npm-3.0.1-60310f6a2b-c92a0a6ab9.zip new file mode 100644 index 0000000..96867a6 Binary files /dev/null and b/.yarn/cache/webidl-conversions-npm-3.0.1-60310f6a2b-c92a0a6ab9.zip differ diff --git a/.yarn/cache/whatwg-url-npm-5.0.0-374fb45e60-b8daed4ad3.zip b/.yarn/cache/whatwg-url-npm-5.0.0-374fb45e60-b8daed4ad3.zip new file mode 100644 index 0000000..5deef33 Binary files /dev/null and b/.yarn/cache/whatwg-url-npm-5.0.0-374fb45e60-b8daed4ad3.zip differ diff --git a/.yarn/cache/which-typed-array-npm-1.1.19-e664d1e89c-162d2a07f6.zip b/.yarn/cache/which-typed-array-npm-1.1.19-e664d1e89c-162d2a07f6.zip new file mode 100644 index 0000000..39b02a7 Binary files /dev/null and b/.yarn/cache/which-typed-array-npm-1.1.19-e664d1e89c-162d2a07f6.zip differ diff --git a/.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip b/.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip new file mode 100644 index 0000000..6072a9f Binary files /dev/null and b/.yarn/cache/wrappy-npm-1.0.2-916de4d4b3-159da4805f.zip differ diff --git a/.yarn/cache/xml2js-npm-0.6.2-64cd781d74-458a838061.zip b/.yarn/cache/xml2js-npm-0.6.2-64cd781d74-458a838061.zip new file mode 100644 index 0000000..f264eda Binary files /dev/null and b/.yarn/cache/xml2js-npm-0.6.2-64cd781d74-458a838061.zip differ diff --git a/.yarn/cache/xmlbuilder-npm-11.0.1-b8b04dc929-7152695e16.zip b/.yarn/cache/xmlbuilder-npm-11.0.1-b8b04dc929-7152695e16.zip new file mode 100644 index 0000000..b7a7d79 Binary files /dev/null and b/.yarn/cache/xmlbuilder-npm-11.0.1-b8b04dc929-7152695e16.zip differ diff --git a/.yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip b/.yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip new file mode 100644 index 0000000..f2d3306 Binary files /dev/null and b/.yarn/cache/yallist-npm-4.0.0-b493d9e907-343617202a.zip differ diff --git a/.yarn/cache/zod-npm-3.24.2-ab80dc0969-c02455c096.zip b/.yarn/cache/zod-npm-3.24.2-ab80dc0969-c02455c096.zip new file mode 100644 index 0000000..e81f303 Binary files /dev/null and b/.yarn/cache/zod-npm-3.24.2-ab80dc0969-c02455c096.zip differ diff --git a/.yarn/cache/zod-npm-3.24.3-464710625e-9c3976e61c.zip b/.yarn/cache/zod-npm-3.24.3-464710625e-9c3976e61c.zip new file mode 100644 index 0000000..387544b Binary files /dev/null and b/.yarn/cache/zod-npm-3.24.3-464710625e-9c3976e61c.zip differ diff --git a/.yarn/cache/zod-to-json-schema-npm-3.24.3-ce4111ed23-f395bb6ece.zip b/.yarn/cache/zod-to-json-schema-npm-3.24.3-ce4111ed23-f395bb6ece.zip new file mode 100644 index 0000000..86c8bf6 Binary files /dev/null and b/.yarn/cache/zod-to-json-schema-npm-3.24.3-ce4111ed23-f395bb6ece.zip differ diff --git a/.yarn/cache/zod-to-json-schema-npm-3.24.5-3484801266-dc4e5e4c06.zip b/.yarn/cache/zod-to-json-schema-npm-3.24.5-3484801266-dc4e5e4c06.zip new file mode 100644 index 0000000..4f95c9f Binary files /dev/null and b/.yarn/cache/zod-to-json-schema-npm-3.24.5-3484801266-dc4e5e4c06.zip differ diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz new file mode 100644 index 0000000..b0fa4d8 Binary files /dev/null and b/.yarn/install-state.gz differ diff --git a/bun.lock b/bun.lock index 38d972c..04209be 100644 --- a/bun.lock +++ b/bun.lock @@ -4,7 +4,6 @@ "": { "name": "address-validation-api", "dependencies": { - "@modelcontextprotocol/sdk": "^1.10.2", "cloudflare": "^4.2.0", "hono": "^4.7.7", "jszip": "^3.10.1", @@ -19,6 +18,7 @@ "@types/bun": "latest", "@types/node": "^22.14.0", "@types/uuid": "^9.0.8", + "typescript": "^5.8.3", }, "peerDependencies": { "typescript": "^5.8.3", @@ -46,7 +46,7 @@ "@cloudflare/workers-types": ["@cloudflare/workers-types@4.20250424.0", "", {}, ""], - "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.10.2", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.3", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, "sha512-rb6AMp2DR4SN+kc6L1ta2NCpApyA9WYNx3CrTSZvGxq9wH71bRur+zRqPfg0vQ9mjywR7qZdX2RGHOPq3ss+tA=="], + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, ""], "@tsconfig/bun": ["@tsconfig/bun@1.0.7", "", {}, ""], @@ -104,8 +104,6 @@ "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, ""], - "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], - "debug": ["debug@4.4.0", "", { "dependencies": { "ms": "^2.1.3" } }, ""], "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, ""], @@ -204,8 +202,6 @@ "isarray": ["isarray@1.0.0", "", {}, ""], - "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - "jmespath": ["jmespath@0.16.0", "", {}, ""], "jose": ["jose@5.2.3", "", {}, ""], @@ -222,9 +218,9 @@ "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, ""], - "mime-db": ["mime-db@1.54.0", "", {}, ""], + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - "mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, ""], + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], "ms": ["ms@2.1.3", "", {}, ""], @@ -254,11 +250,9 @@ "parseurl": ["parseurl@1.3.3", "", {}, ""], - "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - "path-to-regexp": ["path-to-regexp@8.2.0", "", {}, ""], - "pkce-challenge": ["pkce-challenge@5.0.0", "", {}, "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ=="], + "pkce-challenge": ["pkce-challenge@4.1.0", "", {}, ""], "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, ""], @@ -298,10 +292,6 @@ "setprototypeof": ["setprototypeof@1.2.0", "", {}, ""], - "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], - - "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, ""], "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, ""], @@ -346,8 +336,6 @@ "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], - "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, ""], "wrappy": ["wrappy@1.0.2", "", {}, ""], @@ -362,24 +350,32 @@ "zod-to-json-schema": ["zod-to-json-schema@3.24.3", "", { "peerDependencies": { "zod": "^3.24.1" } }, ""], + "accepts/mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, ""], + "aws-sdk/uuid": ["uuid@8.0.0", "", { "bin": "dist/bin/uuid" }, ""], "cloudflare/@types/node": ["@types/node@18.19.86", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ=="], "content-disposition/safe-buffer": ["safe-buffer@5.2.1", "", {}, ""], - "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "opencontrol/@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.6.1", "", { "dependencies": { "content-type": "^1.0.5", "cors": "^2.8.5", "eventsource": "^3.0.2", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "pkce-challenge": "^4.1.0", "raw-body": "^3.0.0", "zod": "^3.23.8", "zod-to-json-schema": "^3.24.1" } }, ""], + "express/mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, ""], "opencontrol/hono": ["hono@4.7.4", "", {}, ""], "openid-client/jose": ["jose@4.15.9", "", {}, ""], + "send/mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, ""], + + "type-is/mime-types": ["mime-types@3.0.1", "", { "dependencies": { "mime-db": "^1.54.0" } }, ""], + + "accepts/mime-types/mime-db": ["mime-db@1.54.0", "", {}, ""], + "cloudflare/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], - "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + "express/mime-types/mime-db": ["mime-db@1.54.0", "", {}, ""], + + "send/mime-types/mime-db": ["mime-db@1.54.0", "", {}, ""], - "opencontrol/@modelcontextprotocol/sdk/pkce-challenge": ["pkce-challenge@4.1.0", "", {}, ""], + "type-is/mime-types/mime-db": ["mime-db@1.54.0", "", {}, ""], } } diff --git a/docs/hono-mcp-server.md b/docs/hono-mcp-server.md index 3377626..7e38535 100644 --- a/docs/hono-mcp-server.md +++ b/docs/hono-mcp-server.md @@ -9,9 +9,11 @@ This document serves as the single source of truth for setting up, developing, a ``` /mcp/ routes.ts # Route definitions: health, SSE, JSON-RPC - mcp.ts # MCP server wrapper, tool registry, helpers + server.ts # Custom MCP server implementation + service.ts # MCP service wrapper + streamableHttp.ts # Custom StreamableHTTP transport + types.ts # Type definitions for MCP /tools/ # Tool definitions and registry - sse.ts # Custom SSETransport bridging MCP <-> browser EventSource registry.ts # In-memory tool registry abstraction ``` @@ -41,12 +43,18 @@ router.post('/messages', messagesHandler) ```ts import { Hono } from 'hono'; -import { SSETransport } from './sse'; -import { mcpService } from './mcp'; +import { StreamableHTTPServerTransport } from './mcp/streamableHttp'; +import { mcpService } from './mcp/service'; const app = new Hono(); -app.get('/sse', (c) => SSETransport.handle(c)); +app.get('/sse', (c) => { + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: () => crypto.randomUUID(), + }); + return mcpService.getServerInstance().connect(transport); +}); + app.post('/messages', (c) => mcpService.handleMessage(c)); mcpService.init(); @@ -58,12 +66,12 @@ mcpService.init(); - Install dependencies: ```sh - npm install hono @hono/node-server @modelcontextprotocol/sdk zod + npm install hono zod ``` -- Implement `SSETransport` (see [SSE docs](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events)) -- Build an `MCPService` thin wrapper around the SDK server: +- Implement custom MCP server and transport (see our implementation in `/mcp/`) +- Build an `MCPService` thin wrapper around the custom server: ```ts - import { Server } from '@modelcontextprotocol/sdk/server'; + import { Server } from './mcp/server'; const server = new Server({ name: 'My MCP' }, { capabilities: { tools: {} } }); server.setRequestHandler(CallToolRequestSchema, ...); ``` @@ -83,7 +91,7 @@ mcpService.init(); ## 4. Local Dev / Debugging Tips -- Use [@modelcontextprotocol/inspector](https://www.npmjs.com/package/@modelcontextprotocol/inspector) proxy at `http://localhost:4200/sse` to inspect traffic +- Use a tool like Postman or curl to test your SSE endpoint - Hono's dev server reloads if you pair with `tsx watch` or similar - Add `?sessionId=...` query param logging for easier correlation in logs - Use descriptive logging for SSE events and tool invocations @@ -94,9 +102,8 @@ mcpService.init(); - [Hono Documentation](https://hono.dev) - [Model Context Protocol Spec](https://github.com/modelcontext/protocol) -- [MCP SDK Server Package](https://github.com/modelcontext/sdk/tree/main/packages/server) -- [openapi2mcptools](https://www.npmjs.com/package/openapi2mcptools) -- [Inspector CLI](https://www.npmjs.com/package/@modelcontextprotocol/inspector) +- [Cloudflare Workers MCP](https://github.com/cloudflare/workers-mcp) +- [Cloudflare MCP Blog Post](https://blog.cloudflare.com/model-context-protocol/) --- @@ -104,17 +111,18 @@ mcpService.init(); ```ts import { Hono } from 'hono'; -import { Server } from '@modelcontextprotocol/sdk/server'; -import { SSETransport } from './sse'; +import { Server } from './mcp/server'; +import { StreamableHTTPServerTransport } from './mcp/streamableHttp'; const app = new Hono(); const mcpServer = new Server({ name: 'Example MCP' }, { capabilities: { tools: {} } }); app.get('/health', (c) => c.json({ status: 'ok', env: process.env.NODE_ENV })); -app.get('/sse', (c) => SSETransport.handle(c, mcpServer)); -app.post('/messages', async (c) => { - const payload = await c.req.json(); - return mcpServer.handleMessage(payload); +app.post('/mcp', async (c) => { + const transport = new StreamableHTTPServerTransport({ + sessionIdGenerator: () => crypto.randomUUID(), + }); + return mcpServer.connect(transport); }); export default app; @@ -131,4 +139,4 @@ export default app; --- -_Last updated: 2025-04-27_ +_Last updated: 2025-04-29_ diff --git a/package.json b/package.json index 2f1eafa..a775720 100644 --- a/package.json +++ b/package.json @@ -5,22 +5,25 @@ "private": true, "scripts": { "start": "bun run --watch src/api.ts", - "dev": "sst dev", + "dev": "bunx wrangler deploy && sst dev --stage lambdacurry2", "build": "sst build", - "deploy": "sst deploy" + "deploy:sst": "sst deploy --stage lambdacurry2", + "deploy:do": "bunx wrangler deploy", + "deploy": "bun run deploy:sst && bun run deploy:do" }, "devDependencies": { "@biomejs/biome": "^1.9.4", "@cloudflare/workers-types": "^4.20250424.0", "@types/bun": "latest", "@types/node": "^22.14.0", - "@types/uuid": "^9.0.8" + "@types/uuid": "^9.0.8", + "typescript": "^5.8.3", + "wrangler": "^3.0.0" }, "peerDependencies": { "typescript": "^5.8.3" }, "dependencies": { - "@modelcontextprotocol/sdk": "^1.10.2", "cloudflare": "^4.2.0", "hono": "^4.7.7", "jszip": "^3.10.1", diff --git a/src/api.ts b/src/api.ts index c5a8610..70aafb9 100644 --- a/src/api.ts +++ b/src/api.ts @@ -47,21 +47,37 @@ app.use( // API Key Validation Middleware // Apply this *before* mounting routes that need protection // Or apply within specific route modules if needed granularly -app.use('*', async (c, next) => { - // Skip API key check for base routes (/, /health) and the MCP route (/mcp) - // Use startsWith to cover all sub-paths under /mcp if necessary, but exact match is likely sufficient here. - const publicPaths = ['/', '/health', '/mcp']; - if (publicPaths.some((p) => c.req.path === p)) { +app.use('*' /* Applies to all paths */, async (c, next) => { + // Check if the request path starts with any of the public prefixes + const publicPrefixes = ['/', '/health', '/mcp/']; // Include base, health, and the MCP prefix + + // Special case for exact match on root path '/' + if (c.req.path === '/') { + await next(); + return; + } + + // Check prefixes for other paths (ensure trailing slash on prefixes if needed) + const isPublicPath = publicPrefixes.some((prefix) => { + // Avoid matching just '/' prefix for non-root paths unless intended + if (prefix === '/' && c.req.path !== '/') return false; + return c.req.path.startsWith(prefix); + }); + + if (isPublicPath) { await next(); return; } + // If not a public path, proceed with API key validation const apiKey = c.req.header('x-api-key') || c.req.query('api_key'); if (!apiKey || apiKey !== Resource.API_KEY.value) { + console.warn(`[Auth] Invalid API key attempt for path: ${c.req.path}`); return c.json({ error: 'Invalid or missing API key' }, 401); } + console.log(`[Auth] API key validated for path: ${c.req.path}`); await next(); }); diff --git a/src/mcp/server.ts b/src/mcp/server.ts new file mode 100644 index 0000000..b5ddb4e --- /dev/null +++ b/src/mcp/server.ts @@ -0,0 +1,142 @@ +import type { + JSONRPCRequest, + JSONRPCResponse, + JSONRPCErrorResponse, + ServerInterface, // Import local interface + Transport, +} from './types'; + +// Define more specific types if needed, or use Record +interface ServerInfo { + name: string; + version: string; + capabilities: Record; +} +type ServerConfig = Record; + +/** + * Custom MCP Server implementation adhering to ServerInterface + */ +export class Server implements ServerInterface { + private info: ServerInfo; + private config: ServerConfig; + // Store handlers keyed by method name + private requestHandlers: Map< + string, + (params: unknown, request: JSONRPCRequest) => Promise + > = new Map(); // Specify handler param/return types + + constructor(info: ServerInfo, config?: ServerConfig) { + this.info = info; + this.config = config ?? {}; + } + + /** + * Set a request handler for a specific method name. + * The handler receives the validated params and the full request object. + */ + public setRequestHandler( + schema: { method: string; params: Record }, // Expect method in schema + handler: (params: unknown, request: JSONRPCRequest) => Promise, // Specify handler param/return types + ): void { + if (!schema || typeof schema.method !== 'string') { + console.error('Invalid schema provided to setRequestHandler:', schema); + throw new Error('Invalid schema: missing method string'); + } + this.requestHandlers.set(schema.method, handler); + console.log(`[MCP Server] Registered handler for method: ${schema.method}`); + } + + /** + * Connect to a transport (called by the transport itself during SSE setup). + * This fulfills the Transport.connect(server) call. + */ + public async connect(transport: Transport): Promise { + // The server doesn't store the transport per se; + // it's passed in during receiveRequest for the specific session. + console.log('[MCP Server] Transport connected for session.'); + // It needs to call the transport's connect method to complete the handshake + // and allow the transport to send the initial 'endpoint' event. + await transport.connect(this); + } + + /** + * Receive and handle an incoming JSON-RPC request using a specific transport + * associated with the client's session. + */ + public async receiveRequest( + request: JSONRPCRequest, + transport: Transport, + ): Promise { + const { method, params, id } = request; + + if (id === undefined || id === null) { + console.warn( + '[MCP Server] Received request without ID. Ignoring notification.', + ); + // MCP typically expects requests to have IDs for responses. + // Decide if notifications (no ID) should be handled. + return; + } + + const handler = this.requestHandlers.get(method); + + if (!handler) { + console.error(`[MCP Server] No handler for method: ${method}`); + const errorResponse: JSONRPCErrorResponse = { + jsonrpc: '2.0', + error: { code: -32601, message: `Method not found: ${method}` }, + id: id, + }; + await transport.sendError(errorResponse); + return; + } + + try { + console.log(`[MCP Server] Handling method: ${method} (ID: ${id})`); + // TODO: Add params validation against schema if possible/needed + const result = await handler(params, request); // Pass params and full request + + const response: JSONRPCResponse = { + jsonrpc: '2.0', + result: result, + id: id, + }; + await transport.sendResponse(response); + console.log( + `[MCP Server] Sent response for method: ${method} (ID: ${id})`, + ); + } catch (error) { + console.error( + `[MCP Server] Error handling method ${method} (ID: ${id}):`, + error, + ); + let errorMessage = 'Internal server error'; + const errorCode = -32000; // Generic server error; + + if (error instanceof Error) { + errorMessage = error.message; + // Check for specific error types or codes if needed + } + + const errorResponse: JSONRPCErrorResponse = { + jsonrpc: '2.0', + error: { code: errorCode, message: errorMessage }, + id: id, + }; + await transport.sendError(errorResponse); + } + } + + /** + * Get server info - fulfills ServerInterface + */ + public getInfo(): ServerInfo { + return this.info; + } + + // Not part of ServerInterface, but might be useful internally + public getConfig(): ServerConfig { + return this.config; + } +} diff --git a/src/mcp/service.ts b/src/mcp/service.ts index 6f3c6ca..1526d2e 100644 --- a/src/mcp/service.ts +++ b/src/mcp/service.ts @@ -1,26 +1,32 @@ -import { Server } from '@modelcontextprotocol/sdk/server/index.js'; +import { Server } from './server'; import { + // Import schemas as values ListToolsRequestSchema, CallToolRequestSchema, -} from '@modelcontextprotocol/sdk/types.js'; + // Import types using 'type' + type Transport, + type JSONRPCRequest, +} from './types'; import { toolRegistry, registerAllTools } from '../tools'; // Assuming tools are in ../tools import type { Context } from 'hono'; +// Remove manual session management - transport/routing handles this +// interface ActiveSession { ... } +// const activeSessions = new Map(); + /** - * MCP Server implementation + * MCP Service: Initializes and holds the MCP Server configuration. */ class MCPService { - private mcpServer_: Server; private ready = false; private initPromise: Promise | null = null; + // Singleton instance of the server with tool definitions + private mcpServerInstance: Server | null = null; - constructor() { - this.mcpServer_ = new Server( - { name: 'Address Validation MCP Server', version: '1.0.0' }, - { capabilities: { tools: {} } }, // Define initial capabilities structure - ); - } + // Constructor is not needed if it does nothing + // constructor() {} + // Initialize the service (register tools, create server instance) public async init(c: Context): Promise { if (this.initPromise) { return this.initPromise; @@ -28,13 +34,22 @@ class MCPService { this.initPromise = (async () => { try { - await registerAllTools(c); // Pass context to tool registration - this.syncTools(); + // Initialize shared resources like tool registry + const tools = await registerAllTools(c); // Pass context to tool registration + + // Create and configure the shared server instance + this.mcpServerInstance = new Server({ + name: 'Address Validation MCP Server', + version: '1.0.0', + capabilities: { tools }, + }); + this.syncTools(this.mcpServerInstance); // Sync tools to the instance + this.ready = true; - console.log('[MCP] Server initialization complete'); + console.log('[MCP] Service initialization complete'); } catch (error) { console.error( - `[MCP] Failed to initialize server: ${error instanceof Error ? error.message : String(error)}`, + `[MCP] Failed to initialize service: ${error instanceof Error ? error.message : String(error)}`, ); throw error; } @@ -43,19 +58,16 @@ class MCPService { return this.initPromise; } - private syncTools(): void { + // Sync tools to the provided server instance + private syncTools(serverInstance: Server): void { const tools = toolRegistry.list(); if (tools.length === 0) { console.warn('[MCP] No tools found in registry to synchronize'); return; } - const schemaMap: Record = {}; - for (const tool of tools) { - schemaMap[tool.name] = tool.inputSchema; - } - - this.mcpServer_.setRequestHandler(ListToolsRequestSchema, async () => ({ + // Register handlers on the specific server instance + serverInstance.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: tools.map(({ name, description, inputSchema }) => ({ name, description, @@ -63,24 +75,30 @@ class MCPService { })), })); - this.mcpServer_.setRequestHandler( + serverInstance.setRequestHandler( CallToolRequestSchema, - async (request: { - params: { + async (params: unknown, request: JSONRPCRequest) => { + // Extract tool name and args from the full request's params + const toolParams = request.params as { name: string; arguments?: unknown; - _meta?: { progressToken?: string | number }; }; - }) => { - const { name, arguments: args } = request.params; + if (!toolParams || typeof toolParams.name !== 'string') { + throw new Error( + "Invalid CallTool request parameters: missing or invalid 'name'", + ); + } + const { name, arguments: args } = toolParams; const tool = tools.find((t) => t.name === name); if (!tool) throw new Error(`Tool '${name}' not found`); // Tool handlers might need context indirectly (e.g., via c.env) - return tool.handler(args); + return tool.handler(args); // Pass only args to the tool's specific handler }, ); - console.log(`[MCP] Synchronized ${tools.length} tools with MCP server`); + console.log( + `[MCP] Synchronized ${tools.length} tools with MCP server instance`, + ); } public isReady(): boolean { @@ -91,12 +109,21 @@ class MCPService { if (this.ready) return; if (this.initPromise) { await this.initPromise; + } else { + throw new Error('MCP Service not initialized. Call init() first.'); } } + // --- Get the configured server instance --- public getServerInstance(): Server { - return this.mcpServer_; + if (!this.mcpServerInstance) { + throw new Error( + 'MCP Server instance not initialized. Call init() first.', + ); + } + return this.mcpServerInstance; } + // --- End Get Server Instance --- public getToolRegistry() { return toolRegistry; diff --git a/src/mcp/session-do.ts b/src/mcp/session-do.ts new file mode 100644 index 0000000..00747f7 --- /dev/null +++ b/src/mcp/session-do.ts @@ -0,0 +1,220 @@ +import type { + DurableObjectState, + DurableObjectNamespace, + ExecutionContext, +} from '@cloudflare/workers-types'; +import { Hono } from 'hono'; +import { streamSSE, type SSEStreamingApi } from 'hono/streaming'; + +// Import types and services needed by the session +import { mcpService } from './service'; // Assuming mcpService is initialized by the main worker +import { StreamableHTTPServerTransport } from './streamableHttp'; +import type { JSONRPCRequest, Transport } from './types'; + +export interface Env { + // Define expected bindings passed from wrangler/sst + MCP_SESSION_DO: DurableObjectNamespace; + // Add other bindings if the DO needs them directly + // DATABASE: D1Database; + // API_KEY: string; +} + +/** + * MCPSession Durable Object + * + * Handles the state and communication for a single MCP client session. + */ +export class MCPSession { + private state: DurableObjectState; + private app: Hono<{ Bindings: Env }>; + private env: Env; + private sse: SSEStreamingApi | null = null; + private transport: Transport | null = null; + + constructor(state: DurableObjectState, env: Env) { + this.state = state; + this.env = env; + this.app = new Hono<{ Bindings: Env }>(); + + // --- Define DO Routes --- + + // GET /sse - Establish the SSE connection for this DO instance + this.app.get('/sse', async (c) => { + return streamSSE(c, async (sseApi) => { + console.log(`[DO ${this.state.id}] SSE connection opened`); + this.sse = sseApi; // Store the SSE API object for this connection + + try { + // Ensure the shared mcpService is ready (initialized by main worker) + await mcpService.waitForReady(); + const serverInstance = mcpService.getServerInstance(); + + // Create the transport linked to this SSE stream + this.transport = new StreamableHTTPServerTransport({ + sse: this.sse, + sessionId: this.state.id.toString(), + // The client needs the *main worker's* message endpoint + // We need a way to get the base URL or pass it in the request + // Hardcoding for now, needs improvement + messageEndpoint: '/mcp/messages', + }); + + // Connect the server logic to this specific transport + await serverInstance.connect(this.transport); + console.log(`[DO ${this.state.id}] Server connected to transport`); + } catch (err) { + console.error(`[DO ${this.state.id}] Error during SSE setup:`, err); + if (this.sse) { + // Check if sse is still valid before closing + try { + this.sse.close(); + } catch (_) {} + } + this.transport = null; + this.sse = null; + } + + // Handle client disconnect + sseApi.onAbort(() => { + console.log( + `[DO ${this.state.id}] SSE connection aborted by client.`, + ); + this.transport = null; + this.sse = null; + // Consider scheduling object deletion if inactive + // this.state.storage.deleteAlarm(); + // this.state.storage.setAlarm(Date.now() + 60 * 60 * 1000); // e.g., cleanup after 1 hour + }); + }); + }); + + // POST /message - Handle incoming JSON-RPC messages for this session + this.app.post('/message', async (c) => { + console.log(`[DO ${this.state.id}] Received POST /message`); + // Ensure the SSE connection and transport are active + if (!this.transport || !this.sse) { + console.error( + `[DO ${this.state.id}] Transport or SSE not ready for message.`, + ); + return c.json( + { error: 'Internal server error: Session not ready' }, + 500, + ); + } + + // Ensure the shared mcpService is ready + await mcpService.waitForReady(); + const serverInstance = mcpService.getServerInstance(); + + try { + const requestBody = await c.req.json(); + console.log( + `[DO ${this.state.id}] Processing method:`, + requestBody?.method, + ); + + // Process the request using the server instance and *this DO's transport* + await serverInstance.receiveRequest(requestBody, this.transport); + + // Respond HTTP 202 Accepted - actual response goes via SSE + return c.body(null, 202); + } catch (err) { + console.error(`[DO ${this.state.id}] Error processing message:`, err); + // Attempt to send error back over SSE + if (this.transport) { + // Check transport again, might have disconnected + try { + // Try to extract ID from the original request if it was parsed and attached to the error + let requestId: string | number | null = null; + // Type guard to check if error might have the requestBody + if ( + err instanceof Error && + typeof err === 'object' && + err !== null && + 'requestBody' in err + ) { + const potentialRequestBody = ( + err as { requestBody?: { id?: string | number | null } } + ).requestBody; + if ( + potentialRequestBody && + (typeof potentialRequestBody.id === 'string' || + typeof potentialRequestBody.id === 'number') + ) { + requestId = potentialRequestBody.id; + } + } + + await this.transport.sendError({ + jsonrpc: '2.0', + error: { + code: -32000, + message: + err instanceof Error + ? err.message + : 'Failed to process message', + }, + id: requestId, + }); + } catch (sseErr) { + console.error( + `[DO ${this.state.id}] Failed to send error over SSE:`, + sseErr, + ); + } + } + // Return HTTP error + return c.json({ error: 'Failed to process message' }, 500); + } + }); + } + + // fetch handler routes requests to the Hono app + async fetch(request: Request): Promise { + console.log( + `[DO ${this.state.id}] Class Fetch: ${request.method} ${request.url}`, + ); + // Ensure mcpService is initialized (assuming main worker handles this) + try { + await mcpService.waitForReady(); + } catch (initError) { + console.error( + `[DO ${this.state.id}] MCP Service failed to initialize:`, + initError, + ); + return new Response('MCP Service unavailable', { status: 503 }); + } + // Route the request using the internal Hono app + return this.app.fetch(request, this.env); + } + + // Example Alarm for cleanup (requires setAlarm in onAbort) + // async alarm() { + // console.log(`[DO ${this.state.id}] Alarm triggered, cleaning up state.`); + // await this.state.storage.deleteAll(); + // } +} + +// --- ES Module Worker Export --- +// This satisfies Wrangler when `main` points to this file +// and `new_classes` is used. +// This fetch handler might not be directly called if requests +// are always routed via `env.MCP_SESSION_DO.get(id).fetch()`. +export default { + async fetch( + request: Request, + env: Env, + ctx: ExecutionContext, + ): Promise { + // This top-level fetch is generally NOT used for DO requests, + // as requests are routed to specific object instances via `stub.fetch()`. + // However, Wrangler requires a valid module export. + console.warn('[DO Script] Top-level fetch handler invoked unexpectedly.'); + // You could potentially route to a default DO instance here if needed, + // but it's often better to return an error or a simple response. + return new Response( + 'Durable Object script entry point. Access via worker binding.', + { status: 400 }, + ); + }, +}; diff --git a/src/mcp/streamableHttp.ts b/src/mcp/streamableHttp.ts new file mode 100644 index 0000000..3401c25 --- /dev/null +++ b/src/mcp/streamableHttp.ts @@ -0,0 +1,112 @@ +import type { + Transport, + JSONRPCRequest, + JSONRPCResponse, + JSONRPCErrorResponse, + ServerInterface, // Use local ServerInterface +} from './types'; +import type { SSEStreamingApi } from 'hono/streaming'; // Import Hono SSE type + +// Define a basic type for the server info structure (can be removed if ServerInterface covers it) +// interface ServerInfo { +// name: string; +// version: string; +// capabilities: Record; +// } + +interface StreamableHTTPOptions { + sse: SSEStreamingApi; // Hono's SSE API for sending events + sessionId: string; // Session ID for this connection + messageEndpoint: string; // The endpoint clients should POST messages to +} + +/** + * StreamableHTTP transport for MCP using Hono SSE + * Sends events over an established SSE connection managed by Hono. + */ +export class StreamableHTTPServerTransport implements Transport { + private sse: SSEStreamingApi; + private sessionId: string; + private messageEndpoint: string; + private serverInfo: ReturnType | null = null; // Use return type of getInfo + + constructor(options: StreamableHTTPOptions) { + this.sse = options.sse; + this.sessionId = options.sessionId; + this.messageEndpoint = options.messageEndpoint; // e.g., /mcp/messages + } + + /** + * Connect to an MCP server (called by Server instance) + * Stores server info and sends the initial endpoint event. + */ + public async connect(server: ServerInterface): Promise { + // Use ServerInterface type + this.serverInfo = server.getInfo(); // Store info like name, version, capabilities + console.log( + `[MCP Transport ${this.sessionId}] Connected to server:`, + this.serverInfo?.name, + ); + this.sendEndpointEvent(); + } + + /** + * Send the initial event telling the client where to POST messages. + */ + private sendEndpointEvent(): void { + const endpointUrl = `${this.messageEndpoint}?session_id=${this.sessionId}`; + const event = { + event: 'endpoint', // Standard MCP event name + data: endpointUrl, + }; + this.sendEvent(event); + console.log( + `[MCP Transport ${this.sessionId}] Sent endpoint event: ${endpointUrl}`, + ); + } + + /** + * Send a response to the client. + */ + public async sendResponse(response: JSONRPCResponse): Promise { + this.sendEvent({ + event: 'message', // Standard MCP event name + data: JSON.stringify(response), + }); + // console.log(`[MCP Transport ${this.sessionId}] Sent response:`, response); + } + + /** + * Send an error to the client. + */ + public async sendError(errorResponse: JSONRPCErrorResponse): Promise { + console.error( + `[MCP Transport ${this.sessionId}] Sending error:`, + errorResponse.error, + ); + this.sendEvent({ + event: 'error', // Standard MCP event name + data: JSON.stringify(errorResponse), // Send the full error response object + }); + } + + /** + * Helper to format and send an SSE event via Hono. + */ + private sendEvent(event: { event: string; data: string }): void { + // Check if stream is still writable (optional, sse.write might handle errors) + // Format according to SSE spec + const formattedEvent = `event: ${event.event}\ndata: ${event.data}\n\n`; + try { + this.sse.write(formattedEvent); + } catch (error) { + console.error( + `[MCP Transport ${this.sessionId}] Failed to write SSE event:`, + error, + ); + // Consider closing the connection or logging further + } + } + + // No need for close/disconnect methods here as Hono's streamSSE handles the lifecycle +} diff --git a/src/mcp/types.ts b/src/mcp/types.ts new file mode 100644 index 0000000..6e3e01a --- /dev/null +++ b/src/mcp/types.ts @@ -0,0 +1,154 @@ +/** + * MCP Server types + */ + +// Request schemas +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const ListToolsRequestSchema: MethodSchema = { + method: 'tools/list', + params: { type: 'object', properties: {} }, // No params expected + response: { + type: 'object', + properties: { + tools: { + type: 'array', + items: { + type: 'object', + properties: { + name: { type: 'string' }, + description: { type: 'string' }, + inputSchema: { type: 'object' }, // Ideally, define the schema structure more precisely + }, + required: ['name', 'description', 'inputSchema'], + }, + }, + }, + required: ['tools'], + }, +}; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export const CallToolRequestSchema: MethodSchema = { + method: 'tool/call', // Or could be dynamic based on tool name? + params: { + type: 'object', + properties: { + name: { type: 'string' }, + arguments: { type: 'object', additionalProperties: true }, // Allow any properties for arguments + _meta: { + type: 'object', + properties: { + progressToken: { type: ['string', 'number'] }, + }, + additionalProperties: false, + required: [], + optional: true, // Make _meta optional + }, + }, + required: ['name'], + }, + // Response schema is highly dependent on the tool being called + response: { type: 'object', additionalProperties: true }, // Allow any properties in response +}; + +// Server types +export interface ServerInfo { + name: string; + version: string; +} + +export interface ServerCapabilities { + tools: Record; +} + +export interface ServerConfig { + capabilities: ServerCapabilities; +} + +// Tool types +export interface ToolDefinition { + name: string; + description: string; + inputSchema: Record; + handler: (args: unknown) => Promise; +} + +// Basic JSON-RPC 2.0 Structures + +export interface JSONRPCRequest { + jsonrpc: '2.0'; + method: string; + params?: TParams; + id?: string | number | null; +} + +export interface JSONRPCResponse { + jsonrpc: '2.0'; + result: TResult; + id: string | number | null; +} + +export interface JSONRPCError { + code: number; + message: string; + data?: unknown; +} + +export interface JSONRPCErrorResponse { + jsonrpc: '2.0'; + error: JSONRPCError; + id: string | number | null; +} + +// Minimal interface for the Server object passed to Transport.connect +// Add methods/properties as needed for the transport to interact with the server +export interface ServerInterface { + getInfo: () => { + name: string; + version: string; + capabilities: Record; + }; + // Potentially add: receiveRequest(request: JSONRPCRequest): Promise; +} + +// Basic MCP Transport Interface +// This is what the Server class will interact with. +export interface Transport { + /** + * Called by the Server when it wants to connect to this transport. + * The transport should store the server internally if needed. + */ + connect: (server: ServerInterface) => Promise; + + /** + * Called by the Server to send a successful response back to the client. + */ + sendResponse: (response: JSONRPCResponse) => Promise; + + /** + * Called by the Server to send an error response back to the client. + */ + sendError: (errorResponse: JSONRPCErrorResponse) => Promise; + + // Add other methods if needed (e.g., close, disconnect) +} + +// Response types +export interface ListToolsResponse { + tools: Array<{ + name: string; + description: string; + inputSchema: Record; + }>; +} + +export interface CallToolResponse { + result: unknown; +} + +// Define a generic type for our simple schema definitions +interface MethodSchema { + method: string; + params: Record; + response: Record; +} diff --git a/src/routes/mcp.ts b/src/routes/mcp.ts index a4407ac..92ed5e3 100644 --- a/src/routes/mcp.ts +++ b/src/routes/mcp.ts @@ -1,42 +1,77 @@ import { Hono } from 'hono'; -import { mcpService } from '../mcp/service'; // Corrected path +import { mcpService } from '../mcp/service'; import type { Bindings } from '../api'; // Import shared Bindings -import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js'; +import type { DurableObjectNamespace } from '@cloudflare/workers-types'; // Import DO namespace type + +// Extend Bindings to include the DO binding +interface MCPBindings extends Bindings { + MCP_SESSION_DO: DurableObjectNamespace; +} // --- Hono Router Setup --- -const mcpRoutes = new Hono<{ Bindings: Bindings }>(); +// Use the extended Bindings type +const mcpRoutes = new Hono<{ Bindings: MCPBindings }>(); + +const MCP_SSE_PATH = '/sse'; +const MCP_MESSAGES_PATH = '/messages'; -// Single MCP Endpoint using Streamable HTTP Transport -mcpRoutes.post('/', async (c) => { +// --- GET /mcp/sse - Delegate to Durable Object --- +mcpRoutes.get(MCP_SSE_PATH, async (c) => { try { - // 1. Ensure MCP Service is initialized (loads tools) + // Ensure the global MCP service is initialized (for tools, etc.) + // The DO might also need to ensure this or have resources passed. await mcpService.init(c); + await mcpService.waitForReady(); + + // Generate a unique ID for the session (or use an existing one if provided) + const sessionId = crypto.randomUUID(); + const doId = c.env.MCP_SESSION_DO.idFromName(sessionId); + const stub = c.env.MCP_SESSION_DO.get(doId); + + console.log(`[Worker] Forwarding GET /sse to DO ID: ${doId}`); + + // Forward the original raw request to the DO's fetch handler + // Let the DO handle parsing its own path (/sse) + // @ts-ignore - Suppress type errors related to Response incompatibility + // Use type assertion to satisfy Hono handler signature + return (await stub.fetch(c.req.raw)) as unknown as Response; + } catch (error) { + console.error(`[Worker GET /sse] Error: ${error}`); + return c.text('Failed to initialize MCP SSE endpoint', 500); + } +}); + +// --- POST /mcp/messages - Delegate to Durable Object --- +mcpRoutes.post(MCP_MESSAGES_PATH, async (c) => { + let sessionId: string | null = null; + try { + // Note: No need to call mcpService.init/waitForReady here in the worker, + // as the DO should handle ensuring the service is ready before processing. - // 2. Get the MCP Server instance - const server = mcpService.getServerInstance(); - if (!server) { - console.error('[MCP] Server instance not available.'); - return c.text('MCP Server not initialized', 503); // Service Unavailable + sessionId = c.req.query('session_id') ?? 'unknown'; + if (sessionId === 'unknown' || !sessionId) { + console.warn('[Worker POST /messages] Missing or invalid session_id'); + return c.json( + { error: 'Missing or invalid session_id query parameter' }, + 400, + ); } - // 3. Create the transport for this request - // The transport expects an options object, including the request - const transport = new StreamableHTTPServerTransport({ - sessionIdGenerator: () => crypto.randomUUID(), - }); - - // 4. Connect the server to the transport for this request - // This handles the request processing and response streaming. - await server.connect(transport); - - // 5. The transport handles the response, so we might not need to return anything explicitly from Hono. - // However, returning c.res might be necessary depending on how Hono and the environment handle it. - // If transport.connect() completes, the response is likely handled. - // Let's return undefined or potentially c.res if needed. - return undefined; // Or potentially c.res if transport doesn't fully control response flow + // Get the Durable Object ID from the session ID + const doId = c.env.MCP_SESSION_DO.idFromName(sessionId); + const stub = c.env.MCP_SESSION_DO.get(doId); + + console.log(`[Worker] Forwarding POST /messages to DO ID: ${doId}`); + + // Forward the original raw request to the DO's fetch handler + // Let the DO handle parsing its own path (/message) + // @ts-ignore - Suppress type errors related to Response incompatibility + // Use type assertion to satisfy Hono handler signature + return (await stub.fetch(c.req.raw)) as unknown as Response; } catch (error) { - console.error(`[MCP] Error handling request: ${error}`); - return c.text('Error processing message', 500); + console.error(`[Worker POST /messages ${sessionId}] Error:`, error); + // Generic error response from the worker + return c.json({ error: 'Failed to process message' }, 500); } }); diff --git a/src/tools/index.ts b/src/tools/index.ts index 8ad6635..5d30282 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -1,6 +1,7 @@ import { DefaultToolRegistry } from './registry'; import { getPostalCodeInfoTool, getPostalInfoTool } from './postal-tools'; import type { Context } from 'hono'; +import type { ToolDefinition } from './types'; // Create a tool registry instance const toolRegistry = new DefaultToolRegistry(); @@ -9,26 +10,29 @@ const toolRegistry = new DefaultToolRegistry(); * Register all tools with the registry * @param c Hono context to inject into tools */ -async function registerAllTools(c: Context): Promise { +async function registerAllTools(c: Context): Promise { try { // Register postal code tools toolRegistry.register( getPostalCodeInfoTool(c).name, getPostalCodeInfoTool(c).description, getPostalCodeInfoTool(c).inputSchema, - getPostalCodeInfoTool(c).handler + getPostalCodeInfoTool(c).handler, ); toolRegistry.register( getPostalInfoTool(c).name, getPostalInfoTool(c).description, getPostalInfoTool(c).inputSchema, - getPostalInfoTool(c).handler + getPostalInfoTool(c).handler, ); console.log(`[MCP] Total registered tools: ${toolRegistry.list().length}`); + return toolRegistry.list(); } catch (error) { - console.error(`[MCP] Error registering tools: ${error instanceof Error ? error.message : String(error)}`); + console.error( + `[MCP] Error registering tools: ${error instanceof Error ? error.message : String(error)}`, + ); throw error; // Re-throw to ensure initialization failure is propagated } } diff --git a/src/tools/types.ts b/src/tools/types.ts index 5ddad18..40f65a0 100644 --- a/src/tools/types.ts +++ b/src/tools/types.ts @@ -7,7 +7,7 @@ export type ToolResponseContentItem = { type: 'text' | 'image' | 'json'; text?: string; image_url?: string; - json?: any; + json?: unknown; }; /** @@ -21,7 +21,7 @@ export type ToolResponse = { /** * Tool handler function */ -export type ToolHandler = (params: any) => Promise; +export type ToolHandler = (params: unknown) => Promise; /** * Tool definition @@ -29,7 +29,7 @@ export type ToolHandler = (params: any) => Promise; export type ToolDefinition = { name: string; description: string; - inputSchema: any; + inputSchema: unknown; handler: ToolHandler; }; @@ -37,7 +37,12 @@ export type ToolDefinition = { * Tool registry interface */ export interface ToolRegistry { - register(name: string, description: string, inputSchema: any, handler: ToolHandler): void; + register( + name: string, + description: string, + inputSchema: any, + handler: ToolHandler, + ): void; list(): ToolDefinition[]; get(name: string): ToolDefinition | undefined; } diff --git a/sst-env.d.ts b/sst-env.d.ts index cf38e85..38f6aca 100644 --- a/sst-env.d.ts +++ b/sst-env.d.ts @@ -18,6 +18,7 @@ declare module "sst" { export interface Resource { "AddressValidationDB": cloudflare.D1Database "DailyImportCronHandler": cloudflare.Service + "Hono": cloudflare.Service "ImportWorker": cloudflare.Service } } diff --git a/sst.config.ts b/sst.config.ts index 8d6247d..3db7e72 100644 --- a/sst.config.ts +++ b/sst.config.ts @@ -1,7 +1,5 @@ /// -console.log('📜 sst.config.ts – TOP'); - export default $config({ app(input) { console.log('🚀 inside app()'); @@ -16,25 +14,10 @@ export default $config({ const API_KEY = new sst.Secret('API_KEY'); const database = new sst.cloudflare.D1('AddressValidationDB'); - const saferBufferAlias = { - build: { - esbuild: { - alias: { 'safer-buffer': 'node:buffer' }, - }, - }, - }; - const importWorker = new sst.cloudflare.Worker('ImportWorker', { url: false, link: [database], handler: 'src/import-worker.ts', - transform: { - worker: { - compatibilityDate: '2025-04-28', - compatibilityFlags: ['nodejs_compat_v2'], - }, - }, - ...saferBufferAlias, }); const binding = sst.cloudflare.binding({ @@ -49,13 +32,6 @@ export default $config({ job: { link: [database, API_KEY, importWorker, binding], handler: 'src/daily-import.ts', - transform: { - worker: { - compatibilityDate: '2025-04-28', - compatibilityFlags: ['nodejs_compat_v2'], - }, - }, - ...saferBufferAlias, }, }); @@ -63,17 +39,10 @@ export default $config({ url: true, link: [database, API_KEY, importWorker, binding], handler: 'src/api.ts', - transform: { - worker: { - compatibilityDate: '2025-04-28', - compatibilityFlags: ['nodejs_compat_v2'], - }, - }, domain: $app.stage === 'production' ? 'address-validation.lambdacurry.dev' : undefined, - ...saferBufferAlias, }); return { diff --git a/wrangler.toml b/wrangler.toml new file mode 100644 index 0000000..972d562 --- /dev/null +++ b/wrangler.toml @@ -0,0 +1,35 @@ +name = "address-validation-api-mcp" # Can be different from SST app name, focuses on DO deployment +compatibility_date = "2024-04-29" # Add a compatibility date +main = "src/mcp/session-do.ts" # Point main to the DO script (now an ES module) +# Remove main entry point - SST handles the main worker deployment +# main = "src/mcp/session-do.ts" +# compatibility_date = "YYYY-MM-DD" # Set your desired compatibility date + +[durable_objects] +# Define the binding name used in Worker code (c.env.MCP_SESSION_DO) +# and the class name exported from the script. +bindings = [ + { name = "MCP_SESSION_DO", class_name = "MCPSession" } +] + +[[migrations]] +tag = "v1" # Initial migration tag +# List the NEW Durable Object classes being introduced in this migration. +new_classes = ["MCPSession"] + +# IMPORTANT: +# This wrangler.toml primarily defines the DO. +# SST still manages the main worker deployment ('Hono' in sst.config.ts). +# If the DO script ('src/mcp/session-do.ts') needs bindings (like D1, secrets), +# they need to be configured here as well for `wrangler deploy` to work correctly, +# or passed via fetch requests from the main worker. +# For simplicity, we'll assume they are passed or not needed directly by the DO for now. +# Example D1 binding for wrangler (if needed): +# [[d1_databases]] +# binding = "DB" # How the DO accesses it (env.DB) +# database_name = "AddressValidationDB" +# database_id = "YOUR_D1_DB_ID" # Find this in Cloudflare dashboard or SST output + +# Example secrets (if needed directly by DO): +# [vars] +# API_KEY = "placeholder" \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..ca75a35 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1680 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + +__metadata: + version: 6 + cacheKey: 8 + +"@biomejs/biome@npm:^1.9.4": + version: 1.9.4 + resolution: "@biomejs/biome@npm:1.9.4" + dependencies: + "@biomejs/cli-darwin-arm64": 1.9.4 + "@biomejs/cli-darwin-x64": 1.9.4 + "@biomejs/cli-linux-arm64": 1.9.4 + "@biomejs/cli-linux-arm64-musl": 1.9.4 + "@biomejs/cli-linux-x64": 1.9.4 + "@biomejs/cli-linux-x64-musl": 1.9.4 + "@biomejs/cli-win32-arm64": 1.9.4 + "@biomejs/cli-win32-x64": 1.9.4 + dependenciesMeta: + "@biomejs/cli-darwin-arm64": + optional: true + "@biomejs/cli-darwin-x64": + optional: true + "@biomejs/cli-linux-arm64": + optional: true + "@biomejs/cli-linux-arm64-musl": + optional: true + "@biomejs/cli-linux-x64": + optional: true + "@biomejs/cli-linux-x64-musl": + optional: true + "@biomejs/cli-win32-arm64": + optional: true + "@biomejs/cli-win32-x64": + optional: true + bin: + biome: bin/biome + checksum: 0bb448d9cf07c76556e0af62cec4262ccdf2d2800a472459c0666c180fdb74ac602a5d87325e926e860cc41c34166fca27f753afc24b2264317f2f29861005b5 + languageName: node + linkType: hard + +"@biomejs/cli-darwin-arm64@npm:1.9.4": + version: 1.9.4 + resolution: "@biomejs/cli-darwin-arm64@npm:1.9.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@biomejs/cli-darwin-x64@npm:1.9.4": + version: 1.9.4 + resolution: "@biomejs/cli-darwin-x64@npm:1.9.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@biomejs/cli-linux-arm64-musl@npm:1.9.4": + version: 1.9.4 + resolution: "@biomejs/cli-linux-arm64-musl@npm:1.9.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@biomejs/cli-linux-arm64@npm:1.9.4": + version: 1.9.4 + resolution: "@biomejs/cli-linux-arm64@npm:1.9.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@biomejs/cli-linux-x64-musl@npm:1.9.4": + version: 1.9.4 + resolution: "@biomejs/cli-linux-x64-musl@npm:1.9.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@biomejs/cli-linux-x64@npm:1.9.4": + version: 1.9.4 + resolution: "@biomejs/cli-linux-x64@npm:1.9.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@biomejs/cli-win32-arm64@npm:1.9.4": + version: 1.9.4 + resolution: "@biomejs/cli-win32-arm64@npm:1.9.4" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@biomejs/cli-win32-x64@npm:1.9.4": + version: 1.9.4 + resolution: "@biomejs/cli-win32-x64@npm:1.9.4" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@cloudflare/workers-types@npm:^4.20250424.0": + version: 4.20250429.0 + resolution: "@cloudflare/workers-types@npm:4.20250429.0" + checksum: 5e7a79f051361eda8aca57ce0400ddd63c6ad1ee1b8e135e07e8fe3e304685f4a99aba4bedc9e30c2776241fad6ee335c6cb9cf30bd6743f3863d53dfe94fc88 + languageName: node + linkType: hard + +"@modelcontextprotocol/sdk@npm:1.6.1": + version: 1.6.1 + resolution: "@modelcontextprotocol/sdk@npm:1.6.1" + dependencies: + content-type: ^1.0.5 + cors: ^2.8.5 + eventsource: ^3.0.2 + express: ^5.0.1 + express-rate-limit: ^7.5.0 + pkce-challenge: ^4.1.0 + raw-body: ^3.0.0 + zod: ^3.23.8 + zod-to-json-schema: ^3.24.1 + checksum: fe1f6a4e0845efc59a0baa86bd8ff4c30a6017c24dcfaf841226964df0b5ee3a5e8d726a68386edf5e5112ff7c654e94ace0783bb21bdfd5ef827e84f8a9ba8a + languageName: node + linkType: hard + +"@tsconfig/bun@npm:1.0.7": + version: 1.0.7 + resolution: "@tsconfig/bun@npm:1.0.7" + checksum: 04f6c2af3bb72b3771d15b0ce2905f80b18a48f0d416c11fef3cfb55e5bda35e4e350a6a2636c790e3c8dffd3f7ed1bb75c47af790780facccbe75a592cc6f37 + languageName: node + linkType: hard + +"@types/bun@npm:latest": + version: 1.2.10 + resolution: "@types/bun@npm:1.2.10" + dependencies: + bun-types: 1.2.10 + checksum: 562b349a627ce6d94faa3ebd41735016ab05dd31778300a7bf09544ef1d0d4b38ff6ee39f49692723b464597c8dddf2e3bb7f7fb66cb25ea8066820245215817 + languageName: node + linkType: hard + +"@types/node-fetch@npm:^2.6.4": + version: 2.6.12 + resolution: "@types/node-fetch@npm:2.6.12" + dependencies: + "@types/node": "*" + form-data: ^4.0.0 + checksum: 9647e68f9a125a090220c38d77b3c8e669c488658ae7506f1b4f9568214beba087624b1705bba1dc76649a65281ce3fd5b400e15266cbef8088027fb88777557 + languageName: node + linkType: hard + +"@types/node@npm:*, @types/node@npm:^22.14.0": + version: 22.15.3 + resolution: "@types/node@npm:22.15.3" + dependencies: + undici-types: ~6.21.0 + checksum: 26618a9fdfb84de3841e898b7c5fd372e1c0bdb9adc3ec71c12c38dd07d4e73da14681924919d27ff509ebf3714b8de941a21f51c26146cc8aaae31561ca7a5c + languageName: node + linkType: hard + +"@types/node@npm:^18.11.18": + version: 18.19.87 + resolution: "@types/node@npm:18.19.87" + dependencies: + undici-types: ~5.26.4 + checksum: 83ca9e0c6b987702e0ff1deb2f7e4d176dc19d85fc6cc9241597047f248aca9aff29c1586ef391bc3b7b2f635e4c622131c2006336561c9aafa75490c30f7763 + languageName: node + linkType: hard + +"@types/uuid@npm:^9.0.8": + version: 9.0.8 + resolution: "@types/uuid@npm:9.0.8" + checksum: b8c60b7ba8250356b5088302583d1704a4e1a13558d143c549c408bf8920535602ffc12394ede77f8a8083511b023704bc66d1345792714002bfa261b17c5275 + languageName: node + linkType: hard + +"abort-controller@npm:^3.0.0": + version: 3.0.0 + resolution: "abort-controller@npm:3.0.0" + dependencies: + event-target-shim: ^5.0.0 + checksum: 170bdba9b47b7e65906a28c8ce4f38a7a369d78e2271706f020849c1bfe0ee2067d4261df8bbb66eb84f79208fd5b710df759d64191db58cfba7ce8ef9c54b75 + languageName: node + linkType: hard + +"accepts@npm:^2.0.0": + version: 2.0.0 + resolution: "accepts@npm:2.0.0" + dependencies: + mime-types: ^3.0.0 + negotiator: ^1.0.0 + checksum: 49fe6c050cb6f6ff4e771b4d88324fca4d3127865f2473872e818dca127d809ba3aa8fdfc7acb51dd3c5bade7311ca6b8cfff7015ea6db2f7eb9c8444d223a4f + languageName: node + linkType: hard + +"address-validation-api@workspace:.": + version: 0.0.0-use.local + resolution: "address-validation-api@workspace:." + dependencies: + "@biomejs/biome": ^1.9.4 + "@cloudflare/workers-types": ^4.20250424.0 + "@types/bun": latest + "@types/node": ^22.14.0 + "@types/uuid": ^9.0.8 + cloudflare: ^4.2.0 + hono: ^4.7.7 + jszip: ^3.10.1 + sst: ^3.13.17 + typescript: ^5.8.3 + uuid: ^11.1.0 + zod: ^3.24.2 + zod-to-json-schema: ^3.22.5 + peerDependencies: + typescript: ^5.8.3 + languageName: unknown + linkType: soft + +"agentkeepalive@npm:^4.2.1": + version: 4.6.0 + resolution: "agentkeepalive@npm:4.6.0" + dependencies: + humanize-ms: ^1.2.1 + checksum: b3cdd10efca04876defda3c7671163523fcbce20e8ef7a8f9f30919a242e32b846791c0f1a8a0269718a585805a2cdcd031779ff7b9927a1a8dd8586f8c2e8c5 + languageName: node + linkType: hard + +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be + languageName: node + linkType: hard + +"available-typed-arrays@npm:^1.0.7": + version: 1.0.7 + resolution: "available-typed-arrays@npm:1.0.7" + dependencies: + possible-typed-array-names: ^1.0.0 + checksum: 1aa3ffbfe6578276996de660848b6e95669d9a95ad149e3dd0c0cda77db6ee1dbd9d1dd723b65b6d277b882dd0c4b91a654ae9d3cf9e1254b7e93e4908d78fd3 + languageName: node + linkType: hard + +"aws-sdk@npm:2.1692.0": + version: 2.1692.0 + resolution: "aws-sdk@npm:2.1692.0" + dependencies: + buffer: 4.9.2 + events: 1.1.1 + ieee754: 1.1.13 + jmespath: 0.16.0 + querystring: 0.2.0 + sax: 1.2.1 + url: 0.10.3 + util: ^0.12.4 + uuid: 8.0.0 + xml2js: 0.6.2 + checksum: 7b245fab02afebeb731db68feeb63c60475511a28bee3ae763c1199e4816f2b2c12315d873c93d827fef5997271d44e00c412ceab2329ca3079797429467c782 + languageName: node + linkType: hard + +"aws4fetch@npm:1.0.18": + version: 1.0.18 + resolution: "aws4fetch@npm:1.0.18" + checksum: a8185388a646bdcb8750919c9ad3666c24afa2a48a8aac8fc673b3c069dfb2e2c67ab67977fc6510185051bc11c0e0c5f771684168bdd5ca6d235040b3864fa9 + languageName: node + linkType: hard + +"base64-js@npm:^1.0.2": + version: 1.5.1 + resolution: "base64-js@npm:1.5.1" + checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 + languageName: node + linkType: hard + +"body-parser@npm:^2.2.0": + version: 2.2.0 + resolution: "body-parser@npm:2.2.0" + dependencies: + bytes: ^3.1.2 + content-type: ^1.0.5 + debug: ^4.4.0 + http-errors: ^2.0.0 + iconv-lite: ^0.6.3 + on-finished: ^2.4.1 + qs: ^6.14.0 + raw-body: ^3.0.0 + type-is: ^2.0.0 + checksum: 7fe3a2d288f0b632528d6ccb90052d1a9492c5b79d5716d32c8de1f5fb8237b0d31ee5050e1d0b7ff143a492ff151804612c6e2686a222a1d4c9e2e6531b8fb2 + languageName: node + linkType: hard + +"buffer@npm:4.9.2": + version: 4.9.2 + resolution: "buffer@npm:4.9.2" + dependencies: + base64-js: ^1.0.2 + ieee754: ^1.1.4 + isarray: ^1.0.0 + checksum: 8801bc1ba08539f3be70eee307a8b9db3d40f6afbfd3cf623ab7ef41dffff1d0a31de0addbe1e66e0ca5f7193eeb667bfb1ecad3647f8f1b0750de07c13295c3 + languageName: node + linkType: hard + +"bun-types@npm:1.2.10": + version: 1.2.10 + resolution: "bun-types@npm:1.2.10" + dependencies: + "@types/node": "*" + checksum: f011c6c94ad356b5fbec29e5a8da055e4133dc632349b610546d597d47e8a6284156aa73b5fe2b0c5736298849240285df8a32d779cbccd1959036de21d3b7e1 + languageName: node + linkType: hard + +"bytes@npm:3.1.2, bytes@npm:^3.1.2": + version: 3.1.2 + resolution: "bytes@npm:3.1.2" + checksum: e4bcd3948d289c5127591fbedf10c0b639ccbf00243504e4e127374a15c3bc8eed0d28d4aaab08ff6f1cf2abc0cce6ba3085ed32f4f90e82a5683ce0014e1b6e + languageName: node + linkType: hard + +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" + dependencies: + es-errors: ^1.3.0 + function-bind: ^1.1.2 + checksum: b2863d74fcf2a6948221f65d95b91b4b2d90cfe8927650b506141e669f7d5de65cea191bf788838bc40d13846b7886c5bc5c84ab96c3adbcf88ad69a72fcdc6b + languageName: node + linkType: hard + +"call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" + dependencies: + call-bind-apply-helpers: ^1.0.0 + es-define-property: ^1.0.0 + get-intrinsic: ^1.2.4 + set-function-length: ^1.2.2 + checksum: aa2899bce917a5392fd73bd32e71799c37c0b7ab454e0ed13af7f6727549091182aade8bbb7b55f304a5bc436d543241c14090fb8a3137e9875e23f444f4f5a9 + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: ^1.0.2 + get-intrinsic: ^1.3.0 + checksum: 2f6399488d1c272f56306ca60ff696575e2b7f31daf23bc11574798c84d9f2759dceb0cb1f471a85b77f28962a7ac6411f51d283ea2e45319009a19b6ccab3b2 + languageName: node + linkType: hard + +"cloudflare@npm:^4.2.0": + version: 4.2.0 + resolution: "cloudflare@npm:4.2.0" + dependencies: + "@types/node": ^18.11.18 + "@types/node-fetch": ^2.6.4 + abort-controller: ^3.0.0 + agentkeepalive: ^4.2.1 + form-data-encoder: 1.7.2 + formdata-node: ^4.3.2 + node-fetch: ^2.6.7 + checksum: 695f4632915a18731e033dce1a54b03feb42522d0314ee009d435c66f940468d21c685885c298081019d0f83eb4638a988222284d9ed7e291a55d9a78a663cce + languageName: node + linkType: hard + +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: ~1.0.0 + checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c + languageName: node + linkType: hard + +"content-disposition@npm:^1.0.0": + version: 1.0.0 + resolution: "content-disposition@npm:1.0.0" + dependencies: + safe-buffer: 5.2.1 + checksum: b27e2579fefe0ecf78238bb652fbc750671efce8344f0c6f05235b12433e6a965adb40906df1ac1fdde23e8f9f0e58385e44640e633165420f3f47d830ae0398 + languageName: node + linkType: hard + +"content-type@npm:^1.0.5": + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: 566271e0a251642254cde0f845f9dd4f9856e52d988f4eb0d0dcffbb7a1f8ec98de7a5215fc628f3bce30fe2fb6fd2bc064b562d721658c59b544e2d34ea2766 + languageName: node + linkType: hard + +"cookie-signature@npm:^1.2.1": + version: 1.2.2 + resolution: "cookie-signature@npm:1.2.2" + checksum: 1ad4f9b3907c9f3673a0f0a07c0a23da7909ac6c9204c5d80a0ec102fe50ccc45f27fdf496361840d6c132c5bb0037122c0a381f856d070183d1ebe3e5e041ff + languageName: node + linkType: hard + +"cookie@npm:^0.7.1": + version: 0.7.2 + resolution: "cookie@npm:0.7.2" + checksum: 9bf8555e33530affd571ea37b615ccad9b9a34febbf2c950c86787088eb00a8973690833b0f8ebd6b69b753c62669ea60cec89178c1fb007bf0749abed74f93e + languageName: node + linkType: hard + +"core-util-is@npm:~1.0.0": + version: 1.0.3 + resolution: "core-util-is@npm:1.0.3" + checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 + languageName: node + linkType: hard + +"cors@npm:^2.8.5": + version: 2.8.5 + resolution: "cors@npm:2.8.5" + dependencies: + object-assign: ^4 + vary: ^1 + checksum: ced838404ccd184f61ab4fdc5847035b681c90db7ac17e428f3d81d69e2989d2b680cc254da0e2554f5ed4f8a341820a1ce3d1c16b499f6e2f47a1b9b07b5006 + languageName: node + linkType: hard + +"debug@npm:^4.3.5, debug@npm:^4.4.0": + version: 4.4.0 + resolution: "debug@npm:4.4.0" + dependencies: + ms: ^2.1.3 + peerDependenciesMeta: + supports-color: + optional: true + checksum: fb42df878dd0e22816fc56e1fdca9da73caa85212fbe40c868b1295a6878f9101ae684f4eeef516c13acfc700f5ea07f1136954f43d4cd2d477a811144136479 + languageName: node + linkType: hard + +"define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + gopd: ^1.0.1 + checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b + languageName: node + linkType: hard + +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020 + languageName: node + linkType: hard + +"depd@npm:2.0.0, depd@npm:^2.0.0": + version: 2.0.0 + resolution: "depd@npm:2.0.0" + checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a + languageName: node + linkType: hard + +"dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: ^1.0.1 + es-errors: ^1.3.0 + gopd: ^1.2.0 + checksum: 149207e36f07bd4941921b0ca929e3a28f1da7bd6b6ff8ff7f4e2f2e460675af4576eeba359c635723dc189b64cdd4787e0255897d5b135ccc5d15cb8685fc90 + languageName: node + linkType: hard + +"ee-first@npm:1.1.1": + version: 1.1.1 + resolution: "ee-first@npm:1.1.1" + checksum: 1b4cac778d64ce3b582a7e26b218afe07e207a0f9bfe13cc7395a6d307849cfe361e65033c3251e00c27dd060cab43014c2d6b2647676135e18b77d2d05b3f4f + languageName: node + linkType: hard + +"encodeurl@npm:^2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: abf5cd51b78082cf8af7be6785813c33b6df2068ce5191a40ca8b1afe6a86f9230af9a9ce694a5ce4665955e5c1120871826df9c128a642e09c58d592e2807fe + languageName: node + linkType: hard + +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 0512f4e5d564021c9e3a644437b0155af2679d10d80f21adaf868e64d30efdfbd321631956f20f42d655fedb2e3a027da479fad3fa6048f768eb453a80a5f80a + languageName: node + linkType: hard + +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 + languageName: node + linkType: hard + +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" + dependencies: + es-errors: ^1.3.0 + checksum: 214d3767287b12f36d3d7267ef342bbbe1e89f899cfd67040309fc65032372a8e60201410a99a1645f2f90c1912c8c49c8668066f6bdd954bcd614dda2e3da97 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: ^1.3.0 + get-intrinsic: ^1.2.6 + has-tostringtag: ^1.0.2 + hasown: ^2.0.2 + checksum: 789f35de4be3dc8d11fdcb91bc26af4ae3e6d602caa93299a8c45cf05d36cc5081454ae2a6d3afa09cceca214b76c046e4f8151e092e6fc7feeb5efb9e794fc6 + languageName: node + linkType: hard + +"escape-html@npm:^1.0.3": + version: 1.0.3 + resolution: "escape-html@npm:1.0.3" + checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 + languageName: node + linkType: hard + +"etag@npm:^1.8.1": + version: 1.8.1 + resolution: "etag@npm:1.8.1" + checksum: 571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff + languageName: node + linkType: hard + +"event-target-shim@npm:^5.0.0": + version: 5.0.1 + resolution: "event-target-shim@npm:5.0.1" + checksum: 1ffe3bb22a6d51bdeb6bf6f7cf97d2ff4a74b017ad12284cc9e6a279e727dc30a5de6bb613e5596ff4dc3e517841339ad09a7eec44266eccb1aa201a30448166 + languageName: node + linkType: hard + +"events@npm:1.1.1": + version: 1.1.1 + resolution: "events@npm:1.1.1" + checksum: 40431eb005cc4c57861b93d44c2981a49e7feb99df84cf551baed299ceea4444edf7744733f6a6667e942af687359b1f4a87ec1ec4f21d5127dac48a782039b9 + languageName: node + linkType: hard + +"eventsource-parser@npm:^3.0.1": + version: 3.0.1 + resolution: "eventsource-parser@npm:3.0.1" + checksum: 737f78d1330d7c257125c6b2bd374bb50c5588ac81eb83c05cd6af81fce295bd40fd3d3bb3357ba028a688267363f07912a7e6044656033cde7e8f836d840e40 + languageName: node + linkType: hard + +"eventsource@npm:^3.0.2": + version: 3.0.6 + resolution: "eventsource@npm:3.0.6" + dependencies: + eventsource-parser: ^3.0.1 + checksum: ac3bc3cc339b03c46688fde0a340957b8efd7a4d90592ac25b0cd497de2c8ee77259f1162d1beade6e7b37e932d31b5daec323a96215e392c4f5c535a29db36f + languageName: node + linkType: hard + +"express-rate-limit@npm:^7.5.0": + version: 7.5.0 + resolution: "express-rate-limit@npm:7.5.0" + peerDependencies: + express: ^4.11 || 5 || ^5.0.0-beta.1 + checksum: 2807341039c111eed292e28768aff3c69515cb96ff15799976a44ead776c41931d6947fe3da3cea021fa0490700b1ab468b4832bbed7d231bed63c195d22b959 + languageName: node + linkType: hard + +"express@npm:^5.0.1": + version: 5.1.0 + resolution: "express@npm:5.1.0" + dependencies: + accepts: ^2.0.0 + body-parser: ^2.2.0 + content-disposition: ^1.0.0 + content-type: ^1.0.5 + cookie: ^0.7.1 + cookie-signature: ^1.2.1 + debug: ^4.4.0 + encodeurl: ^2.0.0 + escape-html: ^1.0.3 + etag: ^1.8.1 + finalhandler: ^2.1.0 + fresh: ^2.0.0 + http-errors: ^2.0.0 + merge-descriptors: ^2.0.0 + mime-types: ^3.0.0 + on-finished: ^2.4.1 + once: ^1.4.0 + parseurl: ^1.3.3 + proxy-addr: ^2.0.7 + qs: ^6.14.0 + range-parser: ^1.2.1 + router: ^2.2.0 + send: ^1.1.0 + serve-static: ^2.2.0 + statuses: ^2.0.1 + type-is: ^2.0.1 + vary: ^1.1.2 + checksum: 06e6141780c6c4780111f971ce062c83d4cf4862c40b43caf1d95afcbb58d7422c560503b8c9d04c7271511525d09cbdbe940bcaad63970fd4c1b9f6fd713bdb + languageName: node + linkType: hard + +"finalhandler@npm:^2.1.0": + version: 2.1.0 + resolution: "finalhandler@npm:2.1.0" + dependencies: + debug: ^4.4.0 + encodeurl: ^2.0.0 + escape-html: ^1.0.3 + on-finished: ^2.4.1 + parseurl: ^1.3.3 + statuses: ^2.0.1 + checksum: 27ca9cc83b1384ba37959eb95bc7e62bc0bf4d6f6af63f6d38821cf7499b113e34b23f96a2a031616817f73986f94deea67c2f558de9daf406790c181a2501df + languageName: node + linkType: hard + +"for-each@npm:^0.3.5": + version: 0.3.5 + resolution: "for-each@npm:0.3.5" + dependencies: + is-callable: ^1.2.7 + checksum: 3c986d7e11f4381237cc98baa0a2f87eabe74719eee65ed7bed275163082b940ede19268c61d04c6260e0215983b12f8d885e3c8f9aa8c2113bf07c37051745c + languageName: node + linkType: hard + +"form-data-encoder@npm:1.7.2": + version: 1.7.2 + resolution: "form-data-encoder@npm:1.7.2" + checksum: aeebd87a1cb009e13cbb5e4e4008e6202ed5f6551eb6d9582ba8a062005178907b90f4887899d3c993de879159b6c0c940af8196725b428b4248cec5af3acf5f + languageName: node + linkType: hard + +"form-data@npm:^4.0.0": + version: 4.0.2 + resolution: "form-data@npm:4.0.2" + dependencies: + asynckit: ^0.4.0 + combined-stream: ^1.0.8 + es-set-tostringtag: ^2.1.0 + mime-types: ^2.1.12 + checksum: e887298b22c13c7c9c5a8ba3716f295a479a13ca78bfd855ef11cbce1bcf22bc0ae2062e94808e21d46e5c667664a1a1a8a7f57d7040193c1fefbfb11af58aab + languageName: node + linkType: hard + +"formdata-node@npm:^4.3.2": + version: 4.4.1 + resolution: "formdata-node@npm:4.4.1" + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 4.0.0-beta.3 + checksum: d91d4f667cfed74827fc281594102c0dabddd03c9f8b426fc97123eedbf73f5060ee43205d89284d6854e2fc5827e030cd352ef68b93beda8decc2d72128c576 + languageName: node + linkType: hard + +"forwarded@npm:0.2.0": + version: 0.2.0 + resolution: "forwarded@npm:0.2.0" + checksum: fd27e2394d8887ebd16a66ffc889dc983fbbd797d5d3f01087c020283c0f019a7d05ee85669383d8e0d216b116d720fc0cef2f6e9b7eb9f4c90c6e0bc7fd28e6 + languageName: node + linkType: hard + +"fresh@npm:^2.0.0": + version: 2.0.0 + resolution: "fresh@npm:2.0.0" + checksum: 38b9828352c6271e2a0dd8bdd985d0100dbbc4eb8b6a03286071dd6f7d96cfaacd06d7735701ad9a95870eb3f4555e67c08db1dcfe24c2e7bb87383c72fae1d2 + languageName: node + linkType: hard + +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.3.0": + version: 1.3.0 + resolution: "get-intrinsic@npm:1.3.0" + 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 + checksum: 301008e4482bb9a9cb49e132b88fee093bff373b4e6def8ba219b1e96b60158a6084f273ef5cafe832e42cd93462f4accb46a618d35fe59a2b507f2388c5b79d + languageName: node + linkType: hard + +"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: ^1.0.1 + es-object-atoms: ^1.0.0 + checksum: 4fc96afdb58ced9a67558698b91433e6b037aaa6f1493af77498d7c85b141382cf223c0e5946f334fb328ee85dfe6edd06d218eaf09556f4bc4ec6005d7f5f7b + languageName: node + linkType: hard + +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: cc6d8e655e360955bdccaca51a12a474268f95bb793fc3e1f2bdadb075f28bfd1fd988dab872daf77a61d78cbaf13744bc8727a17cfb1d150d76047d805375f3 + languageName: node + linkType: hard + +"has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: ^1.0.0 + checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 + languageName: node + linkType: hard + +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: b2316c7302a0e8ba3aaba215f834e96c22c86f192e7310bdf689dd0e6999510c89b00fbc5742571507cebf25764d68c988b3a0da217369a73596191ac0ce694b + languageName: node + linkType: hard + +"has-tostringtag@npm:^1.0.2": + version: 1.0.2 + resolution: "has-tostringtag@npm:1.0.2" + dependencies: + has-symbols: ^1.0.3 + checksum: 999d60bb753ad714356b2c6c87b7fb74f32463b8426e159397da4bde5bca7e598ab1073f4d8d4deafac297f2eb311484cd177af242776bf05f0d11565680468d + languageName: node + linkType: hard + +"hasown@npm:^2.0.2": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: ^1.1.2 + checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db + languageName: node + linkType: hard + +"hono@npm:4.7.4": + version: 4.7.4 + resolution: "hono@npm:4.7.4" + checksum: fcc4b48eaa51572f6db6b102a2ce9c69ead6c47cba9c4e9e816c5741894dc210913f29379967005591d43884ea8ad56a66859c4126bf0eeddc275d64fcb9af1c + languageName: node + linkType: hard + +"hono@npm:^4.7.7": + version: 4.7.8 + resolution: "hono@npm:4.7.8" + checksum: fcfcf5d815f74c48fec01d47e515fd544972bd507badb565b280a2f4bd8dbb874d3fac1615495e0f9fba4453fd4b6d9a24d7e326d6ac45842a55935cdb3076d5 + languageName: node + linkType: hard + +"http-errors@npm:2.0.0, http-errors@npm:^2.0.0": + version: 2.0.0 + resolution: "http-errors@npm:2.0.0" + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + checksum: 9b0a3782665c52ce9dc658a0d1560bcb0214ba5699e4ea15aefb2a496e2ca83db03ebc42e1cce4ac1f413e4e0d2d736a3fd755772c556a9a06853ba2a0b7d920 + languageName: node + linkType: hard + +"humanize-ms@npm:^1.2.1": + version: 1.2.1 + resolution: "humanize-ms@npm:1.2.1" + dependencies: + ms: ^2.0.0 + checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 + languageName: node + linkType: hard + +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.3": + version: 0.6.3 + resolution: "iconv-lite@npm:0.6.3" + dependencies: + safer-buffer: ">= 2.1.2 < 3.0.0" + checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf + languageName: node + linkType: hard + +"ieee754@npm:1.1.13": + version: 1.1.13 + resolution: "ieee754@npm:1.1.13" + checksum: 102df1ba662e316e6160f7ce29c7c7fa3e04f2014c288336c5a9ff40bbcc2a27d209fa2a81ebfb33f28b1941021343d30e9ad8ee85a2d61f79f5936c35edc33d + languageName: node + linkType: hard + +"ieee754@npm:^1.1.4": + version: 1.2.1 + resolution: "ieee754@npm:1.2.1" + checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e + languageName: node + linkType: hard + +"immediate@npm:~3.0.5": + version: 3.0.6 + resolution: "immediate@npm:3.0.6" + checksum: f9b3486477555997657f70318cc8d3416159f208bec4cca3ff3442fd266bc23f50f0c9bd8547e1371a6b5e82b821ec9a7044a4f7b944798b25aa3cc6d5e63e62 + languageName: node + linkType: hard + +"inherits@npm:2.0.4, inherits@npm:^2.0.3, inherits@npm:~2.0.3": + version: 2.0.4 + resolution: "inherits@npm:2.0.4" + checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + languageName: node + linkType: hard + +"ipaddr.js@npm:1.9.1": + version: 1.9.1 + resolution: "ipaddr.js@npm:1.9.1" + checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 + languageName: node + linkType: hard + +"is-arguments@npm:^1.0.4": + version: 1.2.0 + resolution: "is-arguments@npm:1.2.0" + dependencies: + call-bound: ^1.0.2 + has-tostringtag: ^1.0.2 + checksum: aae9307fedfe2e5be14aebd0f48a9eeedf6b8c8f5a0b66257b965146d1e94abdc3f08e3dce3b1d908e1fa23c70039a88810ee1d753905758b9b6eebbab0bafeb + languageName: node + linkType: hard + +"is-callable@npm:^1.2.7": + version: 1.2.7 + resolution: "is-callable@npm:1.2.7" + checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac + languageName: node + linkType: hard + +"is-generator-function@npm:^1.0.7": + version: 1.1.0 + resolution: "is-generator-function@npm:1.1.0" + dependencies: + call-bound: ^1.0.3 + get-proto: ^1.0.0 + has-tostringtag: ^1.0.2 + safe-regex-test: ^1.1.0 + checksum: f7f7276131bdf7e28169b86ac55a5b080012a597f9d85a0cbef6fe202a7133fa450a3b453e394870e3cb3685c5a764c64a9f12f614684b46969b1e6f297bed6b + languageName: node + linkType: hard + +"is-promise@npm:^4.0.0": + version: 4.0.0 + resolution: "is-promise@npm:4.0.0" + checksum: 0b46517ad47b00b6358fd6553c83ec1f6ba9acd7ffb3d30a0bf519c5c69e7147c132430452351b8a9fc198f8dd6c4f76f8e6f5a7f100f8c77d57d9e0f4261a8a + languageName: node + linkType: hard + +"is-regex@npm:^1.2.1": + version: 1.2.1 + resolution: "is-regex@npm:1.2.1" + dependencies: + call-bound: ^1.0.2 + gopd: ^1.2.0 + has-tostringtag: ^1.0.2 + hasown: ^2.0.2 + checksum: 99ee0b6d30ef1bb61fa4b22fae7056c6c9b3c693803c0c284ff7a8570f83075a7d38cda53b06b7996d441215c27895ea5d1af62124562e13d91b3dbec41a5e13 + languageName: node + linkType: hard + +"is-typed-array@npm:^1.1.3": + version: 1.1.15 + resolution: "is-typed-array@npm:1.1.15" + dependencies: + which-typed-array: ^1.1.16 + checksum: ea7cfc46c282f805d19a9ab2084fd4542fed99219ee9dbfbc26284728bd713a51eac66daa74eca00ae0a43b61322920ba334793607dc39907465913e921e0892 + languageName: node + linkType: hard + +"isarray@npm:^1.0.0, isarray@npm:~1.0.0": + version: 1.0.0 + resolution: "isarray@npm:1.0.0" + checksum: f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab + languageName: node + linkType: hard + +"jmespath@npm:0.16.0": + version: 0.16.0 + resolution: "jmespath@npm:0.16.0" + checksum: 2d602493a1e4addfd1350ac8c9d54b1b03ed09e305fd863bab84a4ee1f52868cf939dd1a08c5cdea29ce9ba8f86875ebb458b6ed45dab3e1c3f2694503fb2fd9 + languageName: node + linkType: hard + +"jose@npm:5.2.3": + version: 5.2.3 + resolution: "jose@npm:5.2.3" + checksum: 7c41025d3e449f654a4cbf0e18e3a4a3bcb74b242d716e2e665a20be5c93b3f68421032a4531fd984d4bad6aa225c7c517da18da6e0cf778b104cd7e30bde5de + languageName: node + linkType: hard + +"jose@npm:^4.15.4": + version: 4.15.9 + resolution: "jose@npm:4.15.9" + checksum: 41abe1c99baa3cf8a78ebbf93da8f8e50e417b7a26754c4afa21865d87527b8ac2baf66de2c5f6accc3f7d7158658dae7364043677236ea1d07895b040097f15 + languageName: node + linkType: hard + +"jszip@npm:^3.10.1": + version: 3.10.1 + resolution: "jszip@npm:3.10.1" + dependencies: + lie: ~3.3.0 + pako: ~1.0.2 + readable-stream: ~2.3.6 + setimmediate: ^1.0.5 + checksum: abc77bfbe33e691d4d1ac9c74c8851b5761fba6a6986630864f98d876f3fcc2d36817dfc183779f32c00157b5d53a016796677298272a714ae096dfe6b1c8b60 + languageName: node + linkType: hard + +"lie@npm:~3.3.0": + version: 3.3.0 + resolution: "lie@npm:3.3.0" + dependencies: + immediate: ~3.0.5 + checksum: 33102302cf19766f97919a6a98d481e01393288b17a6aa1f030a3542031df42736edde8dab29ffdbf90bebeffc48c761eb1d064dc77592ca3ba3556f9fe6d2a8 + languageName: node + linkType: hard + +"lru-cache@npm:^6.0.0": + version: 6.0.0 + resolution: "lru-cache@npm:6.0.0" + dependencies: + yallist: ^4.0.0 + checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 + languageName: node + linkType: hard + +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 0e513b29d120f478c85a70f49da0b8b19bc638975eca466f2eeae0071f3ad00454c621bf66e16dd435896c208e719fc91ad79bbfba4e400fe0b372e7c1c9c9a2 + languageName: node + linkType: hard + +"media-typer@npm:^1.1.0": + version: 1.1.0 + resolution: "media-typer@npm:1.1.0" + checksum: a58dd60804df73c672942a7253ccc06815612326dc1c0827984b1a21704466d7cde351394f47649e56cf7415e6ee2e26e000e81b51b3eebb5a93540e8bf93cbd + languageName: node + linkType: hard + +"merge-descriptors@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-descriptors@npm:2.0.0" + checksum: e383332e700a94682d0125a36c8be761142a1320fc9feeb18e6e36647c9edf064271645f5669b2c21cf352116e561914fd8aa831b651f34db15ef4038c86696a + languageName: node + linkType: hard + +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + languageName: node + linkType: hard + +"mime-db@npm:^1.54.0": + version: 1.54.0 + resolution: "mime-db@npm:1.54.0" + checksum: e99aaf2f23f5bd607deb08c83faba5dd25cf2fec90a7cc5b92d8260867ee08dab65312e1a589e60093dc7796d41e5fae013268418482f1db4c7d52d0a0960ac9 + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: 1.52.0 + checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 + languageName: node + linkType: hard + +"mime-types@npm:^3.0.0, mime-types@npm:^3.0.1": + version: 3.0.1 + resolution: "mime-types@npm:3.0.1" + dependencies: + mime-db: ^1.54.0 + checksum: 8d497ad5cb2dd1210ac7d049b5de94af0b24b45a314961e145b44389344604d54752f03bc00bf880c0da60a214be6fb6d423d318104f02c28d95dd8ebeea4fb4 + languageName: node + linkType: hard + +"ms@npm:^2.0.0, ms@npm:^2.1.3": + version: 2.1.3 + resolution: "ms@npm:2.1.3" + checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + languageName: node + linkType: hard + +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 20ebfe79b2d2e7cf9cbc8239a72662b584f71164096e6e8896c8325055497c96f6b80cd22c258e8a2f2aa382a787795ec3ee8b37b422a302c7d4381b0d5ecfbb + languageName: node + linkType: hard + +"node-domexception@npm:1.0.0": + version: 1.0.0 + resolution: "node-domexception@npm:1.0.0" + checksum: ee1d37dd2a4eb26a8a92cd6b64dfc29caec72bff5e1ed9aba80c294f57a31ba4895a60fd48347cf17dd6e766da0ae87d75657dfd1f384ebfa60462c2283f5c7f + languageName: node + linkType: hard + +"node-fetch@npm:^2.6.7": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" + dependencies: + whatwg-url: ^5.0.0 + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + checksum: d76d2f5edb451a3f05b15115ec89fc6be39de37c6089f1b6368df03b91e1633fd379a7e01b7ab05089a25034b2023d959b47e59759cb38d88341b2459e89d6e5 + languageName: node + linkType: hard + +"object-assign@npm:^4": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f + languageName: node + linkType: hard + +"object-hash@npm:^2.2.0": + version: 2.2.0 + resolution: "object-hash@npm:2.2.0" + checksum: 55ba841e3adce9c4f1b9b46b41983eda40f854e0d01af2802d3ae18a7085a17168d6b81731d43fdf1d6bcbb3c9f9c56d22c8fea992203ad90a38d7d919bc28f1 + languageName: node + linkType: hard + +"object-inspect@npm:^1.13.3": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 582810c6a8d2ef988ea0a39e69e115a138dad8f42dd445383b394877e5816eb4268489f316a6f74ee9c4e0a984b3eab1028e3e79d62b1ed67c726661d55c7a8b + languageName: node + linkType: hard + +"oidc-token-hash@npm:^5.0.3": + version: 5.1.0 + resolution: "oidc-token-hash@npm:5.1.0" + checksum: b1ac3bf07315b1e26a8a33da714d1adee58f4aa488a5680cee49adb58e3b7fd7b00be5acca86d93215de1ce1a7d53720cbc7eba8347124f251703ede3abdbcb6 + languageName: node + linkType: hard + +"on-finished@npm:^2.4.1": + version: 2.4.1 + resolution: "on-finished@npm:2.4.1" + dependencies: + ee-first: 1.1.1 + checksum: d20929a25e7f0bb62f937a425b5edeb4e4cde0540d77ba146ec9357f00b0d497cdb3b9b05b9c8e46222407d1548d08166bff69cc56dfa55ba0e4469228920ff0 + languageName: node + linkType: hard + +"once@npm:^1.4.0": + version: 1.4.0 + resolution: "once@npm:1.4.0" + dependencies: + wrappy: 1 + checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + languageName: node + linkType: hard + +"opencontrol@npm:0.0.6": + version: 0.0.6 + resolution: "opencontrol@npm:0.0.6" + dependencies: + "@modelcontextprotocol/sdk": 1.6.1 + "@tsconfig/bun": 1.0.7 + hono: 4.7.4 + zod: 3.24.2 + zod-to-json-schema: 3.24.3 + bin: + opencontrol: bin/index.mjs + checksum: 112c409d27e7e89cd7e6ccdb461ce758f78d1fe1d2464ada00deedb90754b1e73e3f88966c96783a322df5a863118343bb6e6400ec5b179e4aec5aeadb8717eb + languageName: node + linkType: hard + +"openid-client@npm:5.6.4": + version: 5.6.4 + resolution: "openid-client@npm:5.6.4" + dependencies: + jose: ^4.15.4 + lru-cache: ^6.0.0 + object-hash: ^2.2.0 + oidc-token-hash: ^5.0.3 + checksum: 69843f078dacbbc6bad6d65ca6689414ac73f095dfe2f8e606822e6cfc9d9cd7d0dfaf2649352eda604653806f0ea65326ad2d6266da897e4740ec93d26d21f6 + languageName: node + linkType: hard + +"pako@npm:~1.0.2": + version: 1.0.11 + resolution: "pako@npm:1.0.11" + checksum: 1be2bfa1f807608c7538afa15d6f25baa523c30ec870a3228a89579e474a4d992f4293859524e46d5d87fd30fa17c5edf34dbef0671251d9749820b488660b16 + languageName: node + linkType: hard + +"parseurl@npm:^1.3.3": + version: 1.3.3 + resolution: "parseurl@npm:1.3.3" + checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 + languageName: node + linkType: hard + +"path-to-regexp@npm:^8.0.0": + version: 8.2.0 + resolution: "path-to-regexp@npm:8.2.0" + checksum: 56e13e45962e776e9e7cd72e87a441cfe41f33fd539d097237ceb16adc922281136ca12f5a742962e33d8dda9569f630ba594de56d8b7b6e49adf31803c5e771 + languageName: node + linkType: hard + +"pkce-challenge@npm:^4.1.0": + version: 4.1.0 + resolution: "pkce-challenge@npm:4.1.0" + checksum: b85c50cefe3d9586ed77f5fde0c0832717c8cb3c88ab4470961306e78d84522a0f040a684d74907bd3b0c3c259f0aafbb6ff9f1f7c39bbad1ca180ac3750adb0 + languageName: node + linkType: hard + +"possible-typed-array-names@npm:^1.0.0": + version: 1.1.0 + resolution: "possible-typed-array-names@npm:1.1.0" + checksum: cfcd4f05264eee8fd184cd4897a17890561d1d473434b43ab66ad3673d9c9128981ec01e0cb1d65a52cd6b1eebfb2eae1e53e39b2e0eca86afc823ede7a4f41b + languageName: node + linkType: hard + +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: 1d38588e520dab7cea67cbbe2efdd86a10cc7a074c09657635e34f035277b59fbb57d09d8638346bf7090f8e8ebc070c96fa5fd183b777fff4f5edff5e9466cf + languageName: node + linkType: hard + +"proxy-addr@npm:^2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + checksum: 29c6990ce9364648255454842f06f8c46fcd124d3e6d7c5066df44662de63cdc0bad032e9bf5a3d653ff72141cc7b6019873d685708ac8210c30458ad99f2b74 + languageName: node + linkType: hard + +"punycode@npm:1.3.2": + version: 1.3.2 + resolution: "punycode@npm:1.3.2" + checksum: b8807fd594b1db33335692d1f03e8beeddde6fda7fbb4a2e32925d88d20a3aa4cd8dcc0c109ccaccbd2ba761c208dfaaada83007087ea8bfb0129c9ef1b99ed6 + languageName: node + linkType: hard + +"qs@npm:^6.14.0": + version: 6.14.0 + resolution: "qs@npm:6.14.0" + dependencies: + side-channel: ^1.1.0 + checksum: 189b52ad4e9a0da1a16aff4c58b2a554a8dad9bd7e287c7da7446059b49ca2e33a49e570480e8be406b87fccebf134f51c373cbce36c8c83859efa0c9b71d635 + languageName: node + linkType: hard + +"querystring@npm:0.2.0": + version: 0.2.0 + resolution: "querystring@npm:0.2.0" + checksum: 8258d6734f19be27e93f601758858c299bdebe71147909e367101ba459b95446fbe5b975bf9beb76390156a592b6f4ac3a68b6087cea165c259705b8b4e56a69 + languageName: node + linkType: hard + +"range-parser@npm:^1.2.1": + version: 1.2.1 + resolution: "range-parser@npm:1.2.1" + checksum: 0a268d4fea508661cf5743dfe3d5f47ce214fd6b7dec1de0da4d669dd4ef3d2144468ebe4179049eff253d9d27e719c88dae55be64f954e80135a0cada804ec9 + languageName: node + linkType: hard + +"raw-body@npm:^3.0.0": + version: 3.0.0 + resolution: "raw-body@npm:3.0.0" + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.6.3 + unpipe: 1.0.0 + checksum: 25b7cf7964183db322e819050d758a5abd0f22c51e9f37884ea44a9ed6855a1fb61f8caa8ec5b61d07e69f54db43dbbc08ad98ef84556696d6aa806be247af0e + languageName: node + linkType: hard + +"readable-stream@npm:~2.3.6": + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" + dependencies: + core-util-is: ~1.0.0 + inherits: ~2.0.3 + isarray: ~1.0.0 + process-nextick-args: ~2.0.0 + safe-buffer: ~5.1.1 + string_decoder: ~1.1.1 + util-deprecate: ~1.0.1 + checksum: 65645467038704f0c8aaf026a72fbb588a9e2ef7a75cd57a01702ee9db1c4a1e4b03aaad36861a6a0926546a74d174149c8c207527963e0c2d3eee2f37678a42 + languageName: node + linkType: hard + +"router@npm:^2.2.0": + version: 2.2.0 + resolution: "router@npm:2.2.0" + dependencies: + debug: ^4.4.0 + depd: ^2.0.0 + is-promise: ^4.0.0 + parseurl: ^1.3.3 + path-to-regexp: ^8.0.0 + checksum: 4c3bec8011ed10bb07d1ee860bc715f245fff0fdff991d8319741d2932d89c3fe0a56766b4fa78e95444bc323fd2538e09c8e43bfbd442c2a7fab67456df7fa5 + languageName: node + linkType: hard + +"safe-buffer@npm:5.2.1": + version: 5.2.1 + resolution: "safe-buffer@npm:5.2.1" + checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + languageName: node + linkType: hard + +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c + languageName: node + linkType: hard + +"safe-regex-test@npm:^1.1.0": + version: 1.1.0 + resolution: "safe-regex-test@npm:1.1.0" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + is-regex: ^1.2.1 + checksum: 3c809abeb81977c9ed6c869c83aca6873ea0f3ab0f806b8edbba5582d51713f8a6e9757d24d2b4b088f563801475ea946c8e77e7713e8c65cdd02305b6caedab + languageName: node + linkType: hard + +"safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 + languageName: node + linkType: hard + +"sax@npm:1.2.1": + version: 1.2.1 + resolution: "sax@npm:1.2.1" + checksum: 8dca7d5e1cd7d612f98ac50bdf0b9f63fbc964b85f0c4e2eb271f8b9b47fd3bf344c4d6a592e69ecf726d1485ca62cd8a52e603bbc332d18a66af25a9a1045ad + languageName: node + linkType: hard + +"sax@npm:>=0.6.0": + version: 1.4.1 + resolution: "sax@npm:1.4.1" + checksum: 3ad64df16b743f0f2eb7c38ced9692a6d924f1cd07bbe45c39576c2cf50de8290d9d04e7b2228f924c7d05fecc4ec5cf651423278e0c7b63d260c387ef3af84a + languageName: node + linkType: hard + +"send@npm:^1.1.0, send@npm:^1.2.0": + version: 1.2.0 + resolution: "send@npm:1.2.0" + dependencies: + debug: ^4.3.5 + encodeurl: ^2.0.0 + escape-html: ^1.0.3 + etag: ^1.8.1 + fresh: ^2.0.0 + http-errors: ^2.0.0 + mime-types: ^3.0.1 + ms: ^2.1.3 + on-finished: ^2.4.1 + range-parser: ^1.2.1 + statuses: ^2.0.1 + checksum: 7557ee6c1c257a1c53b402b4fba8ed88c95800b08abe085fc79e0824869274f213491be2efb2df3de228c70e4d40ce2019e5f77b58c42adb97149135420c3f34 + languageName: node + linkType: hard + +"serve-static@npm:^2.2.0": + version: 2.2.0 + resolution: "serve-static@npm:2.2.0" + dependencies: + encodeurl: ^2.0.0 + escape-html: ^1.0.3 + parseurl: ^1.3.3 + send: ^1.2.0 + checksum: 74f39e88f0444aa6732aae3b9597739c47552adecdc83fa32aa42555e76f1daad480d791af73894655c27a2d378275a461e691cead33fb35d8b976f1e2d24665 + languageName: node + linkType: hard + +"set-function-length@npm:^1.2.2": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: ^1.1.4 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.2 + checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 + languageName: node + linkType: hard + +"setimmediate@npm:^1.0.5": + version: 1.0.5 + resolution: "setimmediate@npm:1.0.5" + checksum: c9a6f2c5b51a2dabdc0247db9c46460152ffc62ee139f3157440bd48e7c59425093f42719ac1d7931f054f153e2d26cf37dfeb8da17a794a58198a2705e527fd + languageName: node + linkType: hard + +"setprototypeof@npm:1.2.0": + version: 1.2.0 + resolution: "setprototypeof@npm:1.2.0" + checksum: be18cbbf70e7d8097c97f713a2e76edf84e87299b40d085c6bf8b65314e994cc15e2e317727342fa6996e38e1f52c59720b53fe621e2eb593a6847bf0356db89 + languageName: node + linkType: hard + +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" + dependencies: + es-errors: ^1.3.0 + object-inspect: ^1.13.3 + checksum: 603b928997abd21c5a5f02ae6b9cc36b72e3176ad6827fab0417ead74580cc4fb4d5c7d0a8a2ff4ead34d0f9e35701ed7a41853dac8a6d1a664fcce1a044f86f + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.5 + object-inspect: ^1.13.3 + checksum: 42501371cdf71f4ccbbc9c9e2eb00aaaab80a4c1c429d5e8da713fd4d39ef3b8d4a4b37ed4f275798a65260a551a7131fd87fe67e922dba4ac18586d6aab8b06 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: ^1.0.2 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.5 + object-inspect: ^1.13.3 + side-channel-map: ^1.0.1 + checksum: a815c89bc78c5723c714ea1a77c938377ea710af20d4fb886d362b0d1f8ac73a17816a5f6640f354017d7e292a43da9c5e876c22145bac00b76cfb3468001736 + languageName: node + linkType: hard + +"side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: ^1.3.0 + object-inspect: ^1.13.3 + side-channel-list: ^1.0.0 + side-channel-map: ^1.0.1 + side-channel-weakmap: ^1.0.2 + checksum: bf73d6d6682034603eb8e99c63b50155017ed78a522d27c2acec0388a792c3ede3238b878b953a08157093b85d05797217d270b7666ba1f111345fbe933380ff + languageName: node + linkType: hard + +"sst-darwin-arm64@npm:3.13.20": + version: 3.13.20 + resolution: "sst-darwin-arm64@npm:3.13.20" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"sst-darwin-x64@npm:3.13.20": + version: 3.13.20 + resolution: "sst-darwin-x64@npm:3.13.20" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"sst-linux-arm64@npm:3.13.20": + version: 3.13.20 + resolution: "sst-linux-arm64@npm:3.13.20" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"sst-linux-x64@npm:3.13.20": + version: 3.13.20 + resolution: "sst-linux-x64@npm:3.13.20" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"sst-linux-x86@npm:3.13.20": + version: 3.13.20 + resolution: "sst-linux-x86@npm:3.13.20" + conditions: os=linux & cpu=x86 + languageName: node + linkType: hard + +"sst@npm:^3.13.17": + version: 3.13.20 + resolution: "sst@npm:3.13.20" + dependencies: + aws-sdk: 2.1692.0 + aws4fetch: 1.0.18 + jose: 5.2.3 + opencontrol: 0.0.6 + openid-client: 5.6.4 + sst-darwin-arm64: 3.13.20 + sst-darwin-x64: 3.13.20 + sst-linux-arm64: 3.13.20 + sst-linux-x64: 3.13.20 + sst-linux-x86: 3.13.20 + dependenciesMeta: + sst-darwin-arm64: + optional: true + sst-darwin-x64: + optional: true + sst-linux-arm64: + optional: true + sst-linux-x64: + optional: true + sst-linux-x86: + optional: true + bin: + sst: bin/sst.mjs + checksum: 9e07f5d3c7a867f3792714dc70ec172b0ea752cb91c2ae28560e9d5b1de06b6625ce028abf507ceba0bab4cf339f0531673d0baca7972c07302247b0c06f8b75 + languageName: node + linkType: hard + +"statuses@npm:2.0.1, statuses@npm:^2.0.1": + version: 2.0.1 + resolution: "statuses@npm:2.0.1" + checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb + languageName: node + linkType: hard + +"string_decoder@npm:~1.1.1": + version: 1.1.1 + resolution: "string_decoder@npm:1.1.1" + dependencies: + safe-buffer: ~5.1.0 + checksum: 9ab7e56f9d60a28f2be697419917c50cac19f3e8e6c28ef26ed5f4852289fe0de5d6997d29becf59028556f2c62983790c1d9ba1e2a3cc401768ca12d5183a5b + languageName: node + linkType: hard + +"toidentifier@npm:1.0.1": + version: 1.0.1 + resolution: "toidentifier@npm:1.0.1" + checksum: 952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 + languageName: node + linkType: hard + +"tr46@npm:~0.0.3": + version: 0.0.3 + resolution: "tr46@npm:0.0.3" + checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 + languageName: node + linkType: hard + +"type-is@npm:^2.0.0, type-is@npm:^2.0.1": + version: 2.0.1 + resolution: "type-is@npm:2.0.1" + dependencies: + content-type: ^1.0.5 + media-typer: ^1.1.0 + mime-types: ^3.0.0 + checksum: 0266e7c782238128292e8c45e60037174d48c6366bb2d45e6bd6422b611c193f83409a8341518b6b5f33f8e4d5a959f38658cacfea77f0a3505b9f7ac1ddec8f + languageName: node + linkType: hard + +"typescript@npm:^5.8.3": + version: 5.8.3 + resolution: "typescript@npm:5.8.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: cb1d081c889a288b962d3c8ae18d337ad6ee88a8e81ae0103fa1fecbe923737f3ba1dbdb3e6d8b776c72bc73bfa6d8d850c0306eed1a51377d2fccdfd75d92c4 + languageName: node + linkType: hard + +"typescript@patch:typescript@^5.8.3#~builtin": + version: 5.8.3 + resolution: "typescript@patch:typescript@npm%3A5.8.3#~builtin::version=5.8.3&hash=e012d7" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 1b503525a88ff0ff5952e95870971c4fb2118c17364d60302c21935dedcd6c37e6a0a692f350892bafcef6f4a16d09073fe461158547978d2f16fbe4cb18581c + languageName: node + linkType: hard + +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: 3192ef6f3fd5df652f2dc1cd782b49d6ff14dc98e5dced492aa8a8c65425227da5da6aafe22523c67f035a272c599bb89cfe803c1db6311e44bed3042fc25487 + languageName: node + linkType: hard + +"undici-types@npm:~6.21.0": + version: 6.21.0 + resolution: "undici-types@npm:6.21.0" + checksum: 46331c7d6016bf85b3e8f20c159d62f5ae471aba1eb3dc52fff35a0259d58dcc7d592d4cc4f00c5f9243fa738a11cfa48bd20203040d4a9e6bc25e807fab7ab3 + languageName: node + linkType: hard + +"unpipe@npm:1.0.0": + version: 1.0.0 + resolution: "unpipe@npm:1.0.0" + checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 + languageName: node + linkType: hard + +"url@npm:0.10.3": + version: 0.10.3 + resolution: "url@npm:0.10.3" + dependencies: + punycode: 1.3.2 + querystring: 0.2.0 + checksum: 7b83ddb106c27bf9bde8629ccbe8d26e9db789c8cda5aa7db72ca2c6f9b8a88a5adf206f3e10db78e6e2d042b327c45db34c7010c1bf0d9908936a17a2b57d05 + languageName: node + linkType: hard + +"util-deprecate@npm:~1.0.1": + version: 1.0.2 + resolution: "util-deprecate@npm:1.0.2" + checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + languageName: node + linkType: hard + +"util@npm:^0.12.4": + version: 0.12.5 + resolution: "util@npm:0.12.5" + dependencies: + inherits: ^2.0.3 + is-arguments: ^1.0.4 + is-generator-function: ^1.0.7 + is-typed-array: ^1.1.3 + which-typed-array: ^1.1.2 + checksum: 705e51f0de5b446f4edec10739752ac25856541e0254ea1e7e45e5b9f9b0cb105bc4bd415736a6210edc68245a7f903bf085ffb08dd7deb8a0e847f60538a38a + languageName: node + linkType: hard + +"uuid@npm:8.0.0": + version: 8.0.0 + resolution: "uuid@npm:8.0.0" + bin: + uuid: dist/bin/uuid + checksum: 56d4e23aa7ac26fa2db6bd1778db34cb8c9f5a10df1770a27167874bf6705fc8f14a4ac414af58a0d96c7653b2bd4848510b29d1c2ef8c91ccb17429c1872b5e + languageName: node + linkType: hard + +"uuid@npm:^11.1.0": + version: 11.1.0 + resolution: "uuid@npm:11.1.0" + bin: + uuid: dist/esm/bin/uuid + checksum: 840f19758543c4631e58a29439e51b5b669d5f34b4dd2700b6a1d15c5708c7a6e0c3e2c8c4a2eae761a3a7caa7e9884d00c86c02622ba91137bd3deade6b4b4a + languageName: node + linkType: hard + +"vary@npm:^1, vary@npm:^1.1.2": + version: 1.1.2 + resolution: "vary@npm:1.1.2" + checksum: ae0123222c6df65b437669d63dfa8c36cee20a504101b2fcd97b8bf76f91259c17f9f2b4d70a1e3c6bbcee7f51b28392833adb6b2770b23b01abec84e369660b + languageName: node + linkType: hard + +"web-streams-polyfill@npm:4.0.0-beta.3": + version: 4.0.0-beta.3 + resolution: "web-streams-polyfill@npm:4.0.0-beta.3" + checksum: dfec1fbf52b9140e4183a941e380487b6c3d5d3838dd1259be81506c1c9f2abfcf5aeb670aeeecfd9dff4271a6d8fef931b193c7bedfb42542a3b05ff36c0d16 + languageName: node + linkType: hard + +"webidl-conversions@npm:^3.0.0": + version: 3.0.1 + resolution: "webidl-conversions@npm:3.0.1" + checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c + languageName: node + linkType: hard + +"whatwg-url@npm:^5.0.0": + version: 5.0.0 + resolution: "whatwg-url@npm:5.0.0" + dependencies: + tr46: ~0.0.3 + webidl-conversions: ^3.0.0 + checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.2": + version: 1.1.19 + resolution: "which-typed-array@npm:1.1.19" + dependencies: + available-typed-arrays: ^1.0.7 + call-bind: ^1.0.8 + call-bound: ^1.0.4 + for-each: ^0.3.5 + get-proto: ^1.0.1 + gopd: ^1.2.0 + has-tostringtag: ^1.0.2 + checksum: 162d2a07f68ea323f88ed9419861487ce5d02cb876f2cf9dd1e428d04a63133f93a54f89308f337b27cabd312ee3d027cae4a79002b2f0a85b79b9ef4c190670 + languageName: node + linkType: hard + +"wrappy@npm:1": + version: 1.0.2 + resolution: "wrappy@npm:1.0.2" + checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + languageName: node + linkType: hard + +"xml2js@npm:0.6.2": + version: 0.6.2 + resolution: "xml2js@npm:0.6.2" + dependencies: + sax: ">=0.6.0" + xmlbuilder: ~11.0.0 + checksum: 458a83806193008edff44562c0bdb982801d61ee7867ae58fd35fab781e69e17f40dfeb8fc05391a4648c9c54012066d3955fe5d993ffbe4dc63399023f32ac2 + languageName: node + linkType: hard + +"xmlbuilder@npm:~11.0.0": + version: 11.0.1 + resolution: "xmlbuilder@npm:11.0.1" + checksum: 7152695e16f1a9976658215abab27e55d08b1b97bca901d58b048d2b6e106b5af31efccbdecf9b07af37c8377d8e7e821b494af10b3a68b0ff4ae60331b415b0 + languageName: node + linkType: hard + +"yallist@npm:^4.0.0": + version: 4.0.0 + resolution: "yallist@npm:4.0.0" + checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + languageName: node + linkType: hard + +"zod-to-json-schema@npm:3.24.3": + version: 3.24.3 + resolution: "zod-to-json-schema@npm:3.24.3" + peerDependencies: + zod: ^3.24.1 + checksum: f395bb6ecef350a2347945e98f0f97e59f18606d9ee78dc5172d53af07954f42e515cf38d51d32d67f166838619a82604e62b5f18369194dffa7907719b7695f + languageName: node + linkType: hard + +"zod-to-json-schema@npm:^3.22.5, zod-to-json-schema@npm:^3.24.1": + version: 3.24.5 + resolution: "zod-to-json-schema@npm:3.24.5" + peerDependencies: + zod: ^3.24.1 + checksum: dc4e5e4c06e9a5494e4b1d8c8363ac907f9d488f36c8e4923e1e5ac4f91f737722f99200cd92a409551e7456d960734d4cabd37935234ca95e290572468ffc08 + languageName: node + linkType: hard + +"zod@npm:3.24.2": + version: 3.24.2 + resolution: "zod@npm:3.24.2" + checksum: c02455c09678c5055c636d64f9fcda2424fea0aa46ac7d9681e7f41990bc55f488bcd84b9d7cfef0f6e906f51f55b245239d92a9f726248aa74c5b84edf00c2d + languageName: node + linkType: hard + +"zod@npm:^3.23.8, zod@npm:^3.24.2": + version: 3.24.3 + resolution: "zod@npm:3.24.3" + checksum: 9c3976e61cec25908f3405502abdf28ab1893afd5182c6739a30375c5c6bf4b9b6ea7e78735324e5ac63571c160ce607ebe320ff389b044223c357ccc2f8c94c + languageName: node + linkType: hard