@dollhousemcp/mcp-server 2.0.0-rc.6 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/CHANGELOG.md +52 -61
  2. package/README.github.md +2 -2
  3. package/README.md +2 -2
  4. package/README.md.backup +284 -224
  5. package/README.npm.md +2 -2
  6. package/dist/cache/LRUCache.d.ts +3 -0
  7. package/dist/cache/LRUCache.d.ts.map +1 -1
  8. package/dist/cache/LRUCache.js +36 -26
  9. package/dist/config/env.d.ts +14 -4
  10. package/dist/config/env.d.ts.map +1 -1
  11. package/dist/config/env.js +20 -6
  12. package/dist/di/Container.d.ts +21 -0
  13. package/dist/di/Container.d.ts.map +1 -1
  14. package/dist/di/Container.js +250 -53
  15. package/dist/elements/BaseElement.d.ts.map +1 -1
  16. package/dist/elements/BaseElement.js +5 -10
  17. package/dist/elements/base/BaseElementManager.d.ts +22 -0
  18. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  19. package/dist/elements/base/BaseElementManager.js +47 -7
  20. package/dist/elements/memories/Memory.d.ts +1 -0
  21. package/dist/elements/memories/Memory.d.ts.map +1 -1
  22. package/dist/elements/memories/Memory.js +12 -8
  23. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  24. package/dist/elements/memories/MemoryManager.js +23 -42
  25. package/dist/elements/memories/MemorySearchIndex.js +2 -2
  26. package/dist/generated/version.d.ts +2 -2
  27. package/dist/generated/version.d.ts.map +1 -1
  28. package/dist/generated/version.js +3 -3
  29. package/dist/handlers/EnhancedIndexHandler.js +6 -6
  30. package/dist/handlers/element-crud/listElements.d.ts +2 -0
  31. package/dist/handlers/element-crud/listElements.d.ts.map +1 -1
  32. package/dist/handlers/element-crud/listElements.js +3 -1
  33. package/dist/handlers/mcp-aql/Gatekeeper.d.ts.map +1 -1
  34. package/dist/handlers/mcp-aql/Gatekeeper.js +23 -17
  35. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +14 -0
  36. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  37. package/dist/handlers/mcp-aql/MCPAQLHandler.js +110 -14
  38. package/dist/handlers/mcp-aql/OperationRouter.d.ts.map +1 -1
  39. package/dist/handlers/mcp-aql/OperationRouter.js +13 -1
  40. package/dist/handlers/mcp-aql/OperationSchema.d.ts +7 -0
  41. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  42. package/dist/handlers/mcp-aql/OperationSchema.js +52 -1
  43. package/dist/handlers/mcp-aql/evaluatePermission.d.ts +53 -0
  44. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -0
  45. package/dist/handlers/mcp-aql/evaluatePermission.js +132 -0
  46. package/dist/handlers/mcp-aql/policies/ToolClassification.d.ts.map +1 -1
  47. package/dist/handlers/mcp-aql/policies/ToolClassification.js +2 -1
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +3 -3
  50. package/dist/logging/LogHooks.js +11 -11
  51. package/dist/logging/LogManager.d.ts +0 -2
  52. package/dist/logging/LogManager.d.ts.map +1 -1
  53. package/dist/logging/LogManager.js +1 -3
  54. package/dist/logging/sinks/MemoryLogSink.d.ts +2 -0
  55. package/dist/logging/sinks/MemoryLogSink.d.ts.map +1 -1
  56. package/dist/logging/sinks/MemoryLogSink.js +12 -3
  57. package/dist/logging/types.d.ts +0 -2
  58. package/dist/logging/types.d.ts.map +1 -1
  59. package/dist/logging/types.js +1 -1
  60. package/dist/metrics/GatekeeperMetricsTracker.d.ts +32 -0
  61. package/dist/metrics/GatekeeperMetricsTracker.d.ts.map +1 -0
  62. package/dist/metrics/GatekeeperMetricsTracker.js +42 -0
  63. package/dist/metrics/MetricsManager.d.ts +47 -0
  64. package/dist/metrics/MetricsManager.d.ts.map +1 -0
  65. package/dist/metrics/MetricsManager.js +232 -0
  66. package/dist/metrics/OperationMetricsTracker.d.ts +32 -0
  67. package/dist/metrics/OperationMetricsTracker.d.ts.map +1 -0
  68. package/dist/metrics/OperationMetricsTracker.js +53 -0
  69. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts +27 -0
  70. package/dist/metrics/collectors/DefaultElementProviderCollector.d.ts.map +1 -0
  71. package/dist/metrics/collectors/DefaultElementProviderCollector.js +69 -0
  72. package/dist/metrics/collectors/FileLockManagerCollector.d.ts +16 -0
  73. package/dist/metrics/collectors/FileLockManagerCollector.d.ts.map +1 -0
  74. package/dist/metrics/collectors/FileLockManagerCollector.js +51 -0
  75. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts +16 -0
  76. package/dist/metrics/collectors/GatekeeperMetricsCollector.d.ts.map +1 -0
  77. package/dist/metrics/collectors/GatekeeperMetricsCollector.js +76 -0
  78. package/dist/metrics/collectors/LRUCacheCollector.d.ts +18 -0
  79. package/dist/metrics/collectors/LRUCacheCollector.d.ts.map +1 -0
  80. package/dist/metrics/collectors/LRUCacheCollector.js +95 -0
  81. package/dist/metrics/collectors/OperationMetricsCollector.d.ts +16 -0
  82. package/dist/metrics/collectors/OperationMetricsCollector.d.ts.map +1 -0
  83. package/dist/metrics/collectors/OperationMetricsCollector.js +80 -0
  84. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts +17 -0
  85. package/dist/metrics/collectors/OperationalTelemetryCollector.d.ts.map +1 -0
  86. package/dist/metrics/collectors/OperationalTelemetryCollector.js +26 -0
  87. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts +14 -0
  88. package/dist/metrics/collectors/PerformanceMonitorCollector.d.ts.map +1 -0
  89. package/dist/metrics/collectors/PerformanceMonitorCollector.js +141 -0
  90. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts +21 -0
  91. package/dist/metrics/collectors/SecurityMonitorCollector.d.ts.map +1 -0
  92. package/dist/metrics/collectors/SecurityMonitorCollector.js +56 -0
  93. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts +15 -0
  94. package/dist/metrics/collectors/SecurityTelemetryCollector.d.ts.map +1 -0
  95. package/dist/metrics/collectors/SecurityTelemetryCollector.js +112 -0
  96. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts +16 -0
  97. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.d.ts.map +1 -0
  98. package/dist/metrics/collectors/TriggerMetricsTrackerCollector.js +26 -0
  99. package/dist/metrics/collectors/index.d.ts +11 -0
  100. package/dist/metrics/collectors/index.d.ts.map +1 -0
  101. package/dist/metrics/collectors/index.js +11 -0
  102. package/dist/metrics/sinks/MemoryMetricsSink.d.ts +22 -0
  103. package/dist/metrics/sinks/MemoryMetricsSink.d.ts.map +1 -0
  104. package/dist/metrics/sinks/MemoryMetricsSink.js +121 -0
  105. package/dist/metrics/types.d.ts +98 -0
  106. package/dist/metrics/types.d.ts.map +1 -0
  107. package/dist/metrics/types.js +24 -0
  108. package/dist/portfolio/DefaultElementProvider.d.ts.map +1 -1
  109. package/dist/portfolio/DefaultElementProvider.js +1 -7
  110. package/dist/portfolio/EnhancedIndexManager.d.ts.map +1 -1
  111. package/dist/portfolio/EnhancedIndexManager.js +18 -18
  112. package/dist/portfolio/NLPScoringManager.d.ts.map +1 -1
  113. package/dist/portfolio/NLPScoringManager.js +5 -9
  114. package/dist/portfolio/PortfolioIndexManager.js +2 -2
  115. package/dist/portfolio/RelationshipManager.js +2 -2
  116. package/dist/portfolio/VerbTriggerManager.d.ts.map +1 -1
  117. package/dist/portfolio/VerbTriggerManager.js +5 -19
  118. package/dist/portfolio/config/IndexConfig.d.ts.map +1 -1
  119. package/dist/portfolio/config/IndexConfig.js +1 -12
  120. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.d.ts.map +1 -1
  121. package/dist/portfolio/enhanced-index/ElementDefinitionBuilder.js +3 -15
  122. package/dist/portfolio/enhanced-index/SemanticRelationshipService.d.ts.map +1 -1
  123. package/dist/portfolio/enhanced-index/SemanticRelationshipService.js +2 -16
  124. package/dist/portfolio/types/RelationshipTypes.d.ts.map +1 -1
  125. package/dist/portfolio/types/RelationshipTypes.js +3 -17
  126. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  127. package/dist/security/audit/config/suppressions.js +36 -8
  128. package/dist/security/constants.d.ts.map +1 -1
  129. package/dist/security/constants.js +10 -6
  130. package/dist/security/fileLockManager.d.ts.map +1 -1
  131. package/dist/security/fileLockManager.js +8 -6
  132. package/dist/security/secureYamlParser.d.ts.map +1 -1
  133. package/dist/security/secureYamlParser.js +1 -13
  134. package/dist/security/securityMonitor.d.ts +2 -1
  135. package/dist/security/securityMonitor.d.ts.map +1 -1
  136. package/dist/security/securityMonitor.js +14 -3
  137. package/dist/security/telemetry/SecurityTelemetry.d.ts +16 -0
  138. package/dist/security/telemetry/SecurityTelemetry.d.ts.map +1 -1
  139. package/dist/security/telemetry/SecurityTelemetry.js +30 -2
  140. package/dist/security/tokenManager.d.ts +3 -0
  141. package/dist/security/tokenManager.d.ts.map +1 -1
  142. package/dist/security/tokenManager.js +13 -5
  143. package/dist/security/validation/BackgroundValidator.d.ts.map +1 -1
  144. package/dist/security/validation/BackgroundValidator.js +7 -7
  145. package/dist/server/startup.d.ts.map +1 -1
  146. package/dist/server/startup.js +8 -24
  147. package/dist/server/tools/MCPAQLTools.js +4 -1
  148. package/dist/services/ActivationStore.d.ts.map +1 -1
  149. package/dist/services/ActivationStore.js +9 -3
  150. package/dist/services/FileWatchService.d.ts +1 -0
  151. package/dist/services/FileWatchService.d.ts.map +1 -1
  152. package/dist/services/FileWatchService.js +83 -48
  153. package/dist/services/MetadataService.d.ts.map +1 -1
  154. package/dist/services/MetadataService.js +7 -2
  155. package/dist/services/query/ElementQueryService.d.ts.map +1 -1
  156. package/dist/services/query/ElementQueryService.js +1 -41
  157. package/dist/services/query/PaginationService.d.ts.map +1 -1
  158. package/dist/services/query/PaginationService.js +1 -14
  159. package/dist/services/query/SortService.d.ts.map +1 -1
  160. package/dist/services/query/SortService.js +1 -6
  161. package/dist/services/validation/ValidationService.d.ts.map +1 -1
  162. package/dist/services/validation/ValidationService.js +3 -8
  163. package/dist/storage/ElementStorageLayer.d.ts.map +1 -1
  164. package/dist/storage/ElementStorageLayer.js +5 -2
  165. package/dist/storage/MemoryStorageLayer.d.ts.map +1 -1
  166. package/dist/storage/MemoryStorageLayer.js +5 -2
  167. package/dist/telemetry/OperationalTelemetry.js +2 -2
  168. package/dist/utils/EventDeduplicator.d.ts +44 -0
  169. package/dist/utils/EventDeduplicator.d.ts.map +1 -0
  170. package/dist/utils/EventDeduplicator.js +93 -0
  171. package/dist/utils/FileLock.d.ts.map +1 -1
  172. package/dist/utils/FileLock.js +1 -9
  173. package/dist/utils/PerformanceMonitor.d.ts.map +1 -1
  174. package/dist/utils/PerformanceMonitor.js +5 -5
  175. package/dist/utils/SlidingWindowRateLimiter.d.ts +13 -0
  176. package/dist/utils/SlidingWindowRateLimiter.d.ts.map +1 -0
  177. package/dist/utils/SlidingWindowRateLimiter.js +23 -0
  178. package/dist/web/console/IngestRoutes.d.ts +84 -0
  179. package/dist/web/console/IngestRoutes.d.ts.map +1 -0
  180. package/dist/web/console/IngestRoutes.js +252 -0
  181. package/dist/web/console/LeaderElection.d.ts +89 -0
  182. package/dist/web/console/LeaderElection.d.ts.map +1 -0
  183. package/dist/web/console/LeaderElection.js +205 -0
  184. package/dist/web/console/LeaderForwardingSink.d.ts +61 -0
  185. package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -0
  186. package/dist/web/console/LeaderForwardingSink.js +197 -0
  187. package/dist/web/console/SessionNames.d.ts +46 -0
  188. package/dist/web/console/SessionNames.d.ts.map +1 -0
  189. package/dist/web/console/SessionNames.js +257 -0
  190. package/dist/web/console/UnifiedConsole.d.ts +64 -0
  191. package/dist/web/console/UnifiedConsole.d.ts.map +1 -0
  192. package/dist/web/console/UnifiedConsole.js +119 -0
  193. package/dist/web/contentPipeline.d.ts +58 -0
  194. package/dist/web/contentPipeline.d.ts.map +1 -0
  195. package/dist/web/contentPipeline.js +112 -0
  196. package/dist/web/portDiscovery.d.ts +58 -0
  197. package/dist/web/portDiscovery.d.ts.map +1 -0
  198. package/dist/web/portDiscovery.js +143 -0
  199. package/dist/web/public/app.js +148 -60
  200. package/dist/web/public/logs.js +638 -0
  201. package/dist/web/public/metrics.js +682 -0
  202. package/dist/web/public/permissions.js +394 -0
  203. package/dist/web/public/sessions.js +369 -0
  204. package/dist/web/routes/healthRoutes.d.ts +16 -0
  205. package/dist/web/routes/healthRoutes.d.ts.map +1 -0
  206. package/dist/web/routes/healthRoutes.js +29 -0
  207. package/dist/web/routes/logRoutes.d.ts +18 -0
  208. package/dist/web/routes/logRoutes.d.ts.map +1 -0
  209. package/dist/web/routes/logRoutes.js +126 -0
  210. package/dist/web/routes/metricsRoutes.d.ts +17 -0
  211. package/dist/web/routes/metricsRoutes.d.ts.map +1 -0
  212. package/dist/web/routes/metricsRoutes.js +90 -0
  213. package/dist/web/routes/permissionRoutes.d.ts +16 -0
  214. package/dist/web/routes/permissionRoutes.d.ts.map +1 -0
  215. package/dist/web/routes/permissionRoutes.js +133 -0
  216. package/dist/web/routes.d.ts.map +1 -1
  217. package/dist/web/routes.js +309 -339
  218. package/dist/web/server.d.ts +21 -1
  219. package/dist/web/server.d.ts.map +1 -1
  220. package/dist/web/server.js +42 -4
  221. package/dist/web/sinks/WebSSELogSink.d.ts +15 -0
  222. package/dist/web/sinks/WebSSELogSink.d.ts.map +1 -0
  223. package/dist/web/sinks/WebSSELogSink.js +22 -0
  224. package/dist/web/sinks/WebSSEMetricsSink.d.ts +16 -0
  225. package/dist/web/sinks/WebSSEMetricsSink.d.ts.map +1 -0
  226. package/dist/web/sinks/WebSSEMetricsSink.js +23 -0
  227. package/package.json +2 -2
  228. package/server.json +2 -2
  229. package/dist/constants/version.d.ts +0 -3
  230. package/dist/constants/version.d.ts.map +0 -1
  231. package/dist/constants/version.js +0 -4
  232. package/dist/logging/sinks/SSELogSink.d.ts +0 -35
  233. package/dist/logging/sinks/SSELogSink.d.ts.map +0 -1
  234. package/dist/logging/sinks/SSELogSink.js +0 -181
  235. package/dist/logging/viewer/viewerHtml.d.ts +0 -8
  236. package/dist/logging/viewer/viewerHtml.d.ts.map +0 -1
  237. package/dist/logging/viewer/viewerHtml.js +0 -204
  238. package/dist/web/public/public/app.js +0 -1878
@@ -11,6 +11,8 @@
11
11
  * @see https://github.com/DollhouseMCP/mcp-server-v2-refactor/issues/774
12
12
  */
13
13
  import type { MCPAQLHandler } from '../handlers/mcp-aql/MCPAQLHandler.js';
14
+ import type { MemoryLogSink } from '../logging/sinks/MemoryLogSink.js';
15
+ import type { MemoryMetricsSink } from '../metrics/sinks/MemoryMetricsSink.js';
14
16
  /**
15
17
  * Options for starting the web server.
16
18
  */
@@ -28,6 +30,23 @@ export interface WebServerOptions {
28
30
  * Issue #796: Web MCP-AQL Gateway.
29
31
  */
30
32
  mcpAqlHandler?: MCPAQLHandler;
33
+ /** MemoryLogSink for log routes (optional — logs tab disabled if not provided) */
34
+ memorySink?: MemoryLogSink;
35
+ /** MemoryMetricsSink for metrics routes (optional — metrics tab disabled if not provided) */
36
+ metricsSink?: MemoryMetricsSink;
37
+ /** Additional routers to mount before the SPA fallback (e.g., ingest routes) */
38
+ additionalRouters?: import('express').Router[];
39
+ }
40
+ /**
41
+ * Result of starting the web server, including hooks for DI wiring.
42
+ */
43
+ export interface WebServerResult {
44
+ /** Express app instance — for mounting additional routes (e.g., ingest routes) */
45
+ app?: import('express').Express;
46
+ /** Log broadcast function — call with each entry to push to SSE clients */
47
+ logBroadcast?: (entry: import('../logging/types.js').UnifiedLogEntry) => void;
48
+ /** Metrics snapshot function — call with each snapshot to push to SSE clients */
49
+ metricsOnSnapshot?: (snapshot: import('../metrics/types.js').MetricSnapshot) => void;
31
50
  }
32
51
  /**
33
52
  * Result of attempting to open the browser.
@@ -52,8 +71,9 @@ export interface BrowserOpenResult {
52
71
  * browser without starting a second instance.
53
72
  *
54
73
  * @param options - Server configuration
74
+ * @returns Hooks for DI wiring (log broadcast, metrics onSnapshot)
55
75
  */
56
- export declare function startWebServer(options: WebServerOptions): Promise<void>;
76
+ export declare function startWebServer(options: WebServerOptions): Promise<WebServerResult>;
57
77
  /**
58
78
  * Open the portfolio browser from within the MCP server process.
59
79
  *
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAW1E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,cAAc,EAAE,OAAO,CAAC;IACxB,kDAAkD;IAClD,aAAa,EAAE,OAAO,CAAC;IACvB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAqCD;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8F7E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwBzI"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAaH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAW/E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,kFAAkF;IAClF,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,6FAA6F;IAC7F,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,OAAO,SAAS,EAAE,MAAM,EAAE,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kFAAkF;IAClF,GAAG,CAAC,EAAE,OAAO,SAAS,EAAE,OAAO,CAAC;IAChC,2EAA2E;IAC3E,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,qBAAqB,EAAE,eAAe,KAAK,IAAI,CAAC;IAC9E,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,qBAAqB,EAAE,cAAc,KAAK,IAAI,CAAC;CACtF;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,cAAc,EAAE,OAAO,CAAC;IACxB,kDAAkD;IAClD,aAAa,EAAE,OAAO,CAAC;IACvB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAqCD;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAwIxF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwBzI"}
@@ -17,6 +17,9 @@ import { execFile } from 'node:child_process';
17
17
  import { platform } from 'node:os';
18
18
  import { mkdir, readdir } from 'node:fs/promises';
19
19
  import { createApiRoutes, createGatewayApiRoutes } from './routes.js';
20
+ import { createLogRoutes } from './routes/logRoutes.js';
21
+ import { createMetricsRoutes } from './routes/metricsRoutes.js';
22
+ import { createHealthRoutes } from './routes/healthRoutes.js';
20
23
  import { logger } from '../utils/logger.js';
21
24
  const __dirname = dirname(fileURLToPath(import.meta.url));
22
25
  const DEFAULT_PORT = 3939;
@@ -69,16 +72,19 @@ function openInBrowser(url) {
69
72
  * browser without starting a second instance.
70
73
  *
71
74
  * @param options - Server configuration
75
+ * @returns Hooks for DI wiring (log broadcast, metrics onSnapshot)
72
76
  */
73
77
  export async function startWebServer(options) {
74
78
  const port = options.port || DEFAULT_PORT;
79
+ const result = {};
75
80
  if (serverRunning) {
76
81
  if (options.openBrowser) {
77
82
  openInBrowser(`http://${CONSOLE_HOST}:${serverPort}`);
78
83
  }
79
- return;
84
+ return result;
80
85
  }
81
86
  const app = express();
87
+ result.app = app;
82
88
  app.disable('x-powered-by');
83
89
  // Security headers
84
90
  app.use((_req, res, next) => {
@@ -90,7 +96,7 @@ export async function startWebServer(options) {
90
96
  res.setHeader('Content-Security-Policy', [
91
97
  "default-src 'self'",
92
98
  "script-src 'self' cdn.jsdelivr.net cdnjs.cloudflare.com",
93
- "style-src 'self' 'unsafe-inline' cdnjs.cloudflare.com",
99
+ "style-src 'self' 'unsafe-inline' cdnjs.cloudflare.com cdn.jsdelivr.net",
94
100
  "connect-src 'self' raw.githubusercontent.com",
95
101
  "font-src 'self'",
96
102
  ].join('; '));
@@ -99,12 +105,41 @@ export async function startWebServer(options) {
99
105
  // API routes — use MCP-AQL gateway when handler is available (Issue #796)
100
106
  if (options.mcpAqlHandler) {
101
107
  app.use('/api', createGatewayApiRoutes(options.mcpAqlHandler, options.portfolioDir));
102
- logger.info('[WebUI] API routes using MCP-AQL Gateway (validated, cached, gatekeeper-checked)');
108
+ // Permission evaluation routes (POST /evaluate_permission, GET /permissions/status)
109
+ const { registerPermissionRoutes } = await import('./routes/permissionRoutes.js');
110
+ const permRouter = (await import('express')).Router();
111
+ registerPermissionRoutes(permRouter, options.mcpAqlHandler);
112
+ app.use('/api', permRouter);
113
+ logger.info('[WebUI] API routes using MCP-AQL Gateway + permission routes');
103
114
  }
104
115
  else {
105
116
  app.use('/api', createApiRoutes(options.portfolioDir));
106
117
  logger.warn('[WebUI] API routes using direct filesystem access (no MCP-AQL handler available)');
107
118
  }
119
+ // Console routes: logs, metrics, health
120
+ let logRoutes;
121
+ let metricsRoutes;
122
+ if (options.memorySink) {
123
+ logRoutes = createLogRoutes(options.memorySink);
124
+ app.use('/api', logRoutes.router);
125
+ result.logBroadcast = logRoutes.broadcast;
126
+ logger.info('[WebUI] Log viewer routes mounted at /api/logs');
127
+ }
128
+ if (options.metricsSink) {
129
+ metricsRoutes = createMetricsRoutes(options.metricsSink);
130
+ app.use('/api', metricsRoutes.router);
131
+ result.metricsOnSnapshot = metricsRoutes.onSnapshot;
132
+ logger.info('[WebUI] Metrics routes mounted at /api/metrics');
133
+ }
134
+ if (options.memorySink) {
135
+ const healthRouter = createHealthRoutes({
136
+ memorySink: options.memorySink,
137
+ metricsSink: options.metricsSink,
138
+ logClientCount: logRoutes ? logRoutes.clientCount : () => 0,
139
+ metricsClientCount: metricsRoutes ? metricsRoutes.clientCount : () => 0,
140
+ });
141
+ app.use('/api', healthRouter);
142
+ }
108
143
  // Serve ~/.dollhouse/pages/ at /pages/ — dashboards, generated content, stack views
109
144
  const pagesDir = join(dirname(options.portfolioDir), 'pages');
110
145
  mkdir(pagesDir, { recursive: true }).catch(err => {
@@ -128,6 +163,8 @@ export async function startWebServer(options) {
128
163
  res.json({ pages: [], directory: pagesDir });
129
164
  }
130
165
  });
166
+ // Additional routers (e.g., unified console ingest routes) — must mount before SPA fallback
167
+ options.additionalRouters?.forEach(router => app.use(router));
131
168
  // Static frontend files
132
169
  const publicDir = join(__dirname, 'public');
133
170
  app.use(express.static(publicDir));
@@ -156,6 +193,7 @@ export async function startWebServer(options) {
156
193
  openInBrowser(url);
157
194
  }
158
195
  });
196
+ return result;
159
197
  }
160
198
  /**
161
199
  * Open the portfolio browser from within the MCP server process.
@@ -192,4 +230,4 @@ export async function openPortfolioBrowser(portfolioDir, port, mcpAqlHandler) {
192
230
  ...(browserResult.error ? { warning: `Browser could not be opened automatically: ${browserResult.error}. Open ${url} manually.` } : {}),
193
231
  };
194
232
  }
195
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dlYi9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUc1QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDMUIsTUFBTSxZQUFZLEdBQUcscUJBQXFCLENBQUM7QUFDM0MsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBRTNELGtFQUFrRTtBQUNsRSxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7QUFDMUIsSUFBSSxVQUFVLEdBQUcsWUFBWSxDQUFDO0FBbUM5Qjs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxhQUFhLENBQUMsR0FBVztJQUNoQyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0IsTUFBTSxJQUFJLEdBQUcs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ekQsQ0FBQztJQUVELE1BQU0sYUFBYSxHQUFHLE1BQU0sYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRS9DLE9BQU87UUFDTCxHQUFHO1FBQ0gsY0FBYztRQUNkLGFBQWEsRUFBRSxhQUFhLENBQUMsT0FBTztRQUNwQyxHQUFHLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsOENBQThDLGFBQWEsQ0FBQyxLQUFLLFVBQVUsR0FBRyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ3hJLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEb2xsaG91c2VNQ1AgV2ViIFVJIFNlcnZlclxuICpcbiAqIExpZ2h0d2VpZ2h0IEV4cHJlc3Mgc2VydmVyIGZvciBicm93c2luZyBwb3J0Zm9saW8gZWxlbWVudHMgaW4gYSBicm93c2VyLlxuICogQm91bmQgdG8gMTI3LjAuMC4xIG9ubHkgKGxvY2FsaG9zdCkuIFJlYWQtb25seSBmb3IgVjEuXG4gKlxuICogQ2FuIGJlIHN0YXJ0ZWQgc3RhbmRhbG9uZSAoYC0td2ViYCBmbGFnKSBvciBmcm9tIHdpdGhpbiB0aGUgTUNQIHNlcnZlclxuICogcHJvY2VzcyB2aWEgYG9wZW5Qb3J0Zm9saW9Ccm93c2VyKClgLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9tY3Atc2VydmVyLXYyLXJlZmFjdG9yL2lzc3Vlcy83MDRcbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL0RvbGxob3VzZU1DUC9tY3Atc2VydmVyLXYyLXJlZmFjdG9yL2lzc3Vlcy83NzRcbiAqL1xuXG5pbXBvcnQgZXhwcmVzcyBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGpvaW4sIGRpcm5hbWUsIGV4dG5hbWUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IGV4ZWNGaWxlIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHBsYXRmb3JtIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBta2RpciwgcmVhZGRpciB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgY3JlYXRlQXBpUm91dGVzLCBjcmVhdGVHYXRld2F5QXBpUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgTUNQQVFMSGFuZGxlciB9IGZyb20gJy4uL2hhbmRsZXJzL21jcC1hcWwvTUNQQVFMSGFuZGxlci5qcyc7XG5cbmNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbmNvbnN0IERFRkFVTFRfUE9SVCA9IDM5Mzk7XG5jb25zdCBDT05TT0xFX0hPU1QgPSAnZG9sbGhvdXNlLmxvY2FsaG9zdCc7XG5jb25zdCBBTExPV0VEX1BBR0VfRVhURU5TSU9OUyA9IG5ldyBTZXQoWycuaHRtbCcsICcuaHRtJ10pO1xuXG4vKiogVHJhY2sgd2hldGhlciB0aGUgd2ViIHNlcnZlciBpcyBhbHJlYWR5IHJ1bm5pbmcgaW4tcHJvY2Vzcy4gKi9cbmxldCBzZXJ2ZXJSdW5uaW5nID0gZmFsc2U7XG5sZXQgc2VydmVyUG9ydCA9IERFRkFVTFRfUE9SVDtcblxuLyoqXG4gKiBPcHRpb25zIGZvciBzdGFydGluZyB0aGUgd2ViIHNlcnZlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJTZXJ2ZXJPcHRpb25zIHtcbiAgLyoqIFBvcnQgdG8gYmluZCB0byAoZGVmYXVsdDogMzkzOSkgKi9cbiAgcG9ydD86IG51bWJlcjtcbiAgLyoqIFBhdGggdG8gdGhlIHBvcnRmb2xpbyBkaXJlY3RvcnkgKGUuZy4sIH4vLmRvbGxob3VzZS9wb3J0Zm9saW8pICovXG4gIHBvcnRmb2xpb0Rpcjogc3RyaW5nO1xuICAvKiogT3BlbiB0aGUgYnJvd3NlciBhdXRvbWF0aWNhbGx5IGFmdGVyIHN0YXJ0aW5nIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgb3BlbkJyb3dzZXI/OiBib29sZWFuO1xuICAvKipcbiAgICogTUNQQVFMSGFuZGxlciBmb3Igcm91dGluZyB0aHJvdWdoIHRoZSBNQ1AtQVFMIHBpcGVsaW5lLlxuICAgKiBXaGVuIHByb3ZpZGVkLCBBUEkgcm91dGVzIHVzZSB0aGUgZ2F0ZXdheSAodmFsaWRhdGVkLCBjYWNoZWQsIGdhdGVrZWVwZXItY2hlY2tlZCkuXG4gICAqIFdoZW4gYWJzZW50LCBmYWxscyBiYWNrIHRvIGRpcmVjdCBmaWxlc3lzdGVtIGFjY2VzcyAobGVnYWN5IGJlaGF2aW9yKS5cbiAgICogSXNzdWUgIzc5NjogV2ViIE1DUC1BUUwgR2F0ZXdheS5cbiAgICovXG4gIG1jcEFxbEhhbmRsZXI/OiBNQ1BBUUxIYW5kbGVyO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhdHRlbXB0aW5nIHRvIG9wZW4gdGhlIGJyb3dzZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJvd3Nlck9wZW5SZXN1bHQge1xuICAvKiogVGhlIFVSTCB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgb24gKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGFscmVhZHkgcnVubmluZyAodHJ1ZSkgb3IganVzdCBzdGFydGVkIChmYWxzZSkgKi9cbiAgYWxyZWFkeVJ1bm5pbmc6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBicm93c2VyIHdhcyBzdWNjZXNzZnVsbHkgb3BlbmVkICovXG4gIGJyb3dzZXJPcGVuZWQ6IGJvb2xlYW47XG4gIC8qKiBXYXJuaW5nIG1lc3NhZ2UgaWYgdGhlIGJyb3dzZXIgY291bGQgbm90IGJlIG9wZW5lZCAqL1xuICB3YXJuaW5nPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wZW4gYSBVUkwgaW4gdGhlIHN5c3RlbSdzIGRlZmF1bHQgYnJvd3Nlci5cbiAqXG4gKiBQbGF0Zm9ybS1hd2FyZTpcbiAqIC0gbWFjT1M6IGBvcGVuYFxuICogLSBMaW51eDogYHhkZy1vcGVuYFxuICogLSBXaW5kb3dzOiBgc3RhcnRgXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBVUkwgdG8gb3BlblxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIGJyb3dzZXIgb3BlbmVkLCBmYWxzZSB3aXRoIGVycm9yIG1lc3NhZ2UgaWYgbm90XG4gKi9cbmZ1bmN0aW9uIG9wZW5JbkJyb3dzZXIodXJsOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBwbGF0ID0gcGxhdGZvcm0oKTtcbiAgICBjb25zdCBjbWQgPSBwbGF0ID09PSAnZGFyd2luJyA/ICdvcGVuJ1xuICAgICAgOiBwbGF0ID09PSAnd2luMzInID8gJ3N0YXJ0J1xuICAgICAgOiAneGRnLW9wZW4nO1xuXG4gICAgLy8gU2VjdXJpdHk6IHVzZSBleGVjRmlsZSB3aXRoIFVSTCBhcyBhcmd1bWVudCBhcnJheSwgbm90IHN0cmluZyBpbnRlcnBvbGF0aW9uXG4gICAgY29uc3QgdXJsU3RyID0gU3RyaW5nKHVybCk7XG4gICAgaWYgKCEvXmh0dHBzPzpcXC9cXC9sb2NhbGhvc3RbOi9dLy50ZXN0KHVybFN0cikpIHtcbiAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdVUkwgbXVzdCBiZSBhIGxvY2FsaG9zdCBIVFRQIFVSTCcgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV4ZWNGaWxlKGNtZCwgW3VybFN0cl0sIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtXZWJVSV0gQ291bGQgbm90IGF1dG8tb3BlbiBicm93c2VyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlcnIubWVzc2FnZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTdGFydCB0aGUgcG9ydGZvbGlvIHdlYiBzZXJ2ZXIuXG4gKlxuICogQmluZHMgdG8gMTI3LjAuMC4xIG9ubHkgKGxvY2FsaG9zdCkuIFNlcnZlcyB0aGUgcG9ydGZvbGlvIGJyb3dzZXJcbiAqIGZyb250ZW5kIGFuZCBBUEkgcm91dGVzIGZvciByZWFkaW5nIGVsZW1lbnRzLlxuICpcbiAqIElkZW1wb3RlbnQ6IGlmIHRoZSBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nLCBvcHRpb25hbGx5IG9wZW5zIHRoZVxuICogYnJvd3NlciB3aXRob3V0IHN0YXJ0aW5nIGEgc2Vjb25kIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gU2VydmVyIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0V2ViU2VydmVyKG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcG9ydCA9IG9wdGlvbnMucG9ydCB8fCBERUZBVUxUX1BPUlQ7XG5cbiAgaWYgKHNlcnZlclJ1bm5pbmcpIHtcbiAgICBpZiAob3B0aW9ucy5vcGVuQnJvd3Nlcikge1xuICAgICAgb3BlbkluQnJvd3NlcihgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3NlcnZlclBvcnR9YCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcbiAgYXBwLmRpc2FibGUoJ3gtcG93ZXJlZC1ieScpO1xuXG4gIC8vIFNlY3VyaXR5IGhlYWRlcnNcbiAgYXBwLnVzZSgoX3JlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgcmVzLnNldEhlYWRlcignWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJyk7XG4gICAgcmVzLnNldEhlYWRlcignWC1GcmFtZS1PcHRpb25zJywgJ0RFTlknKTtcbiAgICByZXMuc2V0SGVhZGVyKCdYLVhTUy1Qcm90ZWN0aW9uJywgJzE7IG1vZGU9YmxvY2snKTtcbiAgICByZXMuc2V0SGVhZGVyKCdSZWZlcnJlci1Qb2xpY3knLCAnbm8tcmVmZXJyZXInKTtcbiAgICByZXMuc2V0SGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCBgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3BvcnR9YCk7XG4gICAgcmVzLnNldEhlYWRlcignQ29udGVudC1TZWN1cml0eS1Qb2xpY3knLCBbXG4gICAgICBcImRlZmF1bHQtc3JjICdzZWxmJ1wiLFxuICAgICAgXCJzY3JpcHQtc3JjICdzZWxmJyBjZG4uanNkZWxpdnIubmV0IGNkbmpzLmNsb3VkZmxhcmUuY29tXCIsXG4gICAgICBcInN0eWxlLXNyYyAnc2VsZicgJ3Vuc2FmZS1pbmxpbmUnIGNkbmpzLmNsb3VkZmxhcmUuY29tXCIsXG4gICAgICBcImNvbm5lY3Qtc3JjICdzZWxmJyByYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tXCIsXG4gICAgICBcImZvbnQtc3JjICdzZWxmJ1wiLFxuICAgIF0uam9pbignOyAnKSk7XG4gICAgbmV4dCgpO1xuICB9KTtcblxuICAvLyBBUEkgcm91dGVzIOKAlCB1c2UgTUNQLUFRTCBnYXRld2F5IHdoZW4gaGFuZGxlciBpcyBhdmFpbGFibGUgKElzc3VlICM3OTYpXG4gIGlmIChvcHRpb25zLm1jcEFxbEhhbmRsZXIpIHtcbiAgICBhcHAudXNlKCcvYXBpJywgY3JlYXRlR2F0ZXdheUFwaVJvdXRlcyhvcHRpb25zLm1jcEFxbEhhbmRsZXIsIG9wdGlvbnMucG9ydGZvbGlvRGlyKSk7XG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gQVBJIHJvdXRlcyB1c2luZyBNQ1AtQVFMIEdhdGV3YXkgKHZhbGlkYXRlZCwgY2FjaGVkLCBnYXRla2VlcGVyLWNoZWNrZWQpJyk7XG4gIH0gZWxzZSB7XG4gICAgYXBwLnVzZSgnL2FwaScsIGNyZWF0ZUFwaVJvdXRlcyhvcHRpb25zLnBvcnRmb2xpb0RpcikpO1xuICAgIGxvZ2dlci53YXJuKCdbV2ViVUldIEFQSSByb3V0ZXMgdXNpbmcgZGlyZWN0IGZpbGVzeXN0ZW0gYWNjZXNzIChubyBNQ1AtQVFMIGhhbmRsZXIgYXZhaWxhYmxlKScpO1xuICB9XG5cbiAgLy8gU2VydmUgfi8uZG9sbGhvdXNlL3BhZ2VzLyBhdCAvcGFnZXMvIOKAlCBkYXNoYm9hcmRzLCBnZW5lcmF0ZWQgY29udGVudCwgc3RhY2sgdmlld3NcbiAgY29uc3QgcGFnZXNEaXIgPSBqb2luKGRpcm5hbWUob3B0aW9ucy5wb3J0Zm9saW9EaXIpLCAncGFnZXMnKTtcbiAgbWtkaXIocGFnZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgbG9nZ2VyLndhcm4oYFtXZWJVSV0gQ291bGQgbm90IGNyZWF0ZSBwYWdlcyBkaXJlY3Rvcnk6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfSk7XG4gIGFwcC51c2UoJy9wYWdlcycsIGV4cHJlc3Muc3RhdGljKHBhZ2VzRGlyKSk7XG5cbiAgLyoqXG4gICAqIEdFVCAvYXBpL3BhZ2VzXG4gICAqIExpc3RzIGF2YWlsYWJsZSBIVE1MIHBhZ2VzIGluIH4vLmRvbGxob3VzZS9wYWdlcy8uXG4gICAqIFJldHVybnMgcGFnZSBuYW1lcyBhbmQgdGhlaXIgVVJMcyBmb3IgdGhlIG1hbmFnZW1lbnQgY29uc29sZS5cbiAgICovXG4gIGFwcC5nZXQoJy9hcGkvcGFnZXMnLCBhc3luYyAoX3JlcSwgcmVzKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgcmVhZGRpcihwYWdlc0Rpcik7XG4gICAgICBjb25zdCBwYWdlcyA9IGZpbGVzXG4gICAgICAgIC5maWx0ZXIoZiA9PiAhZi5zdGFydHNXaXRoKCcuJykgJiYgQUxMT1dFRF9QQUdFX0VYVEVOU0lPTlMuaGFzKGV4dG5hbWUoZikpKVxuICAgICAgICAubWFwKGYgPT4gKHsgbmFtZTogZiwgdXJsOiBgL3BhZ2VzLyR7Zn1gIH0pKTtcbiAgICAgIHJlcy5qc29uKHsgcGFnZXMsIGRpcmVjdG9yeTogcGFnZXNEaXIgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXMuanNvbih7IHBhZ2VzOiBbXSwgZGlyZWN0b3J5OiBwYWdlc0RpciB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFN0YXRpYyBmcm9udGVuZCBmaWxlc1xuICBjb25zdCBwdWJsaWNEaXIgPSBqb2luKF9fZGlybmFtZSwgJ3B1YmxpYycpO1xuICBhcHAudXNlKGV4cHJlc3Muc3RhdGljKHB1YmxpY0RpcikpO1xuXG4gIC8vIFNQQSBmYWxsYmFja1xuICBhcHAuZ2V0KCcveypwYXRofScsIChyZXEsIHJlcykgPT4ge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcmVxLnBhdGgubm9ybWFsaXplKCdORkMnKTtcbiAgICBpZiAobm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aCgnL2FwaS8nKSkge1xuICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYEFQSSByb3V0ZSBub3QgZm91bmQ6ICR7bm9ybWFsaXplZFBhdGh9YCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoJy9wYWdlcy8nKSkge1xuICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oeyBlcnJvcjogYFBhZ2Ugbm90IGZvdW5kOiAke25vcm1hbGl6ZWRQYXRofWAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlcy5zZW5kRmlsZShqb2luKHB1YmxpY0RpciwgJ2luZGV4Lmh0bWwnKSk7XG4gIH0pO1xuXG4gIC8vIEJpbmQgdG8gbG9jYWxob3N0IG9ubHlcbiAgYXBwLmxpc3Rlbihwb3J0LCAnMTI3LjAuMC4xJywgKCkgPT4ge1xuICAgIHNlcnZlclJ1bm5pbmcgPSB0cnVlO1xuICAgIHNlcnZlclBvcnQgPSBwb3J0O1xuICAgIGNvbnN0IHVybCA9IGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7cG9ydH1gO1xuICAgIGNvbnN0IGZhbGxiYWNrVXJsID0gYGh0dHA6Ly8xMjcuMC4wLjE6JHtwb3J0fWA7XG4gICAgbG9nZ2VyLmluZm8oYFtXZWJVSV0gTWFuYWdlbWVudCBjb25zb2xlIHJ1bm5pbmcgYXQgJHt1cmx9YCk7XG4gICAgY29uc29sZS5sb2coYFxcbiAgRG9sbGhvdXNlTUNQIE1hbmFnZW1lbnQgQ29uc29sZVxcbiAgJHt1cmx9XFxuICAke2ZhbGxiYWNrVXJsfSAoZmFsbGJhY2spXFxuYCk7XG5cbiAgICBpZiAob3B0aW9ucy5vcGVuQnJvd3Nlcikge1xuICAgICAgb3BlbkluQnJvd3Nlcih1cmwpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogT3BlbiB0aGUgcG9ydGZvbGlvIGJyb3dzZXIgZnJvbSB3aXRoaW4gdGhlIE1DUCBzZXJ2ZXIgcHJvY2Vzcy5cbiAqXG4gKiBTdGFydHMgdGhlIHdlYiBzZXJ2ZXIgaWYgbm90IGFscmVhZHkgcnVubmluZywgdGhlbiBvcGVucyB0aGUgc3lzdGVtXG4gKiBicm93c2VyIHRvIHRoZSBwb3J0Zm9saW8gVUkuIFJldHVybnMgYSByZXN1bHQgb2JqZWN0IGluZGljYXRpbmdcbiAqIHdoZXRoZXIgdGhlIHNlcnZlciBzdGFydGVkIGFuZCB0aGUgYnJvd3NlciBvcGVuZWQgc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIENhbGxlZCBieSB0aGUgYG9wZW5fcG9ydGZvbGlvX2Jyb3dzZXJgIE1DUC1BUUwgb3BlcmF0aW9uIChJc3N1ZSAjNzc0KS5cbiAqXG4gKiBAcGFyYW0gcG9ydGZvbGlvRGlyIC0gUGF0aCB0byB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeSAoZS5nLiwgfi8uZG9sbGhvdXNlL3BvcnRmb2xpbylcbiAqIEBwYXJhbSBwb3J0IC0gUG9ydCB0byBiaW5kIHRvIChkZWZhdWx0OiAzOTM5KVxuICogQHJldHVybnMgUmVzdWx0IHdpdGggVVJMLCBzZXJ2ZXIgc3RhdHVzLCBhbmQgYnJvd3NlciBvcGVuIHN0YXR1c1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlblBvcnRmb2xpb0Jyb3dzZXIocG9ydGZvbGlvRGlyOiBzdHJpbmcsIHBvcnQ/OiBudW1iZXIsIG1jcEFxbEhhbmRsZXI/OiBNQ1BBUUxIYW5kbGVyKTogUHJvbWlzZTxCcm93c2VyT3BlblJlc3VsdD4ge1xuICBjb25zdCB0YXJnZXRQb3J0ID0gcG9ydCB8fCBERUZBVUxUX1BPUlQ7XG4gIGNvbnN0IHVybCA9IGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7dGFyZ2V0UG9ydH1gO1xuICBjb25zdCBhbHJlYWR5UnVubmluZyA9IHNlcnZlclJ1bm5pbmc7XG5cbiAgaWYgKCFzZXJ2ZXJSdW5uaW5nKSB7XG4gICAgYXdhaXQgc3RhcnRXZWJTZXJ2ZXIoe1xuICAgICAgcG9ydGZvbGlvRGlyLFxuICAgICAgcG9ydDogdGFyZ2V0UG9ydCxcbiAgICAgIG9wZW5Ccm93c2VyOiBmYWxzZSwgLy8gV2UnbGwgb3BlbiBtYW51YWxseSBiZWxvdyB0byBjYXB0dXJlIHRoZSByZXN1bHRcbiAgICAgIG1jcEFxbEhhbmRsZXIsXG4gICAgfSk7XG4gICAgLy8gV2FpdCBicmllZmx5IGZvciB0aGUgc2VydmVyIHRvIGJpbmRcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwKSk7XG4gIH1cblxuICBjb25zdCBicm93c2VyUmVzdWx0ID0gYXdhaXQgb3BlbkluQnJvd3Nlcih1cmwpO1xuXG4gIHJldHVybiB7XG4gICAgdXJsLFxuICAgIGFscmVhZHlSdW5uaW5nLFxuICAgIGJyb3dzZXJPcGVuZWQ6IGJyb3dzZXJSZXN1bHQuc3VjY2VzcyxcbiAgICAuLi4oYnJvd3NlclJlc3VsdC5lcnJvciA/IHsgd2FybmluZzogYEJyb3dzZXIgY291bGQgbm90IGJlIG9wZW5lZCBhdXRvbWF0aWNhbGx5OiAke2Jyb3dzZXJSZXN1bHQuZXJyb3J9LiBPcGVuICR7dXJsfSBtYW51YWxseS5gIH0gOiB7fSksXG4gIH07XG59XG4iXX0=
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3dlYi9zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0dBV0c7QUFFSCxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxlQUFlLEVBQXdCLE1BQU0sdUJBQXVCLENBQUM7QUFDOUUsT0FBTyxFQUFFLG1CQUFtQixFQUE0QixNQUFNLDJCQUEyQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUs1QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMxRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7QUFDMUIsTUFBTSxZQUFZLEdBQUcscUJBQXFCLENBQUM7QUFDM0MsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBRTNELGtFQUFrRTtBQUNsRSxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7QUFDMUIsSUFB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QUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERvbGxob3VzZU1DUCBXZWIgVUkgU2VydmVyXG4gKlxuICogTGlnaHR3ZWlnaHQgRXhwcmVzcyBzZXJ2ZXIgZm9yIGJyb3dzaW5nIHBvcnRmb2xpbyBlbGVtZW50cyBpbiBhIGJyb3dzZXIuXG4gKiBCb3VuZCB0byAxMjcuMC4wLjEgb25seSAobG9jYWxob3N0KS4gUmVhZC1vbmx5IGZvciBWMS5cbiAqXG4gKiBDYW4gYmUgc3RhcnRlZCBzdGFuZGFsb25lIChgLS13ZWJgIGZsYWcpIG9yIGZyb20gd2l0aGluIHRoZSBNQ1Agc2VydmVyXG4gKiBwcm9jZXNzIHZpYSBgb3BlblBvcnRmb2xpb0Jyb3dzZXIoKWAuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXItdjItcmVmYWN0b3IvaXNzdWVzLzcwNFxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vRG9sbGhvdXNlTUNQL21jcC1zZXJ2ZXItdjItcmVmYWN0b3IvaXNzdWVzLzc3NFxuICovXG5cbmltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IHsgam9pbiwgZGlybmFtZSwgZXh0bmFtZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHsgZXhlY0ZpbGUgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgcGxhdGZvcm0gfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBjcmVhdGVBcGlSb3V0ZXMsIGNyZWF0ZUdhdGV3YXlBcGlSb3V0ZXMgfSBmcm9tICcuL3JvdXRlcy5qcyc7XG5pbXBvcnQgeyBjcmVhdGVMb2dSb3V0ZXMsIHR5cGUgTG9nUm91dGVzUmVzdWx0IH0gZnJvbSAnLi9yb3V0ZXMvbG9nUm91dGVzLmpzJztcbmltcG9ydCB7IGNyZWF0ZU1ldHJpY3NSb3V0ZXMsIHR5cGUgTWV0cmljc1JvdXRlc1Jlc3VsdCB9IGZyb20gJy4vcm91dGVzL21ldHJpY3NSb3V0ZXMuanMnO1xuaW1wb3J0IHsgY3JlYXRlSGVhbHRoUm91dGVzIH0gZnJvbSAnLi9yb3V0ZXMvaGVhbHRoUm91dGVzLmpzJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IE1DUEFRTEhhbmRsZXIgfSBmcm9tICcuLi9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNZW1vcnlMb2dTaW5rIH0gZnJvbSAnLi4vbG9nZ2luZy9zaW5rcy9NZW1vcnlMb2dTaW5rLmpzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5TWV0cmljc1NpbmsgfSBmcm9tICcuLi9tZXRyaWNzL3NpbmtzL01lbW9yeU1ldHJpY3NTaW5rLmpzJztcblxuY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuY29uc3QgREVGQVVMVF9QT1JUID0gMzkzOTtcbmNvbnN0IENPTlNPTEVfSE9TVCA9ICdkb2xsaG91c2UubG9jYWxob3N0JztcbmNvbnN0IEFMTE9XRURfUEFHRV9FWFRFTlNJT05TID0gbmV3IFNldChbJy5odG1sJywgJy5odG0nXSk7XG5cbi8qKiBUcmFjayB3aGV0aGVyIHRoZSB3ZWIgc2VydmVyIGlzIGFscmVhZHkgcnVubmluZyBpbi1wcm9jZXNzLiAqL1xubGV0IHNlcnZlclJ1bm5pbmcgPSBmYWxzZTtcbmxldCBzZXJ2ZXJQb3J0ID0gREVGQVVMVF9QT1JUO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIHRoZSB3ZWIgc2VydmVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlcnZlck9wdGlvbnMge1xuICAvKiogUG9ydCB0byBiaW5kIHRvIChkZWZhdWx0OiAzOTM5KSAqL1xuICBwb3J0PzogbnVtYmVyO1xuICAvKiogUGF0aCB0byB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeSAoZS5nLiwgfi8uZG9sbGhvdXNlL3BvcnRmb2xpbykgKi9cbiAgcG9ydGZvbGlvRGlyOiBzdHJpbmc7XG4gIC8qKiBPcGVuIHRoZSBicm93c2VyIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgc3RhcnRpbmcgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICBvcGVuQnJvd3Nlcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBNQ1BBUUxIYW5kbGVyIGZvciByb3V0aW5nIHRocm91Z2ggdGhlIE1DUC1BUUwgcGlwZWxpbmUuXG4gICAqIFdoZW4gcHJvdmlkZWQsIEFQSSByb3V0ZXMgdXNlIHRoZSBnYXRld2F5ICh2YWxpZGF0ZWQsIGNhY2hlZCwgZ2F0ZWtlZXBlci1jaGVja2VkKS5cbiAgICogV2hlbiBhYnNlbnQsIGZhbGxzIGJhY2sgdG8gZGlyZWN0IGZpbGVzeXN0ZW0gYWNjZXNzIChsZWdhY3kgYmVoYXZpb3IpLlxuICAgKiBJc3N1ZSAjNzk2OiBXZWIgTUNQLUFRTCBHYXRld2F5LlxuICAgKi9cbiAgbWNwQXFsSGFuZGxlcj86IE1DUEFRTEhhbmRsZXI7XG4gIC8qKiBNZW1vcnlMb2dTaW5rIGZvciBsb2cgcm91dGVzIChvcHRpb25hbCDigJQgbG9ncyB0YWIgZGlzYWJsZWQgaWYgbm90IHByb3ZpZGVkKSAqL1xuICBtZW1vcnlTaW5rPzogTWVtb3J5TG9nU2luaztcbiAgLyoqIE1lbW9yeU1ldHJpY3NTaW5rIGZvciBtZXRyaWNzIHJvdXRlcyAob3B0aW9uYWwg4oCUIG1ldHJpY3MgdGFiIGRpc2FibGVkIGlmIG5vdCBwcm92aWRlZCkgKi9cbiAgbWV0cmljc1Npbms/OiBNZW1vcnlNZXRyaWNzU2luaztcbiAgLyoqIEFkZGl0aW9uYWwgcm91dGVycyB0byBtb3VudCBiZWZvcmUgdGhlIFNQQSBmYWxsYmFjayAoZS5nLiwgaW5nZXN0IHJvdXRlcykgKi9cbiAgYWRkaXRpb25hbFJvdXRlcnM/OiBpbXBvcnQoJ2V4cHJlc3MnKS5Sb3V0ZXJbXTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Ygc3RhcnRpbmcgdGhlIHdlYiBzZXJ2ZXIsIGluY2x1ZGluZyBob29rcyBmb3IgREkgd2lyaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlcnZlclJlc3VsdCB7XG4gIC8qKiBFeHByZXNzIGFwcCBpbnN0YW5jZSDigJQgZm9yIG1vdW50aW5nIGFkZGl0aW9uYWwgcm91dGVzIChlLmcuLCBpbmdlc3Qgcm91dGVzKSAqL1xuICBhcHA/OiBpbXBvcnQoJ2V4cHJlc3MnKS5FeHByZXNzO1xuICAvKiogTG9nIGJyb2FkY2FzdCBmdW5jdGlvbiDigJQgY2FsbCB3aXRoIGVhY2ggZW50cnkgdG8gcHVzaCB0byBTU0UgY2xpZW50cyAqL1xuICBsb2dCcm9hZGNhc3Q/OiAoZW50cnk6IGltcG9ydCgnLi4vbG9nZ2luZy90eXBlcy5qcycpLlVuaWZpZWRMb2dFbnRyeSkgPT4gdm9pZDtcbiAgLyoqIE1ldHJpY3Mgc25hcHNob3QgZnVuY3Rpb24g4oCUIGNhbGwgd2l0aCBlYWNoIHNuYXBzaG90IHRvIHB1c2ggdG8gU1NFIGNsaWVudHMgKi9cbiAgbWV0cmljc09uU25hcHNob3Q/OiAoc25hcHNob3Q6IGltcG9ydCgnLi4vbWV0cmljcy90eXBlcy5qcycpLk1ldHJpY1NuYXBzaG90KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBhdHRlbXB0aW5nIHRvIG9wZW4gdGhlIGJyb3dzZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJvd3Nlck9wZW5SZXN1bHQge1xuICAvKiogVGhlIFVSTCB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgb24gKi9cbiAgdXJsOiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGFscmVhZHkgcnVubmluZyAodHJ1ZSkgb3IganVzdCBzdGFydGVkIChmYWxzZSkgKi9cbiAgYWxyZWFkeVJ1bm5pbmc6IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBicm93c2VyIHdhcyBzdWNjZXNzZnVsbHkgb3BlbmVkICovXG4gIGJyb3dzZXJPcGVuZWQ6IGJvb2xlYW47XG4gIC8qKiBXYXJuaW5nIG1lc3NhZ2UgaWYgdGhlIGJyb3dzZXIgY291bGQgbm90IGJlIG9wZW5lZCAqL1xuICB3YXJuaW5nPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wZW4gYSBVUkwgaW4gdGhlIHN5c3RlbSdzIGRlZmF1bHQgYnJvd3Nlci5cbiAqXG4gKiBQbGF0Zm9ybS1hd2FyZTpcbiAqIC0gbWFjT1M6IGBvcGVuYFxuICogLSBMaW51eDogYHhkZy1vcGVuYFxuICogLSBXaW5kb3dzOiBgc3RhcnRgXG4gKlxuICogQHBhcmFtIHVybCAtIFRoZSBVUkwgdG8gb3BlblxuICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRydWUgaWYgdGhlIGJyb3dzZXIgb3BlbmVkLCBmYWxzZSB3aXRoIGVycm9yIG1lc3NhZ2UgaWYgbm90XG4gKi9cbmZ1bmN0aW9uIG9wZW5JbkJyb3dzZXIodXJsOiBzdHJpbmcpOiBQcm9taXNlPHsgc3VjY2VzczogYm9vbGVhbjsgZXJyb3I/OiBzdHJpbmcgfT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBjb25zdCBwbGF0ID0gcGxhdGZvcm0oKTtcbiAgICBjb25zdCBjbWQgPSBwbGF0ID09PSAnZGFyd2luJyA/ICdvcGVuJ1xuICAgICAgOiBwbGF0ID09PSAnd2luMzInID8gJ3N0YXJ0J1xuICAgICAgOiAneGRnLW9wZW4nO1xuXG4gICAgLy8gU2VjdXJpdHk6IHVzZSBleGVjRmlsZSB3aXRoIFVSTCBhcyBhcmd1bWVudCBhcnJheSwgbm90IHN0cmluZyBpbnRlcnBvbGF0aW9uXG4gICAgY29uc3QgdXJsU3RyID0gU3RyaW5nKHVybCk7XG4gICAgaWYgKCEvXmh0dHBzPzpcXC9cXC9sb2NhbGhvc3RbOi9dLy50ZXN0KHVybFN0cikpIHtcbiAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiBmYWxzZSwgZXJyb3I6ICdVUkwgbXVzdCBiZSBhIGxvY2FsaG9zdCBIVFRQIFVSTCcgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV4ZWNGaWxlKGNtZCwgW3VybFN0cl0sIChlcnIpID0+IHtcbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtXZWJVSV0gQ291bGQgbm90IGF1dG8tb3BlbiBicm93c2VyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICByZXNvbHZlKHsgc3VjY2VzczogZmFsc2UsIGVycm9yOiBlcnIubWVzc2FnZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc29sdmUoeyBzdWNjZXNzOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBTdGFydCB0aGUgcG9ydGZvbGlvIHdlYiBzZXJ2ZXIuXG4gKlxuICogQmluZHMgdG8gMTI3LjAuMC4xIG9ubHkgKGxvY2FsaG9zdCkuIFNlcnZlcyB0aGUgcG9ydGZvbGlvIGJyb3dzZXJcbiAqIGZyb250ZW5kIGFuZCBBUEkgcm91dGVzIGZvciByZWFkaW5nIGVsZW1lbnRzLlxuICpcbiAqIElkZW1wb3RlbnQ6IGlmIHRoZSBzZXJ2ZXIgaXMgYWxyZWFkeSBydW5uaW5nLCBvcHRpb25hbGx5IG9wZW5zIHRoZVxuICogYnJvd3NlciB3aXRob3V0IHN0YXJ0aW5nIGEgc2Vjb25kIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gU2VydmVyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIEhvb2tzIGZvciBESSB3aXJpbmcgKGxvZyBicm9hZGNhc3QsIG1ldHJpY3Mgb25TbmFwc2hvdClcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0V2ViU2VydmVyKG9wdGlvbnM6IFdlYlNlcnZlck9wdGlvbnMpOiBQcm9taXNlPFdlYlNlcnZlclJlc3VsdD4ge1xuICBjb25zdCBwb3J0ID0gb3B0aW9ucy5wb3J0IHx8IERFRkFVTFRfUE9SVDtcbiAgY29uc3QgcmVzdWx0OiBXZWJTZXJ2ZXJSZXN1bHQgPSB7fTtcblxuICBpZiAoc2VydmVyUnVubmluZykge1xuICAgIGlmIChvcHRpb25zLm9wZW5Ccm93c2VyKSB7XG4gICAgICBvcGVuSW5Ccm93c2VyKGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7c2VydmVyUG9ydH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcbiAgcmVzdWx0LmFwcCA9IGFwcDtcbiAgYXBwLmRpc2FibGUoJ3gtcG93ZXJlZC1ieScpO1xuXG4gIC8vIFNlY3VyaXR5IGhlYWRlcnNcbiAgYXBwLnVzZSgoX3JlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgcmVzLnNldEhlYWRlcignWC1Db250ZW50LVR5cGUtT3B0aW9ucycsICdub3NuaWZmJyk7XG4gICAgcmVzLnNldEhlYWRlcignWC1GcmFtZS1PcHRpb25zJywgJ0RFTlknKTtcbiAgICByZXMuc2V0SGVhZGVyKCdYLVhTUy1Qcm90ZWN0aW9uJywgJzE7IG1vZGU9YmxvY2snKTtcbiAgICByZXMuc2V0SGVhZGVyKCdSZWZlcnJlci1Qb2xpY3knLCAnbm8tcmVmZXJyZXInKTtcbiAgICByZXMuc2V0SGVhZGVyKCdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCBgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3BvcnR9YCk7XG4gICAgcmVzLnNldEhlYWRlcignQ29udGVudC1TZWN1cml0eS1Qb2xpY3knLCBbXG4gICAgICBcImRlZmF1bHQtc3JjICdzZWxmJ1wiLFxuICAgICAgXCJzY3JpcHQtc3JjICdzZWxmJyBjZG4uanNkZWxpdnIubmV0IGNkbmpzLmNsb3VkZmxhcmUuY29tXCIsXG4gICAgICBcInN0eWxlLXNyYyAnc2VsZicgJ3Vuc2FmZS1pbmxpbmUnIGNkbmpzLmNsb3VkZmxhcmUuY29tIGNkbi5qc2RlbGl2ci5uZXRcIixcbiAgICAgIFwiY29ubmVjdC1zcmMgJ3NlbGYnIHJhdy5naXRodWJ1c2VyY29udGVudC5jb21cIixcbiAgICAgIFwiZm9udC1zcmMgJ3NlbGYnXCIsXG4gICAgXS5qb2luKCc7ICcpKTtcbiAgICBuZXh0KCk7XG4gIH0pO1xuXG4gIC8vIEFQSSByb3V0ZXMg4oCUIHVzZSBNQ1AtQVFMIGdhdGV3YXkgd2hlbiBoYW5kbGVyIGlzIGF2YWlsYWJsZSAoSXNzdWUgIzc5NilcbiAgaWYgKG9wdGlvbnMubWNwQXFsSGFuZGxlcikge1xuICAgIGFwcC51c2UoJy9hcGknLCBjcmVhdGVHYXRld2F5QXBpUm91dGVzKG9wdGlvbnMubWNwQXFsSGFuZGxlciwgb3B0aW9ucy5wb3J0Zm9saW9EaXIpKTtcblxuICAgIC8vIFBlcm1pc3Npb24gZXZhbHVhdGlvbiByb3V0ZXMgKFBPU1QgL2V2YWx1YXRlX3Blcm1pc3Npb24sIEdFVCAvcGVybWlzc2lvbnMvc3RhdHVzKVxuICAgIGNvbnN0IHsgcmVnaXN0ZXJQZXJtaXNzaW9uUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoJy4vcm91dGVzL3Blcm1pc3Npb25Sb3V0ZXMuanMnKTtcbiAgICBjb25zdCBwZXJtUm91dGVyID0gKGF3YWl0IGltcG9ydCgnZXhwcmVzcycpKS5Sb3V0ZXIoKTtcbiAgICByZWdpc3RlclBlcm1pc3Npb25Sb3V0ZXMocGVybVJvdXRlciwgb3B0aW9ucy5tY3BBcWxIYW5kbGVyKTtcbiAgICBhcHAudXNlKCcvYXBpJywgcGVybVJvdXRlcik7XG5cbiAgICBsb2dnZXIuaW5mbygnW1dlYlVJXSBBUEkgcm91dGVzIHVzaW5nIE1DUC1BUUwgR2F0ZXdheSArIHBlcm1pc3Npb24gcm91dGVzJyk7XG4gIH0gZWxzZSB7XG4gICAgYXBwLnVzZSgnL2FwaScsIGNyZWF0ZUFwaVJvdXRlcyhvcHRpb25zLnBvcnRmb2xpb0RpcikpO1xuICAgIGxvZ2dlci53YXJuKCdbV2ViVUldIEFQSSByb3V0ZXMgdXNpbmcgZGlyZWN0IGZpbGVzeXN0ZW0gYWNjZXNzIChubyBNQ1AtQVFMIGhhbmRsZXIgYXZhaWxhYmxlKScpO1xuICB9XG5cbiAgLy8gQ29uc29sZSByb3V0ZXM6IGxvZ3MsIG1ldHJpY3MsIGhlYWx0aFxuICBsZXQgbG9nUm91dGVzOiBMb2dSb3V0ZXNSZXN1bHQgfCB1bmRlZmluZWQ7XG4gIGxldCBtZXRyaWNzUm91dGVzOiBNZXRyaWNzUm91dGVzUmVzdWx0IHwgdW5kZWZpbmVkO1xuXG4gIGlmIChvcHRpb25zLm1lbW9yeVNpbmspIHtcbiAgICBsb2dSb3V0ZXMgPSBjcmVhdGVMb2dSb3V0ZXMob3B0aW9ucy5tZW1vcnlTaW5rKTtcbiAgICBhcHAudXNlKCcvYXBpJywgbG9nUm91dGVzLnJvdXRlcik7XG4gICAgcmVzdWx0LmxvZ0Jyb2FkY2FzdCA9IGxvZ1JvdXRlcy5icm9hZGNhc3Q7XG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gTG9nIHZpZXdlciByb3V0ZXMgbW91bnRlZCBhdCAvYXBpL2xvZ3MnKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLm1ldHJpY3NTaW5rKSB7XG4gICAgbWV0cmljc1JvdXRlcyA9IGNyZWF0ZU1ldHJpY3NSb3V0ZXMob3B0aW9ucy5tZXRyaWNzU2luayk7XG4gICAgYXBwLnVzZSgnL2FwaScsIG1ldHJpY3NSb3V0ZXMucm91dGVyKTtcbiAgICByZXN1bHQubWV0cmljc09uU25hcHNob3QgPSBtZXRyaWNzUm91dGVzLm9uU25hcHNob3Q7XG4gICAgbG9nZ2VyLmluZm8oJ1tXZWJVSV0gTWV0cmljcyByb3V0ZXMgbW91bnRlZCBhdCAvYXBpL21ldHJpY3MnKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLm1lbW9yeVNpbmspIHtcbiAgICBjb25zdCBoZWFsdGhSb3V0ZXIgPSBjcmVhdGVIZWFsdGhSb3V0ZXMoe1xuICAgICAgbWVtb3J5U2luazogb3B0aW9ucy5tZW1vcnlTaW5rLFxuICAgICAgbWV0cmljc1Npbms6IG9wdGlvbnMubWV0cmljc1NpbmssXG4gICAgICBsb2dDbGllbnRDb3VudDogbG9nUm91dGVzID8gbG9nUm91dGVzLmNsaWVudENvdW50IDogKCkgPT4gMCxcbiAgICAgIG1ldHJpY3NDbGllbnRDb3VudDogbWV0cmljc1JvdXRlcyA/IG1ldHJpY3NSb3V0ZXMuY2xpZW50Q291bnQgOiAoKSA9PiAwLFxuICAgIH0pO1xuICAgIGFwcC51c2UoJy9hcGknLCBoZWFsdGhSb3V0ZXIpO1xuICB9XG5cbiAgLy8gU2VydmUgfi8uZG9sbGhvdXNlL3BhZ2VzLyBhdCAvcGFnZXMvIOKAlCBkYXNoYm9hcmRzLCBnZW5lcmF0ZWQgY29udGVudCwgc3RhY2sgdmlld3NcbiAgY29uc3QgcGFnZXNEaXIgPSBqb2luKGRpcm5hbWUob3B0aW9ucy5wb3J0Zm9saW9EaXIpLCAncGFnZXMnKTtcbiAgbWtkaXIocGFnZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pLmNhdGNoKGVyciA9PiB7XG4gICAgbG9nZ2VyLndhcm4oYFtXZWJVSV0gQ291bGQgbm90IGNyZWF0ZSBwYWdlcyBkaXJlY3Rvcnk6ICR7KGVyciBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgfSk7XG4gIGFwcC51c2UoJy9wYWdlcycsIGV4cHJlc3Muc3RhdGljKHBhZ2VzRGlyKSk7XG5cbiAgLyoqXG4gICAqIEdFVCAvYXBpL3BhZ2VzXG4gICAqIExpc3RzIGF2YWlsYWJsZSBIVE1MIHBhZ2VzIGluIH4vLmRvbGxob3VzZS9wYWdlcy8uXG4gICAqIFJldHVybnMgcGFnZSBuYW1lcyBhbmQgdGhlaXIgVVJMcyBmb3IgdGhlIG1hbmFnZW1lbnQgY29uc29sZS5cbiAgICovXG4gIGFwcC5nZXQoJy9hcGkvcGFnZXMnLCBhc3luYyAoX3JlcSwgcmVzKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgcmVhZGRpcihwYWdlc0Rpcik7XG4gICAgICBjb25zdCBwYWdlcyA9IGZpbGVzXG4gICAgICAgIC5maWx0ZXIoZiA9PiAhZi5zdGFydHNXaXRoKCcuJykgJiYgQUxMT1dFRF9QQUdFX0VYVEVOU0lPTlMuaGFzKGV4dG5hbWUoZikpKVxuICAgICAgICAubWFwKGYgPT4gKHsgbmFtZTogZiwgdXJsOiBgL3BhZ2VzLyR7Zn1gIH0pKTtcbiAgICAgIHJlcy5qc29uKHsgcGFnZXMsIGRpcmVjdG9yeTogcGFnZXNEaXIgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXMuanNvbih7IHBhZ2VzOiBbXSwgZGlyZWN0b3J5OiBwYWdlc0RpciB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEFkZGl0aW9uYWwgcm91dGVycyAoZS5nLiwgdW5pZmllZCBjb25zb2xlIGluZ2VzdCByb3V0ZXMpIOKAlCBtdXN0IG1vdW50IGJlZm9yZSBTUEEgZmFsbGJhY2tcbiAgb3B0aW9ucy5hZGRpdGlvbmFsUm91dGVycz8uZm9yRWFjaChyb3V0ZXIgPT4gYXBwLnVzZShyb3V0ZXIpKTtcblxuICAvLyBTdGF0aWMgZnJvbnRlbmQgZmlsZXNcbiAgY29uc3QgcHVibGljRGlyID0gam9pbihfX2Rpcm5hbWUsICdwdWJsaWMnKTtcbiAgYXBwLnVzZShleHByZXNzLnN0YXRpYyhwdWJsaWNEaXIpKTtcblxuICAvLyBTUEEgZmFsbGJhY2tcbiAgYXBwLmdldCgnL3sqcGF0aH0nLCAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHJlcS5wYXRoLm5vcm1hbGl6ZSgnTkZDJyk7XG4gICAgaWYgKG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgoJy9hcGkvJykpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IGBBUEkgcm91dGUgbm90IGZvdW5kOiAke25vcm1hbGl6ZWRQYXRofWAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKCcvcGFnZXMvJykpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6IGBQYWdlIG5vdCBmb3VuZDogJHtub3JtYWxpemVkUGF0aH1gIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXMuc2VuZEZpbGUoam9pbihwdWJsaWNEaXIsICdpbmRleC5odG1sJykpO1xuICB9KTtcblxuICAvLyBCaW5kIHRvIGxvY2FsaG9zdCBvbmx5XG4gIGFwcC5saXN0ZW4ocG9ydCwgJzEyNy4wLjAuMScsICgpID0+IHtcbiAgICBzZXJ2ZXJSdW5uaW5nID0gdHJ1ZTtcbiAgICBzZXJ2ZXJQb3J0ID0gcG9ydDtcbiAgICBjb25zdCB1cmwgPSBgaHR0cDovLyR7Q09OU09MRV9IT1NUfToke3BvcnR9YDtcbiAgICBjb25zdCBmYWxsYmFja1VybCA9IGBodHRwOi8vMTI3LjAuMC4xOiR7cG9ydH1gO1xuICAgIGxvZ2dlci5pbmZvKGBbV2ViVUldIE1hbmFnZW1lbnQgY29uc29sZSBydW5uaW5nIGF0ICR7dXJsfWApO1xuICAgIGNvbnNvbGUubG9nKGBcXG4gIERvbGxob3VzZU1DUCBNYW5hZ2VtZW50IENvbnNvbGVcXG4gICR7dXJsfVxcbiAgJHtmYWxsYmFja1VybH0gKGZhbGxiYWNrKVxcbmApO1xuXG4gICAgaWYgKG9wdGlvbnMub3BlbkJyb3dzZXIpIHtcbiAgICAgIG9wZW5JbkJyb3dzZXIodXJsKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogT3BlbiB0aGUgcG9ydGZvbGlvIGJyb3dzZXIgZnJvbSB3aXRoaW4gdGhlIE1DUCBzZXJ2ZXIgcHJvY2Vzcy5cbiAqXG4gKiBTdGFydHMgdGhlIHdlYiBzZXJ2ZXIgaWYgbm90IGFscmVhZHkgcnVubmluZywgdGhlbiBvcGVucyB0aGUgc3lzdGVtXG4gKiBicm93c2VyIHRvIHRoZSBwb3J0Zm9saW8gVUkuIFJldHVybnMgYSByZXN1bHQgb2JqZWN0IGluZGljYXRpbmdcbiAqIHdoZXRoZXIgdGhlIHNlcnZlciBzdGFydGVkIGFuZCB0aGUgYnJvd3NlciBvcGVuZWQgc3VjY2Vzc2Z1bGx5LlxuICpcbiAqIENhbGxlZCBieSB0aGUgYG9wZW5fcG9ydGZvbGlvX2Jyb3dzZXJgIE1DUC1BUUwgb3BlcmF0aW9uIChJc3N1ZSAjNzc0KS5cbiAqXG4gKiBAcGFyYW0gcG9ydGZvbGlvRGlyIC0gUGF0aCB0byB0aGUgcG9ydGZvbGlvIGRpcmVjdG9yeSAoZS5nLiwgfi8uZG9sbGhvdXNlL3BvcnRmb2xpbylcbiAqIEBwYXJhbSBwb3J0IC0gUG9ydCB0byBiaW5kIHRvIChkZWZhdWx0OiAzOTM5KVxuICogQHJldHVybnMgUmVzdWx0IHdpdGggVVJMLCBzZXJ2ZXIgc3RhdHVzLCBhbmQgYnJvd3NlciBvcGVuIHN0YXR1c1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3BlblBvcnRmb2xpb0Jyb3dzZXIocG9ydGZvbGlvRGlyOiBzdHJpbmcsIHBvcnQ/OiBudW1iZXIsIG1jcEFxbEhhbmRsZXI/OiBNQ1BBUUxIYW5kbGVyKTogUHJvbWlzZTxCcm93c2VyT3BlblJlc3VsdD4ge1xuICBjb25zdCB0YXJnZXRQb3J0ID0gcG9ydCB8fCBERUZBVUxUX1BPUlQ7XG4gIGNvbnN0IHVybCA9IGBodHRwOi8vJHtDT05TT0xFX0hPU1R9OiR7dGFyZ2V0UG9ydH1gO1xuICBjb25zdCBhbHJlYWR5UnVubmluZyA9IHNlcnZlclJ1bm5pbmc7XG5cbiAgaWYgKCFzZXJ2ZXJSdW5uaW5nKSB7XG4gICAgYXdhaXQgc3RhcnRXZWJTZXJ2ZXIoe1xuICAgICAgcG9ydGZvbGlvRGlyLFxuICAgICAgcG9ydDogdGFyZ2V0UG9ydCxcbiAgICAgIG9wZW5Ccm93c2VyOiBmYWxzZSwgLy8gV2UnbGwgb3BlbiBtYW51YWxseSBiZWxvdyB0byBjYXB0dXJlIHRoZSByZXN1bHRcbiAgICAgIG1jcEFxbEhhbmRsZXIsXG4gICAgfSk7XG4gICAgLy8gV2FpdCBicmllZmx5IGZvciB0aGUgc2VydmVyIHRvIGJpbmRcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNTAwKSk7XG4gIH1cblxuICBjb25zdCBicm93c2VyUmVzdWx0ID0gYXdhaXQgb3BlbkluQnJvd3Nlcih1cmwpO1xuXG4gIHJldHVybiB7XG4gICAgdXJsLFxuICAgIGFscmVhZHlSdW5uaW5nLFxuICAgIGJyb3dzZXJPcGVuZWQ6IGJyb3dzZXJSZXN1bHQuc3VjY2VzcyxcbiAgICAuLi4oYnJvd3NlclJlc3VsdC5lcnJvciA/IHsgd2FybmluZzogYEJyb3dzZXIgY291bGQgbm90IGJlIG9wZW5lZCBhdXRvbWF0aWNhbGx5OiAke2Jyb3dzZXJSZXN1bHQuZXJyb3J9LiBPcGVuICR7dXJsfSBtYW51YWxseS5gIH0gOiB7fSksXG4gIH07XG59XG4iXX0=
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Thin ILogSink adapter that bridges LogManager to the web console SSE stream.
3
+ *
4
+ * write() calls the broadcast function from logRoutes.
5
+ * flush()/close() are no-ops — the SSE connections are managed by Express.
6
+ */
7
+ import type { ILogSink, UnifiedLogEntry } from '../../logging/types.js';
8
+ export declare class WebSSELogSink implements ILogSink {
9
+ private readonly broadcast;
10
+ constructor(broadcast: (entry: UnifiedLogEntry) => void);
11
+ write(entry: UnifiedLogEntry): void;
12
+ flush(): Promise<void>;
13
+ close(): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=WebSSELogSink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSSELogSink.d.ts","sourceRoot":"","sources":["../../../src/web/sinks/WebSSELogSink.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAExE,qBAAa,aAAc,YAAW,QAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI;IAExE,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAI7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Thin ILogSink adapter that bridges LogManager to the web console SSE stream.
3
+ *
4
+ * write() calls the broadcast function from logRoutes.
5
+ * flush()/close() are no-ops — the SSE connections are managed by Express.
6
+ */
7
+ export class WebSSELogSink {
8
+ broadcast;
9
+ constructor(broadcast) {
10
+ this.broadcast = broadcast;
11
+ }
12
+ write(entry) {
13
+ this.broadcast(entry);
14
+ }
15
+ async flush() {
16
+ // No-op — SSE writes are immediate.
17
+ }
18
+ async close() {
19
+ // No-op — SSE connections managed by Express.
20
+ }
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ViU1NFTG9nU2luay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93ZWIvc2lua3MvV2ViU1NFTG9nU2luay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQUlILE1BQU0sT0FBTyxhQUFhO0lBQ0s7SUFBN0IsWUFBNkIsU0FBMkM7UUFBM0MsY0FBUyxHQUFULFNBQVMsQ0FBa0M7SUFBRyxDQUFDO0lBRTVFLEtBQUssQ0FBQyxLQUFzQjtRQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNULG9DQUFvQztJQUN0QyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCw4Q0FBOEM7SUFDaEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGluIElMb2dTaW5rIGFkYXB0ZXIgdGhhdCBicmlkZ2VzIExvZ01hbmFnZXIgdG8gdGhlIHdlYiBjb25zb2xlIFNTRSBzdHJlYW0uXG4gKlxuICogd3JpdGUoKSBjYWxscyB0aGUgYnJvYWRjYXN0IGZ1bmN0aW9uIGZyb20gbG9nUm91dGVzLlxuICogZmx1c2goKS9jbG9zZSgpIGFyZSBuby1vcHMg4oCUIHRoZSBTU0UgY29ubmVjdGlvbnMgYXJlIG1hbmFnZWQgYnkgRXhwcmVzcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IElMb2dTaW5rLCBVbmlmaWVkTG9nRW50cnkgfSBmcm9tICcuLi8uLi9sb2dnaW5nL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYlNTRUxvZ1NpbmsgaW1wbGVtZW50cyBJTG9nU2luayB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYnJvYWRjYXN0OiAoZW50cnk6IFVuaWZpZWRMb2dFbnRyeSkgPT4gdm9pZCkge31cblxuICB3cml0ZShlbnRyeTogVW5pZmllZExvZ0VudHJ5KTogdm9pZCB7XG4gICAgdGhpcy5icm9hZGNhc3QoZW50cnkpO1xuICB9XG5cbiAgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTm8tb3Ag4oCUIFNTRSB3cml0ZXMgYXJlIGltbWVkaWF0ZS5cbiAgfVxuXG4gIGFzeW5jIGNsb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIE5vLW9wIOKAlCBTU0UgY29ubmVjdGlvbnMgbWFuYWdlZCBieSBFeHByZXNzLlxuICB9XG59XG4iXX0=
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Thin IMetricsSink adapter that bridges MetricsManager to the web console SSE stream.
3
+ *
4
+ * onSnapshot() calls the onSnapshot function from metricsRoutes.
5
+ * flush()/close() are no-ops — the SSE connections are managed by Express.
6
+ */
7
+ import type { IMetricsSink, MetricSnapshot } from '../../metrics/types.js';
8
+ export declare class WebSSEMetricsSink implements IMetricsSink {
9
+ private readonly pushSnapshot;
10
+ readonly name = "WebSSEMetricsSink";
11
+ constructor(pushSnapshot: (snapshot: MetricSnapshot) => void);
12
+ onSnapshot(snapshot: MetricSnapshot): void;
13
+ flush(): Promise<void>;
14
+ close(): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=WebSSEMetricsSink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSSEMetricsSink.d.ts","sourceRoot":"","sources":["../../../src/web/sinks/WebSSEMetricsSink.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE3E,qBAAa,iBAAkB,YAAW,YAAY;IAGxC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAFzC,QAAQ,CAAC,IAAI,uBAAuB;gBAEP,YAAY,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI;IAE7E,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAIpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Thin IMetricsSink adapter that bridges MetricsManager to the web console SSE stream.
3
+ *
4
+ * onSnapshot() calls the onSnapshot function from metricsRoutes.
5
+ * flush()/close() are no-ops — the SSE connections are managed by Express.
6
+ */
7
+ export class WebSSEMetricsSink {
8
+ pushSnapshot;
9
+ name = 'WebSSEMetricsSink';
10
+ constructor(pushSnapshot) {
11
+ this.pushSnapshot = pushSnapshot;
12
+ }
13
+ onSnapshot(snapshot) {
14
+ this.pushSnapshot(snapshot);
15
+ }
16
+ async flush() {
17
+ // No-op — SSE writes are immediate.
18
+ }
19
+ async close() {
20
+ // No-op — SSE connections managed by Express.
21
+ }
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ViU1NFTWV0cmljc1NpbmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvd2ViL3NpbmtzL1dlYlNTRU1ldHJpY3NTaW5rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQUdDO0lBRnBCLElBQUksR0FBRyxtQkFBbUIsQ0FBQztJQUVwQyxZQUE2QixZQUFnRDtRQUFoRCxpQkFBWSxHQUFaLFlBQVksQ0FBb0M7SUFBRyxDQUFDO0lBRWpGLFVBQVUsQ0FBQyxRQUF3QjtRQUNqQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNULG9DQUFvQztJQUN0QyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDVCw4Q0FBOEM7SUFDaEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGluIElNZXRyaWNzU2luayBhZGFwdGVyIHRoYXQgYnJpZGdlcyBNZXRyaWNzTWFuYWdlciB0byB0aGUgd2ViIGNvbnNvbGUgU1NFIHN0cmVhbS5cbiAqXG4gKiBvblNuYXBzaG90KCkgY2FsbHMgdGhlIG9uU25hcHNob3QgZnVuY3Rpb24gZnJvbSBtZXRyaWNzUm91dGVzLlxuICogZmx1c2goKS9jbG9zZSgpIGFyZSBuby1vcHMg4oCUIHRoZSBTU0UgY29ubmVjdGlvbnMgYXJlIG1hbmFnZWQgYnkgRXhwcmVzcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IElNZXRyaWNzU2luaywgTWV0cmljU25hcHNob3QgfSBmcm9tICcuLi8uLi9tZXRyaWNzL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYlNTRU1ldHJpY3NTaW5rIGltcGxlbWVudHMgSU1ldHJpY3NTaW5rIHtcbiAgcmVhZG9ubHkgbmFtZSA9ICdXZWJTU0VNZXRyaWNzU2luayc7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwdXNoU25hcHNob3Q6IChzbmFwc2hvdDogTWV0cmljU25hcHNob3QpID0+IHZvaWQpIHt9XG5cbiAgb25TbmFwc2hvdChzbmFwc2hvdDogTWV0cmljU25hcHNob3QpOiB2b2lkIHtcbiAgICB0aGlzLnB1c2hTbmFwc2hvdChzbmFwc2hvdCk7XG4gIH1cblxuICBhc3luYyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBOby1vcCDigJQgU1NFIHdyaXRlcyBhcmUgaW1tZWRpYXRlLlxuICB9XG5cbiAgYXN5bmMgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTm8tb3Ag4oCUIFNTRSBjb25uZWN0aW9ucyBtYW5hZ2VkIGJ5IEV4cHJlc3MuXG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dollhousemcp/mcp-server",
3
- "version": "2.0.0-rc.6",
3
+ "version": "2.0.0",
4
4
  "description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -12,7 +12,7 @@
12
12
  "prebuild": "npm run build:safety && node scripts/generate-version.js",
13
13
  "build:safety": "cd packages/safety && npm install && npm run build",
14
14
  "build": "tsc",
15
- "postbuild": "cp -r src/seed-elements dist/ && cp -r src/web/public dist/web/public",
15
+ "postbuild": "node -e \"const fs=require('fs'),p=require('path');function rm(d){if(fs.existsSync(d)){for(const e of fs.readdirSync(d)){const f=p.join(d,e);fs.statSync(f).isDirectory()?rm(f):fs.unlinkSync(f)}fs.rmdirSync(d)}}function cpR(s,d){fs.mkdirSync(d,{recursive:true});for(const e of fs.readdirSync(s)){const sp=p.join(s,e),dp=p.join(d,e);fs.statSync(sp).isDirectory()?cpR(sp,dp):fs.copyFileSync(sp,dp)}}cpR('src/seed-elements','dist/seed-elements');rm('dist/web/public');cpR('src/web/public','dist/web/public')\"",
16
16
  "web": "node dist/index.js --web",
17
17
  "start": "node dist/index.js",
18
18
  "dev": "tsx watch src/index.ts",
package/server.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.DollhouseMCP/mcp-server",
4
4
  "title": "DollhouseMCP",
5
5
  "description": "OSS to create Personas, Skills, Templates, Agents, and Memories to customize your AI experience.",
6
- "version": "2.0.0-rc.6",
6
+ "version": "2.0.0",
7
7
  "homepage": "https://dollhousemcp.com",
8
8
  "repository": {
9
9
  "type": "git",
@@ -29,7 +29,7 @@
29
29
  {
30
30
  "registryType": "npm",
31
31
  "identifier": "@dollhousemcp/mcp-server",
32
- "version": "2.0.0-rc.6",
32
+ "version": "2.0.0",
33
33
  "transport": {
34
34
  "type": "stdio"
35
35
  }
@@ -1,3 +0,0 @@
1
- export declare const VERSION = "1.6.5";
2
- export declare const BUILD_DATE = "2025-08-26T15:30:22.187Z";
3
- //# sourceMappingURL=version.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/constants/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,UAAU,CAAC;AAC/B,eAAO,MAAM,UAAU,6BAA6B,CAAC"}
@@ -1,4 +0,0 @@
1
- // Auto-generated version constant
2
- export const VERSION = "1.6.5";
3
- export const BUILD_DATE = "2025-08-26T15:30:22.187Z";
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdGFudHMvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxrQ0FBa0M7QUFDbEMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUMvQixNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsMEJBQTBCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBdXRvLWdlbmVyYXRlZCB2ZXJzaW9uIGNvbnN0YW50XG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiMS42LjVcIjtcbmV4cG9ydCBjb25zdCBCVUlMRF9EQVRFID0gXCIyMDI1LTA4LTI2VDE1OjMwOjIyLjE4N1pcIjtcbiJdfQ==
@@ -1,35 +0,0 @@
1
- /**
2
- * SSE-based real-time log viewer sink.
3
- *
4
- * Implements ILogSink and runs an opt-in Express HTTP server that:
5
- * - Serves a browser-based log viewer at GET /
6
- * - Streams log entries via SSE at GET /logs/stream
7
- * - Exposes a JSON query endpoint at GET /logs (delegates to MemoryLogSink)
8
- * - Provides a health endpoint at GET /health
9
- *
10
- * See docs/LOGGING-DESIGN.md §4.6 for the full design.
11
- */
12
- import type { ILogSink, UnifiedLogEntry } from '../types.js';
13
- import type { MemoryLogSink } from './MemoryLogSink.js';
14
- export interface SSELogSinkOptions {
15
- port: number;
16
- memorySink: MemoryLogSink;
17
- }
18
- export declare class SSELogSink implements ILogSink {
19
- private readonly app;
20
- private server;
21
- private readonly clients;
22
- private readonly memorySink;
23
- private readonly port;
24
- private readonly startTime;
25
- constructor(options: SSELogSinkOptions);
26
- write(entry: UnifiedLogEntry): void;
27
- flush(): Promise<void>;
28
- close(): Promise<void>;
29
- start(): Promise<void>;
30
- get clientCount(): number;
31
- getPort(): number;
32
- private setupRoutes;
33
- private matchesFilter;
34
- }
35
- //# sourceMappingURL=SSELogSink.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"SSELogSink.d.ts","sourceRoot":"","sources":["../../../src/logging/sinks/SSELogSink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAyB,MAAM,aAAa,CAAC;AAEpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGxD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,aAAa,CAAC;CAC3B;AAcD,qBAAa,UAAW,YAAW,QAAQ;IACzC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA6B;IACjD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;gBAE5B,OAAO,EAAE,iBAAiB;IAWtC,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAQ7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,OAAO,IAAI,MAAM;IAWjB,OAAO,CAAC,WAAW;IA4FnB,OAAO,CAAC,aAAa;CAkBtB"}