@kepler.gl/mcp 0.0.0-stage → 3.3.0-alpha.19
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/dist/cjs/commands/add-column-command.js +192 -0
- package/dist/cjs/commands/basemap-command.js +80 -0
- package/dist/cjs/commands/boundary-command.js +81 -0
- package/dist/cjs/commands/command-wrappers.js +122 -0
- package/dist/cjs/commands/dataset-context-command.js +87 -0
- package/dist/cjs/commands/index.js +230 -0
- package/dist/cjs/commands/layer-creation-command.js +534 -0
- package/dist/cjs/commands/layer-style-command.js +136 -0
- package/dist/cjs/commands/load-data-command.js +270 -0
- package/dist/cjs/commands/save-data-command.js +118 -0
- package/dist/cjs/commands/split-view-command.js +261 -0
- package/dist/cjs/commands/table-command.js +199 -0
- package/dist/cjs/commands/time-filter-command.js +289 -0
- package/dist/cjs/commands/toggle-time-filter-command.js +155 -0
- package/dist/cjs/commands/types.js +6 -0
- package/dist/cjs/commands/utils.js +536 -0
- package/dist/cjs/commands/view-mode-command.js +94 -0
- package/dist/cjs/index.js +39 -0
- package/dist/cjs/map-contract.js +6 -0
- package/dist/cjs/server/bridge-server.js +435 -0
- package/dist/cjs/server/index.js +31 -0
- package/dist/cjs/server/stdio.js +201 -0
- package/dist/cjs/types.js +30 -0
- package/dist/commands/add-column-command.d.ts +4 -0
- package/dist/commands/basemap-command.d.ts +4 -0
- package/dist/commands/boundary-command.d.ts +4 -0
- package/dist/commands/command-wrappers.d.ts +52 -0
- package/dist/commands/dataset-context-command.d.ts +4 -0
- package/dist/commands/index.d.ts +31 -0
- package/dist/commands/layer-creation-command.d.ts +8 -0
- package/dist/commands/layer-style-command.d.ts +4 -0
- package/dist/commands/load-data-command.d.ts +4 -0
- package/dist/commands/save-data-command.d.ts +4 -0
- package/dist/commands/split-view-command.d.ts +4 -0
- package/dist/commands/table-command.d.ts +4 -0
- package/dist/commands/time-filter-command.d.ts +13 -0
- package/dist/commands/toggle-time-filter-command.d.ts +4 -0
- package/dist/commands/types.d.ts +132 -0
- package/dist/commands/utils.d.ts +138 -0
- package/dist/commands/view-mode-command.d.ts +4 -0
- package/dist/esm/commands/add-column-command.js +185 -0
- package/dist/esm/commands/basemap-command.js +72 -0
- package/dist/esm/commands/boundary-command.js +73 -0
- package/dist/esm/commands/command-wrappers.js +114 -0
- package/dist/esm/commands/dataset-context-command.js +79 -0
- package/dist/esm/commands/index.js +51 -0
- package/dist/esm/commands/layer-creation-command.js +527 -0
- package/dist/esm/commands/layer-style-command.js +130 -0
- package/dist/esm/commands/load-data-command.js +264 -0
- package/dist/esm/commands/save-data-command.js +112 -0
- package/dist/esm/commands/split-view-command.js +255 -0
- package/dist/esm/commands/table-command.js +194 -0
- package/dist/esm/commands/time-filter-command.js +280 -0
- package/dist/esm/commands/toggle-time-filter-command.js +147 -0
- package/dist/esm/commands/types.js +3 -0
- package/dist/esm/commands/utils.js +521 -0
- package/dist/esm/commands/view-mode-command.js +86 -0
- package/dist/esm/index.js +20 -0
- package/dist/esm/map-contract.js +3 -0
- package/dist/esm/server/bridge-server.js +428 -0
- package/dist/esm/server/index.js +13 -0
- package/dist/esm/server/stdio.js +198 -0
- package/dist/esm/types.js +24 -0
- package/dist/index.d.ts +15 -0
- package/dist/map-contract.d.ts +31 -0
- package/dist/server/bridge-server.d.ts +53 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/stdio.d.ts +2 -0
- package/dist/types.d.ts +24 -0
- package/package.json +84 -4
- package/skill/kepler/SKILL.md +438 -0
- package/skill/kepler/skill.yaml +4 -0
- package/README.md +0 -3
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
2
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
3
|
+
// SPDX-License-Identifier: MIT
|
|
4
|
+
// Copyright contributors to the kepler.gl project
|
|
5
|
+
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { MapViewMode } from '@kepler.gl/constants';
|
|
8
|
+
import { setMapViewMode } from '@kepler.gl/actions';
|
|
9
|
+
export var viewModeCommandId = 'map.set-view-mode';
|
|
10
|
+
|
|
11
|
+
/** Agent-facing names for the three camera modes. */
|
|
12
|
+
var VIEW_MODE_BY_INPUT = {
|
|
13
|
+
'2d': MapViewMode.MODE_2D,
|
|
14
|
+
'3d': MapViewMode.MODE_3D,
|
|
15
|
+
globe: MapViewMode.MODE_GLOBE
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Accept the short names (`2d`, `3d`, `globe`) as well as the enum values
|
|
20
|
+
* (`MODE_2D`, …) — the bridge and WebMCP callers reach execute without zod
|
|
21
|
+
* parsing, so the runtime guard must understand both.
|
|
22
|
+
*/
|
|
23
|
+
function resolveViewMode(input) {
|
|
24
|
+
if (typeof input !== 'string') return null;
|
|
25
|
+
var _short = input.toLowerCase();
|
|
26
|
+
if (VIEW_MODE_BY_INPUT[_short]) return VIEW_MODE_BY_INPUT[_short];
|
|
27
|
+
return Object.values(MapViewMode).includes(input) ? input : null;
|
|
28
|
+
}
|
|
29
|
+
export function getViewModeCommand(ctx) {
|
|
30
|
+
return {
|
|
31
|
+
id: viewModeCommandId,
|
|
32
|
+
name: 'Set map view mode',
|
|
33
|
+
group: 'Map',
|
|
34
|
+
description: "Switch the map between the flat 2D map, the tilted 3D map and the 3D globe.\n- '2d': flat map, no tilt.\n- '3d': flat map tilted (pitch 50), for extruded/3D layers.\n- 'globe': the 3D globe \u2014 use it when the data spans the world and the user is looking at global patterns.\nGlobe support: point, arc, line, trip, cluster, hexagon, grid, geojson and vector-tile layers render on the globe. The 'flow' and 'flowField' layers are NOT supported there yet (flow arrows collapse edge-on; flow field clipping is mercator-only), so keep those on the 2d/3d map.",
|
|
35
|
+
metadata: {
|
|
36
|
+
readOnly: false,
|
|
37
|
+
riskLevel: 'low',
|
|
38
|
+
idempotent: true
|
|
39
|
+
},
|
|
40
|
+
inputSchema: z.object({
|
|
41
|
+
mode: z["enum"](['2d', '3d', 'globe'])
|
|
42
|
+
}),
|
|
43
|
+
execute: function () {
|
|
44
|
+
var _execute = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(_execCtx, input) {
|
|
45
|
+
var _ref, mode, viewMode, label;
|
|
46
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
47
|
+
while (1) switch (_context.prev = _context.next) {
|
|
48
|
+
case 0:
|
|
49
|
+
_ref = input !== null && input !== void 0 ? input : {}, mode = _ref.mode;
|
|
50
|
+
viewMode = resolveViewMode(mode);
|
|
51
|
+
if (viewMode) {
|
|
52
|
+
_context.next = 4;
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
return _context.abrupt("return", {
|
|
56
|
+
success: false,
|
|
57
|
+
commandId: viewModeCommandId,
|
|
58
|
+
error: "Invalid view mode: ".concat(String(mode), ". Use \"2d\", \"3d\" or \"globe\"."),
|
|
59
|
+
data: {
|
|
60
|
+
instruction: 'Call map.set-view-mode with mode "2d", "3d" or "globe".'
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
case 4:
|
|
64
|
+
ctx.dispatch(setMapViewMode(viewMode));
|
|
65
|
+
label = viewMode === MapViewMode.MODE_GLOBE ? '3D globe' : viewMode === MapViewMode.MODE_3D ? '3D tilted map' : '2D flat map';
|
|
66
|
+
return _context.abrupt("return", {
|
|
67
|
+
success: true,
|
|
68
|
+
commandId: viewModeCommandId,
|
|
69
|
+
data: {
|
|
70
|
+
details: "Map view switched to ".concat(label, ".")
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
case 7:
|
|
74
|
+
case "end":
|
|
75
|
+
return _context.stop();
|
|
76
|
+
}
|
|
77
|
+
}, _callee);
|
|
78
|
+
}));
|
|
79
|
+
function execute(_x, _x2) {
|
|
80
|
+
return _execute.apply(this, arguments);
|
|
81
|
+
}
|
|
82
|
+
return execute;
|
|
83
|
+
}()
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ6IiwiTWFwVmlld01vZGUiLCJzZXRNYXBWaWV3TW9kZSIsInZpZXdNb2RlQ29tbWFuZElkIiwiVklFV19NT0RFX0JZX0lOUFVUIiwiTU9ERV8yRCIsIk1PREVfM0QiLCJnbG9iZSIsIk1PREVfR0xPQkUiLCJyZXNvbHZlVmlld01vZGUiLCJpbnB1dCIsInNob3J0IiwidG9Mb3dlckNhc2UiLCJPYmplY3QiLCJ2YWx1ZXMiLCJpbmNsdWRlcyIsImdldFZpZXdNb2RlQ29tbWFuZCIsImN0eCIsImlkIiwibmFtZSIsImdyb3VwIiwiZGVzY3JpcHRpb24iLCJtZXRhZGF0YSIsInJlYWRPbmx5Iiwicmlza0xldmVsIiwiaWRlbXBvdGVudCIsImlucHV0U2NoZW1hIiwib2JqZWN0IiwibW9kZSIsImV4ZWN1dGUiLCJfZXhlY3V0ZSIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwiX2V4ZWNDdHgiLCJfcmVmIiwidmlld01vZGUiLCJsYWJlbCIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJhYnJ1cHQiLCJzdWNjZXNzIiwiY29tbWFuZElkIiwiZXJyb3IiLCJjb25jYXQiLCJTdHJpbmciLCJkYXRhIiwiaW5zdHJ1Y3Rpb24iLCJkaXNwYXRjaCIsImRldGFpbHMiLCJzdG9wIiwiX3giLCJfeDIiLCJhcHBseSIsImFyZ3VtZW50cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy92aWV3LW1vZGUtY29tbWFuZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgdHlwZSB7Um9vbUNvbW1hbmR9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuaW1wb3J0IHtNYXBWaWV3TW9kZX0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtzZXRNYXBWaWV3TW9kZX0gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcbmltcG9ydCB0eXBlIHtLZXBsZXJDb250ZXh0fSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IHZpZXdNb2RlQ29tbWFuZElkID0gJ21hcC5zZXQtdmlldy1tb2RlJyBhcyBjb25zdDtcblxuLyoqIEFnZW50LWZhY2luZyBuYW1lcyBmb3IgdGhlIHRocmVlIGNhbWVyYSBtb2Rlcy4gKi9cbmNvbnN0IFZJRVdfTU9ERV9CWV9JTlBVVDogUmVjb3JkPHN0cmluZywgTWFwVmlld01vZGU+ID0ge1xuICAnMmQnOiBNYXBWaWV3TW9kZS5NT0RFXzJELFxuICAnM2QnOiBNYXBWaWV3TW9kZS5NT0RFXzNELFxuICBnbG9iZTogTWFwVmlld01vZGUuTU9ERV9HTE9CRVxufTtcblxuLyoqXG4gKiBBY2NlcHQgdGhlIHNob3J0IG5hbWVzIChgMmRgLCBgM2RgLCBgZ2xvYmVgKSBhcyB3ZWxsIGFzIHRoZSBlbnVtIHZhbHVlc1xuICogKGBNT0RFXzJEYCwg4oCmKSDigJQgdGhlIGJyaWRnZSBhbmQgV2ViTUNQIGNhbGxlcnMgcmVhY2ggZXhlY3V0ZSB3aXRob3V0IHpvZFxuICogcGFyc2luZywgc28gdGhlIHJ1bnRpbWUgZ3VhcmQgbXVzdCB1bmRlcnN0YW5kIGJvdGguXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVWaWV3TW9kZShpbnB1dDogdW5rbm93bik6IE1hcFZpZXdNb2RlIHwgbnVsbCB7XG4gIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSByZXR1cm4gbnVsbDtcbiAgY29uc3Qgc2hvcnQgPSBpbnB1dC50b0xvd2VyQ2FzZSgpO1xuICBpZiAoVklFV19NT0RFX0JZX0lOUFVUW3Nob3J0XSkgcmV0dXJuIFZJRVdfTU9ERV9CWV9JTlBVVFtzaG9ydF07XG4gIHJldHVybiAoT2JqZWN0LnZhbHVlcyhNYXBWaWV3TW9kZSkgYXMgc3RyaW5nW10pLmluY2x1ZGVzKGlucHV0KSA/IChpbnB1dCBhcyBNYXBWaWV3TW9kZSkgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld01vZGVDb21tYW5kKGN0eDogS2VwbGVyQ29udGV4dCk6IFJvb21Db21tYW5kIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogdmlld01vZGVDb21tYW5kSWQsXG4gICAgbmFtZTogJ1NldCBtYXAgdmlldyBtb2RlJyxcbiAgICBncm91cDogJ01hcCcsXG4gICAgZGVzY3JpcHRpb246IGBTd2l0Y2ggdGhlIG1hcCBiZXR3ZWVuIHRoZSBmbGF0IDJEIG1hcCwgdGhlIHRpbHRlZCAzRCBtYXAgYW5kIHRoZSAzRCBnbG9iZS5cbi0gJzJkJzogZmxhdCBtYXAsIG5vIHRpbHQuXG4tICczZCc6IGZsYXQgbWFwIHRpbHRlZCAocGl0Y2ggNTApLCBmb3IgZXh0cnVkZWQvM0QgbGF5ZXJzLlxuLSAnZ2xvYmUnOiB0aGUgM0QgZ2xvYmUg4oCUIHVzZSBpdCB3aGVuIHRoZSBkYXRhIHNwYW5zIHRoZSB3b3JsZCBhbmQgdGhlIHVzZXIgaXMgbG9va2luZyBhdCBnbG9iYWwgcGF0dGVybnMuXG5HbG9iZSBzdXBwb3J0OiBwb2ludCwgYXJjLCBsaW5lLCB0cmlwLCBjbHVzdGVyLCBoZXhhZ29uLCBncmlkLCBnZW9qc29uIGFuZCB2ZWN0b3ItdGlsZSBsYXllcnMgcmVuZGVyIG9uIHRoZSBnbG9iZS4gVGhlICdmbG93JyBhbmQgJ2Zsb3dGaWVsZCcgbGF5ZXJzIGFyZSBOT1Qgc3VwcG9ydGVkIHRoZXJlIHlldCAoZmxvdyBhcnJvd3MgY29sbGFwc2UgZWRnZS1vbjsgZmxvdyBmaWVsZCBjbGlwcGluZyBpcyBtZXJjYXRvci1vbmx5KSwgc28ga2VlcCB0aG9zZSBvbiB0aGUgMmQvM2QgbWFwLmAsXG4gICAgbWV0YWRhdGE6IHtyZWFkT25seTogZmFsc2UsIHJpc2tMZXZlbDogJ2xvdycsIGlkZW1wb3RlbnQ6IHRydWV9LFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBtb2RlOiB6LmVudW0oWycyZCcsICczZCcsICdnbG9iZSddKVxuICAgIH0pIGFzIGFueSxcbiAgICBleGVjdXRlOiBhc3luYyAoX2V4ZWNDdHgsIGlucHV0KSA9PiB7XG4gICAgICBjb25zdCB7bW9kZX0gPSAoaW5wdXQgPz8ge30pIGFzIHttb2RlOiB1bmtub3dufTtcbiAgICAgIGNvbnN0IHZpZXdNb2RlID0gcmVzb2x2ZVZpZXdNb2RlKG1vZGUpO1xuICAgICAgaWYgKCF2aWV3TW9kZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgIGNvbW1hbmRJZDogdmlld01vZGVDb21tYW5kSWQsXG4gICAgICAgICAgZXJyb3I6IGBJbnZhbGlkIHZpZXcgbW9kZTogJHtTdHJpbmcobW9kZSl9LiBVc2UgXCIyZFwiLCBcIjNkXCIgb3IgXCJnbG9iZVwiLmAsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaW5zdHJ1Y3Rpb246ICdDYWxsIG1hcC5zZXQtdmlldy1tb2RlIHdpdGggbW9kZSBcIjJkXCIsIFwiM2RcIiBvciBcImdsb2JlXCIuJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY3R4LmRpc3BhdGNoKHNldE1hcFZpZXdNb2RlKHZpZXdNb2RlKSk7XG4gICAgICBjb25zdCBsYWJlbCA9XG4gICAgICAgIHZpZXdNb2RlID09PSBNYXBWaWV3TW9kZS5NT0RFX0dMT0JFXG4gICAgICAgICAgPyAnM0QgZ2xvYmUnXG4gICAgICAgICAgOiB2aWV3TW9kZSA9PT0gTWFwVmlld01vZGUuTU9ERV8zRFxuICAgICAgICAgID8gJzNEIHRpbHRlZCBtYXAnXG4gICAgICAgICAgOiAnMkQgZmxhdCBtYXAnO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgY29tbWFuZElkOiB2aWV3TW9kZUNvbW1hbmRJZCxcbiAgICAgICAgZGF0YToge2RldGFpbHM6IGBNYXAgdmlldyBzd2l0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
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// Copyright contributors to the kepler.gl project
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @kepler.gl/mcp — the kepler.gl map surface.
|
|
6
|
+
*
|
|
7
|
+
* Only the map contract + the map.* commands live here, plus dependency-light
|
|
8
|
+
* helper utilities (e.g. `commands/utils.ts`) that hosts are meant to reuse.
|
|
9
|
+
* No analysis and no app-specific wiring glue — those belong to
|
|
10
|
+
* kepler-assistant, which imports this package for the commands and implements
|
|
11
|
+
* the `KeplerContext` glue seam.
|
|
12
|
+
*
|
|
13
|
+
* This root entry stays browser-safe. The stdio MCP server (which needs `ws`
|
|
14
|
+
* and Node APIs) lives in the `./server` subpath and is never imported here.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
export * from './map-contract';
|
|
18
|
+
export * from './types';
|
|
19
|
+
export * from './commands';
|
|
20
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8qKlxuICogQGtlcGxlci5nbC9tY3Ag4oCUIHRoZSBrZXBsZXIuZ2wgbWFwIHN1cmZhY2UuXG4gKlxuICogT25seSB0aGUgbWFwIGNvbnRyYWN0ICsgdGhlIG1hcC4qIGNvbW1hbmRzIGxpdmUgaGVyZSwgcGx1cyBkZXBlbmRlbmN5LWxpZ2h0XG4gKiBoZWxwZXIgdXRpbGl0aWVzIChlLmcuIGBjb21tYW5kcy91dGlscy50c2ApIHRoYXQgaG9zdHMgYXJlIG1lYW50IHRvIHJldXNlLlxuICogTm8gYW5hbHlzaXMgYW5kIG5vIGFwcC1zcGVjaWZpYyB3aXJpbmcgZ2x1ZSDigJQgdGhvc2UgYmVsb25nIHRvXG4gKiBrZXBsZXItYXNzaXN0YW50LCB3aGljaCBpbXBvcnRzIHRoaXMgcGFja2FnZSBmb3IgdGhlIGNvbW1hbmRzIGFuZCBpbXBsZW1lbnRzXG4gKiB0aGUgYEtlcGxlckNvbnRleHRgIGdsdWUgc2VhbS5cbiAqXG4gKiBUaGlzIHJvb3QgZW50cnkgc3RheXMgYnJvd3Nlci1zYWZlLiBUaGUgc3RkaW8gTUNQIHNlcnZlciAod2hpY2ggbmVlZHMgYHdzYFxuICogYW5kIE5vZGUgQVBJcykgbGl2ZXMgaW4gdGhlIGAuL3NlcnZlcmAgc3VicGF0aCBhbmQgaXMgbmV2ZXIgaW1wb3J0ZWQgaGVyZS5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL21hcC1jb250cmFjdCc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vY29tbWFuZHMnO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxjQUFjLGdCQUFnQjtBQUM5QixjQUFjLFNBQVM7QUFDdkIsY0FBYyxZQUFZIiwiaWdub3JlTGlzdCI6W119
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
export {};
|
|
3
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21hcC1jb250cmFjdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vKipcbiAqIFRoZSBrZXBsZXIuZ2wgbWFwIHRvb2wgY29udHJhY3Qg4oCUIHRoZSBcIm1hcCBzdXJmYWNlXCIuXG4gKlxuICoga2VwbGVyLmdsJ3MgY29udHJhY3QgaXMgXCJhY2NlcHQgZGF0YSwgYWN0dWF0ZSB0aGUgbWFwLCBpbnRyb3NwZWN0LCByZW5kZXIuXCJcbiAqIFRoZSBzdXJmYWNlIGlzIG1hcC1mb2N1c2VkOiBubyBzcGF0aWFsIGFuYWx5c2lzIGFuZCBubyBjaGFydHMg4oCUIHRob3NlIGJlbG9uZ1xuICogdG8gdGhlIGFuYWx5c2lzIHNlcnZpY2UgKGtlcGxlci1hc3Npc3RhbnQpLiBBIGZldyB0YWJsZSBvcHMgKG1hcC5jcmVhdGUtdGFibGUsXG4gKiBtYXAuYWRkLWNvbHVtbiwgbWFwLnNhdmUtZGF0YSkgYXJlIER1Y2tEQi1iYWNrZWQgYW5kIG11dGF0ZSB0aGUgbWFwJ3MgZGF0YXNldHNcbiAqIGluIHBsYWNlOyB0aGV5IGFyZSBwYXJ0IG9mIHRoZSBzdXJmYWNlIGJlY2F1c2UgdGhleSBjaGFuZ2Ugd2hhdCB0aGUgbWFwIHNob3dzLlxuICpcbiAqIFRoaXMgbW9kdWxlIGlzIGludGVudGlvbmFsbHkgZGVwZW5kZW5jeS1saWdodC4gSXQgZGVmaW5lcyB0aGUgbWFwLiogdG9vbCBpZHNcbiAqIGFuZCBhIGBNYXBDb250cmFjdGAgaW50ZXJmYWNlIHNvIGFueSBob3N0ICh0aGUgZGVtby1hcHAgYnJvd3NlciBwYWdlLCB0aGVcbiAqIGtlcGxlci1hc3Npc3RhbnQgbGlicmFyeSwgb3IgYSBmdXR1cmUgTUNQIHNlcnZlcikgY2FuIGltcGxlbWVudCBvciBjb25zdW1lXG4gKiB0aGUgc2FtZSBjb250cmFjdC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7TWFwVG9vbElkLCBUb29sUmVzdWx0fSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgbWFwIHRvb2wgc3VyZmFjZS4gTW9zdGx5IHB1cmUgbWFwIGFjdHVhdGlvbiAoc2V0LWJhc2VtYXAsIGFkZC1sYXllciwgLi4uKTtcbiAqIGEgZmV3IHRhYmxlIG9wcyAobWFwLmNyZWF0ZS10YWJsZSwgbWFwLmFkZC1jb2x1bW4sIG1hcC5zYXZlLWRhdGEpIGFyZSBpbmNsdWRlZFxuICogYmVjYXVzZSB0aGV5IG11dGF0ZSB0aGUgbWFwJ3MgZGF0YXNldHMgaW4gcGxhY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFwQ29udHJhY3Qge1xuICByZWFkb25seSB0b29sSWRzOiByZWFkb25seSBNYXBUb29sSWRbXTtcbiAgLyoqIExpc3QgdGhlIHRvb2xzIHRoaXMgc3VyZmFjZSBleHBvc2VzIChpZCArIGlucHV0IEpTT04gU2NoZW1hLCBpZiBrbm93bikuICovXG4gIGxpc3RUb29scygpOiBBcnJheTx7aWQ6IE1hcFRvb2xJZDsgaW5wdXRTY2hlbWE/OiB1bmtub3duOyBkZXNjcmlwdGlvbj86IHN0cmluZ30+O1xuICAvKiogRXhlY3V0ZSBhIG1hcCB0b29sLiBSZXR1cm5zIGEgdHJpbW1lZCwgbW9kZWwtZmFjaW5nIHJlc3VsdC4gKi9cbiAgY2FsbFRvb2woaWQ6IE1hcFRvb2xJZCwgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxUb29sUmVzdWx0Pjtcbn1cbiJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==
|
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray";
|
|
2
|
+
import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
|
|
3
|
+
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
|
|
4
|
+
import _createClass from "@babel/runtime/helpers/esm/createClass";
|
|
5
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
6
|
+
import _typeof from "@babel/runtime/helpers/esm/typeof";
|
|
7
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
8
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
9
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
10
|
+
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
11
|
+
// SPDX-License-Identifier: MIT
|
|
12
|
+
// Copyright contributors to the kepler.gl project
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The bridge between an MCP client and a kepler.gl page.
|
|
16
|
+
*
|
|
17
|
+
* Browsers cannot listen on a port, so the page is a WebSocket CLIENT that
|
|
18
|
+
* connects OUT to `ws://127.0.0.1:<port>/ws?token=...` (the reverse-connect
|
|
19
|
+
* pattern). This server holds that socket, advertises the `map.*` tools to the
|
|
20
|
+
* MCP client, and forwards each call to the page, where the command registry
|
|
21
|
+
* executes against the live map.
|
|
22
|
+
*
|
|
23
|
+
* The tool list comes from the package itself (`getKeplerCommands`), so tools
|
|
24
|
+
* exist before a page connects; a call without a page returns a clear error.
|
|
25
|
+
* Once a page says `hello` its own catalog replaces the static one, because a
|
|
26
|
+
* page may not serve every command (the demo app omits the DuckDB-backed ones).
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import { randomUUID } from 'node:crypto';
|
|
30
|
+
import { createServer } from 'node:http';
|
|
31
|
+
import { WebSocket, WebSocketServer } from 'ws';
|
|
32
|
+
import { z } from 'zod';
|
|
33
|
+
import { getKeplerCommands } from '../commands';
|
|
34
|
+
var DEFAULT_PORT = 8765;
|
|
35
|
+
var DEFAULT_HOST = '127.0.0.1';
|
|
36
|
+
var DEFAULT_CALL_TIMEOUT_MS = 60000;
|
|
37
|
+
/** MCP tool names are commonly restricted to [A-Za-z0-9_-]; `map.add-layer` → `map_add_layer`. */
|
|
38
|
+
export function toToolName(commandId) {
|
|
39
|
+
return commandId.replace(/\./g, '_');
|
|
40
|
+
}
|
|
41
|
+
function toInputSchema(command) {
|
|
42
|
+
if (command.inputSchema) {
|
|
43
|
+
try {
|
|
44
|
+
var schema = z.toJSONSchema(command.inputSchema);
|
|
45
|
+
if (schema) return schema;
|
|
46
|
+
} catch (_unused) {
|
|
47
|
+
// Not every command ships a zod schema; fall back to a free-form object.
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
type: 'object'
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** The map surface as declared by this package, independent of any page. */
|
|
56
|
+
export function getMapTools() {
|
|
57
|
+
var commands = getKeplerCommands({});
|
|
58
|
+
return Object.values(commands).map(function (command) {
|
|
59
|
+
return {
|
|
60
|
+
name: toToolName(command.id),
|
|
61
|
+
commandId: command.id,
|
|
62
|
+
description: command.description || command.name,
|
|
63
|
+
inputSchema: toInputSchema(command)
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
function toolsFromDescriptors(descriptors) {
|
|
68
|
+
return descriptors.filter(function (descriptor) {
|
|
69
|
+
return descriptor && descriptor.id;
|
|
70
|
+
}).map(function (descriptor) {
|
|
71
|
+
return {
|
|
72
|
+
name: toToolName(descriptor.id),
|
|
73
|
+
commandId: descriptor.id,
|
|
74
|
+
description: descriptor.description || descriptor.name || descriptor.id,
|
|
75
|
+
inputSchema: descriptor.inputSchema || {
|
|
76
|
+
type: 'object'
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** RoomCommandResult → the text an MCP client shows for a tool call. */
|
|
83
|
+
export function formatResult(result) {
|
|
84
|
+
var _ref, _result$data;
|
|
85
|
+
if (result && _typeof(result) === 'object' && result.success === false) {
|
|
86
|
+
var _result$error;
|
|
87
|
+
return {
|
|
88
|
+
text: "\u2717 ".concat(result.commandId, ": ").concat((_result$error = result.error) !== null && _result$error !== void 0 ? _result$error : 'failed'),
|
|
89
|
+
isError: true
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
if (result && _typeof(result) === 'object' && result.error) {
|
|
93
|
+
return {
|
|
94
|
+
text: "\u2717 ".concat(result.commandId, ": ").concat(result.error),
|
|
95
|
+
isError: true
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
var data = result === null || result === void 0 ? void 0 : result.data;
|
|
99
|
+
if (data && typeof data.details === 'string') return {
|
|
100
|
+
text: data.details,
|
|
101
|
+
isError: false
|
|
102
|
+
};
|
|
103
|
+
return {
|
|
104
|
+
text: JSON.stringify((_ref = (_result$data = result === null || result === void 0 ? void 0 : result.data) !== null && _result$data !== void 0 ? _result$data : result) !== null && _ref !== void 0 ? _ref : null, null, 2),
|
|
105
|
+
isError: false
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
export var KeplerMcpBridge = /*#__PURE__*/function () {
|
|
109
|
+
function KeplerMcpBridge() {
|
|
110
|
+
var _options$port, _options$host, _options$mapUrl, _options$callTimeoutM;
|
|
111
|
+
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
112
|
+
_classCallCheck(this, KeplerMcpBridge);
|
|
113
|
+
_defineProperty(this, "options", void 0);
|
|
114
|
+
_defineProperty(this, "staticTools", void 0);
|
|
115
|
+
_defineProperty(this, "pageTools", null);
|
|
116
|
+
_defineProperty(this, "socket", null);
|
|
117
|
+
_defineProperty(this, "wss", null);
|
|
118
|
+
_defineProperty(this, "httpServer", null);
|
|
119
|
+
_defineProperty(this, "pending", new Map());
|
|
120
|
+
_defineProperty(this, "token", '');
|
|
121
|
+
_defineProperty(this, "pageUrl", '');
|
|
122
|
+
this.options = {
|
|
123
|
+
port: (_options$port = options.port) !== null && _options$port !== void 0 ? _options$port : DEFAULT_PORT,
|
|
124
|
+
host: (_options$host = options.host) !== null && _options$host !== void 0 ? _options$host : DEFAULT_HOST,
|
|
125
|
+
mapUrl: (_options$mapUrl = options.mapUrl) !== null && _options$mapUrl !== void 0 ? _options$mapUrl : 'http://localhost:8080',
|
|
126
|
+
callTimeoutMs: (_options$callTimeoutM = options.callTimeoutMs) !== null && _options$callTimeoutM !== void 0 ? _options$callTimeoutM : DEFAULT_CALL_TIMEOUT_MS
|
|
127
|
+
};
|
|
128
|
+
this.staticTools = getMapTools();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** Tools the MCP client can call right now. */
|
|
132
|
+
return _createClass(KeplerMcpBridge, [{
|
|
133
|
+
key: "getTools",
|
|
134
|
+
value: function getTools() {
|
|
135
|
+
var _this$pageTools;
|
|
136
|
+
return (_this$pageTools = this.pageTools) !== null && _this$pageTools !== void 0 ? _this$pageTools : this.staticTools;
|
|
137
|
+
}
|
|
138
|
+
}, {
|
|
139
|
+
key: "connected",
|
|
140
|
+
get: function get() {
|
|
141
|
+
var _this$socket;
|
|
142
|
+
return ((_this$socket = this.socket) === null || _this$socket === void 0 ? void 0 : _this$socket.readyState) === WebSocket.OPEN;
|
|
143
|
+
}
|
|
144
|
+
}, {
|
|
145
|
+
key: "start",
|
|
146
|
+
value: function () {
|
|
147
|
+
var _start = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
|
|
148
|
+
var _this = this;
|
|
149
|
+
var httpServer, wss, address, port, mapUrl;
|
|
150
|
+
return _regeneratorRuntime.wrap(function _callee$(_context) {
|
|
151
|
+
while (1) switch (_context.prev = _context.next) {
|
|
152
|
+
case 0:
|
|
153
|
+
if (!this.wss) {
|
|
154
|
+
_context.next = 2;
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
throw new Error('The kepler.gl bridge is already running.');
|
|
158
|
+
case 2:
|
|
159
|
+
this.token = randomUUID().replace(/-/g, '');
|
|
160
|
+
|
|
161
|
+
// A plain HTTP GET on `/` redirects to the map page carrying the token, so
|
|
162
|
+
// the user can open `http://127.0.0.1:<port>/` even when the MCP client
|
|
163
|
+
// never shows the server's stderr. Only `/ws` upgrades to a WebSocket.
|
|
164
|
+
httpServer = createServer(function (request, response) {
|
|
165
|
+
var _request$url;
|
|
166
|
+
if (request.url === '/' || (_request$url = request.url) !== null && _request$url !== void 0 && _request$url.startsWith('/?')) {
|
|
167
|
+
response.writeHead(302, {
|
|
168
|
+
Location: _this.pageUrl
|
|
169
|
+
});
|
|
170
|
+
response.end();
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
response.writeHead(404, {
|
|
174
|
+
'content-type': 'text/plain'
|
|
175
|
+
});
|
|
176
|
+
response.end('kepler-mcp: the map page connects at /ws');
|
|
177
|
+
});
|
|
178
|
+
this.httpServer = httpServer;
|
|
179
|
+
wss = new WebSocketServer({
|
|
180
|
+
server: httpServer,
|
|
181
|
+
path: '/ws'
|
|
182
|
+
});
|
|
183
|
+
this.wss = wss;
|
|
184
|
+
wss.on('connection', function (socket, request) {
|
|
185
|
+
return _this.handleConnection(socket, request.url);
|
|
186
|
+
});
|
|
187
|
+
_context.next = 10;
|
|
188
|
+
return new Promise(function (resolve, reject) {
|
|
189
|
+
httpServer.once('error', reject);
|
|
190
|
+
httpServer.listen(_this.options.port, _this.options.host, function () {
|
|
191
|
+
return resolve();
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
case 10:
|
|
195
|
+
address = httpServer.address();
|
|
196
|
+
port = _typeof(address) === 'object' && address ? address.port : this.options.port;
|
|
197
|
+
mapUrl = this.options.mapUrl.replace(/\/$/, '');
|
|
198
|
+
this.pageUrl = "".concat(mapUrl).concat(mapUrl.includes('?') ? '&' : '?', "mcp=").concat(encodeURIComponent(this.token));
|
|
199
|
+
return _context.abrupt("return", {
|
|
200
|
+
host: this.options.host,
|
|
201
|
+
port: port,
|
|
202
|
+
token: this.token,
|
|
203
|
+
pageUrl: this.pageUrl
|
|
204
|
+
});
|
|
205
|
+
case 15:
|
|
206
|
+
case "end":
|
|
207
|
+
return _context.stop();
|
|
208
|
+
}
|
|
209
|
+
}, _callee, this);
|
|
210
|
+
}));
|
|
211
|
+
function start() {
|
|
212
|
+
return _start.apply(this, arguments);
|
|
213
|
+
}
|
|
214
|
+
return start;
|
|
215
|
+
}()
|
|
216
|
+
}, {
|
|
217
|
+
key: "callTool",
|
|
218
|
+
value: function () {
|
|
219
|
+
var _callTool = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(name) {
|
|
220
|
+
var _this$getTools$find,
|
|
221
|
+
_this2 = this;
|
|
222
|
+
var input,
|
|
223
|
+
tool,
|
|
224
|
+
socket,
|
|
225
|
+
callId,
|
|
226
|
+
reply,
|
|
227
|
+
_args2 = arguments;
|
|
228
|
+
return _regeneratorRuntime.wrap(function _callee2$(_context2) {
|
|
229
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
230
|
+
case 0:
|
|
231
|
+
input = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : {};
|
|
232
|
+
tool = (_this$getTools$find = this.getTools().find(function (candidate) {
|
|
233
|
+
return candidate.name === name;
|
|
234
|
+
})) !== null && _this$getTools$find !== void 0 ? _this$getTools$find : this.staticTools.find(function (candidate) {
|
|
235
|
+
return candidate.name === name;
|
|
236
|
+
});
|
|
237
|
+
if (tool) {
|
|
238
|
+
_context2.next = 4;
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
throw new Error("Unknown map tool \"".concat(name, "\". Available: ").concat(this.getTools().map(function (candidate) {
|
|
242
|
+
return candidate.name;
|
|
243
|
+
}).join(', '), "."));
|
|
244
|
+
case 4:
|
|
245
|
+
socket = this.socket;
|
|
246
|
+
if (!(!socket || socket.readyState !== WebSocket.OPEN)) {
|
|
247
|
+
_context2.next = 7;
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
throw new Error('No kepler.gl map page is connected. Open the page URL printed at startup ' + '(it carries ?mcp=<token>), then call the tool again.');
|
|
251
|
+
case 7:
|
|
252
|
+
callId = randomUUID();
|
|
253
|
+
reply = new Promise(function (resolve, reject) {
|
|
254
|
+
var timer = setTimeout(function () {
|
|
255
|
+
_this2.pending["delete"](callId);
|
|
256
|
+
reject(new Error("Timed out after ".concat(_this2.options.callTimeoutMs, " ms waiting for the map page.")));
|
|
257
|
+
}, _this2.options.callTimeoutMs);
|
|
258
|
+
_this2.pending.set(callId, {
|
|
259
|
+
resolve: resolve,
|
|
260
|
+
reject: reject,
|
|
261
|
+
timer: timer
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
socket.send(JSON.stringify({
|
|
265
|
+
type: 'call',
|
|
266
|
+
callId: callId,
|
|
267
|
+
tool: tool.commandId,
|
|
268
|
+
input: input
|
|
269
|
+
}));
|
|
270
|
+
return _context2.abrupt("return", reply);
|
|
271
|
+
case 11:
|
|
272
|
+
case "end":
|
|
273
|
+
return _context2.stop();
|
|
274
|
+
}
|
|
275
|
+
}, _callee2, this);
|
|
276
|
+
}));
|
|
277
|
+
function callTool(_x) {
|
|
278
|
+
return _callTool.apply(this, arguments);
|
|
279
|
+
}
|
|
280
|
+
return callTool;
|
|
281
|
+
}()
|
|
282
|
+
}, {
|
|
283
|
+
key: "close",
|
|
284
|
+
value: function () {
|
|
285
|
+
var _close = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
|
|
286
|
+
var _this$socket2;
|
|
287
|
+
var wss, httpServer, _iterator, _step, client;
|
|
288
|
+
return _regeneratorRuntime.wrap(function _callee3$(_context3) {
|
|
289
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
290
|
+
case 0:
|
|
291
|
+
this.rejectPending('The bridge was closed.');
|
|
292
|
+
this.pageTools = null;
|
|
293
|
+
(_this$socket2 = this.socket) === null || _this$socket2 === void 0 || _this$socket2.close(1000, 'bridge closed');
|
|
294
|
+
this.socket = null;
|
|
295
|
+
wss = this.wss;
|
|
296
|
+
httpServer = this.httpServer;
|
|
297
|
+
this.wss = null;
|
|
298
|
+
this.httpServer = null;
|
|
299
|
+
if (wss) {
|
|
300
|
+
_context3.next = 10;
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
return _context3.abrupt("return");
|
|
304
|
+
case 10:
|
|
305
|
+
// close() only stops listening and waits for clients; terminate them so
|
|
306
|
+
// shutdown (and tests) do not hang on a page that never closes its socket.
|
|
307
|
+
_iterator = _createForOfIteratorHelper(wss.clients);
|
|
308
|
+
try {
|
|
309
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
310
|
+
client = _step.value;
|
|
311
|
+
client.terminate();
|
|
312
|
+
}
|
|
313
|
+
} catch (err) {
|
|
314
|
+
_iterator.e(err);
|
|
315
|
+
} finally {
|
|
316
|
+
_iterator.f();
|
|
317
|
+
}
|
|
318
|
+
_context3.next = 14;
|
|
319
|
+
return new Promise(function (resolve) {
|
|
320
|
+
return wss.close(function () {
|
|
321
|
+
return resolve();
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
case 14:
|
|
325
|
+
if (!httpServer) {
|
|
326
|
+
_context3.next = 17;
|
|
327
|
+
break;
|
|
328
|
+
}
|
|
329
|
+
_context3.next = 17;
|
|
330
|
+
return new Promise(function (resolve) {
|
|
331
|
+
return httpServer.close(function () {
|
|
332
|
+
return resolve();
|
|
333
|
+
});
|
|
334
|
+
});
|
|
335
|
+
case 17:
|
|
336
|
+
case "end":
|
|
337
|
+
return _context3.stop();
|
|
338
|
+
}
|
|
339
|
+
}, _callee3, this);
|
|
340
|
+
}));
|
|
341
|
+
function close() {
|
|
342
|
+
return _close.apply(this, arguments);
|
|
343
|
+
}
|
|
344
|
+
return close;
|
|
345
|
+
}()
|
|
346
|
+
}, {
|
|
347
|
+
key: "handleConnection",
|
|
348
|
+
value: function handleConnection(socket, requestUrl) {
|
|
349
|
+
var _this$socket3,
|
|
350
|
+
_this3 = this;
|
|
351
|
+
var token = null;
|
|
352
|
+
try {
|
|
353
|
+
token = new URL(requestUrl !== null && requestUrl !== void 0 ? requestUrl : '/ws', 'http://127.0.0.1').searchParams.get('token');
|
|
354
|
+
} catch (_unused2) {
|
|
355
|
+
token = null;
|
|
356
|
+
}
|
|
357
|
+
// The token is the only thing keeping other local pages/processes from
|
|
358
|
+
// driving the map; reject a mismatch before accepting any message.
|
|
359
|
+
if (token !== this.token) {
|
|
360
|
+
socket.close(1008, 'invalid token');
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// One map page at a time: a second tab takes over so calls never race
|
|
365
|
+
// between two live maps.
|
|
366
|
+
(_this$socket3 = this.socket) === null || _this$socket3 === void 0 || _this$socket3.close(1000, 'replaced by a newer connection');
|
|
367
|
+
this.socket = socket;
|
|
368
|
+
this.pageTools = null;
|
|
369
|
+
socket.on('message', function (data) {
|
|
370
|
+
return _this3.handleMessage(data);
|
|
371
|
+
});
|
|
372
|
+
socket.on('close', function () {
|
|
373
|
+
if (_this3.socket === socket) {
|
|
374
|
+
_this3.socket = null;
|
|
375
|
+
_this3.pageTools = null;
|
|
376
|
+
_this3.rejectPending('The kepler.gl page disconnected.');
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
// Errors are followed by close; the close handler resets state.
|
|
380
|
+
socket.on('error', function () {
|
|
381
|
+
return undefined;
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
}, {
|
|
385
|
+
key: "handleMessage",
|
|
386
|
+
value: function handleMessage(raw) {
|
|
387
|
+
var _message, _message2;
|
|
388
|
+
var message;
|
|
389
|
+
try {
|
|
390
|
+
message = JSON.parse(String(raw));
|
|
391
|
+
} catch (_unused3) {
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
if (((_message = message) === null || _message === void 0 ? void 0 : _message.type) === 'hello' && Array.isArray(message.commands)) {
|
|
395
|
+
this.pageTools = toolsFromDescriptors(message.commands);
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
if (((_message2 = message) === null || _message2 === void 0 ? void 0 : _message2.type) === 'result' && typeof message.callId === 'string') {
|
|
399
|
+
var pendingCall = this.pending.get(message.callId);
|
|
400
|
+
if (!pendingCall) return;
|
|
401
|
+
clearTimeout(pendingCall.timer);
|
|
402
|
+
this.pending["delete"](message.callId);
|
|
403
|
+
pendingCall.resolve(message.result);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}, {
|
|
407
|
+
key: "rejectPending",
|
|
408
|
+
value: function rejectPending(reason) {
|
|
409
|
+
var _iterator2 = _createForOfIteratorHelper(this.pending),
|
|
410
|
+
_step2;
|
|
411
|
+
try {
|
|
412
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
413
|
+
var _step2$value = _slicedToArray(_step2.value, 2),
|
|
414
|
+
callId = _step2$value[0],
|
|
415
|
+
pendingCall = _step2$value[1];
|
|
416
|
+
clearTimeout(pendingCall.timer);
|
|
417
|
+
this.pending["delete"](callId);
|
|
418
|
+
pendingCall.reject(new Error(reason));
|
|
419
|
+
}
|
|
420
|
+
} catch (err) {
|
|
421
|
+
_iterator2.e(err);
|
|
422
|
+
} finally {
|
|
423
|
+
_iterator2.f();
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}]);
|
|
427
|
+
}();
|
|
428
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyYW5kb21VVUlEIiwiY3JlYXRlU2VydmVyIiwiV2ViU29ja2V0IiwiV2ViU29ja2V0U2VydmVyIiwieiIsImdldEtlcGxlckNvbW1hbmRzIiwiREVGQVVMVF9QT1JUIiwiREVGQVVMVF9IT1NUIiwiREVGQVVMVF9DQUxMX1RJTUVPVVRfTVMiLCJ0b1Rvb2xOYW1lIiwiY29tbWFuZElkIiwicmVwbGFjZSIsInRvSW5wdXRTY2hlbWEiLCJjb21tYW5kIiwiaW5wdXRTY2hlbWEiLCJzY2hlbWEiLCJ0b0pTT05TY2hlbWEiLCJfdW51c2VkIiwidHlwZSIsImdldE1hcFRvb2xzIiwiY29tbWFuZHMiLCJPYmplY3QiLCJ2YWx1ZXMiLCJtYXAiLCJuYW1lIiwiaWQiLCJkZXNjcmlwdGlvbiIsInRvb2xzRnJvbURlc2NyaXB0b3JzIiwiZGVzY3JpcHRvcnMiLCJmaWx0ZXIiLCJkZXNjcmlwdG9yIiwiZm9ybWF0UmVzdWx0IiwicmVzdWx0IiwiX3JlZiIsIl9yZXN1bHQkZGF0YSIsIl90eXBlb2YiLCJzdWNjZXNzIiwiX3Jlc3VsdCRlcnJvciIsInRleHQiLCJjb25jYXQiLCJlcnJvciIsImlzRXJyb3IiLCJkYXRhIiwiZGV0YWlscyIsIkpTT04iLCJzdHJpbmdpZnkiLCJLZXBsZXJNY3BCcmlkZ2UiLCJfb3B0aW9ucyRwb3J0IiwiX29wdGlvbnMkaG9zdCIsIl9vcHRpb25zJG1hcFVybCIsIl9vcHRpb25zJGNhbGxUaW1lb3V0TSIsIm9wdGlvbnMiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJfY2xhc3NDYWxsQ2hlY2siLCJfZGVmaW5lUHJvcGVydHkiLCJNYXAiLCJwb3J0IiwiaG9zdCIsIm1hcFVybCIsImNhbGxUaW1lb3V0TXMiLCJzdGF0aWNUb29scyIsIl9jcmVhdGVDbGFzcyIsImtleSIsInZhbHVlIiwiZ2V0VG9vbHMiLCJfdGhpcyRwYWdlVG9vbHMiLCJwYWdlVG9vbHMiLCJnZXQiLCJfdGhpcyRzb2NrZXQiLCJzb2NrZXQiLCJyZWFkeVN0YXRlIiwiT1BFTiIsIl9zdGFydCIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwiX3RoaXMiLCJodHRwU2VydmVyIiwid3NzIiwiYWRkcmVzcyIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIm5leHQiLCJFcnJvciIsInRva2VuIiwicmVxdWVzdCIsInJlc3BvbnNlIiwiX3JlcXVlc3QkdXJsIiwidXJsIiwic3RhcnRzV2l0aCIsIndyaXRlSGVhZCIsIkxvY2F0aW9uIiwicGFnZVVybCIsImVuZCIsInNlcnZlciIsInBhdGgiLCJvbiIsImhhbmRsZUNvbm5lY3Rpb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uY2UiLCJsaXN0ZW4iLCJpbmNsdWRlcyIsImVuY29kZVVSSUNvbXBvbmVudCIsImFicnVwdCIsInN0b3AiLCJzdGFydCIsImFwcGx5IiwiX2NhbGxUb29sIiwiX2NhbGxlZTIiLCJfdGhpcyRnZXRUb29scyRmaW5kIiwiX3RoaXMyIiwiaW5wdXQiLCJ0b29sIiwiY2FsbElkIiwicmVwbHkiLCJfYXJnczIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJmaW5kIiwiY2FuZGlkYXRlIiwiam9pbiIsInRpbWVyIiwic2V0VGltZW91dCIsInBlbmRpbmciLCJzZXQiLCJzZW5kIiwiY2FsbFRvb2wiLCJfeCIsIl9jbG9zZSIsIl9jYWxsZWUzIiwiX3RoaXMkc29ja2V0MiIsIl9pdGVyYXRvciIsIl9zdGVwIiwiY2xpZW50IiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwicmVqZWN0UGVuZGluZyIsImNsb3NlIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJjbGllbnRzIiwicyIsIm4iLCJkb25lIiwidGVybWluYXRlIiwiZXJyIiwiZSIsImYiLCJyZXF1ZXN0VXJsIiwiX3RoaXMkc29ja2V0MyIsIl90aGlzMyIsIlVSTCIsInNlYXJjaFBhcmFtcyIsIl91bnVzZWQyIiwiaGFuZGxlTWVzc2FnZSIsInJhdyIsIl9tZXNzYWdlIiwiX21lc3NhZ2UyIiwibWVzc2FnZSIsInBhcnNlIiwiU3RyaW5nIiwiX3VudXNlZDMiLCJBcnJheSIsImlzQXJyYXkiLCJwZW5kaW5nQ2FsbCIsImNsZWFyVGltZW91dCIsInJlYXNvbiIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJfc3RlcDIkdmFsdWUiLCJfc2xpY2VkVG9BcnJheSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zZXJ2ZXIvYnJpZGdlLXNlcnZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vKipcbiAqIFRoZSBicmlkZ2UgYmV0d2VlbiBhbiBNQ1AgY2xpZW50IGFuZCBhIGtlcGxlci5nbCBwYWdlLlxuICpcbiAqIEJyb3dzZXJzIGNhbm5vdCBsaXN0ZW4gb24gYSBwb3J0LCBzbyB0aGUgcGFnZSBpcyBhIFdlYlNvY2tldCBDTElFTlQgdGhhdFxuICogY29ubmVjdHMgT1VUIHRvIGB3czovLzEyNy4wLjAuMTo8cG9ydD4vd3M/dG9rZW49Li4uYCAodGhlIHJldmVyc2UtY29ubmVjdFxuICogcGF0dGVybikuIFRoaXMgc2VydmVyIGhvbGRzIHRoYXQgc29ja2V0LCBhZHZlcnRpc2VzIHRoZSBgbWFwLipgIHRvb2xzIHRvIHRoZVxuICogTUNQIGNsaWVudCwgYW5kIGZvcndhcmRzIGVhY2ggY2FsbCB0byB0aGUgcGFnZSwgd2hlcmUgdGhlIGNvbW1hbmQgcmVnaXN0cnlcbiAqIGV4ZWN1dGVzIGFnYWluc3QgdGhlIGxpdmUgbWFwLlxuICpcbiAqIFRoZSB0b29sIGxpc3QgY29tZXMgZnJvbSB0aGUgcGFja2FnZSBpdHNlbGYgKGBnZXRLZXBsZXJDb21tYW5kc2ApLCBzbyB0b29sc1xuICogZXhpc3QgYmVmb3JlIGEgcGFnZSBjb25uZWN0czsgYSBjYWxsIHdpdGhvdXQgYSBwYWdlIHJldHVybnMgYSBjbGVhciBlcnJvci5cbiAqIE9uY2UgYSBwYWdlIHNheXMgYGhlbGxvYCBpdHMgb3duIGNhdGFsb2cgcmVwbGFjZXMgdGhlIHN0YXRpYyBvbmUsIGJlY2F1c2UgYVxuICogcGFnZSBtYXkgbm90IHNlcnZlIGV2ZXJ5IGNvbW1hbmQgKHRoZSBkZW1vIGFwcCBvbWl0cyB0aGUgRHVja0RCLWJhY2tlZCBvbmVzKS5cbiAqL1xuXG5pbXBvcnQge3JhbmRvbVVVSUR9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7Y3JlYXRlU2VydmVyfSBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHR5cGUge1NlcnZlciBhcyBIdHRwU2VydmVyfSBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHtXZWJTb2NrZXQsIFdlYlNvY2tldFNlcnZlcn0gZnJvbSAnd3MnO1xuaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuaW1wb3J0IHtnZXRLZXBsZXJDb21tYW5kc30gZnJvbSAnLi4vY29tbWFuZHMnO1xuaW1wb3J0IHR5cGUge0tlcGxlckNvbnRleHQsIFJvb21Db21tYW5kUmVzdWx0LCBUb29sRGVzY3JpcHRvcn0gZnJvbSAnLi4vY29tbWFuZHMvdHlwZXMnO1xuXG5jb25zdCBERUZBVUxUX1BPUlQgPSA4NzY1O1xuY29uc3QgREVGQVVMVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBERUZBVUxUX0NBTExfVElNRU9VVF9NUyA9IDYwXzAwMDtcblxuZXhwb3J0IHR5cGUgTWFwVG9vbCA9IHtcbiAgLyoqIE1DUCB0b29sIG5hbWUsIGUuZy4gYG1hcF9hZGRfbGF5ZXJgIChkb3RzIGFyZSBub3QgYWxsb3dlZCBpbiB0b29sIG5hbWVzKS4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogVGhlIGBtYXAuKmAgY29tbWFuZCBpZCB0aGUgY2FsbCBpcyBmb3J3YXJkZWQgdG8uICovXG4gIGNvbW1hbmRJZDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICBpbnB1dFNjaGVtYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59O1xuXG5leHBvcnQgdHlwZSBLZXBsZXJNY3BCcmlkZ2VPcHRpb25zID0ge1xuICBwb3J0PzogbnVtYmVyO1xuICBob3N0Pzogc3RyaW5nO1xuICAvKiogQmFzZSBVUkwgb2YgdGhlIG1hcCBwYWdlLCBwcmludGVkIHdpdGggdGhlIHRva2VuLiAqL1xuICBtYXBVcmw/OiBzdHJpbmc7XG4gIGNhbGxUaW1lb3V0TXM/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBLZXBsZXJNY3BCcmlkZ2VTdGFydCA9IHtcbiAgaG9zdDogc3RyaW5nO1xuICBwb3J0OiBudW1iZXI7XG4gIHRva2VuOiBzdHJpbmc7XG4gIC8qKiBXaGF0IGEgaHVtYW4gc2hvdWxkIG9wZW46IGA8bWFwVXJsPj9tY3A9PHRva2VuPmAuICovXG4gIHBhZ2VVcmw6IHN0cmluZztcbn07XG5cbnR5cGUgUGVuZGluZ0NhbGwgPSB7XG4gIHJlc29sdmU6IChyZXN1bHQ6IFJvb21Db21tYW5kUmVzdWx0KSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG4gIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pjtcbn07XG5cbi8qKiBNQ1AgdG9vbCBuYW1lcyBhcmUgY29tbW9ubHkgcmVzdHJpY3RlZCB0byBbQS1aYS16MC05Xy1dOyBgbWFwLmFkZC1sYXllcmAg4oaSIGBtYXBfYWRkX2xheWVyYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1Rvb2xOYW1lKGNvbW1hbmRJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbW1hbmRJZC5yZXBsYWNlKC9cXC4vZywgJ18nKTtcbn1cblxuZnVuY3Rpb24gdG9JbnB1dFNjaGVtYShjb21tYW5kOiB7aW5wdXRTY2hlbWE/OiB1bmtub3dufSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKGNvbW1hbmQuaW5wdXRTY2hlbWEpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2NoZW1hID0gei50b0pTT05TY2hlbWEoY29tbWFuZC5pbnB1dFNjaGVtYSBhcyB6LlpvZFR5cGUpO1xuICAgICAgaWYgKHNjaGVtYSkgcmV0dXJuIHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIE5vdCBldmVyeSBjb21tYW5kIHNoaXBzIGEgem9kIHNjaGVtYTsgZmFsbCBiYWNrIHRvIGEgZnJlZS1mb3JtIG9iamVjdC5cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHt0eXBlOiAnb2JqZWN0J307XG59XG5cbi8qKiBUaGUgbWFwIHN1cmZhY2UgYXMgZGVjbGFyZWQgYnkgdGhpcyBwYWNrYWdlLCBpbmRlcGVuZGVudCBvZiBhbnkgcGFnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNYXBUb29scygpOiBNYXBUb29sW10ge1xuICBjb25zdCBjb21tYW5kcyA9IGdldEtlcGxlckNvbW1hbmRzKHt9IGFzIEtlcGxlckNvbnRleHQpO1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhjb21tYW5kcykubWFwKGNvbW1hbmQgPT4gKHtcbiAgICBuYW1lOiB0b1Rvb2xOYW1lKGNvbW1hbmQuaWQpLFxuICAgIGNvbW1hbmRJZDogY29tbWFuZC5pZCxcbiAgICBkZXNjcmlwdGlvbjogY29tbWFuZC5kZXNjcmlwdGlvbiB8fCBjb21tYW5kLm5hbWUsXG4gICAgaW5wdXRTY2hlbWE6IHRvSW5wdXRTY2hlbWEoY29tbWFuZClcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiB0b29sc0Zyb21EZXNjcmlwdG9ycyhkZXNjcmlwdG9yczogVG9vbERlc2NyaXB0b3JbXSk6IE1hcFRvb2xbXSB7XG4gIHJldHVybiBkZXNjcmlwdG9yc1xuICAgIC5maWx0ZXIoZGVzY3JpcHRvciA9PiBkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuaWQpXG4gICAgLm1hcChkZXNjcmlwdG9yID0+ICh7XG4gICAgICBuYW1lOiB0b1Rvb2xOYW1lKGRlc2NyaXB0b3IuaWQpLFxuICAgICAgY29tbWFuZElkOiBkZXNjcmlwdG9yLmlkLFxuICAgICAgZGVzY3JpcHRpb246IGRlc2NyaXB0b3IuZGVzY3JpcHRpb24gfHwgZGVzY3JpcHRvci5uYW1lIHx8IGRlc2NyaXB0b3IuaWQsXG4gICAgICBpbnB1dFNjaGVtYTogKGRlc2NyaXB0b3IuaW5wdXRTY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHx8IHt0eXBlOiAnb2JqZWN0J31cbiAgICB9KSk7XG59XG5cbi8qKiBSb29tQ29tbWFuZFJlc3VsdCDihpIgdGhlIHRleHQgYW4gTUNQIGNsaWVudCBzaG93cyBmb3IgYSB0b29sIGNhbGwuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UmVzdWx0KHJlc3VsdDogUm9vbUNvbW1hbmRSZXN1bHQpOiB7dGV4dDogc3RyaW5nOyBpc0Vycm9yOiBib29sZWFufSB7XG4gIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0LnN1Y2Nlc3MgPT09IGZhbHNlKSB7XG4gICAgcmV0dXJuIHt0ZXh0OiBg4pyXICR7cmVzdWx0LmNvbW1hbmRJZH06ICR7cmVzdWx0LmVycm9yID8/ICdmYWlsZWQnfWAsIGlzRXJyb3I6IHRydWV9O1xuICB9XG4gIGlmIChyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0LmVycm9yKSB7XG4gICAgcmV0dXJuIHt0ZXh0OiBg4pyXICR7cmVzdWx0LmNvbW1hbmRJZH06ICR7cmVzdWx0LmVycm9yfWAsIGlzRXJyb3I6IHRydWV9O1xuICB9XG4gIGNvbnN0IGRhdGEgPSByZXN1bHQ/LmRhdGEgYXMge2RldGFpbHM/OiBzdHJpbmd9IHwgdW5kZWZpbmVkO1xuICBpZiAoZGF0YSAmJiB0eXBlb2YgZGF0YS5kZXRhaWxzID09PSAnc3RyaW5nJykgcmV0dXJuIHt0ZXh0OiBkYXRhLmRldGFpbHMsIGlzRXJyb3I6IGZhbHNlfTtcbiAgcmV0dXJuIHt0ZXh0OiBKU09OLnN0cmluZ2lmeShyZXN1bHQ/LmRhdGEgPz8gcmVzdWx0ID8/IG51bGwsIG51bGwsIDIpLCBpc0Vycm9yOiBmYWxzZX07XG59XG5cbmV4cG9ydCBjbGFzcyBLZXBsZXJNY3BCcmlkZ2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFJlcXVpcmVkPEtlcGxlck1jcEJyaWRnZU9wdGlvbnM+O1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRpY1Rvb2xzOiBNYXBUb29sW107XG4gIHByaXZhdGUgcGFnZVRvb2xzOiBNYXBUb29sW10gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzb2NrZXQ6IFdlYlNvY2tldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHdzczogV2ViU29ja2V0U2VydmVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgaHR0cFNlcnZlcjogSHR0cFNlcnZlciB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHBlbmRpbmcgPSBuZXcgTWFwPHN0cmluZywgUGVuZGluZ0NhbGw+KCk7XG4gIHByaXZhdGUgdG9rZW4gPSAnJztcbiAgcHJpdmF0ZSBwYWdlVXJsID0gJyc7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogS2VwbGVyTWNwQnJpZGdlT3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgcG9ydDogb3B0aW9ucy5wb3J0ID8/IERFRkFVTFRfUE9SVCxcbiAgICAgIGhvc3Q6IG9wdGlvbnMuaG9zdCA/PyBERUZBVUxUX0hPU1QsXG4gICAgICBtYXBVcmw6IG9wdGlvbnMubWFwVXJsID8/ICdodHRwOi8vbG9jYWxob3N0OjgwODAnLFxuICAgICAgY2FsbFRpbWVvdXRNczogb3B0aW9ucy5jYWxsVGltZW91dE1zID8/IERFRkFVTFRfQ0FMTF9USU1FT1VUX01TXG4gICAgfTtcbiAgICB0aGlzLnN0YXRpY1Rvb2xzID0gZ2V0TWFwVG9vbHMoKTtcbiAgfVxuXG4gIC8qKiBUb29scyB0aGUgTUNQIGNsaWVudCBjYW4gY2FsbCByaWdodCBub3cuICovXG4gIGdldFRvb2xzKCk6IE1hcFRvb2xbXSB7XG4gICAgcmV0dXJuIHRoaXMucGFnZVRvb2xzID8/IHRoaXMuc3RhdGljVG9vbHM7XG4gIH1cblxuICBnZXQgY29ubmVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNvY2tldD8ucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU47XG4gIH1cblxuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPEtlcGxlck1jcEJyaWRnZVN0YXJ0PiB7XG4gICAgaWYgKHRoaXMud3NzKSB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBrZXBsZXIuZ2wgYnJpZGdlIGlzIGFscmVhZHkgcnVubmluZy4nKTtcblxuICAgIHRoaXMudG9rZW4gPSByYW5kb21VVUlEKCkucmVwbGFjZSgvLS9nLCAnJyk7XG5cbiAgICAvLyBBIHBsYWluIEhUVFAgR0VUIG9uIGAvYCByZWRpcmVjdHMgdG8gdGhlIG1hcCBwYWdlIGNhcnJ5aW5nIHRoZSB0b2tlbiwgc29cbiAgICAvLyB0aGUgdXNlciBjYW4gb3BlbiBgaHR0cDovLzEyNy4wLjAuMTo8cG9ydD4vYCBldmVuIHdoZW4gdGhlIE1DUCBjbGllbnRcbiAgICAvLyBuZXZlciBzaG93cyB0aGUgc2VydmVyJ3Mgc3RkZXJyLiBPbmx5IGAvd3NgIHVwZ3JhZGVzIHRvIGEgV2ViU29ja2V0LlxuICAgIGNvbnN0IGh0dHBTZXJ2ZXIgPSBjcmVhdGVTZXJ2ZXIoKHJlcXVlc3QsIHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAocmVxdWVzdC51cmwgPT09ICcvJyB8fCByZXF1ZXN0LnVybD8uc3RhcnRzV2l0aCgnLz8nKSkge1xuICAgICAgICByZXNwb25zZS53cml0ZUhlYWQoMzAyLCB7TG9jYXRpb246IHRoaXMucGFnZVVybH0pO1xuICAgICAgICByZXNwb25zZS5lbmQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzcG9uc2Uud3JpdGVIZWFkKDQwNCwgeydjb250ZW50LXR5cGUnOiAndGV4dC9wbGFpbid9KTtcbiAgICAgIHJlc3BvbnNlLmVuZCgna2VwbGVyLW1jcDogdGhlIG1hcCBwYWdlIGNvbm5lY3RzIGF0IC93cycpO1xuICAgIH0pO1xuICAgIHRoaXMuaHR0cFNlcnZlciA9IGh0dHBTZXJ2ZXI7XG5cbiAgICBjb25zdCB3c3MgPSBuZXcgV2ViU29ja2V0U2VydmVyKHtzZXJ2ZXI6IGh0dHBTZXJ2ZXIsIHBhdGg6ICcvd3MnfSk7XG4gICAgdGhpcy53c3MgPSB3c3M7XG4gICAgd3NzLm9uKCdjb25uZWN0aW9uJywgKHNvY2tldCwgcmVxdWVzdCkgPT4gdGhpcy5oYW5kbGVDb25uZWN0aW9uKHNvY2tldCwgcmVxdWVzdC51cmwpKTtcblxuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGh0dHBTZXJ2ZXIub25jZSgnZXJyb3InLCByZWplY3QpO1xuICAgICAgaHR0cFNlcnZlci5saXN0ZW4odGhpcy5vcHRpb25zLnBvcnQsIHRoaXMub3B0aW9ucy5ob3N0LCAoKSA9PiByZXNvbHZlKCkpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgYWRkcmVzcyA9IGh0dHBTZXJ2ZXIuYWRkcmVzcygpO1xuICAgIGNvbnN0IHBvcnQgPSB0eXBlb2YgYWRkcmVzcyA9PT0gJ29iamVjdCcgJiYgYWRkcmVzcyA/IGFkZHJlc3MucG9ydCA6IHRoaXMub3B0aW9ucy5wb3J0O1xuICAgIGNvbnN0IG1hcFVybCA9IHRoaXMub3B0aW9ucy5tYXBVcmwucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgICB0aGlzLnBhZ2VVcmwgPSBgJHttYXBVcmx9JHttYXBVcmwuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/J31tY3A9JHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICB0aGlzLnRva2VuXG4gICAgKX1gO1xuICAgIHJldHVybiB7aG9zdDogdGhpcy5vcHRpb25zLmhvc3QsIHBvcnQsIHRva2VuOiB0aGlzLnRva2VuLCBwYWdlVXJsOiB0aGlzLnBhZ2VVcmx9O1xuICB9XG5cbiAgYXN5bmMgY2FsbFRvb2wobmFtZTogc3RyaW5nLCBpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSk6IFByb21pc2U8Um9vbUNvbW1hbmRSZXN1bHQ+IHtcbiAgICBjb25zdCB0b29sID1cbiAgICAgIHRoaXMuZ2V0VG9vbHMoKS5maW5kKGNhbmRpZGF0ZSA9PiBjYW5kaWRhdGUubmFtZSA9PT0gbmFtZSkgPz9cbiAgICAgIHRoaXMuc3RhdGljVG9vbHMuZmluZChjYW5kaWRhdGUgPT4gY2FuZGlkYXRlLm5hbWUgPT09IG5hbWUpO1xuICAgIGlmICghdG9vbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5rbm93biBtYXAgdG9vbCBcIiR7bmFtZX1cIi4gQXZhaWxhYmxlOiAke3RoaXMuZ2V0VG9vbHMoKVxuICAgICAgICAgIC5tYXAoY2FuZGlkYXRlID0+IGNhbmRpZGF0ZS5uYW1lKVxuICAgICAgICAgIC5qb2luKCcsICcpfS5gXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzb2NrZXQgPSB0aGlzLnNvY2tldDtcbiAgICBpZiAoIXNvY2tldCB8fCBzb2NrZXQucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ05vIGtlcGxlci5nbCBtYXAgcGFnZSBpcyBjb25uZWN0ZWQuIE9wZW4gdGhlIHBhZ2UgVVJMIHByaW50ZWQgYXQgc3RhcnR1cCAnICtcbiAgICAgICAgICAnKGl0IGNhcnJpZXMgP21jcD08dG9rZW4+KSwgdGhlbiBjYWxsIHRoZSB0b29sIGFnYWluLidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FsbElkID0gcmFuZG9tVVVJRCgpO1xuICAgIGNvbnN0IHJlcGx5ID0gbmV3IFByb21pc2U8Um9vbUNvbW1hbmRSZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucGVuZGluZy5kZWxldGUoY2FsbElkKTtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBFcnJvcihgVGltZWQgb3V0IGFmdGVyICR7dGhpcy5vcHRpb25zLmNhbGxUaW1lb3V0TXN9IG1zIHdhaXRpbmcgZm9yIHRoZSBtYXAgcGFnZS5gKVxuICAgICAgICApO1xuICAgICAgfSwgdGhpcy5vcHRpb25zLmNhbGxUaW1lb3V0TXMpO1xuICAgICAgdGhpcy5wZW5kaW5nLnNldChjYWxsSWQsIHtyZXNvbHZlLCByZWplY3QsIHRpbWVyfSk7XG4gICAgfSk7XG5cbiAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7dHlwZTogJ2NhbGwnLCBjYWxsSWQsIHRvb2w6IHRvb2wuY29tbWFuZElkLCBpbnB1dH0pKTtcbiAgICByZXR1cm4gcmVwbHk7XG4gIH1cblxuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJlamVjdFBlbmRpbmcoJ1RoZSBicmlkZ2Ugd2FzIGNsb3NlZC4nKTtcbiAgICB0aGlzLnBhZ2VUb29scyA9IG51bGw7XG4gICAgdGhpcy5zb2NrZXQ/LmNsb3NlKDEwMDAsICdicmlkZ2UgY2xvc2VkJyk7XG4gICAgdGhpcy5zb2NrZXQgPSBudWxsO1xuICAgIGNvbnN0IHdzcyA9IHRoaXMud3NzO1xuICAgIGNvbnN0IGh0dHBTZXJ2ZXIgPSB0aGlzLmh0dHBTZXJ2ZXI7XG4gICAgdGhpcy53c3MgPSBudWxsO1xuICAgIHRoaXMuaHR0cFNlcnZlciA9IG51bGw7XG4gICAgaWYgKCF3c3MpIHJldHVybjtcbiAgICAvLyBjbG9zZSgpIG9ubHkgc3RvcHMgbGlzdGVuaW5nIGFuZCB3YWl0cyBmb3IgY2xpZW50czsgdGVybWluYXRlIHRoZW0gc29cbiAgICAvLyBzaHV0ZG93biAoYW5kIHRlc3RzKSBkbyBub3QgaGFuZyBvbiBhIHBhZ2UgdGhhdCBuZXZlciBjbG9zZXMgaXRzIHNvY2tldC5cbiAgICBmb3IgKGNvbnN0IGNsaWVudCBvZiB3c3MuY2xpZW50cykgY2xpZW50LnRlcm1pbmF0ZSgpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gd3NzLmNsb3NlKCgpID0+IHJlc29sdmUoKSkpO1xuICAgIGlmIChodHRwU2VydmVyKSB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IGh0dHBTZXJ2ZXIuY2xvc2UoKCkgPT4gcmVzb2x2ZSgpKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDb25uZWN0aW9uKHNvY2tldDogV2ViU29ja2V0LCByZXF1ZXN0VXJsOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBsZXQgdG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICB0b2tlbiA9IG5ldyBVUkwocmVxdWVzdFVybCA/PyAnL3dzJywgJ2h0dHA6Ly8xMjcuMC4wLjEnKS5zZWFyY2hQYXJhbXMuZ2V0KCd0b2tlbicpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdG9rZW4gPSBudWxsO1xuICAgIH1cbiAgICAvLyBUaGUgdG9rZW4gaXMgdGhlIG9ubHkgdGhpbmcga2VlcGluZyBvdGhlciBsb2NhbCBwYWdlcy9wcm9jZXNzZXMgZnJvbVxuICAgIC8vIGRyaXZpbmcgdGhlIG1hcDsgcmVqZWN0IGEgbWlzbWF0Y2ggYmVmb3JlIGFjY2VwdGluZyBhbnkgbWVzc2FnZS5cbiAgICBpZiAodG9rZW4gIT09IHRoaXMudG9rZW4pIHtcbiAgICAgIHNvY2tldC5jbG9zZSgxMDA4LCAnaW52YWxpZCB0b2tlbicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE9uZSBtYXAgcGFnZSBhdCBhIHRpbWU6IGEgc2Vjb25kIHRhYiB0YWtlcyBvdmVyIHNvIGNhbGxzIG5ldmVyIHJhY2VcbiAgICAvLyBiZXR3ZWVuIHR3byBsaXZlIG1hcHMuXG4gICAgdGhpcy5zb2NrZXQ/LmNsb3NlKDEwMDAsICdyZXBsYWNlZCBieSBhIG5ld2VyIGNvbm5lY3Rpb24nKTtcbiAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICB0aGlzLnBhZ2VUb29scyA9IG51bGw7XG5cbiAgICBzb2NrZXQub24oJ21lc3NhZ2UnLCBkYXRhID0+IHRoaXMuaGFuZGxlTWVzc2FnZShkYXRhKSk7XG4gICAgc29ja2V0Lm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnNvY2tldCA9PT0gc29ja2V0KSB7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wYWdlVG9vbHMgPSBudWxsO1xuICAgICAgICB0aGlzLnJlamVjdFBlbmRpbmcoJ1RoZSBrZXBsZXIuZ2wgcGFnZSBkaXNjb25uZWN0ZWQuJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gRXJyb3JzIGFyZSBmb2xsb3dlZCBieSBjbG9zZTsgdGhlIGNsb3NlIGhhbmRsZXIgcmVzZXRzIHN0YXRlLlxuICAgIHNvY2tldC5vbignZXJyb3InLCAoKSA9PiB1bmRlZmluZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVNZXNzYWdlKHJhdzogdW5rbm93bik6IHZvaWQge1xuICAgIGxldCBtZXNzYWdlOiBhbnk7XG4gICAgdHJ5IHtcbiAgICAgIG1lc3NhZ2UgPSBKU09OLnBhcnNlKFN0cmluZyhyYXcpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG1lc3NhZ2U/LnR5cGUgPT09ICdoZWxsbycgJiYgQXJyYXkuaXNBcnJheShtZXNzYWdlLmNvbW1hbmRzKSkge1xuICAgICAgdGhpcy5wYWdlVG9vbHMgPSB0b29sc0Zyb21EZXNjcmlwdG9ycyhtZXNzYWdlLmNvbW1hbmRzIGFzIFRvb2xEZXNjcmlwdG9yW10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZT8udHlwZSA9PT0gJ3Jlc3VsdCcgJiYgdHlwZW9mIG1lc3NhZ2UuY2FsbElkID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgcGVuZGluZ0NhbGwgPSB0aGlzLnBlbmRpbmcuZ2V0KG1lc3NhZ2UuY2FsbElkKTtcbiAgICAgIGlmICghcGVuZGluZ0NhbGwpIHJldHVybjtcbiAgICAgIGNsZWFyVGltZW91dChwZW5kaW5nQ2FsbC50aW1lcik7XG4gICAgICB0aGlzLnBlbmRpbmcuZGVsZXRlKG1lc3NhZ2UuY2FsbElkKTtcbiAgICAgIHBlbmRpbmdDYWxsLnJlc29sdmUobWVzc2FnZS5yZXN1bHQgYXMgUm9vbUNvbW1hbmRSZXN1bHQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVqZWN0UGVuZGluZyhyZWFzb246IHN0cmluZyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2NhbGxJZCwgcGVuZGluZ0NhbGxdIG9mIHRoaXMucGVuZGluZykge1xuICAgICAgY2xlYXJUaW1lb3V0KHBlbmRpbmdDYWxsLnRpbWVyKTtcbiAgICAgIHRoaXMucGVuZGluZy5kZWxldGUoY2FsbElkKTtcbiAgICAgIHBlbmRpbmdDYWxsLnJlamVjdChuZXcgRXJyb3IocmVhc29uKSk7XG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUUEsVUFBVSxRQUFPLGFBQWE7QUFDdEMsU0FBUUMsWUFBWSxRQUFPLFdBQVc7QUFFdEMsU0FBUUMsU0FBUyxFQUFFQyxlQUFlLFFBQU8sSUFBSTtBQUM3QyxTQUFRQyxDQUFDLFFBQU8sS0FBSztBQUNyQixTQUFRQyxpQkFBaUIsUUFBTyxhQUFhO0FBRzdDLElBQU1DLFlBQVksR0FBRyxJQUFJO0FBQ3pCLElBQU1DLFlBQVksR0FBRyxXQUFXO0FBQ2hDLElBQU1DLHVCQUF1QixHQUFHLEtBQU07QUFpQ3RDO0FBQ0EsT0FBTyxTQUFTQyxVQUFVQSxDQUFDQyxTQUFpQixFQUFVO0VBQ3BELE9BQU9BLFNBQVMsQ0FBQ0MsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7QUFDdEM7QUFFQSxTQUFTQyxhQUFhQSxDQUFDQyxPQUFnQyxFQUEy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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// Copyright contributors to the kepler.gl project
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Server-side entry point of `@kepler.gl/mcp`.
|
|
6
|
+
*
|
|
7
|
+
* Browser bundles must not import this module: it pulls in `ws` and Node APIs.
|
|
8
|
+
* The map contracts and commands stay in the package root; this subpath is for
|
|
9
|
+
* the stdio MCP server (`kepler-mcp`) and for tests.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export { KeplerMcpBridge, formatResult, getMapTools, toToolName } from './bridge-server';
|
|
13
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJLZXBsZXJNY3BCcmlkZ2UiLCJmb3JtYXRSZXN1bHQiLCJnZXRNYXBUb29scyIsInRvVG9vbE5hbWUiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmVyL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbi8qKlxuICogU2VydmVyLXNpZGUgZW50cnkgcG9pbnQgb2YgYEBrZXBsZXIuZ2wvbWNwYC5cbiAqXG4gKiBCcm93c2VyIGJ1bmRsZXMgbXVzdCBub3QgaW1wb3J0IHRoaXMgbW9kdWxlOiBpdCBwdWxscyBpbiBgd3NgIGFuZCBOb2RlIEFQSXMuXG4gKiBUaGUgbWFwIGNvbnRyYWN0cyBhbmQgY29tbWFuZHMgc3RheSBpbiB0aGUgcGFja2FnZSByb290OyB0aGlzIHN1YnBhdGggaXMgZm9yXG4gKiB0aGUgc3RkaW8gTUNQIHNlcnZlciAoYGtlcGxlci1tY3BgKSBhbmQgZm9yIHRlc3RzLlxuICovXG5cbmV4cG9ydCB7S2VwbGVyTWNwQnJpZGdlLCBmb3JtYXRSZXN1bHQsIGdldE1hcFRvb2xzLCB0b1Rvb2xOYW1lfSBmcm9tICcuL2JyaWRnZS1zZXJ2ZXInO1xuZXhwb3J0IHR5cGUge0tlcGxlck1jcEJyaWRnZU9wdGlvbnMsIEtlcGxlck1jcEJyaWRnZVN0YXJ0LCBNYXBUb29sfSBmcm9tICcuL2JyaWRnZS1zZXJ2ZXInO1xuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVFBLGVBQWUsRUFBRUMsWUFBWSxFQUFFQyxXQUFXLEVBQUVDLFVBQVUsUUFBTyxpQkFBaUIiLCJpZ25vcmVMaXN0IjpbXX0=
|