From bd1f3ef29483a7637b1daf07f8d6799ef38ecf3a Mon Sep 17 00:00:00 2001 From: ingalls Date: Wed, 15 Jul 2026 15:56:50 -0400 Subject: [PATCH 1/4] Mission Layer Support --- api/derived-types.d.ts | 216 ++++++++ api/package-lock.json | 482 +++++++++--------- api/package.json | 2 +- api/stateless/routes/marti-mission-layers.ts | 81 +++ api/test/marti-mission-layer-cot.srv.test.ts | 119 +++++ api/web/src/base/subscription-layer.ts | 41 ++ .../Menu/Mission/MissionLayerCreate.vue | 4 +- .../CloudTAK/Menu/Mission/MissionLayers.vue | 141 +++-- .../CloudTAK/util/PathBreadcrumb.vue | 92 +++- 9 files changed, 877 insertions(+), 301 deletions(-) create mode 100644 api/test/marti-mission-layer-cot.srv.test.ts diff --git a/api/derived-types.d.ts b/api/derived-types.d.ts index 60a7ea11e3..18715af35d 100644 --- a/api/derived-types.d.ts +++ b/api/derived-types.d.ts @@ -25229,6 +25229,222 @@ export interface paths { }; trace?: never; }; + "/api/marti/missions/{:name}/layer/{:uid}/cot": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + /** Helper API to file existing Mission CoTs under a mission layer, moving them from any layer they are currently filed under */ + put: { + parameters: { + query?: never; + header?: never; + path: { + /** @description No Description */ + ":name": string; + /** @description No Description */ + ":uid": string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": { + uids: string[]; + }; + }; + }; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: number; + message: string; + }; + }; + }; + /** @description Error Response */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: number; + message: string; + }; + }; + }; + /** @description Error Response */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: number; + message: string; + }; + }; + }; + /** @description Error Response */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: number; + message: string; + }; + }; + }; + /** @description Error Response */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: number; + message: string; + }; + }; + }; + /** @description Error Response */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: number; + message: string; + }; + }; + }; + }; + }; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/marti/missions/{:name}/layer/{:uid}/cot/{:cotuid}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** Helper API to move a Mission CoT out of a mission layer and back to the mission root - the CoT remains part of the Mission */ + delete: { + parameters: { + query?: never; + header?: never; + path: { + /** @description No Description */ + ":name": string; + /** @description No Description */ + ":uid": string; + /** @description No Description */ + ":cotuid": string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Successful Response */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: number; + message: string; + }; + }; + }; + /** @description Error Response */ + 400: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: number; + message: string; + }; + }; + }; + /** @description Error Response */ + 401: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: number; + message: string; + }; + }; + }; + /** @description Error Response */ + 403: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: number; + message: string; + }; + }; + }; + /** @description Error Response */ + 404: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: number; + message: string; + }; + }; + }; + /** @description Error Response */ + 500: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + status: number; + message: string; + }; + }; + }; + }; + }; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/marti/missions/{:name}/log": { parameters: { query?: never; diff --git a/api/package-lock.json b/api/package-lock.json index e5022f867a..ea0feffd9b 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -1,12 +1,12 @@ { "name": "@tak-ps/CloudTAK.api", - "version": "13.46.0", + "version": "13.47.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@tak-ps/CloudTAK.api", - "version": "13.46.0", + "version": "13.47.1", "license": "ISC", "dependencies": { "@archiver/archiver": "^0.1.0", @@ -35,7 +35,7 @@ "@tak-ps/etl": "^10.0.0", "@tak-ps/node-cot": "^14.45.0", "@tak-ps/node-safeurl": "^1.5.0", - "@tak-ps/node-tak": "^12.22.0", + "@tak-ps/node-tak": "^12.23.0", "@turf/bbox": "^7.1.0", "@turf/bbox-polygon": "^7.2.0", "@turf/meta": "^7.0.0", @@ -162,14 +162,14 @@ } }, "node_modules/@aws-sdk/checksums": { - "version": "3.1000.17", - "resolved": "https://registry.npmjs.org/@aws-sdk/checksums/-/checksums-3.1000.17.tgz", - "integrity": "sha512-k45iXM7w8Pyknnz/vTXSS/IkLDNFdgnBQI7Hmq+uhsrW7NGT/BiUJGlv20QSKzihmH1XDvSCRILICaKi57/35w==", + "version": "3.1000.18", + "resolved": "https://registry.npmjs.org/@aws-sdk/checksums/-/checksums-3.1000.18.tgz", + "integrity": "sha512-IImkbEyXdV6/uaF5r6Wkk+8718mQw1ll83j0a4a30R3JM/rHVFdWAiT4jtJpFjJiIwM/oJ6SxIxr0z2TaQUGqw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -178,17 +178,17 @@ } }, "node_modules/@aws-sdk/client-cloudformation": { - "version": "3.1087.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.1087.0.tgz", - "integrity": "sha512-YE9T3ATXX/wqC8klvIIuUo3rswTLWHYpndii0oGnwchbtI3e/R4xovnWIdxY+gmAF+wScMO/gaSQkqnFjZrcsQ==", + "version": "3.1088.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudformation/-/client-cloudformation-3.1088.0.tgz", + "integrity": "sha512-s4CGaL7uxaMVrgYVN/gpt6W+vMwZKZVzmZ3nA0JDmxdvQpEAUH7sA3Rz2whry56X2Lcp1ptdkfbP3HzrDWyj9g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/credential-provider-node": "^3.972.68", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", - "@smithy/fetch-http-handler": "^5.6.5", - "@smithy/node-http-handler": "^4.9.5", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/credential-provider-node": "^3.972.69", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/fetch-http-handler": "^5.6.6", + "@smithy/node-http-handler": "^4.9.6", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -197,18 +197,18 @@ } }, "node_modules/@aws-sdk/client-cloudwatch": { - "version": "3.1087.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.1087.0.tgz", - "integrity": "sha512-UTDttmkkxUbQ+GkCkp0AnA0ZF2Yni/1FcvbBJ6AgGNbyb1t8QlAK14j+xVPoUOTprft5PD1Coal5hN+0FKBjcw==", + "version": "3.1088.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.1088.0.tgz", + "integrity": "sha512-/GqqKB8xm5t9EZgoJvFsi3oGv2JMf0yatzDegcGBq4xB1HEOLzhaPNKTkujpkyYOm0tHboz2R82X9D5R7TLBgA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/credential-provider-node": "^3.972.68", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", - "@smithy/fetch-http-handler": "^5.6.5", - "@smithy/middleware-compression": "^4.5.8", - "@smithy/node-http-handler": "^4.9.5", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/credential-provider-node": "^3.972.69", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/fetch-http-handler": "^5.6.6", + "@smithy/middleware-compression": "^4.5.9", + "@smithy/node-http-handler": "^4.9.6", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -217,17 +217,17 @@ } }, "node_modules/@aws-sdk/client-cloudwatch-logs": { - "version": "3.1087.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.1087.0.tgz", - "integrity": "sha512-xRTs7auUkM3ABhXHtg2JCMjKIVo6HBZgkvKuuH/Jd0XZzJEP1yIi6nZnvc1fuKszjjWTqj8tYaKrgD2eXrXxpg==", + "version": "3.1088.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.1088.0.tgz", + "integrity": "sha512-3tsxdp3qZaGCqqwoImv96D4i5xlKBgpmXZqdrIZ76BTQKUrptAH4g8wb6Pg1Jc/EiGQfX826FDgGmx4m7nizaQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/credential-provider-node": "^3.972.68", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", - "@smithy/fetch-http-handler": "^5.6.5", - "@smithy/node-http-handler": "^4.9.5", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/credential-provider-node": "^3.972.69", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/fetch-http-handler": "^5.6.6", + "@smithy/node-http-handler": "^4.9.6", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -236,17 +236,17 @@ } }, "node_modules/@aws-sdk/client-ecr": { - "version": "3.1087.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.1087.0.tgz", - "integrity": "sha512-D4kbh4MPuRyDAdEsvQT+5/whz18m0kxdimxPvYrnTd/y7dc6DKQp7KB0dba47Y4dhp+c2a0eKfamFGnqsPYZqQ==", + "version": "3.1088.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ecr/-/client-ecr-3.1088.0.tgz", + "integrity": "sha512-N3OTMD10DZOh30YzTEggkt0B9/+xk/8kQVeTty75FqjIpWUG4Lr31ymWHqDlbc5NZUAPQ/ZAmaoKgjqapl3hog==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/credential-provider-node": "^3.972.68", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", - "@smithy/fetch-http-handler": "^5.6.5", - "@smithy/node-http-handler": "^4.9.5", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/credential-provider-node": "^3.972.69", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/fetch-http-handler": "^5.6.6", + "@smithy/node-http-handler": "^4.9.6", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -255,17 +255,17 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.1087.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.1087.0.tgz", - "integrity": "sha512-qZVBwoJjdphfnvTpDoeg7vCF16tGmP5B15f7hcGJm7J2mQGRPXA+II16b9jguORgud3y6CHHjsBfcg8o5cHNew==", + "version": "3.1088.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.1088.0.tgz", + "integrity": "sha512-wyg0qrN58C4Qckfwfs8zDFyMO/6Hbo6qcWWuf8gkZjDhLR3vj160h99mh7L16jBbQUUjJFasymOjJ0pxm0zj2w==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/credential-provider-node": "^3.972.68", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", - "@smithy/fetch-http-handler": "^5.6.5", - "@smithy/node-http-handler": "^4.9.5", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/credential-provider-node": "^3.972.69", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/fetch-http-handler": "^5.6.6", + "@smithy/node-http-handler": "^4.9.6", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -274,20 +274,20 @@ } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.1087.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1087.0.tgz", - "integrity": "sha512-44ua5vo5JiFFSnG3oeeWTMfSjOtblQSoJiGbf37s0W4Lr7IY9NmIVkBHIfD4hBI1VEKdvJhDmvuJawwTfi2pvw==", + "version": "3.1088.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.1088.0.tgz", + "integrity": "sha512-9ryKKxnjtJRKLDI24P+2gQZki7k28BeV6gz1AySvFDWayhjAZuh4QZjCyx55tqR8Oz0IJxWutgJRO43dDOcXoQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/checksums": "^3.1000.17", - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/credential-provider-node": "^3.972.68", - "@aws-sdk/middleware-sdk-s3": "^3.972.63", - "@aws-sdk/signature-v4-multi-region": "^3.996.40", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", - "@smithy/fetch-http-handler": "^5.6.5", - "@smithy/node-http-handler": "^4.9.5", + "@aws-sdk/checksums": "^3.1000.18", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/credential-provider-node": "^3.972.69", + "@aws-sdk/middleware-sdk-s3": "^3.972.64", + "@aws-sdk/signature-v4-multi-region": "^3.996.41", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/fetch-http-handler": "^5.6.6", + "@smithy/node-http-handler": "^4.9.6", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -296,17 +296,17 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.1087.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.1087.0.tgz", - "integrity": "sha512-muY3Z3S8iFUIum2ir97iwGSW4xsRtzfgI74xmfDibuvkaUb4YnBKcJ+V5OOwoiZCKa9rFrR6gXjFfEN3zvbmPA==", + "version": "3.1088.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.1088.0.tgz", + "integrity": "sha512-4Gcjmj2QWqVdPxGNJjj3cjSjGBPkfXkHXC7MYdhBIWrSKyvPLLGU4EUdePuR97pOK+gCzvUaSGhY+4IRJcihtA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/credential-provider-node": "^3.972.68", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", - "@smithy/fetch-http-handler": "^5.6.5", - "@smithy/node-http-handler": "^4.9.5", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/credential-provider-node": "^3.972.69", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/fetch-http-handler": "^5.6.6", + "@smithy/node-http-handler": "^4.9.6", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -315,18 +315,18 @@ } }, "node_modules/@aws-sdk/client-sqs": { - "version": "3.1087.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.1087.0.tgz", - "integrity": "sha512-pejcGuwvPrPcKLJiQKsQE7jycoognZrJS5OjxeYC4Qx4ePzx5gRkaagxyE1tRIp4PBdRbz3vOMpLjsruE73wuQ==", + "version": "3.1088.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.1088.0.tgz", + "integrity": "sha512-qt9k/SBPvcrgmthtlbuVTPZ++UOmViF+Qig3MoHKBXS9ls6JY467lYXFvpPJ7GPZgGOpTATx35/07BYGnETksg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/credential-provider-node": "^3.972.68", - "@aws-sdk/middleware-sdk-sqs": "^3.972.36", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", - "@smithy/fetch-http-handler": "^5.6.5", - "@smithy/node-http-handler": "^4.9.5", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/credential-provider-node": "^3.972.69", + "@aws-sdk/middleware-sdk-sqs": "^3.972.37", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/fetch-http-handler": "^5.6.6", + "@smithy/node-http-handler": "^4.9.6", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -335,18 +335,18 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.1087.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.1087.0.tgz", - "integrity": "sha512-yU/2IFQO2HqjCPDYd8mJxRyZKVZDFQrupn67JURtHW75SpeAkm6vJSQQJtLzeOSJyj5Zu/2KRreMQV/KRTe4kA==", + "version": "3.1088.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.1088.0.tgz", + "integrity": "sha512-8hRjgsBgoKL1o4LIn2GfjLqNiWiunO2QkKejOOcy+hAnuzBtCO8o68Tjns2qYcD/gleV3QvC17zh1R8hqwCKag==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/credential-provider-node": "^3.972.68", - "@aws-sdk/signature-v4-multi-region": "^3.996.40", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", - "@smithy/fetch-http-handler": "^5.6.5", - "@smithy/node-http-handler": "^4.9.5", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/credential-provider-node": "^3.972.69", + "@aws-sdk/signature-v4-multi-region": "^3.996.41", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/fetch-http-handler": "^5.6.6", + "@smithy/node-http-handler": "^4.9.6", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -355,16 +355,16 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.975.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.975.2.tgz", - "integrity": "sha512-iyeXwziyjJpixq5OmhsIyrSWx8vwcI7gDo4yRUC3EP7NQtOo9iAJiIEc3G+/HkhtNXqOhofiCK7Lc34Sq+fJWg==", + "version": "3.975.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.975.3.tgz", + "integrity": "sha512-7ur3kCKuvPLqlsZ2XlvnNBVQ7KkpSu6Y6dOTwSPHLrFpTEfZM8isLBJc4cgv96WB7GifeVM436mpycwxBd2vEA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.974.1", - "@aws-sdk/xml-builder": "^3.972.35", + "@aws-sdk/types": "^3.974.2", + "@aws-sdk/xml-builder": "^3.972.36", "@aws/lambda-invoke-store": "^0.3.0", - "@smithy/core": "^3.29.3", - "@smithy/signature-v4": "^5.6.3", + "@smithy/core": "^3.29.4", + "@smithy/signature-v4": "^5.6.5", "@smithy/types": "^4.16.1", "bowser": "^2.11.0", "tslib": "^2.6.2" @@ -374,14 +374,14 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.972.58", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.58.tgz", - "integrity": "sha512-vyGtvK1rY940eq7JT0yIGKuZ+2kpPSJcHibSvGlit5oiMFDamzC7cxBGLl4FLnd6suihMXDI2FSF2dL6TmBqPA==", + "version": "3.972.59", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.59.tgz", + "integrity": "sha512-Ny5e4Mfh3QPmiAc0AiUe+cbTXDlxkU3Rc+EpWOfyWeWEy6yp7Fa1KmfNeCc+1a8by9zQ9gtohmiQUkMPScF3ng==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -390,16 +390,16 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.972.60", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.60.tgz", - "integrity": "sha512-g9b9YzDrD5pcKiPBJfCSXRfFMrA39eR0guUhZ5SRm+7vMAVc43+effxbcamxBjSd5bUhrdKo5te/yQuWurLXLA==", + "version": "3.972.61", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.61.tgz", + "integrity": "sha512-8jAjgStl5Ytq4+HF3X/9f+EmRinaRbGRRtQGktlPfBRVx73H+R1y48vIeXerQtYGFaUqkEp3fT6jP854rVO2yQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", - "@smithy/fetch-http-handler": "^5.6.5", - "@smithy/node-http-handler": "^4.9.5", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/fetch-http-handler": "^5.6.6", + "@smithy/node-http-handler": "^4.9.6", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -408,22 +408,22 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.973.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.973.2.tgz", - "integrity": "sha512-Yr7yxNyQ8aHt9Ww0RPFUZx+xiem+vl7vuwhP0tniTijoesJNV5jou9HCgVpI0GEPAF+89TkOvilE5uRrZJnjaw==", + "version": "3.973.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.973.3.tgz", + "integrity": "sha512-WpuqYX4gGkx++fCTSWE8+41JzkZVcrI50SH48Ml4CsG1pyuHKyMmpw/FixBHDrmjoQ553PmeCLa/fZIcst+WyA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/credential-provider-env": "^3.972.58", - "@aws-sdk/credential-provider-http": "^3.972.60", - "@aws-sdk/credential-provider-login": "^3.972.64", - "@aws-sdk/credential-provider-process": "^3.972.58", - "@aws-sdk/credential-provider-sso": "^3.973.2", - "@aws-sdk/credential-provider-web-identity": "^3.972.64", - "@aws-sdk/nested-clients": "^3.997.32", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", - "@smithy/credential-provider-imds": "^4.4.7", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/credential-provider-env": "^3.972.59", + "@aws-sdk/credential-provider-http": "^3.972.61", + "@aws-sdk/credential-provider-login": "^3.972.65", + "@aws-sdk/credential-provider-process": "^3.972.59", + "@aws-sdk/credential-provider-sso": "^3.973.3", + "@aws-sdk/credential-provider-web-identity": "^3.972.65", + "@aws-sdk/nested-clients": "^3.997.33", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/credential-provider-imds": "^4.4.9", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -432,15 +432,15 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.972.64", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.64.tgz", - "integrity": "sha512-YQoSI4d6kXvoenoG/0Jv/PqaAuukHzGmGXGyHBQYeEUNsYovlNAn/Sw1wp/WQbhcQ3HsEMGgjEahvD3igz6ecQ==", + "version": "3.972.65", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.65.tgz", + "integrity": "sha512-xr9rgjYEdmC2Tpg2lwt9o+nOEaK9Qpd+dBjzrVCuWWyQfvhO91Ezu0Hh9ts2VUxOZxmS/k5T9msa34e4R1bnrQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/nested-clients": "^3.997.32", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/nested-clients": "^3.997.33", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -449,20 +449,20 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.972.68", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.68.tgz", - "integrity": "sha512-4akjzW9CjorByYfqXBXmYUh/h7Io3U4DtVgGGh9TQraZ7ZlyJqNyHwDRGiUFnHD+BTOeTbCesCa4sJaK7BGZ7A==", + "version": "3.972.69", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.69.tgz", + "integrity": "sha512-wbJGGesd0Tl18bmUcbj1xJ+e7CpuRJ6PIpMywLFuUttGy615lua87cJ0EA8pFpY/QgPuUXbnupWBtSPJ9tyZhg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "^3.972.58", - "@aws-sdk/credential-provider-http": "^3.972.60", - "@aws-sdk/credential-provider-ini": "^3.973.2", - "@aws-sdk/credential-provider-process": "^3.972.58", - "@aws-sdk/credential-provider-sso": "^3.973.2", - "@aws-sdk/credential-provider-web-identity": "^3.972.64", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", - "@smithy/credential-provider-imds": "^4.4.7", + "@aws-sdk/credential-provider-env": "^3.972.59", + "@aws-sdk/credential-provider-http": "^3.972.61", + "@aws-sdk/credential-provider-ini": "^3.973.3", + "@aws-sdk/credential-provider-process": "^3.972.59", + "@aws-sdk/credential-provider-sso": "^3.973.3", + "@aws-sdk/credential-provider-web-identity": "^3.972.65", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/credential-provider-imds": "^4.4.9", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -471,14 +471,14 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.972.58", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.58.tgz", - "integrity": "sha512-1nYitRCaDmXWUrpBJt6WlcGjLx1JVsMY8rlYuHHsTYTSaYikbixYdQSyINN2VYq1F798uTO9qHAzytL25M8g3A==", + "version": "3.972.59", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.59.tgz", + "integrity": "sha512-DlZF2/MhLlatDdlrIy3CUCpfdbLrKx+3SMjVo+WyHnPpwzkc/M3vwAHw4OVJf7DMvO+4vfRqSCMc/E9I1auN0g==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -487,16 +487,16 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.973.2", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.973.2.tgz", - "integrity": "sha512-pjMLaLU/JZi5lVfmR14V1OZqRBTuMHf6AwGNZA0K9hK+JKtO3jcLBarfD8iq5oc8cSowvc/9R32sqMVXZPo6xQ==", + "version": "3.973.3", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.973.3.tgz", + "integrity": "sha512-hmdDHoy2G5Es2e8IgelNMYUuSQI6uCIAKZMJ2u2PdKDhxvbk1uWD/g4+R7R5c/tJfKEB1+KjjWiaoCr/S+ZTiQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/nested-clients": "^3.997.32", - "@aws-sdk/token-providers": "3.1087.0", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/nested-clients": "^3.997.33", + "@aws-sdk/token-providers": "3.1088.0", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -505,15 +505,15 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.972.64", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.64.tgz", - "integrity": "sha512-7Buc7p0OvDHW7iBsu4b+YdS0WnaFBDGKDfbVQqaac9dkWiSiUtIoarBDsA1RmOVXZijaZJDoHJFIQiicQvWRlQ==", + "version": "3.972.65", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.65.tgz", + "integrity": "sha512-gHQb/Kt0chjk/JQDa/GJDqmAvEuVn8n7z10wK2h0LFM9TUDRkohgOO4aEF+s2sBLM0br7Cl5W6P7phgjrrJvLQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/nested-clients": "^3.997.32", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/nested-clients": "^3.997.33", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -522,12 +522,12 @@ } }, "node_modules/@aws-sdk/lib-storage": { - "version": "3.1087.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.1087.0.tgz", - "integrity": "sha512-ptS+BZ4CpzHagElZ//ISf/Bw4gCGAus1UhVnnUy8ZpnsvNlPR7ibWPUUQDH+U2WIxwIwIOUZe0AWi1HfJ0oqKA==", + "version": "3.1088.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.1088.0.tgz", + "integrity": "sha512-OElyotfOuTLAkWeYfWvgFQ/ABVs5xi9+UzlnKveFnbyfzV9um0guDWGanG/xGlw9ofAiplscHlNauChtJUBNWA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.3", + "@smithy/core": "^3.29.4", "@smithy/types": "^4.16.1", "buffer": "5.6.0", "events": "3.3.0", @@ -538,19 +538,19 @@ "node": ">=20.0.0" }, "peerDependencies": { - "@aws-sdk/client-s3": "^3.1087.0" + "@aws-sdk/client-s3": "^3.1088.0" } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.972.63", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.63.tgz", - "integrity": "sha512-EklitJscj/Aq2Pk8nz0xSxvL+VMSP29iFqouQU0Ow05JKn5y/OhI81ujkfVS72MjD1yeoU9uIdT8c/W6vhktQw==", + "version": "3.972.64", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.64.tgz", + "integrity": "sha512-RBi43anhDBUv+HCfxCOXwGOE7GmT4n7ChV04Mwr22RhXTNcamW/iWnJlOotDPCZSrJ4dEvhZSiWWQMwLX+ZhFA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/signature-v4-multi-region": "^3.996.40", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/signature-v4-multi-region": "^3.996.41", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -559,13 +559,13 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sqs": { - "version": "3.972.36", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.972.36.tgz", - "integrity": "sha512-A3y33ETRHygvS4yZAM92NowTKZVAfsCNOeJuuOPgJO4vUS/rHDu7u+CDzrSq+W+T1bF7f4LMO9PxnEbo4ZaQuA==", + "version": "3.972.37", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.972.37.tgz", + "integrity": "sha512-ObKPWZWpog+4zZQ2q+LdBwf/nm+HF2afgBxCtyHeqjRlsnATuKOV3dPYnzCGyjRZ/RHTEre4LRrYRcIxlWhzVQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -574,17 +574,17 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.997.32", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.32.tgz", - "integrity": "sha512-6Yj2fr9XF67cndITea48rchTdVr3VGx6PN47bIKNinJAjLkmaIlz/4EBPCgJ8UmhVopiXmeAuPLI3+DXDDbMhQ==", + "version": "3.997.33", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.997.33.tgz", + "integrity": "sha512-dVZOroI/r3/ENvqNGgjMPul+jjlz9GddfVusgTXlVjfZj5isibOxecLkGQbRPp8XOuX+RAfjXLFgPkD1JS5xrw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/signature-v4-multi-region": "^3.996.40", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", - "@smithy/fetch-http-handler": "^5.6.5", - "@smithy/node-http-handler": "^4.9.5", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/signature-v4-multi-region": "^3.996.41", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", + "@smithy/fetch-http-handler": "^5.6.6", + "@smithy/node-http-handler": "^4.9.6", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -593,13 +593,13 @@ } }, "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.996.40", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.40.tgz", - "integrity": "sha512-wrGZ/authosokclY1DXsiWT/1WjfCI22FuZGgdcilF+XLTXs5dCjAtiFYSPsEToZkbm3Lj2YP8PoWg0yoMNu0g==", + "version": "3.996.41", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.41.tgz", + "integrity": "sha512-QMUytg+FQMGouc8gHS00KoYih3+N6cqmVI/pQGOIo7Nr7OpQaiXjSYOuL+vsPZ1tymY4LAQ8MYcHJmws5LRxng==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "^3.974.1", - "@smithy/signature-v4": "^5.6.3", + "@aws-sdk/types": "^3.974.2", + "@smithy/signature-v4": "^5.6.5", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -608,15 +608,15 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.1087.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1087.0.tgz", - "integrity": "sha512-umM+qNq16f2fH+VLM5MqXW4ORNQAjk+TOSto73xbUHcKaU41L48j786r3UWQYlejeJk37NlvRYgxBT+MBkfaYQ==", + "version": "3.1088.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.1088.0.tgz", + "integrity": "sha512-4ObatWt2qpJg5FBk4LOOKrTQYzaqeewAtdO3r9ZO8lH9YqLtpTzLyIdy0mJ+nVdfYOnqISkKNfmzP22bNDhwyw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "^3.975.2", - "@aws-sdk/nested-clients": "^3.997.32", - "@aws-sdk/types": "^3.974.1", - "@smithy/core": "^3.29.3", + "@aws-sdk/core": "^3.975.3", + "@aws-sdk/nested-clients": "^3.997.33", + "@aws-sdk/types": "^3.974.2", + "@smithy/core": "^3.29.4", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -625,9 +625,9 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.974.1", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.1.tgz", - "integrity": "sha512-W0IQZR0eaBqlBFIIofMapaWkw1W0U+Xi4dvW+BqwmCEMd8Ng2U6IhkxuPSjMVnR8klLjfuS9PeZWUl1N6UaZdg==", + "version": "3.974.2", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.974.2.tgz", + "integrity": "sha512-3W6IUtSxFbH6X7Wb7DzGCV5QiFQsd0g8bOfntpmDxQlzBoKWUMBu/JPQR0DwkE+Hpnxd6db1tXbOwdeHddG6cA==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.16.1", @@ -638,9 +638,9 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.35", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.35.tgz", - "integrity": "sha512-pXzaWe3evZhjxDXAlMnqISe/XefTCGwBJG4nFTXaWSgAnMkqPEhxEPqJNhhpGesEvKFhvNpnozJJ4GTL11bRYw==", + "version": "3.972.36", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.36.tgz", + "integrity": "sha512-RdGmS1GLrtaTOLE1ElSluMldNrpk9Emq6uYs8SS8iHlu5xTAmM9rRkM91o48+rIRryBtyO9t+uLYCoMG6jVMVA==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.16.1", @@ -2861,9 +2861,9 @@ } }, "node_modules/@smithy/core": { - "version": "3.29.3", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.29.3.tgz", - "integrity": "sha512-L+Ys6ecjk5vwPMAKHBpPKlJ3DkqwNcnfEISXBZIsVvWG/XKXfsAP8mwIYlTeLcd2ElHdesPI8OuOmJSFAPhm6A==", + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.29.4.tgz", + "integrity": "sha512-G1GRglAabzEhqghJMBAd54FkRS7SAFGHEwbhcI9r+O+LIMuFsLyXkLZkCoFSgAglRu8s/URVXJB0hglq3ZipIg==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.16.1", @@ -2874,12 +2874,12 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.4.8.tgz", - "integrity": "sha512-q9J7JTiXrAhB8sDp4px97uEPT7CwKH61Co78grdNQvU8QZAdiuaSRhP0tUVf2ogy36RZTrlMU1rBmDEH+cnkiA==", + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.4.9.tgz", + "integrity": "sha512-2nfV4qRKiYeXU4zD2vvSCfg5dfp/BuhrM73vt7q9gzBhxs4rbPxXY21wo+kyI3bRmXcEGRnCLTaW8O437jzHIg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.3", + "@smithy/core": "^3.29.4", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -2888,12 +2888,12 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.6.5", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.6.5.tgz", - "integrity": "sha512-SuqeisTyPoiIPtIYru/sGxGyXzmZ+8nnFOhC+qRPglt06Ebd1yH//CDltZB2J/3WBNVhwfUaZ0EtHB3cm2X32g==", + "version": "5.6.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.6.6.tgz", + "integrity": "sha512-NHLgAlORUFZjn5ZfhYuyyKMlXA1WLYOdGxEhyNxrPpbJzoacGbl0chn1lN2KiZ8mpNVk0tV5607CSYlYs/OFgw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.3", + "@smithy/core": "^3.29.4", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -2902,12 +2902,12 @@ } }, "node_modules/@smithy/middleware-compression": { - "version": "4.5.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.5.8.tgz", - "integrity": "sha512-ODHXD5tDW3+25pfiLjJ2ZTIHRfWWxqVGPqIMz1NjmiV4bG4i1S0kuibHxik6WXibR03nmDGMiI1/hF6647F/Zg==", + "version": "4.5.9", + "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.5.9.tgz", + "integrity": "sha512-/9lZ7lVBPZoAnN/hJiTSml8qgzgw2pG6RzPveBZl1vnPxNN7F3UEYMZBI3xRSyc+tJjLsZbSlT3/DttjH199hw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.3", + "@smithy/core": "^3.29.4", "@smithy/types": "^4.16.1", "fflate": "0.8.1", "tslib": "^2.6.2" @@ -2917,12 +2917,12 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.9.5.tgz", - "integrity": "sha512-bNqdxTQTxmLbomSmlkZFz8L6B/feQ2HHzw4L2zY7Ecp2XffYAZq2uzdWDdxJHJFbEvqd+SRuluJso0P8+xPdbw==", + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.9.6.tgz", + "integrity": "sha512-odd+HYx3OLcXRSEz0ZeF3JQdSYdK8QnRgA2N87cPW7coWIbKfRk7a9VQjfeWQLqnzrDLk23KMEn46p8N7M/JFg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.3", + "@smithy/core": "^3.29.4", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -2931,12 +2931,12 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.6.4.tgz", - "integrity": "sha512-B89bpf2t/y/wia6LZ+4JfHXYQT9PnVftsH05rgJKKIStS7r/4XSs9HOjtPoLtgcA6HCW9jVqX5DBbq7E0PAkiQ==", + "version": "5.6.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.6.5.tgz", + "integrity": "sha512-MO5VEhwVl0BN7xVoVeNrZfiUFoQtqxUbgl6/RwOTlMMxCSjblG8twSrVTwz3J4w9WZxd2rBfBAUXjH77agspBg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.29.3", + "@smithy/core": "^3.29.4", "@smithy/types": "^4.16.1", "tslib": "^2.6.2" }, @@ -3064,9 +3064,9 @@ } }, "node_modules/@tak-ps/node-tak": { - "version": "12.22.0", - "resolved": "https://registry.npmjs.org/@tak-ps/node-tak/-/node-tak-12.22.0.tgz", - "integrity": "sha512-j6dnXkPbmABYRXrNGyYXNPx3qG40lL4LMdikuOyUP4m77PHnKR2GXvuDyhG+LEcHU9UQhm6lfIEpcLiuqltK8A==", + "version": "12.23.0", + "resolved": "https://registry.npmjs.org/@tak-ps/node-tak/-/node-tak-12.23.0.tgz", + "integrity": "sha512-wr/RE2ptD6yp/C2y8MgLt5miGpLls96ngGxQexQqlrnW2L0Zl/KPOwQR91e1LYO25XhSWD5Z7IBeHqu8aL+h5Q==", "license": "MIT", "dependencies": { "@openaddresses/batch-error": "^2.12.0", diff --git a/api/package.json b/api/package.json index 5db1a00376..c32de5b809 100644 --- a/api/package.json +++ b/api/package.json @@ -56,7 +56,7 @@ "@tak-ps/etl": "^10.0.0", "@tak-ps/node-cot": "^14.45.0", "@tak-ps/node-safeurl": "^1.5.0", - "@tak-ps/node-tak": "^12.22.0", + "@tak-ps/node-tak": "^12.23.0", "@turf/bbox": "^7.1.0", "@turf/bbox-polygon": "^7.2.0", "@turf/meta": "^7.0.0", diff --git a/api/stateless/routes/marti-mission-layers.ts b/api/stateless/routes/marti-mission-layers.ts index 61dbdfaa65..f01cc5f342 100644 --- a/api/stateless/routes/marti-mission-layers.ts +++ b/api/stateless/routes/marti-mission-layers.ts @@ -120,6 +120,87 @@ export default async function router(schema: Schema, config: ConfigStateless) { } }); + await schema.put('/marti/missions/:name/layer/:uid/cot', { + name: 'Attach Layer CoTs', + group: 'MartiMissionLayer', + params: Type.Object({ + name: Type.String(), + uid: Type.String(), + }), + body: Type.Object({ + uids: Type.Array(Type.String(), { minItems: 1 }), + }), + description: 'Helper API to file existing Mission CoTs under a mission layer, moving them from any layer they are currently filed under', + res: StandardResponse, + }, async (req, res) => { + try { + const user = await Auth.as_user(config, req); + + const auth = (await config.models.Profile.from(user.email)).auth; + const api = await TAKAPI.init(new URL(String(config.server.api)), new APIAuthCertificate(auth.cert, auth.key)); + + const opts: Static = req.headers['missionauthorization'] + ? { token: String(req.headers['missionauthorization']) } + : await profileControl.subscription(user.email, req.params.name); + + await api.MissionLayer.attachUids( + req.params.name, + req.params.uid, + { + uids: req.body.uids, + creatorUid: user.email, + }, + opts, + ); + + res.json({ + status: 200, + message: 'CoTs Attached to Layer', + }); + } catch (err) { + Err.respond(err, res); + } + }); + + await schema.delete('/marti/missions/:name/layer/:uid/cot/:cotuid', { + name: 'Detach Layer CoT', + group: 'MartiMissionLayer', + params: Type.Object({ + name: Type.String(), + uid: Type.String(), + cotuid: Type.String(), + }), + description: 'Helper API to move a Mission CoT out of a mission layer and back to the mission root - the CoT remains part of the Mission', + res: StandardResponse, + }, async (req, res) => { + try { + const user = await Auth.as_user(config, req); + + const auth = (await config.models.Profile.from(user.email)).auth; + const api = await TAKAPI.init(new URL(String(config.server.api)), new APIAuthCertificate(auth.cert, auth.key)); + + const opts: Static = req.headers['missionauthorization'] + ? { token: String(req.headers['missionauthorization']) } + : await profileControl.subscription(user.email, req.params.name); + + await api.MissionLayer.setParent( + req.params.name, + { + layerUids: [req.params.cotuid], + creatorUid: user.email, + }, + opts, + ); + + res.json({ + status: 200, + message: 'CoT Detached from Layer', + }); + } catch (err) { + Err.respond(err, res); + } + }); + await schema.patch('/marti/missions/:name/layer/:uid', { name: 'Update Layer', group: 'MartiMissionLayer', diff --git a/api/test/marti-mission-layer-cot.srv.test.ts b/api/test/marti-mission-layer-cot.srv.test.ts new file mode 100644 index 0000000000..b0edea36dd --- /dev/null +++ b/api/test/marti-mission-layer-cot.srv.test.ts @@ -0,0 +1,119 @@ +process.env.SigningSecret = 'coe-wildland-fire'; +import test from 'node:test'; +import assert from 'node:assert'; +import Flight from './flight.js'; +import type { IncomingMessage, ServerResponse } from 'node:http'; + +const flight = new Flight(); + +flight.init({ takserver: true }); +flight.takeoff(); +flight.user(); + +async function readBody(request: IncomingMessage): Promise { + const chunks: Buffer[] = []; + for await (const chunk of request) { + chunks.push(chunk as Buffer); + } + return Buffer.concat(chunks).toString(); +} + +test('PUT: api/marti/missions/:name/layer/:uid/cot - Attach CoTs to Layer', async () => { + let capturedBody: unknown; + let creatorUid: string | null = null; + + flight.tak.mockMarti.push(async (request: IncomingMessage, response: ServerResponse) => { + if (!request.method || !request.url) return false; + + const url = new URL(request.url, 'http://localhost'); + + if (request.method === 'PUT' && url.pathname === '/Marti/api/missions/Test%20Mission/contents') { + creatorUid = url.searchParams.get('creatorUid'); + capturedBody = JSON.parse(await readBody(request)); + + response.setHeader('Content-Type', 'application/json'); + response.write(JSON.stringify({ data: [] })); + response.end(); + return true; + } + + return false; + }); + + try { + const res = await flight.fetch('/api/marti/missions/Test Mission/layer/layer-1/cot', { + method: 'PUT', + auth: { + bearer: flight.token.admin, + }, + headers: { + missionauthorization: 'test-mission-token', + }, + body: { + uids: ['cot-1', 'cot-2'], + }, + }, true); + + assert.equal(res.body.status, 200); + assert.equal(res.body.message, 'CoTs Attached to Layer'); + assert.equal(creatorUid, 'admin@example.com'); + assert.deepEqual(capturedBody, { + paths: { + 'layer-1': [{ uids: ['cot-1', 'cot-2'] }], + }, + }); + } catch (err) { + assert.ifError(err); + } + + flight.tak.reset(); +}); + +test('DELETE: api/marti/missions/:name/layer/:uid/cot/:cotuid - Detach CoT from Layer', async () => { + let layerUids: string[] = []; + let parentUid: string | null = null; + let creatorUid: string | null = null; + + flight.tak.mockMarti.push(async (request: IncomingMessage, response: ServerResponse) => { + if (!request.method || !request.url) return false; + + const url = new URL(request.url, 'http://localhost'); + + if (request.method === 'PUT' && url.pathname === '/Marti/api/missions/Test%20Mission/layers/parent') { + layerUids = url.searchParams.getAll('layerUid'); + parentUid = url.searchParams.get('parentUid'); + creatorUid = url.searchParams.get('creatorUid'); + + response.setHeader('Content-Type', 'application/json'); + response.write(JSON.stringify({})); + response.end(); + return true; + } + + return false; + }); + + try { + const res = await flight.fetch('/api/marti/missions/Test Mission/layer/layer-1/cot/cot-1', { + method: 'DELETE', + auth: { + bearer: flight.token.admin, + }, + headers: { + missionauthorization: 'test-mission-token', + }, + }, true); + + assert.equal(res.body.status, 200); + assert.equal(res.body.message, 'CoT Detached from Layer'); + assert.deepEqual(layerUids, ['cot-1']); + assert.equal(parentUid, null); + assert.equal(creatorUid, 'admin@example.com'); + } catch (err) { + assert.ifError(err); + } + + flight.tak.reset(); +}); + +flight.landing(); diff --git a/api/web/src/base/subscription-layer.ts b/api/web/src/base/subscription-layer.ts index bd8c1f74e6..1867ff65e2 100644 --- a/api/web/src/base/subscription-layer.ts +++ b/api/web/src/base/subscription-layer.ts @@ -144,6 +144,47 @@ export default class SubscriptionLayer { return data as unknown as MissionLayer; } + /** + * File existing mission features under a mission layer, moving them from + * any layer they are currently filed under, then refresh the local store. + */ + async attachFeatures( + layeruid: string, + uids: string[] + ): Promise { + const { error } = await server.PUT('/api/marti/missions/{:name}/layer/{:uid}/cot', { + params: { + path: { ':name': this.parent.guid, ':uid': layeruid } + }, + headers: this.headers(), + body: { uids } + }); + + if (error) throw new Error('Failed to move features into mission layer'); + + await this.refresh(); + } + + /** + * Move a mission feature out of a mission layer and back to the mission + * root - the feature remains part of the mission - then refresh the local store. + */ + async detachFeature( + layeruid: string, + uid: string + ): Promise { + const { error } = await server.DELETE('/api/marti/missions/{:name}/layer/{:uid}/cot/{:cotuid}', { + params: { + path: { ':name': this.parent.guid, ':uid': layeruid, ':cotuid': uid } + }, + headers: this.headers() + }); + + if (error) throw new Error('Failed to move feature out of mission layer'); + + await this.refresh(); + } + /** * Delete a mission layer, then refresh the local store. */ diff --git a/api/web/src/components/CloudTAK/Menu/Mission/MissionLayerCreate.vue b/api/web/src/components/CloudTAK/Menu/Mission/MissionLayerCreate.vue index 84769bf8d0..b94ce2ad02 100644 --- a/api/web/src/components/CloudTAK/Menu/Mission/MissionLayerCreate.vue +++ b/api/web/src/components/CloudTAK/Menu/Mission/MissionLayerCreate.vue @@ -56,9 +56,11 @@ const loading = ref({ layer: false, }); +// UID type folders are the native Data Sync folder for map items - the TAK +// Server only returns features filed under UID layers, not GROUP layers const layer = ref({ name: '', - type: 'GROUP' + type: 'UID' }); async function createLayer() { diff --git a/api/web/src/components/CloudTAK/Menu/Mission/MissionLayers.vue b/api/web/src/components/CloudTAK/Menu/Mission/MissionLayers.vue index f2aaac708a..f9eb8d8d42 100644 --- a/api/web/src/components/CloudTAK/Menu/Mission/MissionLayers.vue +++ b/api/web/src/components/CloudTAK/Menu/Mission/MissionLayers.vue @@ -53,34 +53,13 @@ /> -
- - - - - / +
+
-
+
@@ -118,14 +103,13 @@ \ No newline at end of file + + + From 7b8491dcababd7e424e4b7ce3371043328edcfb5 Mon Sep 17 00:00:00 2001 From: ingalls Date: Wed, 15 Jul 2026 16:00:27 -0400 Subject: [PATCH 2/4] Update Schema --- api/test/fixtures/get_schema.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/api/test/fixtures/get_schema.json b/api/test/fixtures/get_schema.json index e414d3c27b..81af85ab9d 100644 --- a/api/test/fixtures/get_schema.json +++ b/api/test/fixtures/get_schema.json @@ -779,6 +779,16 @@ "query": false, "res": true }, + "PUT /marti/missions/:name/layer/:uid/cot": { + "body": true, + "query": false, + "res": true + }, + "DELETE /marti/missions/:name/layer/:uid/cot/:cotuid": { + "body": false, + "query": false, + "res": true + }, "PATCH /marti/missions/:name/layer/:uid": { "body": true, "query": false, From e0c2eb4433ac54f1e119ae9920a36a03f5328675 Mon Sep 17 00:00:00 2001 From: ingalls Date: Fri, 24 Jul 2026 17:39:43 -0600 Subject: [PATCH 3/4] Fix review comments --- .../CloudTAK/Menu/Mission/MissionLayers.vue | 15 +++++++++++++-- .../components/CloudTAK/util/PathBreadcrumb.vue | 10 +++++++--- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/api/web/src/components/CloudTAK/Menu/Mission/MissionLayers.vue b/api/web/src/components/CloudTAK/Menu/Mission/MissionLayers.vue index f9eb8d8d42..44c8758518 100644 --- a/api/web/src/components/CloudTAK/Menu/Mission/MissionLayers.vue +++ b/api/web/src/components/CloudTAK/Menu/Mission/MissionLayers.vue @@ -103,7 +103,7 @@