@dollhousemcp/mcp-server 2.0.11 → 2.0.12-rc.2

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.
Files changed (93) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/config/ConfigManager.d.ts +34 -0
  3. package/dist/config/ConfigManager.d.ts.map +1 -1
  4. package/dist/config/ConfigManager.js +46 -1
  5. package/dist/config/env.d.ts +18 -0
  6. package/dist/config/env.d.ts.map +1 -1
  7. package/dist/config/env.js +89 -2
  8. package/dist/di/Container.d.ts +1 -0
  9. package/dist/di/Container.d.ts.map +1 -1
  10. package/dist/di/Container.js +38 -2
  11. package/dist/elements/agents/AgentManager.js +2 -2
  12. package/dist/generated/version.d.ts +2 -2
  13. package/dist/generated/version.d.ts.map +1 -1
  14. package/dist/generated/version.js +3 -3
  15. package/dist/handlers/mcp-aql/GatekeeperSession.d.ts.map +1 -1
  16. package/dist/handlers/mcp-aql/GatekeeperSession.js +3 -2
  17. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  18. package/dist/handlers/mcp-aql/MCPAQLHandler.js +11 -3
  19. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  20. package/dist/handlers/mcp-aql/OperationSchema.js +11 -6
  21. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
  22. package/dist/handlers/mcp-aql/policies/ToolClassification.js +8 -1
  23. package/dist/index.js +53 -3
  24. package/dist/security/InputNormalizer.d.ts +4 -6
  25. package/dist/security/InputNormalizer.d.ts.map +1 -1
  26. package/dist/security/InputNormalizer.js +10 -16
  27. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  28. package/dist/security/audit/config/suppressions.js +26 -1
  29. package/dist/security/constants.d.ts +7 -0
  30. package/dist/security/constants.d.ts.map +1 -1
  31. package/dist/security/constants.js +10 -1
  32. package/dist/security/contentValidator.d.ts.map +1 -1
  33. package/dist/security/contentValidator.js +14 -6
  34. package/dist/security/encryption/PatternEncryptor.d.ts.map +1 -1
  35. package/dist/security/encryption/PatternEncryptor.js +18 -10
  36. package/dist/security/securityMonitor.d.ts +1 -1
  37. package/dist/security/securityMonitor.d.ts.map +1 -1
  38. package/dist/security/securityMonitor.js +1 -1
  39. package/dist/security/tokenManager.d.ts +18 -2
  40. package/dist/security/tokenManager.d.ts.map +1 -1
  41. package/dist/security/tokenManager.js +47 -15
  42. package/dist/security/validators/unicodeValidator.d.ts +4 -5
  43. package/dist/security/validators/unicodeValidator.d.ts.map +1 -1
  44. package/dist/security/validators/unicodeValidator.js +19 -20
  45. package/dist/services/VerificationNotifier.d.ts.map +1 -1
  46. package/dist/services/VerificationNotifier.js +15 -13
  47. package/dist/services/validation/GenericElementValidator.js +5 -5
  48. package/dist/web/console/IngestRoutes.d.ts +14 -2
  49. package/dist/web/console/IngestRoutes.d.ts.map +1 -1
  50. package/dist/web/console/IngestRoutes.js +69 -5
  51. package/dist/web/console/LeaderElection.d.ts +37 -3
  52. package/dist/web/console/LeaderElection.d.ts.map +1 -1
  53. package/dist/web/console/LeaderElection.js +67 -7
  54. package/dist/web/console/LeaderForwardingSink.d.ts +19 -3
  55. package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -1
  56. package/dist/web/console/LeaderForwardingSink.js +44 -9
  57. package/dist/web/console/PromotionManager.d.ts +29 -0
  58. package/dist/web/console/PromotionManager.d.ts.map +1 -0
  59. package/dist/web/console/PromotionManager.js +94 -0
  60. package/dist/web/console/SessionNames.d.ts +7 -0
  61. package/dist/web/console/SessionNames.d.ts.map +1 -1
  62. package/dist/web/console/SessionNames.js +10 -1
  63. package/dist/web/console/UnifiedConsole.d.ts +26 -1
  64. package/dist/web/console/UnifiedConsole.d.ts.map +1 -1
  65. package/dist/web/console/UnifiedConsole.js +143 -20
  66. package/dist/web/portDiscovery.d.ts +4 -3
  67. package/dist/web/portDiscovery.d.ts.map +1 -1
  68. package/dist/web/portDiscovery.js +7 -5
  69. package/dist/web/public/app.js +35 -18
  70. package/dist/web/public/consoleAuth.js +152 -0
  71. package/dist/web/public/index.html +243 -9
  72. package/dist/web/public/logs.js +1 -1
  73. package/dist/web/public/metrics.js +3 -3
  74. package/dist/web/public/permissions.js +1 -1
  75. package/dist/web/public/security.css +396 -0
  76. package/dist/web/public/security.js +393 -0
  77. package/dist/web/public/sessions.css +54 -4
  78. package/dist/web/public/sessions.js +46 -6
  79. package/dist/web/public/setup.css +439 -0
  80. package/dist/web/public/setup.js +490 -18
  81. package/dist/web/public/styles.css +10 -0
  82. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  83. package/dist/web/routes/permissionRoutes.js +8 -3
  84. package/dist/web/routes/setupRoutes.d.ts +4 -0
  85. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  86. package/dist/web/routes/setupRoutes.js +418 -7
  87. package/dist/web/routes.d.ts.map +1 -1
  88. package/dist/web/routes.js +9 -5
  89. package/dist/web/server.d.ts +49 -3
  90. package/dist/web/server.d.ts.map +1 -1
  91. package/dist/web/server.js +282 -82
  92. package/package.json +11 -2
  93. package/server.json +2 -2
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Follower-to-leader promotion manager (#1850).
3
+ *
4
+ * Handles the lifecycle of promoting a follower process to leader when the
5
+ * current leader becomes unreachable. Extracted from UnifiedConsole.ts to
6
+ * reduce complexity and allow per-instance state tracking.
7
+ *
8
+ * Each PromotionManager instance tracks its own attempt counter, so multiple
9
+ * followers in the same process (unlikely but possible) don't interfere
10
+ * with each other's promotion budgets.
11
+ */
12
+ import { logger } from '../../utils/logger.js';
13
+ import { deleteLeaderLock, claimLeadership, readLeaderLock, LOCK_VERSION, } from './LeaderElection.js';
14
+ const MAX_PROMOTION_ATTEMPTS = 3;
15
+ export class PromotionManager {
16
+ options;
17
+ consolePort;
18
+ startAsLeader;
19
+ startAsFollower;
20
+ inProgress = false;
21
+ attempts = 0;
22
+ constructor(options, consolePort, startAsLeader, startAsFollower) {
23
+ this.options = options;
24
+ this.consolePort = consolePort;
25
+ this.startAsLeader = startAsLeader;
26
+ this.startAsFollower = startAsFollower;
27
+ }
28
+ /**
29
+ * Attempt promotion. Safe to call from the ForwardingSink onLeaderDeath
30
+ * callback — guards against concurrent and excessive attempts.
31
+ */
32
+ async promote(forwardingSink, sessionHeartbeat) {
33
+ if (this.inProgress) {
34
+ logger.info('[PromotionManager] Promotion already in progress — skipping');
35
+ return;
36
+ }
37
+ this.attempts++;
38
+ if (this.attempts > MAX_PROMOTION_ATTEMPTS) {
39
+ logger.error(`[PromotionManager] Attempt ${this.attempts} exceeds max (${MAX_PROMOTION_ATTEMPTS}) — giving up`);
40
+ return;
41
+ }
42
+ this.inProgress = true;
43
+ const startMs = Date.now();
44
+ try {
45
+ logger.warn(`[PromotionManager] Leader death detected — promotion attempt ${this.attempts}/${MAX_PROMOTION_ATTEMPTS}`, {
46
+ sessionId: this.options.sessionId, pid: process.pid, port: this.consolePort, attempt: this.attempts,
47
+ });
48
+ await sessionHeartbeat.stop();
49
+ await forwardingSink.close();
50
+ await deleteLeaderLock();
51
+ const now = new Date().toISOString();
52
+ const myInfo = {
53
+ version: LOCK_VERSION,
54
+ pid: process.pid,
55
+ port: this.consolePort,
56
+ sessionId: this.options.sessionId,
57
+ startedAt: now,
58
+ heartbeat: now,
59
+ };
60
+ const claimed = await claimLeadership(myInfo);
61
+ const durationMs = Date.now() - startMs;
62
+ if (claimed) {
63
+ logger.info('[PromotionManager] Promotion succeeded — starting as leader', {
64
+ sessionId: this.options.sessionId, port: this.consolePort, durationMs, attempt: this.attempts,
65
+ });
66
+ const election = { role: 'leader', leaderInfo: myInfo };
67
+ await this.startAsLeader(this.options, election, this.consolePort);
68
+ }
69
+ else {
70
+ logger.info('[PromotionManager] Lost promotion race — following new leader', {
71
+ sessionId: this.options.sessionId, durationMs, attempt: this.attempts,
72
+ });
73
+ const newLeader = await readLeaderLock();
74
+ if (newLeader) {
75
+ const election = { role: 'follower', leaderInfo: newLeader };
76
+ await this.startAsFollower(this.options, election, this.consolePort);
77
+ }
78
+ else {
79
+ logger.error('[PromotionManager] No leader available after lost race');
80
+ }
81
+ }
82
+ }
83
+ catch (err) {
84
+ logger.error('[PromotionManager] Promotion failed', {
85
+ error: err instanceof Error ? err.message : String(err),
86
+ durationMs: Date.now() - startMs, attempt: this.attempts,
87
+ });
88
+ }
89
+ finally {
90
+ this.inProgress = false;
91
+ }
92
+ }
93
+ }
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvbW90aW9uTWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93ZWIvY29uc29sZS9Qcm9tb3Rpb25NYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0MsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsY0FBYyxFQUNkLFlBQVksR0FHYixNQUFNLHFCQUFxQixDQUFDO0FBSTdCLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0FBRWpDLE1BQU0sT0FBTyxnQkFBZ0I7SUFLUjtJQUNBO0lBQ0E7SUFLQTtJQVhYLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUVyQixZQUNtQixPQUE4QixFQUM5QixXQUFtQixFQUNuQixhQUlJLEVBQ0osZUFJSTtRQVhKLFlBQU8sR0FBUCxPQUFPLENBQXVCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQ25CLGtCQUFhLEdBQWIsYUFBYSxDQUlUO1FBQ0osb0JBQWUsR0FBZixlQUFlLENBSVg7SUFDcEIsQ0FBQztJQUVKOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQ1gsY0FBdUMsRUFDdkMsZ0JBQWtDO1FBRWxDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsNkRBQTZELENBQUMsQ0FBQztZQUMzRSxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztZQUMzQyxNQUFNLENBQUMsS0FBSyxDQUFDLDhCQUE4QixJQUFJLENBQUMsUUFBUSxpQkFBaUIsc0JBQXNCLGVBQWUsQ0FBQyxDQUFDO1lBQ2hILE9BQU87UUFDVCxD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LENBQUMsR0FBRyxFQUFFLEdBQUcsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUTthQUN6RCxDQUFDLENBQUM7UUFDTCxDQUFDO2dCQUFTLENBQUM7WUFDVCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGb2xsb3dlci10by1sZWFkZXIgcHJvbW90aW9uIG1hbmFnZXIgKCMxODUwKS5cbiAqXG4gKiBIYW5kbGVzIHRoZSBsaWZlY3ljbGUgb2YgcHJvbW90aW5nIGEgZm9sbG93ZXIgcHJvY2VzcyB0byBsZWFkZXIgd2hlbiB0aGVcbiAqIGN1cnJlbnQgbGVhZGVyIGJlY29tZXMgdW5yZWFjaGFibGUuIEV4dHJhY3RlZCBmcm9tIFVuaWZpZWRDb25zb2xlLnRzIHRvXG4gKiByZWR1Y2UgY29tcGxleGl0eSBhbmQgYWxsb3cgcGVyLWluc3RhbmNlIHN0YXRlIHRyYWNraW5nLlxuICpcbiAqIEVhY2ggUHJvbW90aW9uTWFuYWdlciBpbnN0YW5jZSB0cmFja3MgaXRzIG93biBhdHRlbXB0IGNvdW50ZXIsIHNvIG11bHRpcGxlXG4gKiBmb2xsb3dlcnMgaW4gdGhlIHNhbWUgcHJvY2VzcyAodW5saWtlbHkgYnV0IHBvc3NpYmxlKSBkb24ndCBpbnRlcmZlcmVcbiAqIHdpdGggZWFjaCBvdGhlcidzIHByb21vdGlvbiBidWRnZXRzLlxuICovXG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBkZWxldGVMZWFkZXJMb2NrLFxuICBjbGFpbUxlYWRlcnNoaXAsXG4gIHJlYWRMZWFkZXJMb2NrLFxuICBMT0NLX1ZFUlNJT04sXG4gIHR5cGUgRWxlY3Rpb25SZXN1bHQsXG4gIHR5cGUgQ29uc29sZUxlYWRlckluZm8sXG59IGZyb20gJy4vTGVhZGVyRWxlY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBMZWFkZXJGb3J3YXJkaW5nTG9nU2luaywgU2Vzc2lvbkhlYXJ0YmVhdCB9IGZyb20gJy4vTGVhZGVyRm9yd2FyZGluZ1NpbmsuanMnO1xuaW1wb3J0IHR5cGUgeyBVbmlmaWVkQ29uc29sZU9wdGlvbnMgfSBmcm9tICcuL1VuaWZpZWRDb25zb2xlLmpzJztcblxuY29uc3QgTUFYX1BST01PVElPTl9BVFRFTVBUUyA9IDM7XG5cbmV4cG9ydCBjbGFzcyBQcm9tb3Rpb25NYW5hZ2VyIHtcbiAgcHJpdmF0ZSBpblByb2dyZXNzID0gZmFsc2U7XG4gIHByaXZhdGUgYXR0ZW1wdHMgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogVW5pZmllZENvbnNvbGVPcHRpb25zLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uc29sZVBvcnQ6IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YXJ0QXNMZWFkZXI6IChcbiAgICAgIG9wdGlvbnM6IFVuaWZpZWRDb25zb2xlT3B0aW9ucyxcbiAgICAgIGVsZWN0aW9uOiBFbGVjdGlvblJlc3VsdCxcbiAgICAgIGNvbnNvbGVQb3J0OiBudW1iZXIsXG4gICAgKSA9PiBQcm9taXNlPHVua25vd24+LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RhcnRBc0ZvbGxvd2VyOiAoXG4gICAgICBvcHRpb25zOiBVbmlmaWVkQ29uc29sZU9wdGlvbnMsXG4gICAgICBlbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQsXG4gICAgICBjb25zb2xlUG9ydDogbnVtYmVyLFxuICAgICkgPT4gUHJvbWlzZTx1bmtub3duPixcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0IHByb21vdGlvbi4gU2FmZSB0byBjYWxsIGZyb20gdGhlIEZvcndhcmRpbmdTaW5rIG9uTGVhZGVyRGVhdGhcbiAgICogY2FsbGJhY2sg4oCUIGd1YXJkcyBhZ2FpbnN0IGNvbmN1cnJlbnQgYW5kIGV4Y2Vzc2l2ZSBhdHRlbXB0cy5cbiAgICovXG4gIGFzeW5jIHByb21vdGUoXG4gICAgZm9yd2FyZGluZ1Npbms6IExlYWRlckZvcndhcmRpbmdMb2dTaW5rLFxuICAgIHNlc3Npb25IZWFydGJlYXQ6IFNlc3Npb25IZWFydGJlYXQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmluUHJvZ3Jlc3MpIHtcbiAgICAgIGxvZ2dlci5pbmZvKCdbUHJvbW90aW9uTWFuYWdlcl0gUHJvbW90aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3Mg4oCUIHNraXBwaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5hdHRlbXB0cysrO1xuICAgIGlmICh0aGlzLmF0dGVtcHRzID4gTUFYX1BST01PVElPTl9BVFRFTVBUUykge1xuICAgICAgbG9nZ2VyLmVycm9yKGBbUHJvbW90aW9uTWFuYWdlcl0gQXR0ZW1wdCAke3RoaXMuYXR0ZW1wdHN9IGV4Y2VlZHMgbWF4ICgke01BWF9QUk9NT1RJT05fQVRURU1QVFN9KSDigJQgZ2l2aW5nIHVwYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pblByb2dyZXNzID0gdHJ1ZTtcbiAgICBjb25zdCBzdGFydE1zID0gRGF0ZS5ub3coKTtcblxuICAgIHRyeSB7XG4gICAgICBsb2dnZXIud2FybihgW1Byb21vdGlvbk1hbmFnZXJdIExlYWRlciBkZWF0aCBkZXRlY3RlZCDigJQgcHJvbW90aW9uIGF0dGVtcHQgJHt0aGlzLmF0dGVtcHRzfS8ke01BWF9QUk9NT1RJT05fQVRURU1QVFN9YCwge1xuICAgICAgICBzZXNzaW9uSWQ6IHRoaXMub3B0aW9ucy5zZXNzaW9uSWQsIHBpZDogcHJvY2Vzcy5waWQsIHBvcnQ6IHRoaXMuY29uc29sZVBvcnQsIGF0dGVtcHQ6IHRoaXMuYXR0ZW1wdHMsXG4gICAgICB9KTtcblxuICAgICAgYXdhaXQgc2Vzc2lvbkhlYXJ0YmVhdC5zdG9wKCk7XG4gICAgICBhd2FpdCBmb3J3YXJkaW5nU2luay5jbG9zZSgpO1xuICAgICAgYXdhaXQgZGVsZXRlTGVhZGVyTG9jaygpO1xuXG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBjb25zdCBteUluZm86IENvbnNvbGVMZWFkZXJJbmZvID0ge1xuICAgICAgICB2ZXJzaW9uOiBMT0NLX1ZFUlNJT04sXG4gICAgICAgIHBpZDogcHJvY2Vzcy5waWQsXG4gICAgICAgIHBvcnQ6IHRoaXMuY29uc29sZVBvcnQsXG4gICAgICAgIHNlc3Npb25JZDogdGhpcy5vcHRpb25zLnNlc3Npb25JZCxcbiAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgIGhlYXJ0YmVhdDogbm93LFxuICAgICAgfTtcblxuICAgICAgY29uc3QgY2xhaW1lZCA9IGF3YWl0IGNsYWltTGVhZGVyc2hpcChteUluZm8pO1xuICAgICAgY29uc3QgZHVyYXRpb25NcyA9IERhdGUubm93KCkgLSBzdGFydE1zO1xuXG4gICAgICBpZiAoY2xhaW1lZCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnW1Byb21vdGlvbk1hbmFnZXJdIFByb21vdGlvbiBzdWNjZWVkZWQg4oCUIHN0YXJ0aW5nIGFzIGxlYWRlcicsIHtcbiAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMub3B0aW9ucy5zZXNzaW9uSWQsIHBvcnQ6IHRoaXMuY29uc29sZVBvcnQsIGR1cmF0aW9uTXMsIGF0dGVtcHQ6IHRoaXMuYXR0ZW1wdHMsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBlbGVjdGlvbjogRWxlY3Rpb25SZXN1bHQgPSB7IHJvbGU6ICdsZWFkZXInLCBsZWFkZXJJbmZvOiBteUluZm8gfTtcbiAgICAgICAgYXdhaXQgdGhpcy5zdGFydEFzTGVhZGVyKHRoaXMub3B0aW9ucywgZWxlY3Rpb24sIHRoaXMuY29uc29sZVBvcnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1tQcm9tb3Rpb25NYW5hZ2VyXSBMb3N0IHByb21vdGlvbiByYWNlIOKAlCBmb2xsb3dpbmcgbmV3IGxlYWRlcicsIHtcbiAgICAgICAgICBzZXNzaW9uSWQ6IHRoaXMub3B0aW9ucy5zZXNzaW9uSWQsIGR1cmF0aW9uTXMsIGF0dGVtcHQ6IHRoaXMuYXR0ZW1wdHMsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBuZXdMZWFkZXIgPSBhd2FpdCByZWFkTGVhZGVyTG9jaygpO1xuICAgICAgICBpZiAobmV3TGVhZGVyKSB7XG4gICAgICAgICAgY29uc3QgZWxlY3Rpb246IEVsZWN0aW9uUmVzdWx0ID0geyByb2xlOiAnZm9sbG93ZXInLCBsZWFkZXJJbmZvOiBuZXdMZWFkZXIgfTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN0YXJ0QXNGb2xsb3dlcih0aGlzLm9wdGlvbnMsIGVsZWN0aW9uLCB0aGlzLmNvbnNvbGVQb3J0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoJ1tQcm9tb3Rpb25NYW5hZ2VyXSBObyBsZWFkZXIgYXZhaWxhYmxlIGFmdGVyIGxvc3QgcmFjZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1tQcm9tb3Rpb25NYW5hZ2VyXSBQcm9tb3Rpb24gZmFpbGVkJywge1xuICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gc3RhcnRNcywgYXR0ZW1wdDogdGhpcy5hdHRlbXB0cyxcbiAgICAgIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -8,6 +8,13 @@
8
8
  *
9
9
  * @since v2.1.0 — Issue #1700
10
10
  */
11
+ /**
12
+ * Pick a random puppet name from the pool, independent of the session
13
+ * name assignment. Used by the console token module (#1780) to generate
14
+ * a friendly default name for newly created tokens. Does not reserve the
15
+ * name — multiple callers can receive the same value.
16
+ */
17
+ export declare function pickRandomPuppetName(): string;
11
18
  /**
12
19
  * Manages friendly session name assignment from the puppet name pool.
13
20
  */
@@ -1 +1 @@
1
- {"version":3,"file":"SessionNames.d.ts","sourceRoot":"","sources":["../../../src/web/console/SessionNames.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAyLH;;GAEG;AACH,qBAAa,eAAe;IAC1B,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,uCAAuC;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,0CAA0C;IAC1C,OAAO,CAAC,QAAQ,CAAuB;IAEvC;;;;;OAKG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,MAAM;IAuCnD;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAehC;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI9C;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK/C;;OAEG;IACH,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAI7B,OAAO,CAAC,cAAc;CAIvB"}
1
+ {"version":3,"file":"SessionNames.d.ts","sourceRoot":"","sources":["../../../src/web/console/SessionNames.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA6GH;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AA8ED;;GAEG;AACH,qBAAa,eAAe;IAC1B,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IACtD,uCAAuC;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAC3D,0CAA0C;IAC1C,OAAO,CAAC,QAAQ,CAAuB;IAEvC;;;;;OAKG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,MAAM;IAuCnD;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAehC;;OAEG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI9C;;OAEG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK/C;;OAEG;IACH,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAI7B,OAAO,CAAC,cAAc;CAIvB"}
@@ -99,6 +99,15 @@ function shuffleArray(arr) {
99
99
  }
100
100
  /** Shuffled copy of the name pool — randomized on each process start */
101
101
  const PUPPET_NAMES = shuffleArray([...ALL_PUPPET_NAMES]);
102
+ /**
103
+ * Pick a random puppet name from the pool, independent of the session
104
+ * name assignment. Used by the console token module (#1780) to generate
105
+ * a friendly default name for newly created tokens. Does not reserve the
106
+ * name — multiple callers can receive the same value.
107
+ */
108
+ export function pickRandomPuppetName() {
109
+ return ALL_PUPPET_NAMES[randomInt(ALL_PUPPET_NAMES.length)];
110
+ }
102
111
  /**
103
112
  * Canonical colors for each puppet character.
104
113
  * Adjusted from true canonical colors for UI readability in both light/dark themes.
@@ -254,4 +263,4 @@ export class SessionNamePool {
254
263
  this.cooldown = this.cooldown.filter(c => (now - c.releasedAt) < NAME_COOLDOWN_MS);
255
264
  }
256
265
  }
257
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Vzc2lvbk5hbWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dlYi9jb25zb2xlL1Nlc3Npb25OYW1lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQzs7O0dBR0c7QUFDSCxNQUFNLGdCQUFnQixHQUFzQjtJQUMxQyx3QkFBd0I7SUFDeEIsT0FBTztJQUNQLE1BQU07SUFDTixXQUFXO0lBQ1gsWUFBWTtJQUNaLFlBQVk7SUFDWixTQUFTO0lBQ1QsVUFBVTtJQUVWLHVCQUF1QjtJQUN2QixRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsU0FBUztJQUVULHdCQUF3QjtJQUN4QixPQUFPO0lBQ1AsT0FBTztJQUVQLGtCQUFrQjtJQUNsQixPQUFPO0lBQ1AsV0FBVztJQUVYLGdCQUFnQjtJQUNoQixRQUFRO0lBQ1IsTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUVQLDBCQUEwQjtJQUMxQixVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixNQUFNO0lBRU4seUJBQXlCO0lBQ3pCLFNBQVM7SUFDVCxRQUFRO0lBQ1IsV0FBVztJQUNYLFlBQVk7SUFDWixXQUFXO0lBRVgsdUJBQXVCO0lBQ3ZCLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFFUix3QkFBd0I7SUFDeEIsWUFBWTtJQUNaLGNBQWM7SUFDZCxXQUFXO0lBQ1gsV0FBVztJQUVYLHdCQUF3QjtJQUN4QixNQUFNO0lBRU4sZUFBZTtJQUNmLE9BQU87SUFDUCxPQUFPO0lBRVAsZ0JBQWdCO0lBQ2hCLFFBQVE7SUFDUixLQUFLO0lBQ0wsU0FBUztJQUNULE9B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WyIvKipcbiAqIEZyaWVuZGx5IHNlc3Npb24gbmFtZXMgZHJhd24gZnJvbSBmYW1vdXMgcHVwcGV0cywgbWFyaW9uZXR0ZXMsXG4gKiBhbmQgcHVwcGV0IGNoYXJhY3RlcnMgdGhyb3VnaG91dCBoaXN0b3J5LlxuICpcbiAqIE5hbWVzIGFyZSBhc3NpZ25lZCBmcm9tIGEgcG9vbCBhbmQgcmV0dXJuZWQgYWZ0ZXIgYSBjb29sZG93biBwZXJpb2RcbiAqIHdoZW4gc2Vzc2lvbnMgZW5kLiBUaGlzIGtlZXBzIHRoZSBhY3RpdmUgc2Vzc2lvbiBsaXN0IGh1bWFuLXJlYWRhYmxlXG4gKiBhbmQgb24tYnJhbmQgZm9yIERvbGxob3VzZU1DUC5cbiAqXG4gKiBAc2luY2UgdjIuMS4wIOKAlCBJc3N1ZSAjMTcwMFxuICovXG5cbmltcG9ydCB7IHJhbmRvbUludCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5cbi8qKlxuICogRmFtb3VzIHB1cHBldHMsIG1hcmlvbmV0dGVzLCBhbmQgcHVwcGV0IGNoYXJhY3RlcnMgZnJvbSBhcm91bmQgdGhlIHdvcmxkLlxuICogT3JkZXIgZG9lc24ndCBtYXR0ZXIg4oCUIHRoZSBwb29sIGlzIHNodWZmbGVkIG9uIHN0YXJ0dXAuXG4gKi9cbmNvbnN0IEFMTF9QVVBQRVRfTkFNRVM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAvLyBDbGFzc2ljICYgdHJhZGl0aW9uYWxcbiAgJ1B1bmNoJyxcbiAgJ0p1ZHknLFxuICAnUGlub2NjaGlvJyxcbiAgJ1BldHJvdWNoa2EnLFxuICAnUHVsY2luZWxsYScsXG4gICdHdWlnbm9sJyxcbiAgJ0thc3BlcmxlJyxcblxuICAvLyBNdXBwZXRzICYgSmltIEhlbnNvblxuICAnS2VybWl0JyxcbiAgJ1BpZ2d5JyxcbiAgJ0ZvenppZScsXG4gICdHb256bycsXG4gICdTY29vdGVyJyxcbiAgJ1Jvd2xmJyxcbiAgJ1dhbGRvcmYnLFxuICAnU3RhdGxlcicsXG5cbiAgLy8gS3VrbGEsIEZyYW4gYW5kIE9sbGllXG4gICdLdWtsYScsXG4gICdPbGxpZScsXG5cbiAgLy8gSG93ZHkgRG9vZHkgZXJhXG4gICdIb3dkeScsXG4gICdDbGFyYWJlbGwnLFxuXG4gIC8vIFNlc2FtZSBTdHJlZXRcbiAgJ0dyb3ZlcicsXG4gICdFbG1vJyxcbiAgJ0VybmllJyxcbiAgJ0JlcnQnLFxuICAnT3NjYXInLFxuXG4gIC8vIFZlbnRyaWxvcXVpc3QgJiB2YXJpZXR5XG4gICdNb3J0aW1lcicsXG4gICdMYW1iY2hvcCcsXG4gICdNYWRhbWUnLFxuICAnVG9wbycsXG5cbiAgLy8gSW50ZXJuYXRpb25hbCBwdXBwZXRyeVxuICAnQnVucmFrdScsXG4gICdXYXlhbmcnLFxuICAnUGV0cnVzaGthJyxcbiAgJ0hhbm5lc2NoZW4nLFxuICAnVml0ZXpzbGF2JyxcblxuICAvLyBNb2Rlcm4gJiBwb3AgY3VsdHVyZVxuICAnU2FsZW0nLFxuICAnVHJpdW1waCcsXG4gICdQZWFudXQnLFxuICAnQWNobWVkJyxcblxuICAvLyBNYXJpb25ldHRlIHRyYWRpdGlvbnNcbiAgJ0ZhbnRvY2NpbmknLFxuICAnU2FsdGltYmFucXVlJyxcbiAgJ0J1cmF0dGlubycsXG4gICdIYXJsZXF1aW4nLFxuXG4gIC8vIERvbGxob3VzZSAoVFYgc2VyaWVzKVxuICAnRWNobycsXG5cbiAgLy8gSW5zaWRlIGpva2VzXG4gICdTcGlrZScsXG4gICdBbmdlbCcsXG5cbiAgLy8gQ2xhc3NpYyBkb2xsc1xuICAnQmFyYmllJyxcbiAgJ0tlbicsXG4gICdTa2lwcGVyJyxcbiAgJ01pZGdlJyxcbiAgJ0NocmlzdGllJyxcbiAgJ0FubmllJyxcbiAgJ0FuZHknLFxuICAnQ2F0aHknLFxuICAnVGVkZHknLFxuICAnWGF2aWVyJyxcbiAgJ1N0cmF3YmVycnknLFxuICAnQmx5dGhlJyxcbiAgJ0dpbm55JyxcbiAgJ0JldHN5JyxcbiAgJ01hZGVsaW5lJyxcbl07XG5cbi8qKiBOYW1lcyB0aGF0IGNhbiBuZXZlciBiZSBhc3NpZ25lZCB0byBhIGxlYWRlciBzZXNzaW9uICovXG5jb25zdCBGT0xMT1dFUl9PTkxZX05BTUVTID0gbmV3IFNldChbJ1B1bmNoJ10pO1xuXG4vKiogRmlzaGVyLVlhdGVzIHNodWZmbGUgdXNpbmcgY3J5cHRvLnJhbmRvbUludCAodW5iaWFzZWQsIG5vIG1vZHVsbykgKi9cbmZ1bmN0aW9uIHNodWZmbGVBcnJheTxUPihhcnI6IFRbXSk6IFRbXSB7XG4gIGZvciAobGV0IGkgPSBhcnIubGVuZ3RoIC0gMTsgaSA+IDA7IGktLSkge1xuICAgIGNvbnN0IGogPSByYW5kb21JbnQoaSArIDEpO1xuICAgIFthcnJbaV0sIGFycltqXV0gPSBbYXJyW2pdLCBhcnJbaV1dO1xuICB9XG4gIHJldHVybiBhcnI7XG59XG5cbi8qKiBTaHVmZmxlZCBjb3B5IG9mIHRoZSBuYW1lIHBvb2wg4oCUIHJhbmRvbWl6ZWQgb24gZWFjaCBwcm9jZXNzIHN0YXJ0ICovXG5jb25zdCBQVVBQRVRfTkFNRVM6IHN0cmluZ1tdID0gc2h1ZmZsZUFycmF5KFsuLi5BTExfUFVQUEVUX05BTUVTXSk7XG5cbi8qKlxuICogQ2Fub25pY2FsIGNvbG9ycyBmb3IgZWFjaCBwdXBwZXQgY2hhcmFjdGVyLlxuICogQWRqdXN0ZWQgZnJvbSB0cnVlIGNhbm9uaWNhbCBjb2xvcnMgZm9yIFVJIHJlYWRhYmlsaXR5IGluIGJvdGggbGlnaHQvZGFyayB0aGVtZXMuXG4gKi9cbmNvbnN0IFBVUFBFVF9DT0xPUlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICdQdW5jaCc6ICAgICAgICAnI0RDMTQzQycsIC8vIGNyaW1zb24gcmVkIGNvc3R1bWVcbiAgJ0p1ZHknOiAgICAgICAgICcjMUU5MEZGJywgLy8gYmx1ZSBkcmVzc1xuICAnUGlub2NjaGlvJzogICAgJyNEQUE1MjAnLCAvLyBnb2xkZW5yb2QgKHdvb2RlbiwgeWVsbG93IGhhdClcbiAgJ1BldHJvdWNoa2EnOiAgICcjQjBCRUM1JywgLy8gYmx1ZS1ncmF5ICh3aGl0ZSBjb3N0dW1lLCBhZGp1c3RlZCBmb3IgdmlzaWJpbGl0eSlcbiAgJ1B1bGNpbmVsbGEnOiAgICcjOTBBNEFFJywgLy8gZ3JheS1ibHVlICh3aGl0ZSBjb3N0dW1lLCBhZGp1c3RlZClcbiAgJ0d1aWdub2wnOiAgICAgICcjOEI0NTEzJywgLy8gc2FkZGxlIGJyb3duXG4gICdLYXNwZXJsZSc6ICAgICAnI0ZGMDAwMCcsIC8vIHJlZCBwb2ludGVkIGNhcFxuICAnS2VybWl0JzogICAgICAgJyM0Q0FGNTAnLCAvLyBncmVlbiBmcm9nXG4gICdQaWdneSc6ICAgICAgICAnI0U5MUU4QycsIC8vIGhvdCBwaW5rIChnbGFtb3JvdXMgcGlnKVxuICAnRm96emllJzogICAgICAgJyNDQzc3MjInLCAvLyBvY2hyZSBicm93biBiZWFyXG4gICdHb256byc6ICAgICAgICAnIzQxNjlFMScsIC8vIHJveWFsIGJsdWVcbiAgJ1Njb290ZXInOiAgICAgICcjRkY4QzAwJywgLy8gZGFyayBvcmFuZ2VcbiAgJ1Jvd2xmJzogICAgICAgICcjOEI2OTE0JywgLy8gZGFyayBnb2xkZW5yb2QgYnJvd24gZG9nXG4gICdXYWxkb3JmJzogICAgICAnIzU1NkIyRicsIC8vIGRhcmsgb2xpdmUgZ3JlZW5cbiAgJ1N0YXRsZXInOiAgICAgICcjNzA4MDkwJywgLy8gc2xhdGUgZ3JheVxuICAnS3VrbGEnOiAgICAgICAgJyNGRjAwMDAnLCAvLyByZWQgbm9zZSBhbmQgY29zdHVtZVxuICAnT2xsaWUnOiAgICAgICAgJyMyMjhCMjInLCAvLyBmb3Jlc3QgZ3JlZW4gZHJhZ29uXG4gICdIb3dkeSc6ICAgICAgICAnI0UyNzI1QicsIC8vIHRlcnJhIGNvdHRhXG4gICdDbGFyYWJlbGwnOiAgICAnI0ZGQ0MwMCcsIC8vIGJyaWdodCB5ZWxsb3cgY2xvd25cbiAgJ0dyb3Zlcic6ICAgICAgICcjNDY4MkI0JywgLy8gc3RlZWwgYmx1ZVxuICAnRWxtbyc6ICAgICAgICAgJyNGRjI0MDAnLCAvLyBzY2FybGV0IHJlZFxuICAnRXJuaWUnOiAgICAgICAgJyNGNEE0NjAnLCAvLyBzYW5keSBicm93blxuICAnQmVydCc6ICAgICAgICAgJyNGRkQ3MDAnLCAvLyBnb2xkIHllbGxvd1xuICAnT3NjYXInOiAgICAgICAgJyM2QjhFMjMnLCAvLyBvbGl2ZSBkcmFiIGdyZWVuXG4gICdNb3J0aW1lcic6ICAgICAnI0RFQjg4NycsIC8vIGJ1cmx5d29vZFxuICAnTGFtYmNob3AnOiAgICAgJyNENEM1QTknLCAvLyB3YXJtIGNyZWFtIChhZGp1c3RlZCBmcm9tIHB1cmUgd2hpdGUpXG4gICdNYWRhbWUnOiAgICAgICAnIzgwMDA4MCcsIC8vIHB1cnBsZVxuICAnVG9wbyc6ICAgICAgICAgJyNBMEEwQTAnLCAvLyBzaWx2ZXIgZ3JheVxuICAnQnVucmFrdSc6ICAgICAgJyNCMjIyMjInLCAvLyBmaXJlYnJpY2sgcmVkXG4gICdXYXlhbmcnOiAgICAgICAnIzZCNDIyNicsIC8vIGRhcmsgbGVhdGhlciBicm93biAobGlnaHRlbmVkIGZvciB2aXNpYmlsaXR5KVxuICAnUGV0cnVzaGthJzogICAgJyNGRjQ1MDAnLCAvLyBvcmFuZ2UgcmVkXG4gICdIYW5uZXNjaGVuJzogICAnI0NENUM1QycsIC8vIGluZGlhbiByZWRcbiAgJ1ZpdGV6c2xhdic6ICAgICcjQjg4NjBCJywgLy8gZGFyayBnb2xkZW5yb2RcbiAgJ1NhbGVtJzogICAgICAgICcjNEE0QTRBJywgLy8gZGFyayBncmF5IChibGFjayBjYXQsIGxpZ2h0ZW5lZCBmb3IgdmlzaWJpbGl0eSlcbiAgJ1RyaXVtcGgnOiAgICAgICcjNkY0RTM3JywgLy8gY29mZmVlIGJyb3duXG4gICdQZWFudXQnOiAgICAgICAnIzkzNzBEQicsIC8vIG1lZGl1bSBwdXJwbGVcbiAgJ0FjaG1lZCc6ICAgICAgICcjQzhCRkE5JywgLy8gYm9uZS9wYXJjaG1lbnQgKGxpZ2h0ZW5lZCBmcm9tIGJlaWdlKVxuICAnRmFudG9jY2luaSc6ICAgJyNDNDFFM0EnLCAvLyBjYXJkaW5hbCByZWRcbiAgJ1NhbHRpbWJhbnF1ZSc6ICcjREFBNTIwJywgLy8gZ29sZGVucm9kXG4gICdCdXJhdHRpbm8nOiAgICAnI0QyNjkxRScsIC8vIGNob2NvbGF0ZSBicm93blxuICAnSGFybGVxdWluJzogICAgJyNFNjAwMjYnLCAvLyBkaWFtb25kIHJlZFxuICAnRWNobyc6ICAgICAgICAgJyM1QzYzNzAnLCAvLyBzbGF0ZSAoZGFyayBhdHRpcmUsIGxpZ2h0ZW5lZCBmb3IgdmlzaWJpbGl0eSlcbiAgJ1NwaWtlJzogICAgICAgICcjRThEQ0M4JywgLy8gcGxhdGludW0vYmxlYWNoIChsaWdodGVuZWQgZm9yIHJlYWRhYmlsaXR5KVxuICAnQW5nZWwnOiAgICAgICAgJyMzRDNEM0QnLCAvLyBjaGFyY29hbCAoYmxhY2sgZHVzdGVyLCBsaWdodGVuZWQgZm9yIHZpc2liaWxpdHkpXG5cbiAgLy8gQ2xhc3NpYyBkb2xsc1xuICAnQmFyYmllJzogICAgICAgJyNFOTFFOTAnLCAvLyBCYXJiaWUgcGlua1xuICAnS2VuJzogICAgICAgICAgJyM0QTkwRDknLCAvLyBLZW4gYmx1ZVxuICAnU2tpcHBlcic6ICAgICAgJyNGRjZCNkInLCAvLyBjb3JhbCByZWRcbiAgJ01pZGdlJzogICAgICAgICcjRTg3MDQwJywgLy8gd2FybSBhdWJ1cm5cbiAgJ0NocmlzdGllJzogICAgICcjQzA2MDMwJywgLy8gd2FybSBicm93blxuICAnQW5uaWUnOiAgICAgICAgJyNFMDMwMzAnLCAvLyBSYWdnZWR5IEFubiByZWQgeWFybiBoYWlyXG4gICdBbmR5JzogICAgICAgICAnIzMwNzBDMCcsIC8vIFJhZ2dlZHkgQW5keSBibHVlIHNhaWxvciBvdXRmaXRcbiAgJ0NhdGh5JzogICAgICAgICcjRDRBNTc0JywgLy8gQ2hhdHR5IENhdGh5IHZpbnRhZ2UgdGFuXG4gICdUZWRkeSc6ICAgICAgICAnI0EwNzg0QScsIC8vIFRlZGR5IFJ1eHBpbiBiZWFyIGJyb3duXG4gICdYYXZpZXInOiAgICAgICAnIzVBQUY0QScsIC8vIFhhdmllciBSb2JlcnRzIC8gQ2FiYmFnZSBQYXRjaCBncmVlblxuICAnU3RyYXdiZXJyeSc6ICAgJyNFODQ0NUEnLCAvLyBzdHJhd2JlcnJ5IHJlZC1waW5rXG4gICdCbHl0aGUnOiAgICAgICAnIzdCNjhFRScsIC8vIGJpZy1leWVkIHB1cnBsZVxuICAnR2lubnknOiAgICAgICAgJyM1QjlCRDUnLCAvLyBjbGFzc2ljIGJsdWUgZHJlc3NcbiAgJ0JldHN5JzogICAgICAgICcjREQ3Njk0JywgLy8gcm9zZSBwaW5rXG4gICdNYWRlbGluZSc6ICAgICAnI0ZGRDcwMCcsIC8vIHllbGxvdyBoYXRcbn07XG5cbi8qKiBDb29sZG93biBwZXJpb2QgYmVmb3JlIGEgcmVsZWFzZWQgbmFtZSBjYW4gYmUgcmV1c2VkIChtcykgKi9cbmNvbnN0IE5BTUVfQ09PTERPV05fTVMgPSA1ICogNjBfMDAwOyAvLyA1IG1pbnV0ZXNcblxuaW50ZXJmYWNlIENvb2xkb3duRW50cnkge1xuICBuYW1lOiBzdHJpbmc7XG4gIHJlbGVhc2VkQXQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBNYW5hZ2VzIGZyaWVuZGx5IHNlc3Npb24gbmFtZSBhc3NpZ25tZW50IGZyb20gdGhlIHB1cHBldCBuYW1lIHBvb2wuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXNzaW9uTmFtZVBvb2wge1xuICAvKiogTmFtZXMgY3VycmVudGx5IGFzc2lnbmVkIHRvIGFjdGl2ZSBzZXNzaW9uczogc2Vzc2lvbklkIOKGkiBuYW1lICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYXNzaWduZWQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAvKiogUmV2ZXJzZSBsb29rdXA6IG5hbWUg4oaSIHNlc3Npb25JZCAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG5hbWVUb1Nlc3Npb24gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAvKiogTmFtZXMgaW4gY29vbGRvd24gYWZ0ZXIgc2Vzc2lvbiBlbmQgKi9cbiAgcHJpdmF0ZSBjb29sZG93bjogQ29vbGRvd25FbnRyeVtdID0gW107XG5cbiAgLyoqXG4gICAqIEFzc2lnbiBhIGZyaWVuZGx5IG5hbWUgdG8gYSBzZXNzaW9uLlxuICAgKiBSZXR1cm5zIGFuIGV4aXN0aW5nIGFzc2lnbm1lbnQgaWYgdGhlIHNlc3Npb24gYWxyZWFkeSBoYXMgb25lLlxuICAgKlxuICAgKiBAcGFyYW0gaXNMZWFkZXIgLSBJZiB0cnVlLCBmb2xsb3dlci1vbmx5IG5hbWVzIChlLmcuLCBQdW5jaCkgYXJlIGV4Y2x1ZGVkXG4gICAqL1xuICBhc3NpZ24oc2Vzc2lvbklkOiBzdHJpbmcsIGlzTGVhZGVyID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIC8vIEFscmVhZHkgYXNzaWduZWQ/XG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLmFzc2lnbmVkLmdldChzZXNzaW9uSWQpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuXG4gICAgLy8gRmx1c2ggZXhwaXJlZCBjb29sZG93bnNcbiAgICB0aGlzLmZsdXNoQ29vbGRvd25zKCk7XG5cbiAgICAvLyBGaW5kIGFuIGF2YWlsYWJsZSBuYW1lLCByZXNwZWN0aW5nIGxlYWRlciByZXN0cmljdGlvbnNcbiAgICBjb25zdCBjb29sZG93bk5hbWVzID0gbmV3IFNldCh0aGlzLmNvb2xkb3duLm1hcChjID0+IGMubmFtZSkpO1xuICAgIGNvbnN0IGF2YWlsYWJsZU5hbWUgPSBQVVBQRVRfTkFNRVMuZmluZChcbiAgICAgIG5hbWUgPT4gIXRoaXMubmFtZVRvU2Vzc2lvbi5oYXMobmFtZSkgJiZcbiAgICAgICAgICAgICAgIWNvb2xkb3duTmFtZXMuaGFzKG5hbWUpICYmXG4gICAgICAgICAgICAgICEoaXNMZWFkZXIgJiYgRk9MTE9XRVJfT05MWV9OQU1FUy5oYXMobmFtZSkpXG4gICAgKTtcblxuICAgIGlmIChhdmFpbGFibGVOYW1lKSB7XG4gICAgICB0aGlzLmFzc2lnbmVkLnNldChzZXNzaW9uSWQsIGF2YWlsYWJsZU5hbWUpO1xuICAgICAgdGhpcy5uYW1lVG9TZXNzaW9uLnNldChhdmFpbGFibGVOYW1lLCBzZXNzaW9uSWQpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBbU2Vzc2lvbk5hbWVzXSBBc3NpZ25lZCAnJHthdmFpbGFibGVOYW1lfScgdG8gJHtzZXNzaW9uSWR9YCk7XG4gICAgICByZXR1cm4gYXZhaWxhYmxlTmFtZTtcbiAgICB9XG5cbiAgICAvLyBBbGwgbmFtZXMgaW4gdXNlIG9yIGNvb2xpbmcgZG93biDigJQgdHJ5IGNvb2xkb3duIG5hbWVzIChvbGRlc3QgZmlyc3QpXG4gICAgaWYgKHRoaXMuY29vbGRvd24ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5jb29sZG93bi5zaGlmdCgpITtcbiAgICAgIHRoaXMuYXNzaWduZWQuc2V0KHNlc3Npb25JZCwgb2xkZXN0Lm5hbWUpO1xuICAgICAgdGhpcy5uYW1lVG9TZXNzaW9uLnNldChvbGRlc3QubmFtZSwgc2Vzc2lvbklkKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW1Nlc3Npb25OYW1lc10gQXNzaWduZWQgJyR7b2xkZXN0Lm5hbWV9JyB0byAke3Nlc3Npb25JZH0gKGVhcmx5IGNvb2xkb3duIHJlbGVhc2UpYCk7XG4gICAgICByZXR1cm4gb2xkZXN0Lm5hbWU7XG4gICAgfVxuXG4gICAgLy8gVHJ1bHkgZXhoYXVzdGVkIOKAlCBmYWxsIGJhY2sgdG8gdHJ1bmNhdGVkIHNlc3Npb24gSURcbiAgICBjb25zdCBmYWxsYmFjayA9IHNlc3Npb25JZC5zcGxpdCgnLScpWzFdIHx8IHNlc3Npb25JZC5zbGljZSgwLCA4KTtcbiAgICB0aGlzLmFzc2lnbmVkLnNldChzZXNzaW9uSWQsIGZhbGxiYWNrKTtcbiAgICBsb2dnZXIud2FybihgW1Nlc3Npb25OYW1lc10gTmFtZSBwb29sIGV4aGF1c3RlZCwgdXNpbmcgZmFsbGJhY2sgJyR7ZmFsbGJhY2t9JyBmb3IgJHtzZXNzaW9uSWR9YCk7XG4gICAgcmV0dXJuIGZhbGxiYWNrO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2UgYSBuYW1lIGJhY2sgdG8gdGhlIHBvb2wgd2l0aCBhIGNvb2xkb3duIHBlcmlvZC5cbiAgICovXG4gIHJlbGVhc2Uoc2Vzc2lvbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5hc3NpZ25lZC5nZXQoc2Vzc2lvbklkKTtcbiAgICBpZiAoIW5hbWUpIHJldHVybjtcblxuICAgIHRoaXMuYXNzaWduZWQuZGVsZXRlKHNlc3Npb25JZCk7XG4gICAgdGhpcy5uYW1lVG9TZXNzaW9uLmRlbGV0ZShuYW1lKTtcblxuICAgIC8vIE9ubHkgY29vbGRvd24gcHVwcGV0IG5hbWVzLCBub3QgZmFsbGJhY2sgSURzXG4gICAgaWYgKFBVUFBFVF9OQU1FUy5pbmNsdWRlcyhuYW1lKSkge1xuICAgICAgdGhpcy5jb29sZG93bi5wdXNoKHsgbmFtZSwgcmVsZWFzZWRBdDogRGF0ZS5ub3coKSB9KTtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoYFtTZXNzaW9uTmFtZXNdIFJlbGVhc2VkICcke25hbWV9JyBmcm9tICR7c2Vzc2lvbklkfSAoY29vbGRvd24gJHtOQU1FX0NPT0xET1dOX01TIC8gMTAwMH1zKWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZnJpZW5kbHkgbmFtZSBmb3IgYSBzZXNzaW9uLCBvciB1bmRlZmluZWQgaWYgbm90IGFzc2lnbmVkLlxuICAgKi9cbiAgZ2V0TmFtZShzZXNzaW9uSWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYXNzaWduZWQuZ2V0KHNlc3Npb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjYW5vbmljYWwgY29sb3IgZm9yIGFuIGFzc2lnbmVkIHNlc3Npb24gbmFtZS5cbiAgICovXG4gIGdldENvbG9yKHNlc3Npb25JZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5hc3NpZ25lZC5nZXQoc2Vzc2lvbklkKTtcbiAgICByZXR1cm4gbmFtZSA/IChQVVBQRVRfQ09MT1JTW25hbWVdID8/IHVuZGVmaW5lZCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCBjdXJyZW50IGFzc2lnbm1lbnRzLlxuICAgKi9cbiAgZ2V0QWxsKCk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgTWFwKHRoaXMuYXNzaWduZWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbHVzaENvb2xkb3ducygpOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuY29vbGRvd24gPSB0aGlzLmNvb2xkb3duLmZpbHRlcihjID0+IChub3cgLSBjLnJlbGVhc2VkQXQpIDwgTkFNRV9DT09MRE9XTl9NUyk7XG4gIH1cbn1cbiJdfQ==
266
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2Vzc2lvbk5hbWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dlYi9jb25zb2xlL1Nlc3Npb25OYW1lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFFSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQzs7O0dBR0c7QUFDSCxNQUFNLGdCQUFnQixHQUFzQjtJQUMxQyx3QkFBd0I7SUFDeEIsT0FBTztJQUNQLE1BQU07SUFDTixXQUFXO0lBQ1gsWUFBWTtJQUNaLFlBQVk7SUFDWixTQUFTO0lBQ1QsVUFBVTtJQUVWLHVCQUF1QjtJQUN2QixRQUFRO0lBQ1IsT0FBTztJQUNQLFFBQVE7SUFDUixPQUFPO0lBQ1AsU0FBUztJQUNULE9BQU87SUFDUCxTQUFTO0lBQ1QsU0FBUztJQUVULHdCQUF3QjtJQUN4QixPQUFPO0lBQ1AsT0FBTztJQUVQLGtCQUFrQjtJQUNsQixPQUFPO0lBQ1AsV0FBVztJQUVYLGdCQUFnQjtJQUNoQixRQUFRO0lBQ1IsTUFBTTtJQUNOLE9BQU87SUFDUCxNQUFNO0lBQ04sT0FBTztJQUVQLDBCQUEwQjtJQUMxQixVQUFVO0lBQ1YsVUFBVTtJQUNWLFFBQVE7SUFDUixNQUFNO0lBRU4seUJBQXlCO0lBQ3pCLFNBQVM7SUFDVCxRQUFRO0lBQ1IsV0FBVztJQUNYLFlBQVk7SUFDWixXQUFXO0lBRVgsdUJBQXVCO0lBQ3ZCLE9BQU87SUFDUCxTQUFTO0lBQ1QsUUFBUTtJQUNSLFFBQVE7SUFFUix3QkFBd0I7SUFDeEIsWUFBWTtJQUNaLGNBQWM7SUFDZCxXQUFXO0lBQ1gsV0FBVztJQUVYLHdCQUF3QjtJQUN4QixNQUFNO0lBRU4sZUFBZTtJQUNmLE9BQU87SUFDUCxPQUFPO0lBRVAsZ0JBQWdCO0lBQ2hCLFFBQVE7SUFDUixLQUFLO0lBQ0wsU0FBUztJQUNULE9B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LENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUM7SUFDckYsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGcmllbmRseSBzZXNzaW9uIG5hbWVzIGRyYXduIGZyb20gZmFtb3VzIHB1cHBldHMsIG1hcmlvbmV0dGVzLFxuICogYW5kIHB1cHBldCBjaGFyYWN0ZXJzIHRocm91Z2hvdXQgaGlzdG9yeS5cbiAqXG4gKiBOYW1lcyBhcmUgYXNzaWduZWQgZnJvbSBhIHBvb2wgYW5kIHJldHVybmVkIGFmdGVyIGEgY29vbGRvd24gcGVyaW9kXG4gKiB3aGVuIHNlc3Npb25zIGVuZC4gVGhpcyBrZWVwcyB0aGUgYWN0aXZlIHNlc3Npb24gbGlzdCBodW1hbi1yZWFkYWJsZVxuICogYW5kIG9uLWJyYW5kIGZvciBEb2xsaG91c2VNQ1AuXG4gKlxuICogQHNpbmNlIHYyLjEuMCDigJQgSXNzdWUgIzE3MDBcbiAqL1xuXG5pbXBvcnQgeyByYW5kb21JbnQgfSBmcm9tICdub2RlOmNyeXB0byc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuXG4vKipcbiAqIEZhbW91cyBwdXBwZXRzLCBtYXJpb25ldHRlcywgYW5kIHB1cHBldCBjaGFyYWN0ZXJzIGZyb20gYXJvdW5kIHRoZSB3b3JsZC5cbiAqIE9yZGVyIGRvZXNuJ3QgbWF0dGVyIOKAlCB0aGUgcG9vbCBpcyBzaHVmZmxlZCBvbiBzdGFydHVwLlxuICovXG5jb25zdCBBTExfUFVQUEVUX05BTUVTOiByZWFkb25seSBzdHJpbmdbXSA9IFtcbiAgLy8gQ2xhc3NpYyAmIHRyYWRpdGlvbmFsXG4gICdQdW5jaCcsXG4gICdKdWR5JyxcbiAgJ1Bpbm9jY2hpbycsXG4gICdQZXRyb3VjaGthJyxcbiAgJ1B1bGNpbmVsbGEnLFxuICAnR3VpZ25vbCcsXG4gICdLYXNwZXJsZScsXG5cbiAgLy8gTXVwcGV0cyAmIEppbSBIZW5zb25cbiAgJ0tlcm1pdCcsXG4gICdQaWdneScsXG4gICdGb3p6aWUnLFxuICAnR29uem8nLFxuICAnU2Nvb3RlcicsXG4gICdSb3dsZicsXG4gICdXYWxkb3JmJyxcbiAgJ1N0YXRsZXInLFxuXG4gIC8vIEt1a2xhLCBGcmFuIGFuZCBPbGxpZVxuICAnS3VrbGEnLFxuICAnT2xsaWUnLFxuXG4gIC8vIEhvd2R5IERvb2R5IGVyYVxuICAnSG93ZHknLFxuICAnQ2xhcmFiZWxsJyxcblxuICAvLyBTZXNhbWUgU3RyZWV0XG4gICdHcm92ZXInLFxuICAnRWxtbycsXG4gICdFcm5pZScsXG4gICdCZXJ0JyxcbiAgJ09zY2FyJyxcblxuICAvLyBWZW50cmlsb3F1aXN0ICYgdmFyaWV0eVxuICAnTW9ydGltZXInLFxuICAnTGFtYmNob3AnLFxuICAnTWFkYW1lJyxcbiAgJ1RvcG8nLFxuXG4gIC8vIEludGVybmF0aW9uYWwgcHVwcGV0cnlcbiAgJ0J1bnJha3UnLFxuICAnV2F5YW5nJyxcbiAgJ1BldHJ1c2hrYScsXG4gICdIYW5uZXNjaGVuJyxcbiAgJ1ZpdGV6c2xhdicsXG5cbiAgLy8gTW9kZXJuICYgcG9wIGN1bHR1cmVcbiAgJ1NhbGVtJyxcbiAgJ1RyaXVtcGgnLFxuICAnUGVhbnV0JyxcbiAgJ0FjaG1lZCcsXG5cbiAgLy8gTWFyaW9uZXR0ZSB0cmFkaXRpb25zXG4gICdGYW50b2NjaW5pJyxcbiAgJ1NhbHRpbWJhbnF1ZScsXG4gICdCdXJhdHRpbm8nLFxuICAnSGFybGVxdWluJyxcblxuICAvLyBEb2xsaG91c2UgKFRWIHNlcmllcylcbiAgJ0VjaG8nLFxuXG4gIC8vIEluc2lkZSBqb2tlc1xuICAnU3Bpa2UnLFxuICAnQW5nZWwnLFxuXG4gIC8vIENsYXNzaWMgZG9sbHNcbiAgJ0JhcmJpZScsXG4gICdLZW4nLFxuICAnU2tpcHBlcicsXG4gICdNaWRnZScsXG4gICdDaHJpc3RpZScsXG4gICdBbm5pZScsXG4gICdBbmR5JyxcbiAgJ0NhdGh5JyxcbiAgJ1RlZGR5JyxcbiAgJ1hhdmllcicsXG4gICdTdHJhd2JlcnJ5JyxcbiAgJ0JseXRoZScsXG4gICdHaW5ueScsXG4gICdCZXRzeScsXG4gICdNYWRlbGluZScsXG5dO1xuXG4vKiogTmFtZXMgdGhhdCBjYW4gbmV2ZXIgYmUgYXNzaWduZWQgdG8gYSBsZWFkZXIgc2Vzc2lvbiAqL1xuY29uc3QgRk9MTE9XRVJfT05MWV9OQU1FUyA9IG5ldyBTZXQoWydQdW5jaCddKTtcblxuLyoqIEZpc2hlci1ZYXRlcyBzaHVmZmxlIHVzaW5nIGNyeXB0by5yYW5kb21JbnQgKHVuYmlhc2VkLCBubyBtb2R1bG8pICovXG5mdW5jdGlvbiBzaHVmZmxlQXJyYXk8VD4oYXJyOiBUW10pOiBUW10ge1xuICBmb3IgKGxldCBpID0gYXJyLmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICBjb25zdCBqID0gcmFuZG9tSW50KGkgKyAxKTtcbiAgICBbYXJyW2ldLCBhcnJbal1dID0gW2FycltqXSwgYXJyW2ldXTtcbiAgfVxuICByZXR1cm4gYXJyO1xufVxuXG4vKiogU2h1ZmZsZWQgY29weSBvZiB0aGUgbmFtZSBwb29sIOKAlCByYW5kb21pemVkIG9uIGVhY2ggcHJvY2VzcyBzdGFydCAqL1xuY29uc3QgUFVQUEVUX05BTUVTOiBzdHJpbmdbXSA9IHNodWZmbGVBcnJheShbLi4uQUxMX1BVUFBFVF9OQU1FU10pO1xuXG4vKipcbiAqIFBpY2sgYSByYW5kb20gcHVwcGV0IG5hbWUgZnJvbSB0aGUgcG9vbCwgaW5kZXBlbmRlbnQgb2YgdGhlIHNlc3Npb25cbiAqIG5hbWUgYXNzaWdubWVudC4gVXNlZCBieSB0aGUgY29uc29sZSB0b2tlbiBtb2R1bGUgKCMxNzgwKSB0byBnZW5lcmF0ZVxuICogYSBmcmllbmRseSBkZWZhdWx0IG5hbWUgZm9yIG5ld2x5IGNyZWF0ZWQgdG9rZW5zLiBEb2VzIG5vdCByZXNlcnZlIHRoZVxuICogbmFtZSDigJQgbXVsdGlwbGUgY2FsbGVycyBjYW4gcmVjZWl2ZSB0aGUgc2FtZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBpY2tSYW5kb21QdXBwZXROYW1lKCk6IHN0cmluZyB7XG4gIHJldHVybiBBTExfUFVQUEVUX05BTUVTW3JhbmRvbUludChBTExfUFVQUEVUX05BTUVTLmxlbmd0aCldO1xufVxuXG4vKipcbiAqIENhbm9uaWNhbCBjb2xvcnMgZm9yIGVhY2ggcHVwcGV0IGNoYXJhY3Rlci5cbiAqIEFkanVzdGVkIGZyb20gdHJ1ZSBjYW5vbmljYWwgY29sb3JzIGZvciBVSSByZWFkYWJpbGl0eSBpbiBib3RoIGxpZ2h0L2RhcmsgdGhlbWVzLlxuICovXG5jb25zdCBQVVBQRVRfQ09MT1JTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAnUHVuY2gnOiAgICAgICAgJyNEQzE0M0MnLCAvLyBjcmltc29uIHJlZCBjb3N0dW1lXG4gICdKdWR5JzogICAgICAgICAnIzFFOTBGRicsIC8vIGJsdWUgZHJlc3NcbiAgJ1Bpbm9jY2hpbyc6ICAgICcjREFBNTIwJywgLy8gZ29sZGVucm9kICh3b29kZW4sIHllbGxvdyBoYXQpXG4gICdQZXRyb3VjaGthJzogICAnI0IwQkVDNScsIC8vIGJsdWUtZ3JheSAod2hpdGUgY29zdHVtZSwgYWRqdXN0ZWQgZm9yIHZpc2liaWxpdHkpXG4gICdQdWxjaW5lbGxhJzogICAnIzkwQTRBRScsIC8vIGdyYXktYmx1ZSAod2hpdGUgY29zdHVtZSwgYWRqdXN0ZWQpXG4gICdHdWlnbm9sJzogICAgICAnIzhCNDUxMycsIC8vIHNhZGRsZSBicm93blxuICAnS2FzcGVybGUnOiAgICAgJyNGRjAwMDAnLCAvLyByZWQgcG9pbnRlZCBjYXBcbiAgJ0tlcm1pdCc6ICAgICAgICcjNENBRjUwJywgLy8gZ3JlZW4gZnJvZ1xuICAnUGlnZ3knOiAgICAgICAgJyNFOTFFOEMnLCAvLyBob3QgcGluayAoZ2xhbW9yb3VzIHBpZylcbiAgJ0ZvenppZSc6ICAgICAgICcjQ0M3NzIyJywgLy8gb2NocmUgYnJvd24gYmVhclxuICAnR29uem8nOiAgICAgICAgJyM0MTY5RTEnLCAvLyByb3lhbCBibHVlXG4gICdTY29vdGVyJzogICAgICAnI0ZGOEMwMCcsIC8vIGRhcmsgb3JhbmdlXG4gICdSb3dsZic6ICAgICAgICAnIzhCNjkxNCcsIC8vIGRhcmsgZ29sZGVucm9kIGJyb3duIGRvZ1xuICAnV2FsZG9yZic6ICAgICAgJyM1NTZCMkYnLCAvLyBkYXJrIG9saXZlIGdyZWVuXG4gICdTdGF0bGVyJzogICAgICAnIzcwODA5MCcsIC8vIHNsYXRlIGdyYXlcbiAgJ0t1a2xhJzogICAgICAgICcjRkYwMDAwJywgLy8gcmVkIG5vc2UgYW5kIGNvc3R1bWVcbiAgJ09sbGllJzogICAgICAgICcjMjI4QjIyJywgLy8gZm9yZXN0IGdyZWVuIGRyYWdvblxuICAnSG93ZHknOiAgICAgICAgJyNFMjcyNUInLCAvLyB0ZXJyYSBjb3R0YVxuICAnQ2xhcmFiZWxsJzogICAgJyNGRkNDMDAnLCAvLyBicmlnaHQgeWVsbG93IGNsb3duXG4gICdHcm92ZXInOiAgICAgICAnIzQ2ODJCNCcsIC8vIHN0ZWVsIGJsdWVcbiAgJ0VsbW8nOiAgICAgICAgICcjRkYyNDAwJywgLy8gc2NhcmxldCByZWRcbiAgJ0VybmllJzogICAgICAgICcjRjRBNDYwJywgLy8gc2FuZHkgYnJvd25cbiAgJ0JlcnQnOiAgICAgICAgICcjRkZENzAwJywgLy8gZ29sZCB5ZWxsb3dcbiAgJ09zY2FyJzogICAgICAgICcjNkI4RTIzJywgLy8gb2xpdmUgZHJhYiBncmVlblxuICAnTW9ydGltZXInOiAgICAgJyNERUI4ODcnLCAvLyBidXJseXdvb2RcbiAgJ0xhbWJjaG9wJzogICAgICcjRDRDNUE5JywgLy8gd2FybSBjcmVhbSAoYWRqdXN0ZWQgZnJvbSBwdXJlIHdoaXRlKVxuICAnTWFkYW1lJzogICAgICAgJyM4MDAwODAnLCAvLyBwdXJwbGVcbiAgJ1RvcG8nOiAgICAgICAgICcjQTBBMEEwJywgLy8gc2lsdmVyIGdyYXlcbiAgJ0J1bnJha3UnOiAgICAgICcjQjIyMjIyJywgLy8gZmlyZWJyaWNrIHJlZFxuICAnV2F5YW5nJzogICAgICAgJyM2QjQyMjYnLCAvLyBkYXJrIGxlYXRoZXIgYnJvd24gKGxpZ2h0ZW5lZCBmb3IgdmlzaWJpbGl0eSlcbiAgJ1BldHJ1c2hrYSc6ICAgICcjRkY0NTAwJywgLy8gb3JhbmdlIHJlZFxuICAnSGFubmVzY2hlbic6ICAgJyNDRDVDNUMnLCAvLyBpbmRpYW4gcmVkXG4gICdWaXRlenNsYXYnOiAgICAnI0I4ODYwQicsIC8vIGRhcmsgZ29sZGVucm9kXG4gICdTYWxlbSc6ICAgICAgICAnIzRBNEE0QScsIC8vIGRhcmsgZ3JheSAoYmxhY2sgY2F0LCBsaWdodGVuZWQgZm9yIHZpc2liaWxpdHkpXG4gICdUcml1bXBoJzogICAgICAnIzZGNEUzNycsIC8vIGNvZmZlZSBicm93blxuICAnUGVhbnV0JzogICAgICAgJyM5MzcwREInLCAvLyBtZWRpdW0gcHVycGxlXG4gICdBY2htZWQnOiAgICAgICAnI0M4QkZBOScsIC8vIGJvbmUvcGFyY2htZW50IChsaWdodGVuZWQgZnJvbSBiZWlnZSlcbiAgJ0ZhbnRvY2NpbmknOiAgICcjQzQxRTNBJywgLy8gY2FyZGluYWwgcmVkXG4gICdTYWx0aW1iYW5xdWUnOiAnI0RBQTUyMCcsIC8vIGdvbGRlbnJvZFxuICAnQnVyYXR0aW5vJzogICAgJyNEMjY5MUUnLCAvLyBjaG9jb2xhdGUgYnJvd25cbiAgJ0hhcmxlcXVpbic6ICAgICcjRTYwMDI2JywgLy8gZGlhbW9uZCByZWRcbiAgJ0VjaG8nOiAgICAgICAgICcjNUM2MzcwJywgLy8gc2xhdGUgKGRhcmsgYXR0aXJlLCBsaWdodGVuZWQgZm9yIHZpc2liaWxpdHkpXG4gICdTcGlrZSc6ICAgICAgICAnI0U4RENDOCcsIC8vIHBsYXRpbnVtL2JsZWFjaCAobGlnaHRlbmVkIGZvciByZWFkYWJpbGl0eSlcbiAgJ0FuZ2VsJzogICAgICAgICcjM0QzRDNEJywgLy8gY2hhcmNvYWwgKGJsYWNrIGR1c3RlciwgbGlnaHRlbmVkIGZvciB2aXNpYmlsaXR5KVxuXG4gIC8vIENsYXNzaWMgZG9sbHNcbiAgJ0JhcmJpZSc6ICAgICAgICcjRTkxRTkwJywgLy8gQmFyYmllIHBpbmtcbiAgJ0tlbic6ICAgICAgICAgICcjNEE5MEQ5JywgLy8gS2VuIGJsdWVcbiAgJ1NraXBwZXInOiAgICAgICcjRkY2QjZCJywgLy8gY29yYWwgcmVkXG4gICdNaWRnZSc6ICAgICAgICAnI0U4NzA0MCcsIC8vIHdhcm0gYXVidXJuXG4gICdDaHJpc3RpZSc6ICAgICAnI0MwNjAzMCcsIC8vIHdhcm0gYnJvd25cbiAgJ0FubmllJzogICAgICAgICcjRTAzMDMwJywgLy8gUmFnZ2VkeSBBbm4gcmVkIHlhcm4gaGFpclxuICAnQW5keSc6ICAgICAgICAgJyMzMDcwQzAnLCAvLyBSYWdnZWR5IEFuZHkgYmx1ZSBzYWlsb3Igb3V0Zml0XG4gICdDYXRoeSc6ICAgICAgICAnI0Q0QTU3NCcsIC8vIENoYXR0eSBDYXRoeSB2aW50YWdlIHRhblxuICAnVGVkZHknOiAgICAgICAgJyNBMDc4NEEnLCAvLyBUZWRkeSBSdXhwaW4gYmVhciBicm93blxuICAnWGF2aWVyJzogICAgICAgJyM1QUFGNEEnLCAvLyBYYXZpZXIgUm9iZXJ0cyAvIENhYmJhZ2UgUGF0Y2ggZ3JlZW5cbiAgJ1N0cmF3YmVycnknOiAgICcjRTg0NDVBJywgLy8gc3RyYXdiZXJyeSByZWQtcGlua1xuICAnQmx5dGhlJzogICAgICAgJyM3QjY4RUUnLCAvLyBiaWctZXllZCBwdXJwbGVcbiAgJ0dpbm55JzogICAgICAgICcjNUI5QkQ1JywgLy8gY2xhc3NpYyBibHVlIGRyZXNzXG4gICdCZXRzeSc6ICAgICAgICAnI0RENzY5NCcsIC8vIHJvc2UgcGlua1xuICAnTWFkZWxpbmUnOiAgICAgJyNGRkQ3MDAnLCAvLyB5ZWxsb3cgaGF0XG59O1xuXG4vKiogQ29vbGRvd24gcGVyaW9kIGJlZm9yZSBhIHJlbGVhc2VkIG5hbWUgY2FuIGJlIHJldXNlZCAobXMpICovXG5jb25zdCBOQU1FX0NPT0xET1dOX01TID0gNSAqIDYwXzAwMDsgLy8gNSBtaW51dGVzXG5cbmludGVyZmFjZSBDb29sZG93bkVudHJ5IHtcbiAgbmFtZTogc3RyaW5nO1xuICByZWxlYXNlZEF0OiBudW1iZXI7XG59XG5cbi8qKlxuICogTWFuYWdlcyBmcmllbmRseSBzZXNzaW9uIG5hbWUgYXNzaWdubWVudCBmcm9tIHRoZSBwdXBwZXQgbmFtZSBwb29sLlxuICovXG5leHBvcnQgY2xhc3MgU2Vzc2lvbk5hbWVQb29sIHtcbiAgLyoqIE5hbWVzIGN1cnJlbnRseSBhc3NpZ25lZCB0byBhY3RpdmUgc2Vzc2lvbnM6IHNlc3Npb25JZCDihpIgbmFtZSAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGFzc2lnbmVkID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgLyoqIFJldmVyc2UgbG9va3VwOiBuYW1lIOKGkiBzZXNzaW9uSWQgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBuYW1lVG9TZXNzaW9uID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgLyoqIE5hbWVzIGluIGNvb2xkb3duIGFmdGVyIHNlc3Npb24gZW5kICovXG4gIHByaXZhdGUgY29vbGRvd246IENvb2xkb3duRW50cnlbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBBc3NpZ24gYSBmcmllbmRseSBuYW1lIHRvIGEgc2Vzc2lvbi5cbiAgICogUmV0dXJucyBhbiBleGlzdGluZyBhc3NpZ25tZW50IGlmIHRoZSBzZXNzaW9uIGFscmVhZHkgaGFzIG9uZS5cbiAgICpcbiAgICogQHBhcmFtIGlzTGVhZGVyIC0gSWYgdHJ1ZSwgZm9sbG93ZXItb25seSBuYW1lcyAoZS5nLiwgUHVuY2gpIGFyZSBleGNsdWRlZFxuICAgKi9cbiAgYXNzaWduKHNlc3Npb25JZDogc3RyaW5nLCBpc0xlYWRlciA9IGZhbHNlKTogc3RyaW5nIHtcbiAgICAvLyBBbHJlYWR5IGFzc2lnbmVkP1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5hc3NpZ25lZC5nZXQoc2Vzc2lvbklkKTtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcblxuICAgIC8vIEZsdXNoIGV4cGlyZWQgY29vbGRvd25zXG4gICAgdGhpcy5mbHVzaENvb2xkb3ducygpO1xuXG4gICAgLy8gRmluZCBhbiBhdmFpbGFibGUgbmFtZSwgcmVzcGVjdGluZyBsZWFkZXIgcmVzdHJpY3Rpb25zXG4gICAgY29uc3QgY29vbGRvd25OYW1lcyA9IG5ldyBTZXQodGhpcy5jb29sZG93bi5tYXAoYyA9PiBjLm5hbWUpKTtcbiAgICBjb25zdCBhdmFpbGFibGVOYW1lID0gUFVQUEVUX05BTUVTLmZpbmQoXG4gICAgICBuYW1lID0+ICF0aGlzLm5hbWVUb1Nlc3Npb24uaGFzKG5hbWUpICYmXG4gICAgICAgICAgICAgICFjb29sZG93bk5hbWVzLmhhcyhuYW1lKSAmJlxuICAgICAgICAgICAgICAhKGlzTGVhZGVyICYmIEZPTExPV0VSX09OTFlfTkFNRVMuaGFzKG5hbWUpKVxuICAgICk7XG5cbiAgICBpZiAoYXZhaWxhYmxlTmFtZSkge1xuICAgICAgdGhpcy5hc3NpZ25lZC5zZXQoc2Vzc2lvbklkLCBhdmFpbGFibGVOYW1lKTtcbiAgICAgIHRoaXMubmFtZVRvU2Vzc2lvbi5zZXQoYXZhaWxhYmxlTmFtZSwgc2Vzc2lvbklkKTtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhgW1Nlc3Npb25OYW1lc10gQXNzaWduZWQgJyR7YXZhaWxhYmxlTmFtZX0nIHRvICR7c2Vzc2lvbklkfWApO1xuICAgICAgcmV0dXJuIGF2YWlsYWJsZU5hbWU7XG4gICAgfVxuXG4gICAgLy8gQWxsIG5hbWVzIGluIHVzZSBvciBjb29saW5nIGRvd24g4oCUIHRyeSBjb29sZG93biBuYW1lcyAob2xkZXN0IGZpcnN0KVxuICAgIGlmICh0aGlzLmNvb2xkb3duLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG9sZGVzdCA9IHRoaXMuY29vbGRvd24uc2hpZnQoKSE7XG4gICAgICB0aGlzLmFzc2lnbmVkLnNldChzZXNzaW9uSWQsIG9sZGVzdC5uYW1lKTtcbiAgICAgIHRoaXMubmFtZVRvU2Vzc2lvbi5zZXQob2xkZXN0Lm5hbWUsIHNlc3Npb25JZCk7XG4gICAgICBsb2dnZXIuZGVidWcoYFtTZXNzaW9uTmFtZXNdIEFzc2lnbmVkICcke29sZGVzdC5uYW1lfScgdG8gJHtzZXNzaW9uSWR9IChlYXJseSBjb29sZG93biByZWxlYXNlKWApO1xuICAgICAgcmV0dXJuIG9sZGVzdC5uYW1lO1xuICAgIH1cblxuICAgIC8vIFRydWx5IGV4aGF1c3RlZCDigJQgZmFsbCBiYWNrIHRvIHRydW5jYXRlZCBzZXNzaW9uIElEXG4gICAgY29uc3QgZmFsbGJhY2sgPSBzZXNzaW9uSWQuc3BsaXQoJy0nKVsxXSB8fCBzZXNzaW9uSWQuc2xpY2UoMCwgOCk7XG4gICAgdGhpcy5hc3NpZ25lZC5zZXQoc2Vzc2lvbklkLCBmYWxsYmFjayk7XG4gICAgbG9nZ2VyLndhcm4oYFtTZXNzaW9uTmFtZXNdIE5hbWUgcG9vbCBleGhhdXN0ZWQsIHVzaW5nIGZhbGxiYWNrICcke2ZhbGxiYWNrfScgZm9yICR7c2Vzc2lvbklkfWApO1xuICAgIHJldHVybiBmYWxsYmFjaztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlIGEgbmFtZSBiYWNrIHRvIHRoZSBwb29sIHdpdGggYSBjb29sZG93biBwZXJpb2QuXG4gICAqL1xuICByZWxlYXNlKHNlc3Npb25JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuYXNzaWduZWQuZ2V0KHNlc3Npb25JZCk7XG4gICAgaWYgKCFuYW1lKSByZXR1cm47XG5cbiAgICB0aGlzLmFzc2lnbmVkLmRlbGV0ZShzZXNzaW9uSWQpO1xuICAgIHRoaXMubmFtZVRvU2Vzc2lvbi5kZWxldGUobmFtZSk7XG5cbiAgICAvLyBPbmx5IGNvb2xkb3duIHB1cHBldCBuYW1lcywgbm90IGZhbGxiYWNrIElEc1xuICAgIGlmIChQVVBQRVRfTkFNRVMuaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgIHRoaXMuY29vbGRvd24ucHVzaCh7IG5hbWUsIHJlbGVhc2VkQXQ6IERhdGUubm93KCkgfSk7XG4gICAgfVxuXG4gICAgbG9nZ2VyLmRlYnVnKGBbU2Vzc2lvbk5hbWVzXSBSZWxlYXNlZCAnJHtuYW1lfScgZnJvbSAke3Nlc3Npb25JZH0gKGNvb2xkb3duICR7TkFNRV9DT09MRE9XTl9NUyAvIDEwMDB9cylgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZyaWVuZGx5IG5hbWUgZm9yIGEgc2Vzc2lvbiwgb3IgdW5kZWZpbmVkIGlmIG5vdCBhc3NpZ25lZC5cbiAgICovXG4gIGdldE5hbWUoc2Vzc2lvbklkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmFzc2lnbmVkLmdldChzZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY2Fub25pY2FsIGNvbG9yIGZvciBhbiBhc3NpZ25lZCBzZXNzaW9uIG5hbWUuXG4gICAqL1xuICBnZXRDb2xvcihzZXNzaW9uSWQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbmFtZSA9IHRoaXMuYXNzaWduZWQuZ2V0KHNlc3Npb25JZCk7XG4gICAgcmV0dXJuIG5hbWUgPyAoUFVQUEVUX0NPTE9SU1tuYW1lXSA/PyB1bmRlZmluZWQpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgY3VycmVudCBhc3NpZ25tZW50cy5cbiAgICovXG4gIGdldEFsbCgpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IE1hcCh0aGlzLmFzc2lnbmVkKTtcbiAgfVxuXG4gIHByaXZhdGUgZmx1c2hDb29sZG93bnMoKTogdm9pZCB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmNvb2xkb3duID0gdGhpcy5jb29sZG93bi5maWx0ZXIoYyA9PiAobm93IC0gYy5yZWxlYXNlZEF0KSA8IE5BTUVfQ09PTERPV05fTVMpO1xuICB9XG59XG4iXX0=
@@ -16,7 +16,8 @@ import type { UnifiedLogEntry } from '../../logging/types.js';
16
16
  import type { MetricSnapshot } from '../../metrics/types.js';
17
17
  import type { MemoryLogSink } from '../../logging/sinks/MemoryLogSink.js';
18
18
  import type { MemoryMetricsSink } from '../../metrics/sinks/MemoryMetricsSink.js';
19
- import { type ElectionResult } from './LeaderElection.js';
19
+ import { logger } from '../../utils/logger.js';
20
+ import { detectLegacyLeader, type ElectionResult } from './LeaderElection.js';
20
21
  /**
21
22
  * Options for starting the unified console.
22
23
  */
@@ -42,6 +43,8 @@ export interface UnifiedConsoleOptions {
42
43
  logBroadcast?: (entry: UnifiedLogEntry) => void;
43
44
  metricsOnSnapshot?: (snapshot: MetricSnapshot) => void;
44
45
  }, metricsSink?: MemoryMetricsSink) => void;
46
+ /** Console port override from config file. Falls back to env var if not provided. */
47
+ port?: number;
45
48
  }
46
49
  /**
47
50
  * Result of starting the unified console.
@@ -54,6 +57,28 @@ export interface UnifiedConsoleResult {
54
57
  /** Cleanup function to call on shutdown */
55
58
  cleanup: () => Promise<void>;
56
59
  }
60
+ /**
61
+ * Check for a running legacy (pre-authentication) DollhouseMCP console and
62
+ * log a WARN-level message if one is found (#1794).
63
+ *
64
+ * Extracted from `startUnifiedConsole` so the wiring can be integration-
65
+ * tested in isolation without spinning up a full web server and leader
66
+ * election. The implementation is fire-and-forget: detection failures
67
+ * are logged at DEBUG and never propagate, because a failure here must
68
+ * not block leader election of the authenticated console.
69
+ *
70
+ * @param currentPort - The port the authenticated console intends to
71
+ * bind to. Used in the warning message to help the
72
+ * user tell the two consoles apart.
73
+ * @param detect - Optional injection point for the detection
74
+ * function. Defaults to `detectLegacyLeader`. Tests
75
+ * pass a stub.
76
+ * @param log - Optional injection point for the logger. Defaults
77
+ * to the module logger. Tests pass a spy.
78
+ * @returns The legacy leader info from `detect()`, or null if detection
79
+ * threw. Exposed so tests can assert the full result shape.
80
+ */
81
+ export declare function warnIfLegacyConsolePresent(currentPort: number, detect?: typeof detectLegacyLeader, log?: typeof logger): Promise<Awaited<ReturnType<typeof detectLegacyLeader>> | null>;
57
82
  /**
58
83
  * Start the unified web console.
59
84
  *
@@ -1 +1 @@
1
- {"version":3,"file":"UnifiedConsole.d.ts","sourceRoot":"","sources":["../../../src/web/console/UnifiedConsole.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAElF,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAU7B;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,UAAU,EAAE,aAAa,CAAC;IAC1B,0BAA0B;IAC1B,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,qFAAqF;IACrF,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,0DAA0D;IAC1D,eAAe,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;QAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;IACzH,8DAA8D;IAC9D,iBAAiB,EAAE,CAAC,SAAS,EAAE;QAAE,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;QAAC,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAA;KAAE,EAAE,WAAW,CAAC,EAAE,iBAAiB,KAAK,IAAI,CAAC;CACtL;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkBvG"}
1
+ {"version":3,"file":"UnifiedConsole.d.ts","sourceRoot":"","sources":["../../../src/web/console/UnifiedConsole.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAML,kBAAkB,EAClB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAmB7B;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,uCAAuC;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,UAAU,EAAE,aAAa,CAAC;IAC1B,0BAA0B;IAC1B,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,qFAAqF;IACrF,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,0DAA0D;IAC1D,eAAe,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;QAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;KAAE,KAAK,IAAI,CAAC;IACzH,8DAA8D;IAC9D,iBAAiB,EAAE,CAAC,SAAS,EAAE;QAAE,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;QAAC,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAA;KAAE,EAAE,WAAW,CAAC,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACrL,qFAAqF;IACrF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,mDAAmD;IACnD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,0BAA0B,CAC9C,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,OAAO,kBAAuC,EACtD,GAAG,GAAE,OAAO,MAAe,GAC1B,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,GAAG,IAAI,CAAC,CAsBhE;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CA8BvG"}