@mapbox/mcp-server 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +111 -14
- package/dist/commonjs/cli.d.ts.map +1 -1
- package/dist/commonjs/cli.js +5 -2
- package/dist/commonjs/cli.js.map +1 -1
- package/dist/commonjs/index.js +38 -1
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/resources/BaseResource.d.ts +18 -0
- package/dist/commonjs/resources/BaseResource.d.ts.map +1 -1
- package/dist/commonjs/resources/BaseResource.js +26 -4
- package/dist/commonjs/resources/BaseResource.js.map +1 -1
- package/dist/commonjs/resources/resourceRegistry.d.ts +1 -2
- package/dist/commonjs/resources/resourceRegistry.d.ts.map +1 -1
- package/dist/commonjs/resources/resourceRegistry.js +0 -2
- package/dist/commonjs/resources/resourceRegistry.js.map +1 -1
- package/dist/commonjs/resources/temporary/TemporaryDataResource.d.ts.map +1 -1
- package/dist/commonjs/resources/temporary/TemporaryDataResource.js +20 -10
- package/dist/commonjs/resources/temporary/TemporaryDataResource.js.map +1 -1
- package/dist/commonjs/resources/ui-apps/MapAppUIResource.d.ts.map +1 -1
- package/dist/commonjs/resources/ui-apps/MapAppUIResource.js +2 -8
- package/dist/commonjs/resources/ui-apps/MapAppUIResource.js.map +1 -1
- package/dist/commonjs/resources/ui-apps/mapAppCsp.d.ts +22 -0
- package/dist/commonjs/resources/ui-apps/mapAppCsp.d.ts.map +1 -0
- package/dist/commonjs/resources/ui-apps/mapAppCsp.js +39 -0
- package/dist/commonjs/resources/ui-apps/mapAppCsp.js.map +1 -0
- package/dist/commonjs/resources/ui-apps/mapAppHtml.d.ts +3 -3
- package/dist/commonjs/resources/ui-apps/mapAppHtml.d.ts.map +1 -1
- package/dist/commonjs/resources/ui-apps/mapAppHtml.js +89 -13
- package/dist/commonjs/resources/ui-apps/mapAppHtml.js.map +1 -1
- package/dist/commonjs/tools/BaseTool.d.ts +19 -0
- package/dist/commonjs/tools/BaseTool.d.ts.map +1 -1
- package/dist/commonjs/tools/BaseTool.js +25 -3
- package/dist/commonjs/tools/BaseTool.js.map +1 -1
- package/dist/commonjs/tools/directions-tool/DirectionsTool.d.ts +16 -0
- package/dist/commonjs/tools/directions-tool/DirectionsTool.d.ts.map +1 -1
- package/dist/commonjs/tools/directions-tool/DirectionsTool.js +107 -2
- package/dist/commonjs/tools/directions-tool/DirectionsTool.js.map +1 -1
- package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.d.ts.map +1 -1
- package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.js +7 -4
- package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.js.map +1 -1
- package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.output.schema.d.ts +4 -0
- package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.output.schema.d.ts.map +1 -1
- package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.output.schema.js +9 -1
- package/dist/commonjs/tools/ground-location-tool/GroundLocationTool.output.schema.js.map +1 -1
- package/dist/commonjs/tools/isochrone-tool/IsochroneTool.js +1 -1
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.d.ts +11 -1
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.d.ts.map +1 -1
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.input.schema.js +3 -3
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.input.schema.js.map +1 -1
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.js +134 -139
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.js.map +1 -1
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.output.schema.d.ts +71 -10
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.output.schema.d.ts.map +1 -1
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.output.schema.js +86 -10
- package/dist/commonjs/tools/place-details-tool/PlaceDetailsTool.output.schema.js.map +1 -1
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.d.ts +2 -4
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.d.ts.map +1 -1
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.input.schema.d.ts +50 -0
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.input.schema.d.ts.map +1 -1
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.input.schema.js +51 -2
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.input.schema.js.map +1 -1
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.js +50 -18
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.js.map +1 -1
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.output.schema.d.ts +50 -0
- package/dist/commonjs/tools/render-map-tool/RenderMapTool.output.schema.d.ts.map +1 -1
- package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.d.ts.map +1 -1
- package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.input.schema.d.ts.map +1 -1
- package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.input.schema.js +2 -2
- package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.input.schema.js.map +1 -1
- package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.js +6 -3
- package/dist/commonjs/tools/search-and-geocode-tool/SearchAndGeocodeTool.js.map +1 -1
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.d.ts.map +1 -1
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.input.schema.d.ts +3 -3
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.input.schema.d.ts.map +1 -1
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.input.schema.js +16 -2
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.input.schema.js.map +1 -1
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.js +17 -6
- package/dist/commonjs/tools/static-map-image-tool/StaticMapImageTool.js.map +1 -1
- package/dist/commonjs/utils/index.d.ts +2 -0
- package/dist/commonjs/utils/index.d.ts.map +1 -1
- package/dist/commonjs/utils/index.js +8 -1
- package/dist/commonjs/utils/index.js.map +1 -1
- package/dist/commonjs/utils/jsonSchema2020.d.ts +26 -0
- package/dist/commonjs/utils/jsonSchema2020.d.ts.map +1 -0
- package/dist/commonjs/utils/jsonSchema2020.js +143 -0
- package/dist/commonjs/utils/jsonSchema2020.js.map +1 -0
- package/dist/commonjs/utils/jwtUtils.d.ts +48 -0
- package/dist/commonjs/utils/jwtUtils.d.ts.map +1 -1
- package/dist/commonjs/utils/jwtUtils.js +63 -0
- package/dist/commonjs/utils/jwtUtils.js.map +1 -1
- package/dist/commonjs/utils/mapAppPayload.d.ts +109 -0
- package/dist/commonjs/utils/mapAppPayload.d.ts.map +1 -1
- package/dist/commonjs/utils/mapAppPayload.js +38 -2
- package/dist/commonjs/utils/mapAppPayload.js.map +1 -1
- package/dist/commonjs/utils/redactToken.d.ts +3 -0
- package/dist/commonjs/utils/redactToken.d.ts.map +1 -0
- package/dist/commonjs/utils/redactToken.js +55 -0
- package/dist/commonjs/utils/redactToken.js.map +1 -0
- package/dist/commonjs/utils/redactingSpanExporter.d.ts +24 -0
- package/dist/commonjs/utils/redactingSpanExporter.d.ts.map +1 -0
- package/dist/commonjs/utils/redactingSpanExporter.js +97 -0
- package/dist/commonjs/utils/redactingSpanExporter.js.map +1 -0
- package/dist/commonjs/utils/selfFetchRef.d.ts.map +1 -1
- package/dist/commonjs/utils/selfFetchRef.js +31 -0
- package/dist/commonjs/utils/selfFetchRef.js.map +1 -1
- package/dist/commonjs/utils/serverInstructions.d.ts +12 -0
- package/dist/commonjs/utils/serverInstructions.d.ts.map +1 -0
- package/dist/commonjs/utils/serverInstructions.js +28 -0
- package/dist/commonjs/utils/serverInstructions.js.map +1 -0
- package/dist/commonjs/utils/storeMapPayload.d.ts +11 -11
- package/dist/commonjs/utils/storeMapPayload.d.ts.map +1 -1
- package/dist/commonjs/utils/storeMapPayload.js +14 -13
- package/dist/commonjs/utils/storeMapPayload.js.map +1 -1
- package/dist/commonjs/utils/temporaryResourceManager.d.ts +10 -4
- package/dist/commonjs/utils/temporaryResourceManager.d.ts.map +1 -1
- package/dist/commonjs/utils/temporaryResourceManager.js.map +1 -1
- package/dist/commonjs/utils/tracing.d.ts +4 -0
- package/dist/commonjs/utils/tracing.d.ts.map +1 -1
- package/dist/commonjs/utils/tracing.js +24 -1
- package/dist/commonjs/utils/tracing.js.map +1 -1
- package/dist/commonjs/utils/urlSafety.d.ts +23 -7
- package/dist/commonjs/utils/urlSafety.d.ts.map +1 -1
- package/dist/commonjs/utils/urlSafety.js +84 -66
- package/dist/commonjs/utils/urlSafety.js.map +1 -1
- package/dist/commonjs/version.json +3 -3
- package/dist/esm/cli.d.ts.map +1 -1
- package/dist/esm/cli.js +5 -2
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/index.js +39 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/resources/BaseResource.d.ts +18 -0
- package/dist/esm/resources/BaseResource.d.ts.map +1 -1
- package/dist/esm/resources/BaseResource.js +26 -4
- package/dist/esm/resources/BaseResource.js.map +1 -1
- package/dist/esm/resources/resourceRegistry.d.ts +1 -2
- package/dist/esm/resources/resourceRegistry.d.ts.map +1 -1
- package/dist/esm/resources/resourceRegistry.js +0 -2
- package/dist/esm/resources/resourceRegistry.js.map +1 -1
- package/dist/esm/resources/temporary/TemporaryDataResource.d.ts.map +1 -1
- package/dist/esm/resources/temporary/TemporaryDataResource.js +21 -11
- package/dist/esm/resources/temporary/TemporaryDataResource.js.map +1 -1
- package/dist/esm/resources/ui-apps/MapAppUIResource.d.ts.map +1 -1
- package/dist/esm/resources/ui-apps/MapAppUIResource.js +2 -8
- package/dist/esm/resources/ui-apps/MapAppUIResource.js.map +1 -1
- package/dist/esm/resources/ui-apps/mapAppCsp.d.ts +22 -0
- package/dist/esm/resources/ui-apps/mapAppCsp.d.ts.map +1 -0
- package/dist/esm/resources/ui-apps/mapAppCsp.js +36 -0
- package/dist/esm/resources/ui-apps/mapAppCsp.js.map +1 -0
- package/dist/esm/resources/ui-apps/mapAppHtml.d.ts +3 -3
- package/dist/esm/resources/ui-apps/mapAppHtml.d.ts.map +1 -1
- package/dist/esm/resources/ui-apps/mapAppHtml.js +89 -13
- package/dist/esm/resources/ui-apps/mapAppHtml.js.map +1 -1
- package/dist/esm/tools/BaseTool.d.ts +19 -0
- package/dist/esm/tools/BaseTool.d.ts.map +1 -1
- package/dist/esm/tools/BaseTool.js +25 -3
- package/dist/esm/tools/BaseTool.js.map +1 -1
- package/dist/esm/tools/directions-tool/DirectionsTool.d.ts +16 -0
- package/dist/esm/tools/directions-tool/DirectionsTool.d.ts.map +1 -1
- package/dist/esm/tools/directions-tool/DirectionsTool.js +108 -3
- package/dist/esm/tools/directions-tool/DirectionsTool.js.map +1 -1
- package/dist/esm/tools/ground-location-tool/GroundLocationTool.d.ts.map +1 -1
- package/dist/esm/tools/ground-location-tool/GroundLocationTool.js +7 -4
- package/dist/esm/tools/ground-location-tool/GroundLocationTool.js.map +1 -1
- package/dist/esm/tools/ground-location-tool/GroundLocationTool.output.schema.d.ts +4 -0
- package/dist/esm/tools/ground-location-tool/GroundLocationTool.output.schema.d.ts.map +1 -1
- package/dist/esm/tools/ground-location-tool/GroundLocationTool.output.schema.js +9 -1
- package/dist/esm/tools/ground-location-tool/GroundLocationTool.output.schema.js.map +1 -1
- package/dist/esm/tools/isochrone-tool/IsochroneTool.js +2 -2
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.d.ts +11 -1
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.d.ts.map +1 -1
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.input.schema.js +3 -3
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.input.schema.js.map +1 -1
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.js +135 -140
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.js.map +1 -1
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.output.schema.d.ts +71 -10
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.output.schema.d.ts.map +1 -1
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.output.schema.js +85 -9
- package/dist/esm/tools/place-details-tool/PlaceDetailsTool.output.schema.js.map +1 -1
- package/dist/esm/tools/render-map-tool/RenderMapTool.d.ts +2 -4
- package/dist/esm/tools/render-map-tool/RenderMapTool.d.ts.map +1 -1
- package/dist/esm/tools/render-map-tool/RenderMapTool.input.schema.d.ts +50 -0
- package/dist/esm/tools/render-map-tool/RenderMapTool.input.schema.d.ts.map +1 -1
- package/dist/esm/tools/render-map-tool/RenderMapTool.input.schema.js +51 -2
- package/dist/esm/tools/render-map-tool/RenderMapTool.input.schema.js.map +1 -1
- package/dist/esm/tools/render-map-tool/RenderMapTool.js +51 -19
- package/dist/esm/tools/render-map-tool/RenderMapTool.js.map +1 -1
- package/dist/esm/tools/render-map-tool/RenderMapTool.output.schema.d.ts +50 -0
- package/dist/esm/tools/render-map-tool/RenderMapTool.output.schema.d.ts.map +1 -1
- package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.d.ts.map +1 -1
- package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.input.schema.d.ts.map +1 -1
- package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.input.schema.js +2 -2
- package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.input.schema.js.map +1 -1
- package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.js +6 -3
- package/dist/esm/tools/search-and-geocode-tool/SearchAndGeocodeTool.js.map +1 -1
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.d.ts.map +1 -1
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.input.schema.d.ts +3 -3
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.input.schema.d.ts.map +1 -1
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.input.schema.js +17 -3
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.input.schema.js.map +1 -1
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.js +18 -7
- package/dist/esm/tools/static-map-image-tool/StaticMapImageTool.js.map +1 -1
- package/dist/esm/utils/index.d.ts +2 -0
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/esm/utils/index.js +5 -0
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/jsonSchema2020.d.ts +26 -0
- package/dist/esm/utils/jsonSchema2020.d.ts.map +1 -0
- package/dist/esm/utils/jsonSchema2020.js +138 -0
- package/dist/esm/utils/jsonSchema2020.js.map +1 -0
- package/dist/esm/utils/jwtUtils.d.ts +48 -0
- package/dist/esm/utils/jwtUtils.d.ts.map +1 -1
- package/dist/esm/utils/jwtUtils.js +61 -0
- package/dist/esm/utils/jwtUtils.js.map +1 -1
- package/dist/esm/utils/mapAppPayload.d.ts +109 -0
- package/dist/esm/utils/mapAppPayload.d.ts.map +1 -1
- package/dist/esm/utils/mapAppPayload.js +38 -2
- package/dist/esm/utils/mapAppPayload.js.map +1 -1
- package/dist/esm/utils/redactToken.d.ts +3 -0
- package/dist/esm/utils/redactToken.d.ts.map +1 -0
- package/dist/esm/utils/redactToken.js +52 -0
- package/dist/esm/utils/redactToken.js.map +1 -0
- package/dist/esm/utils/redactingSpanExporter.d.ts +24 -0
- package/dist/esm/utils/redactingSpanExporter.d.ts.map +1 -0
- package/dist/esm/utils/redactingSpanExporter.js +93 -0
- package/dist/esm/utils/redactingSpanExporter.js.map +1 -0
- package/dist/esm/utils/selfFetchRef.d.ts.map +1 -1
- package/dist/esm/utils/selfFetchRef.js +31 -0
- package/dist/esm/utils/selfFetchRef.js.map +1 -1
- package/dist/esm/utils/serverInstructions.d.ts +12 -0
- package/dist/esm/utils/serverInstructions.d.ts.map +1 -0
- package/dist/esm/utils/serverInstructions.js +25 -0
- package/dist/esm/utils/serverInstructions.js.map +1 -0
- package/dist/esm/utils/storeMapPayload.d.ts +11 -11
- package/dist/esm/utils/storeMapPayload.d.ts.map +1 -1
- package/dist/esm/utils/storeMapPayload.js +14 -13
- package/dist/esm/utils/storeMapPayload.js.map +1 -1
- package/dist/esm/utils/temporaryResourceManager.d.ts +10 -4
- package/dist/esm/utils/temporaryResourceManager.d.ts.map +1 -1
- package/dist/esm/utils/temporaryResourceManager.js.map +1 -1
- package/dist/esm/utils/tracing.d.ts +4 -0
- package/dist/esm/utils/tracing.d.ts.map +1 -1
- package/dist/esm/utils/tracing.js +23 -1
- package/dist/esm/utils/tracing.js.map +1 -1
- package/dist/esm/utils/urlSafety.d.ts +23 -7
- package/dist/esm/utils/urlSafety.d.ts.map +1 -1
- package/dist/esm/utils/urlSafety.js +80 -66
- package/dist/esm/utils/urlSafety.js.map +1 -1
- package/dist/esm/version.json +3 -3
- package/package.json +3 -2
- package/patches/{@modelcontextprotocol+sdk+1.29.0.patch → @modelcontextprotocol+sdk+1.30.0.patch} +6 -2
- package/dist/commonjs/resources/ui-apps/StaticMapUIResource.d.ts +0 -15
- package/dist/commonjs/resources/ui-apps/StaticMapUIResource.d.ts.map +0 -1
- package/dist/commonjs/resources/ui-apps/StaticMapUIResource.js +0 -262
- package/dist/commonjs/resources/ui-apps/StaticMapUIResource.js.map +0 -1
- package/dist/esm/resources/ui-apps/StaticMapUIResource.d.ts +0 -15
- package/dist/esm/resources/ui-apps/StaticMapUIResource.d.ts.map +0 -1
- package/dist/esm/resources/ui-apps/StaticMapUIResource.js +0 -258
- package/dist/esm/resources/ui-apps/StaticMapUIResource.js.map +0 -1
|
@@ -1,11 +1,21 @@
|
|
|
1
1
|
// Copyright (c) Mapbox, Inc.
|
|
2
2
|
// Licensed under the MIT License.
|
|
3
|
+
import { createHash, timingSafeEqual } from 'node:crypto';
|
|
3
4
|
/**
|
|
4
5
|
* Extract the Mapbox username from a JWT access token.
|
|
5
6
|
*
|
|
6
7
|
* Mapbox tokens are JWTs whose payload contains the username under the `u` key.
|
|
7
8
|
* Returns undefined if the token is malformed or missing the `u` field — callers
|
|
8
9
|
* can decide whether to surface an error or fall back to another auth path.
|
|
10
|
+
*
|
|
11
|
+
* SECURITY: the returned name is an UNVERIFIED claim. This decodes the payload
|
|
12
|
+
* without checking the signature (Mapbox signs with a secret only Mapbox holds,
|
|
13
|
+
* so it cannot be checked here), which means any caller can fabricate a token
|
|
14
|
+
* asserting any username. Use this only where the value is non-authoritative —
|
|
15
|
+
* e.g. building a `/tokens/v2/{username}` request URL, where a forged name
|
|
16
|
+
* simply makes the Mapbox API reject the call. Never use it to decide whether
|
|
17
|
+
* one caller may read another caller's data; use {@link getOwnerKeyFromToken}
|
|
18
|
+
* and {@link ownerKeyMatches} for that.
|
|
9
19
|
*/
|
|
10
20
|
export function getUserNameFromToken(token) {
|
|
11
21
|
const parts = token.split('.');
|
|
@@ -19,4 +29,55 @@ export function getUserNameFromToken(token) {
|
|
|
19
29
|
return undefined;
|
|
20
30
|
}
|
|
21
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Derive the ownership key used to scope temporary resources to the caller.
|
|
34
|
+
*
|
|
35
|
+
* This is a SHA-256 fingerprint of the raw token string — NOT the `u` claim.
|
|
36
|
+
* The distinction is the whole point: `getUserNameFromToken` reads an
|
|
37
|
+
* *unverified* claim out of a token payload that anyone can fabricate, because
|
|
38
|
+
* Mapbox signs its tokens with a secret only Mapbox holds and this server
|
|
39
|
+
* therefore cannot check the signature locally. Scoping a resource by username
|
|
40
|
+
* means anyone who learns a resource URI and a Mapbox username can mint a
|
|
41
|
+
* garbage token asserting `{"u":"<victim>"}` and read that resource.
|
|
42
|
+
*
|
|
43
|
+
* Fingerprinting the token instead makes the check depend on bytes the attacker
|
|
44
|
+
* would have to already possess. An attacker holding the victim's real token
|
|
45
|
+
* does not need this path at all — they can call the Mapbox API directly — so
|
|
46
|
+
* the bypass stops being worth anything. No signature verification and no
|
|
47
|
+
* network round-trip to an introspection endpoint are required, which keeps
|
|
48
|
+
* resource reads at the O(1) cost the temporary-resource cache exists to
|
|
49
|
+
* preserve.
|
|
50
|
+
*
|
|
51
|
+
* Tradeoff: ownership is now per-token rather than per-account. A caller that
|
|
52
|
+
* rotates to a different token mid-session can no longer read resources it
|
|
53
|
+
* created under the previous one; those reads fail closed and surface as the
|
|
54
|
+
* normal "not found or expired" response. With a 30-minute TTL this is a narrow
|
|
55
|
+
* window, and failing closed is the correct direction for an authorization
|
|
56
|
+
* check.
|
|
57
|
+
*
|
|
58
|
+
* Returns undefined for an empty/absent token so callers keep failing closed.
|
|
59
|
+
*/
|
|
60
|
+
export function getOwnerKeyFromToken(token) {
|
|
61
|
+
if (!token)
|
|
62
|
+
return undefined;
|
|
63
|
+
return createHash('sha256').update(token, 'utf-8').digest('hex');
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Compare two ownership keys from {@link getOwnerKeyFromToken}.
|
|
67
|
+
*
|
|
68
|
+
* Fails closed when either side is undefined — an unowned resource is never
|
|
69
|
+
* readable. The comparison is constant-time so the check cannot be probed
|
|
70
|
+
* byte-by-byte; SHA-256 preimage resistance already makes a leaked digest
|
|
71
|
+
* useless, but an authorization comparison on a credential-derived value has no
|
|
72
|
+
* reason not to be constant-time.
|
|
73
|
+
*/
|
|
74
|
+
export function ownerKeyMatches(expected, actual) {
|
|
75
|
+
if (!expected || !actual)
|
|
76
|
+
return false;
|
|
77
|
+
const a = Buffer.from(expected, 'utf-8');
|
|
78
|
+
const b = Buffer.from(actual, 'utf-8');
|
|
79
|
+
if (a.length !== b.length)
|
|
80
|
+
return false;
|
|
81
|
+
return timingSafeEqual(a, b);
|
|
82
|
+
}
|
|
22
83
|
//# sourceMappingURL=jwtUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jwtUtils.js","sourceRoot":"","sources":["../../../src/utils/jwtUtils.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kCAAkC;AAElC
|
|
1
|
+
{"version":3,"file":"jwtUtils.js","sourceRoot":"","sources":["../../../src/utils/jwtUtils.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kCAAkC;AAElC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CACxB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC/B,CAAC;QACrB,OAAO,OAAO,OAAO,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAyB;IAEzB,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,QAA4B,EAC5B,MAA0B;IAE1B,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -43,7 +43,62 @@ export interface MapAppLayer {
|
|
|
43
43
|
paint?: Record<string, unknown>;
|
|
44
44
|
/** Mapbox Style spec layout object, passed through to addLayer. */
|
|
45
45
|
layout?: Record<string, unknown>;
|
|
46
|
+
/**
|
|
47
|
+
* Where to place this layer relative to the Standard base style's own
|
|
48
|
+
* layers ('bottom' | 'middle' | 'top'). Omit to keep the current
|
|
49
|
+
* behavior: the layer renders above everything, including labels.
|
|
50
|
+
*/
|
|
51
|
+
slot?: 'bottom' | 'middle' | 'top';
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Standard base-style config properties (`map.setConfigProperty('basemap',
|
|
55
|
+
* key, value)`), for restyling the base map itself rather than adding new
|
|
56
|
+
* layers on top of it. Only the currently-documented properties are typed;
|
|
57
|
+
* `.passthrough()` on the Zod schema below lets a Standard property Mapbox
|
|
58
|
+
* ships later flow through without a schema change here. Has no effect if
|
|
59
|
+
* the underlying base style isn't Standard.
|
|
60
|
+
*/
|
|
61
|
+
export interface MapAppBaseMapConfig {
|
|
62
|
+
theme?: 'default' | 'faded' | 'monochrome' | 'custom';
|
|
63
|
+
lightPreset?: 'day' | 'dawn' | 'dusk' | 'night';
|
|
64
|
+
colorWater?: string;
|
|
65
|
+
colorLand?: string;
|
|
66
|
+
colorGreenspace?: string;
|
|
67
|
+
colorMotorways?: string;
|
|
68
|
+
colorTrunks?: string;
|
|
69
|
+
colorRoads?: string;
|
|
70
|
+
colorBuildings?: string;
|
|
71
|
+
colorAdminBoundaries?: string;
|
|
72
|
+
colorCommercial?: string;
|
|
73
|
+
colorEducation?: string;
|
|
74
|
+
colorMedical?: string;
|
|
75
|
+
colorIndustrial?: string;
|
|
76
|
+
colorPlaceLabels?: string;
|
|
77
|
+
colorRoadLabels?: string;
|
|
78
|
+
colorPointOfInterestLabels?: string;
|
|
79
|
+
showPointOfInterestLabels?: boolean;
|
|
80
|
+
showTransitLabels?: boolean;
|
|
81
|
+
showPlaceLabels?: boolean;
|
|
82
|
+
showRoadLabels?: boolean;
|
|
83
|
+
showAdminBoundaries?: boolean;
|
|
84
|
+
showIndoor?: boolean;
|
|
85
|
+
showIndoorLabels?: boolean;
|
|
86
|
+
showLandmarkIconLabels?: boolean;
|
|
87
|
+
show3dObjects?: boolean;
|
|
88
|
+
show3dTrees?: boolean;
|
|
89
|
+
show3dFacades?: boolean;
|
|
90
|
+
densityPointOfInterestLabels?: number;
|
|
46
91
|
}
|
|
92
|
+
/**
|
|
93
|
+
* Which Mapbox-owned base style to load. Both are part of the Standard
|
|
94
|
+
* family (same config-property system and `bottom`/`middle`/`top` slots,
|
|
95
|
+
* per https://docs.mapbox.com/map-styles/reference/), so `baseMapConfig`
|
|
96
|
+
* and `slot` work under either — `standard-satellite` just doesn't support
|
|
97
|
+
* every Standard property (no `theme`, no flat-color overrides like
|
|
98
|
+
* `colorWater`/`colorBuildings`, since imagery replaces those surfaces).
|
|
99
|
+
* Defaults to `standard` when omitted.
|
|
100
|
+
*/
|
|
101
|
+
export type MapAppBaseStyle = 'standard' | 'standard-satellite';
|
|
47
102
|
export interface MapAppMarker {
|
|
48
103
|
coordinates: [number, number];
|
|
49
104
|
/**
|
|
@@ -109,6 +164,10 @@ export interface MapAppPayload {
|
|
|
109
164
|
defer?: MapAppDeferredLayer;
|
|
110
165
|
/** Layers the iframe fetches and builds itself, post-initial-render. */
|
|
111
166
|
selfFetch?: MapAppSelfFetch[];
|
|
167
|
+
/** Restyles the Standard base map itself (colors, theme, lightPreset, label visibility). */
|
|
168
|
+
baseMapConfig?: MapAppBaseMapConfig;
|
|
169
|
+
/** Which Mapbox-owned base style to load; defaults to `standard`. */
|
|
170
|
+
baseStyle?: MapAppBaseStyle;
|
|
112
171
|
}
|
|
113
172
|
export declare const MapAppPayloadSchema: z.ZodObject<{
|
|
114
173
|
summary: z.ZodOptional<z.ZodString>;
|
|
@@ -150,6 +209,11 @@ export declare const MapAppPayloadSchema: z.ZodObject<{
|
|
|
150
209
|
}, z.core.$strip>]>;
|
|
151
210
|
paint: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
152
211
|
layout: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
212
|
+
slot: z.ZodOptional<z.ZodEnum<{
|
|
213
|
+
bottom: "bottom";
|
|
214
|
+
middle: "middle";
|
|
215
|
+
top: "top";
|
|
216
|
+
}>>;
|
|
153
217
|
}, z.core.$strip>>;
|
|
154
218
|
markers: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
155
219
|
coordinates: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
|
|
@@ -185,6 +249,51 @@ export declare const MapAppPayloadSchema: z.ZodObject<{
|
|
|
185
249
|
}>;
|
|
186
250
|
params: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
187
251
|
}, z.core.$strip>>>;
|
|
252
|
+
baseMapConfig: z.ZodOptional<z.ZodObject<{
|
|
253
|
+
theme: z.ZodOptional<z.ZodEnum<{
|
|
254
|
+
default: "default";
|
|
255
|
+
custom: "custom";
|
|
256
|
+
faded: "faded";
|
|
257
|
+
monochrome: "monochrome";
|
|
258
|
+
}>>;
|
|
259
|
+
lightPreset: z.ZodOptional<z.ZodEnum<{
|
|
260
|
+
day: "day";
|
|
261
|
+
dawn: "dawn";
|
|
262
|
+
dusk: "dusk";
|
|
263
|
+
night: "night";
|
|
264
|
+
}>>;
|
|
265
|
+
colorWater: z.ZodOptional<z.ZodString>;
|
|
266
|
+
colorLand: z.ZodOptional<z.ZodString>;
|
|
267
|
+
colorGreenspace: z.ZodOptional<z.ZodString>;
|
|
268
|
+
colorMotorways: z.ZodOptional<z.ZodString>;
|
|
269
|
+
colorTrunks: z.ZodOptional<z.ZodString>;
|
|
270
|
+
colorRoads: z.ZodOptional<z.ZodString>;
|
|
271
|
+
colorBuildings: z.ZodOptional<z.ZodString>;
|
|
272
|
+
colorAdminBoundaries: z.ZodOptional<z.ZodString>;
|
|
273
|
+
colorCommercial: z.ZodOptional<z.ZodString>;
|
|
274
|
+
colorEducation: z.ZodOptional<z.ZodString>;
|
|
275
|
+
colorMedical: z.ZodOptional<z.ZodString>;
|
|
276
|
+
colorIndustrial: z.ZodOptional<z.ZodString>;
|
|
277
|
+
colorPlaceLabels: z.ZodOptional<z.ZodString>;
|
|
278
|
+
colorRoadLabels: z.ZodOptional<z.ZodString>;
|
|
279
|
+
colorPointOfInterestLabels: z.ZodOptional<z.ZodString>;
|
|
280
|
+
showPointOfInterestLabels: z.ZodOptional<z.ZodBoolean>;
|
|
281
|
+
showTransitLabels: z.ZodOptional<z.ZodBoolean>;
|
|
282
|
+
showPlaceLabels: z.ZodOptional<z.ZodBoolean>;
|
|
283
|
+
showRoadLabels: z.ZodOptional<z.ZodBoolean>;
|
|
284
|
+
showAdminBoundaries: z.ZodOptional<z.ZodBoolean>;
|
|
285
|
+
showIndoor: z.ZodOptional<z.ZodBoolean>;
|
|
286
|
+
showIndoorLabels: z.ZodOptional<z.ZodBoolean>;
|
|
287
|
+
showLandmarkIconLabels: z.ZodOptional<z.ZodBoolean>;
|
|
288
|
+
show3dObjects: z.ZodOptional<z.ZodBoolean>;
|
|
289
|
+
show3dTrees: z.ZodOptional<z.ZodBoolean>;
|
|
290
|
+
show3dFacades: z.ZodOptional<z.ZodBoolean>;
|
|
291
|
+
densityPointOfInterestLabels: z.ZodOptional<z.ZodNumber>;
|
|
292
|
+
}, z.core.$loose>>;
|
|
293
|
+
baseStyle: z.ZodOptional<z.ZodEnum<{
|
|
294
|
+
standard: "standard";
|
|
295
|
+
"standard-satellite": "standard-satellite";
|
|
296
|
+
}>>;
|
|
188
297
|
}, z.core.$strip>;
|
|
189
298
|
/**
|
|
190
299
|
* Decode a Mapbox polyline string (precision 5 by default) to a GeoJSON
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapAppPayload.d.ts","sourceRoot":"","sources":["../../../src/utils/mapAppPayload.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,QAAQ,GAChB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAA;CAAE,CAAC;AAElE,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,mBAAmB,CAAC;IAC1B,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,uEAAuE;IACvE,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC5C,IAAI,EAAE,OAAO,GAAG,iBAAiB,CAAC;IAClC,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"mapAppPayload.d.ts","sourceRoot":"","sources":["../../../src/utils/mapAppPayload.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,8 +24,42 @@ const MapAppLayerSchema = z.object({
|
|
|
24
24
|
type: z.enum(['fill', 'line', 'circle', 'symbol']),
|
|
25
25
|
data: z.union([FeatureSchema, FeatureCollectionSchema]),
|
|
26
26
|
paint: z.record(z.string(), z.unknown()).optional(),
|
|
27
|
-
layout: z.record(z.string(), z.unknown()).optional()
|
|
27
|
+
layout: z.record(z.string(), z.unknown()).optional(),
|
|
28
|
+
slot: z.enum(['bottom', 'middle', 'top']).optional()
|
|
28
29
|
});
|
|
30
|
+
const MapAppBaseMapConfigSchema = z
|
|
31
|
+
.object({
|
|
32
|
+
theme: z.enum(['default', 'faded', 'monochrome', 'custom']).optional(),
|
|
33
|
+
lightPreset: z.enum(['day', 'dawn', 'dusk', 'night']).optional(),
|
|
34
|
+
colorWater: z.string().optional(),
|
|
35
|
+
colorLand: z.string().optional(),
|
|
36
|
+
colorGreenspace: z.string().optional(),
|
|
37
|
+
colorMotorways: z.string().optional(),
|
|
38
|
+
colorTrunks: z.string().optional(),
|
|
39
|
+
colorRoads: z.string().optional(),
|
|
40
|
+
colorBuildings: z.string().optional(),
|
|
41
|
+
colorAdminBoundaries: z.string().optional(),
|
|
42
|
+
colorCommercial: z.string().optional(),
|
|
43
|
+
colorEducation: z.string().optional(),
|
|
44
|
+
colorMedical: z.string().optional(),
|
|
45
|
+
colorIndustrial: z.string().optional(),
|
|
46
|
+
colorPlaceLabels: z.string().optional(),
|
|
47
|
+
colorRoadLabels: z.string().optional(),
|
|
48
|
+
colorPointOfInterestLabels: z.string().optional(),
|
|
49
|
+
showPointOfInterestLabels: z.boolean().optional(),
|
|
50
|
+
showTransitLabels: z.boolean().optional(),
|
|
51
|
+
showPlaceLabels: z.boolean().optional(),
|
|
52
|
+
showRoadLabels: z.boolean().optional(),
|
|
53
|
+
showAdminBoundaries: z.boolean().optional(),
|
|
54
|
+
showIndoor: z.boolean().optional(),
|
|
55
|
+
showIndoorLabels: z.boolean().optional(),
|
|
56
|
+
showLandmarkIconLabels: z.boolean().optional(),
|
|
57
|
+
show3dObjects: z.boolean().optional(),
|
|
58
|
+
show3dTrees: z.boolean().optional(),
|
|
59
|
+
show3dFacades: z.boolean().optional(),
|
|
60
|
+
densityPointOfInterestLabels: z.number().optional()
|
|
61
|
+
})
|
|
62
|
+
.passthrough();
|
|
29
63
|
const MapAppMarkerSchema = z.object({
|
|
30
64
|
coordinates: z.tuple([z.number(), z.number()]),
|
|
31
65
|
style: z.enum(['pin', 'numbered', 'start', 'end']).optional(),
|
|
@@ -66,7 +100,9 @@ export const MapAppPayloadSchema = z.object({
|
|
|
66
100
|
markers: z.array(MapAppMarkerSchema).optional(),
|
|
67
101
|
legend: z.array(MapAppLegendEntrySchema).optional(),
|
|
68
102
|
camera: MapAppCameraSchema.optional(),
|
|
69
|
-
selfFetch: z.array(MapAppSelfFetchSchema).optional()
|
|
103
|
+
selfFetch: z.array(MapAppSelfFetchSchema).optional(),
|
|
104
|
+
baseMapConfig: MapAppBaseMapConfigSchema.optional(),
|
|
105
|
+
baseStyle: z.enum(['standard', 'standard-satellite']).optional()
|
|
70
106
|
});
|
|
71
107
|
/**
|
|
72
108
|
* Decode a Mapbox polyline string (precision 5 by default) to a GeoJSON
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapAppPayload.js","sourceRoot":"","sources":["../../../src/utils/mapAppPayload.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kCAAkC;AAElC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"mapAppPayload.js","sourceRoot":"","sources":["../../../src/utils/mapAppPayload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redactToken.d.ts","sourceRoot":"","sources":["../../../src/utils/redactToken.ts"],"names":[],"mappings":"AA0DA,sGAAsG;AACtG,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK7C"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// Copyright (c) Mapbox, Inc.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
/** Token prefixes Mapbox uses: public, secret, and temporary. */
|
|
4
|
+
const TOKEN_PREFIXES = new Set(['pk', 'sk', 'tk']);
|
|
5
|
+
/**
|
|
6
|
+
* Character allowlist for an account name lifted out of a token payload. This
|
|
7
|
+
* bounds what a token payload can put into a span attribute or log line — the
|
|
8
|
+
* value comes from decoding untrusted JWT payload data, so the allowlist is a
|
|
9
|
+
* safety gate against log/span injection and oversized values, not a
|
|
10
|
+
* statement of Mapbox's actual account naming rules. A name outside it is not
|
|
11
|
+
* partially disclosed — it falls back to `***`.
|
|
12
|
+
*/
|
|
13
|
+
const ACCOUNT_NAME_PATTERN = /^[A-Za-z0-9_-]{1,64}$/;
|
|
14
|
+
/**
|
|
15
|
+
* Replace a token value with a placeholder that keeps the parts safe to publish.
|
|
16
|
+
*
|
|
17
|
+
* Mapbox tokens are JWTs (`<prefix>.<payload>.<signature>`) whose payload carries
|
|
18
|
+
* the account name under `u`, so `pk.eyJ1IjoiZXhhbXBsZSJ9.signature` becomes
|
|
19
|
+
* `pk.example.redacted`. Keeping the prefix and account name makes traces and logs
|
|
20
|
+
* readable — you can still tell a secret token from a public one, and whose account
|
|
21
|
+
* a request billed to — while the signature, which is the part that authenticates,
|
|
22
|
+
* never leaves the process.
|
|
23
|
+
*
|
|
24
|
+
* Anything that does not parse cleanly as such a token falls back to `***`, so an
|
|
25
|
+
* unrecognized shape is never partially disclosed on the assumption it was harmless.
|
|
26
|
+
*/
|
|
27
|
+
function maskTokenValue(token) {
|
|
28
|
+
const parts = token.split('.');
|
|
29
|
+
if (parts.length !== 3) {
|
|
30
|
+
return '***';
|
|
31
|
+
}
|
|
32
|
+
const [prefix, payload] = parts;
|
|
33
|
+
if (!TOKEN_PREFIXES.has(prefix)) {
|
|
34
|
+
return '***';
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const decoded = JSON.parse(Buffer.from(payload, 'base64').toString('utf-8'));
|
|
38
|
+
if (typeof decoded.u !== 'string' ||
|
|
39
|
+
!ACCOUNT_NAME_PATTERN.test(decoded.u)) {
|
|
40
|
+
return '***';
|
|
41
|
+
}
|
|
42
|
+
return `${prefix}.${decoded.u}.redacted`;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return '***';
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** Remove access_token query parameter values from strings before logging or returning to callers. */
|
|
49
|
+
export function redactToken(s) {
|
|
50
|
+
return s.replace(/access_token=([^&\s#"']+)/g, (_match, token) => `access_token=${maskTokenValue(token)}`);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=redactToken.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redactToken.js","sourceRoot":"","sources":["../../../src/utils/redactToken.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kCAAkC;AAElC,iEAAiE;AACjE,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAEnD;;;;;;;GAOG;AACH,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAErD;;;;;;;;;;;;GAYG;AACH,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC;IAChC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CACxB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC9B,CAAC;QAErB,IACE,OAAO,OAAO,CAAC,CAAC,KAAK,QAAQ;YAC7B,CAAC,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EACrC,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,GAAG,MAAM,IAAI,OAAO,CAAC,CAAC,WAAW,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,sGAAsG;AACtG,MAAM,UAAU,WAAW,CAAC,CAAS;IACnC,OAAO,CAAC,CAAC,OAAO,CACd,4BAA4B,EAC5B,CAAC,MAAM,EAAE,KAAa,EAAE,EAAE,CAAC,gBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,CACnE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ReadableSpan, SpanExporter } from '@opentelemetry/sdk-trace-base';
|
|
2
|
+
import type { ExportResult } from '@opentelemetry/core';
|
|
3
|
+
/**
|
|
4
|
+
* Wraps a SpanExporter and strips access token signatures from span attributes
|
|
5
|
+
* before they leave the process, leaving behind the prefix and account name
|
|
6
|
+
* (`access_token=pk.some-account.redacted`).
|
|
7
|
+
*
|
|
8
|
+
* Auto-instrumentation of `fetch`/`undici` records the full request URL on client
|
|
9
|
+
* spans (`url.full`, `url.query`), and Mapbox APIs take the access token as a
|
|
10
|
+
* query parameter. Without this wrapper, an operator who configures an OTLP
|
|
11
|
+
* endpoint gets those tokens copied verbatim into their telemetry backend.
|
|
12
|
+
*
|
|
13
|
+
* Redaction happens at the exporter rather than in an instrumentation
|
|
14
|
+
* `requestHook` so it covers every attribute on every span, including attribute
|
|
15
|
+
* names introduced by future semantic-convention or instrumentation changes.
|
|
16
|
+
*/
|
|
17
|
+
export declare class RedactingSpanExporter implements SpanExporter {
|
|
18
|
+
private readonly delegate;
|
|
19
|
+
constructor(delegate: SpanExporter);
|
|
20
|
+
export(spans: ReadableSpan[], resultCallback: (result: ExportResult) => void): void;
|
|
21
|
+
shutdown(): Promise<void>;
|
|
22
|
+
forceFlush(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=redactingSpanExporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redactingSpanExporter.d.ts","sourceRoot":"","sources":["../../../src/utils/redactingSpanExporter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAmFxD;;;;;;;;;;;;;GAaG;AACH,qBAAa,qBAAsB,YAAW,YAAY;IAC5C,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAEnD,MAAM,CACJ,KAAK,EAAE,YAAY,EAAE,EACrB,cAAc,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,GAC7C,IAAI;IAIP,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAG5B"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// Copyright (c) Mapbox, Inc.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
import { redactToken } from './redactToken.js';
|
|
4
|
+
/**
|
|
5
|
+
* Rewrites every string attribute value through `redactToken`, returning the
|
|
6
|
+
* original object when nothing changed so unaffected spans pass through as-is.
|
|
7
|
+
*/
|
|
8
|
+
function redactAttributes(attributes) {
|
|
9
|
+
let redacted;
|
|
10
|
+
for (const [key, value] of Object.entries(attributes)) {
|
|
11
|
+
if (typeof value !== 'string') {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
const clean = redactToken(value);
|
|
15
|
+
if (clean !== value) {
|
|
16
|
+
redacted ??= { ...attributes };
|
|
17
|
+
redacted[key] = clean;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return redacted ?? attributes;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Collect every property name reachable on a span, including accessors defined
|
|
24
|
+
* on its prototype chain. Copying by key list rather than a hardcoded field list
|
|
25
|
+
* keeps this working across OpenTelemetry SDK versions, which have moved fields
|
|
26
|
+
* (e.g. `parentSpanId` to `parentSpanContext`) between releases.
|
|
27
|
+
*/
|
|
28
|
+
function collectKeys(span) {
|
|
29
|
+
const keys = new Set();
|
|
30
|
+
for (let current = span; current && current !== Object.prototype; current = Object.getPrototypeOf(current)) {
|
|
31
|
+
for (const key of Object.getOwnPropertyNames(current)) {
|
|
32
|
+
if (key !== 'constructor') {
|
|
33
|
+
keys.add(key);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return keys;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Return a copy of `span` with redacted attributes, or the span itself when no
|
|
41
|
+
* attribute needed redaction. The copy is a plain object rather than a mutation
|
|
42
|
+
* of the original, so the SDK's own span state is left untouched.
|
|
43
|
+
*/
|
|
44
|
+
function redactSpan(span) {
|
|
45
|
+
const attributes = redactAttributes(span.attributes);
|
|
46
|
+
const events = span.events.map((event) => event.attributes
|
|
47
|
+
? { ...event, attributes: redactAttributes(event.attributes) }
|
|
48
|
+
: event);
|
|
49
|
+
const attributesChanged = attributes !== span.attributes;
|
|
50
|
+
const eventsChanged = events.some((event, index) => event !== span.events[index]);
|
|
51
|
+
if (!attributesChanged && !eventsChanged) {
|
|
52
|
+
return span;
|
|
53
|
+
}
|
|
54
|
+
const copy = {};
|
|
55
|
+
for (const key of collectKeys(span)) {
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- generic property copy across unknown SDK span shapes
|
|
57
|
+
const value = span[key];
|
|
58
|
+
copy[key] = typeof value === 'function' ? value.bind(span) : value;
|
|
59
|
+
}
|
|
60
|
+
copy.attributes = attributes;
|
|
61
|
+
copy.events = events;
|
|
62
|
+
return copy;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Wraps a SpanExporter and strips access token signatures from span attributes
|
|
66
|
+
* before they leave the process, leaving behind the prefix and account name
|
|
67
|
+
* (`access_token=pk.some-account.redacted`).
|
|
68
|
+
*
|
|
69
|
+
* Auto-instrumentation of `fetch`/`undici` records the full request URL on client
|
|
70
|
+
* spans (`url.full`, `url.query`), and Mapbox APIs take the access token as a
|
|
71
|
+
* query parameter. Without this wrapper, an operator who configures an OTLP
|
|
72
|
+
* endpoint gets those tokens copied verbatim into their telemetry backend.
|
|
73
|
+
*
|
|
74
|
+
* Redaction happens at the exporter rather than in an instrumentation
|
|
75
|
+
* `requestHook` so it covers every attribute on every span, including attribute
|
|
76
|
+
* names introduced by future semantic-convention or instrumentation changes.
|
|
77
|
+
*/
|
|
78
|
+
export class RedactingSpanExporter {
|
|
79
|
+
delegate;
|
|
80
|
+
constructor(delegate) {
|
|
81
|
+
this.delegate = delegate;
|
|
82
|
+
}
|
|
83
|
+
export(spans, resultCallback) {
|
|
84
|
+
this.delegate.export(spans.map(redactSpan), resultCallback);
|
|
85
|
+
}
|
|
86
|
+
shutdown() {
|
|
87
|
+
return this.delegate.shutdown();
|
|
88
|
+
}
|
|
89
|
+
forceFlush() {
|
|
90
|
+
return this.delegate.forceFlush?.() ?? Promise.resolve();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=redactingSpanExporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redactingSpanExporter.js","sourceRoot":"","sources":["../../../src/utils/redactingSpanExporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selfFetchRef.d.ts","sourceRoot":"","sources":["../../../src/utils/selfFetchRef.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAIzE,MAAM,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;AAYpD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAKR;
|
|
1
|
+
{"version":3,"file":"selfFetchRef.d.ts","sourceRoot":"","sources":["../../../src/utils/selfFetchRef.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAIzE,MAAM,MAAM,aAAa,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;AAYpD;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CAKR;AA4CD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CA4BrE"}
|
|
@@ -25,6 +25,35 @@ export function buildSelfFetchRef(tool, params) {
|
|
|
25
25
|
const data = Buffer.from(JSON.stringify(params), 'utf8').toString('base64url');
|
|
26
26
|
return `${SELF_FETCH_URI_PREFIX}${tool}?data=${data}`;
|
|
27
27
|
}
|
|
28
|
+
function isNonEmptyNumberArray(value) {
|
|
29
|
+
return (Array.isArray(value) &&
|
|
30
|
+
value.length > 0 &&
|
|
31
|
+
value.every((v) => typeof v === 'number' && Number.isFinite(v)));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Reject refs whose params can't produce a valid API request in the iframe.
|
|
35
|
+
* A ref minted by the tool itself always passes, but the ref format is easy
|
|
36
|
+
* for an LLM to hand-write, and a malformed one would otherwise resolve
|
|
37
|
+
* here, report success to the LLM, and only fail later inside the iframe
|
|
38
|
+
* (e.g. `contours_minutes: 15` instead of `[15]` is silently dropped from
|
|
39
|
+
* the Isochrone request, which then 422s with "You must supply one of
|
|
40
|
+
* contours_meters or contours_minutes"). Failing here routes the ref into
|
|
41
|
+
* render_map_tool's unresolved-refs path, which tells the LLM to re-run
|
|
42
|
+
* the source tool.
|
|
43
|
+
*/
|
|
44
|
+
function hasValidSelfFetchParams(tool, params) {
|
|
45
|
+
if (tool === 'isochrone') {
|
|
46
|
+
const coords = params.coordinates;
|
|
47
|
+
if (!coords ||
|
|
48
|
+
typeof coords.longitude !== 'number' ||
|
|
49
|
+
typeof coords.latitude !== 'number') {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
return (isNonEmptyNumberArray(params.contours_minutes) ||
|
|
53
|
+
isNonEmptyNumberArray(params.contours_meters));
|
|
54
|
+
}
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
28
57
|
export function isSelfFetchRef(uri) {
|
|
29
58
|
return uri.startsWith(SELF_FETCH_URI_PREFIX);
|
|
30
59
|
}
|
|
@@ -62,6 +91,8 @@ export function resolveSelfFetchRef(uri) {
|
|
|
62
91
|
}
|
|
63
92
|
if (!params || typeof params !== 'object')
|
|
64
93
|
return null;
|
|
94
|
+
if (!hasValidSelfFetchParams(tool, params))
|
|
95
|
+
return null;
|
|
65
96
|
return {
|
|
66
97
|
layers: [],
|
|
67
98
|
selfFetch: [{ tool: tool, params }]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selfFetchRef.js","sourceRoot":"","sources":["../../../src/utils/selfFetchRef.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kCAAkC;AAIlC,MAAM,qBAAqB,GAAG,qBAAqB,CAAC;AAIpD,MAAM,gBAAgB,GAA6B;IACjD,YAAY;IACZ,WAAW;IACX,cAAc;IACd,QAAQ;IACR,iBAAiB;IACjB,cAAc;IACd,iBAAiB;CAClB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAmB,EACnB,MAA+B;IAE/B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,QAAQ,CAC/D,WAAW,CACZ,CAAC;IACF,OAAO,GAAG,qBAAqB,GAAG,IAAI,SAAS,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,GAAG,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,IAAI,IAAY,CAAC;IACjB,IAAI,OAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1C,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAqB,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnE,IAAI,MAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"selfFetchRef.js","sourceRoot":"","sources":["../../../src/utils/selfFetchRef.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-level `instructions` returned from `initialize`.
|
|
3
|
+
*
|
|
4
|
+
* Hosts that load tools lazily (Claude Desktop, Claude Code) list only tool
|
|
5
|
+
* names until the model loads a tool, so tool descriptions can't steer
|
|
6
|
+
* which tool gets picked — e.g. a model asked to "show a map" loaded
|
|
7
|
+
* static_map_image_tool because of its name and never saw
|
|
8
|
+
* render_map_tool's "ALWAYS use this tool to display maps". Server
|
|
9
|
+
* instructions are shown up front, so the routing rule lives here.
|
|
10
|
+
*/
|
|
11
|
+
export declare function buildServerInstructions(enabledToolNames: readonly string[]): string | undefined;
|
|
12
|
+
//# sourceMappingURL=serverInstructions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverInstructions.d.ts","sourceRoot":"","sources":["../../../src/utils/serverInstructions.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,gBAAgB,EAAE,SAAS,MAAM,EAAE,GAClC,MAAM,GAAG,SAAS,CAYpB"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
// Copyright (c) Mapbox, Inc.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
/**
|
|
4
|
+
* Server-level `instructions` returned from `initialize`.
|
|
5
|
+
*
|
|
6
|
+
* Hosts that load tools lazily (Claude Desktop, Claude Code) list only tool
|
|
7
|
+
* names until the model loads a tool, so tool descriptions can't steer
|
|
8
|
+
* which tool gets picked — e.g. a model asked to "show a map" loaded
|
|
9
|
+
* static_map_image_tool because of its name and never saw
|
|
10
|
+
* render_map_tool's "ALWAYS use this tool to display maps". Server
|
|
11
|
+
* instructions are shown up front, so the routing rule lives here.
|
|
12
|
+
*/
|
|
13
|
+
export function buildServerInstructions(enabledToolNames) {
|
|
14
|
+
if (!enabledToolNames.includes('render_map_tool'))
|
|
15
|
+
return undefined;
|
|
16
|
+
const lines = [
|
|
17
|
+
'To show anything on a map, use render_map_tool: it renders an interactive Mapbox GL JS map inline.',
|
|
18
|
+
'When a tool result includes mapboxRender.ref, pass that ref unchanged in render_map_tool payload_refs (several refs can share one map). Never write or edit a ref by hand.'
|
|
19
|
+
];
|
|
20
|
+
if (enabledToolNames.includes('static_map_image_tool')) {
|
|
21
|
+
lines.push('Use static_map_image_tool only when the user explicitly asks for a static image file (PNG/JPEG), never as the default way to show a map.');
|
|
22
|
+
}
|
|
23
|
+
return lines.join('\n');
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=serverInstructions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serverInstructions.js","sourceRoot":"","sources":["../../../src/utils/serverInstructions.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,kCAAkC;AAElC;;;;;;;;;GASG;AACH,MAAM,UAAU,uBAAuB,CACrC,gBAAmC;IAEnC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,iBAAiB,CAAC;QAAE,OAAO,SAAS,CAAC;IACpE,MAAM,KAAK,GAAG;QACZ,oGAAoG;QACpG,4KAA4K;KAC7K,CAAC;IACF,IAAI,gBAAgB,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;QACvD,KAAK,CAAC,IAAI,CACR,0IAA0I,CAC3I,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|