@skillsmith/mcp-server 0.4.7 → 0.4.9

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 (213) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +21 -0
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/src/__tests__/tool-dispatch.test.d.ts +8 -0
  5. package/dist/src/__tests__/tool-dispatch.test.d.ts.map +1 -0
  6. package/dist/src/__tests__/tool-dispatch.test.js +144 -0
  7. package/dist/src/__tests__/tool-dispatch.test.js.map +1 -0
  8. package/dist/src/index.js +31 -2
  9. package/dist/src/index.js.map +1 -1
  10. package/dist/src/middleware/license.d.ts +23 -0
  11. package/dist/src/middleware/license.d.ts.map +1 -1
  12. package/dist/src/middleware/license.js +28 -0
  13. package/dist/src/middleware/license.js.map +1 -1
  14. package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -1
  15. package/dist/src/middleware/toolFeatureMapping.js +4 -1
  16. package/dist/src/middleware/toolFeatureMapping.js.map +1 -1
  17. package/dist/src/supabase-client.d.ts +24 -0
  18. package/dist/src/supabase-client.d.ts.map +1 -0
  19. package/dist/src/supabase-client.js +63 -0
  20. package/dist/src/supabase-client.js.map +1 -0
  21. package/dist/src/tool-dispatch.d.ts.map +1 -1
  22. package/dist/src/tool-dispatch.js +71 -62
  23. package/dist/src/tool-dispatch.js.map +1 -1
  24. package/dist/src/tools/analytics.d.ts +155 -0
  25. package/dist/src/tools/analytics.d.ts.map +1 -0
  26. package/dist/src/tools/analytics.js +321 -0
  27. package/dist/src/tools/analytics.js.map +1 -0
  28. package/dist/src/tools/analytics.service.d.ts +46 -0
  29. package/dist/src/tools/analytics.service.d.ts.map +1 -0
  30. package/dist/src/tools/analytics.service.js +69 -0
  31. package/dist/src/tools/analytics.service.js.map +1 -0
  32. package/dist/src/tools/analytics.service.test.d.ts +6 -0
  33. package/dist/src/tools/analytics.service.test.d.ts.map +1 -0
  34. package/dist/src/tools/analytics.service.test.js +151 -0
  35. package/dist/src/tools/analytics.service.test.js.map +1 -0
  36. package/dist/src/tools/analytics.stub.d.ts +27 -0
  37. package/dist/src/tools/analytics.stub.d.ts.map +1 -0
  38. package/dist/src/tools/analytics.stub.js +200 -0
  39. package/dist/src/tools/analytics.stub.js.map +1 -0
  40. package/dist/src/tools/analytics.test.d.ts +6 -0
  41. package/dist/src/tools/analytics.test.d.ts.map +1 -0
  42. package/dist/src/tools/analytics.test.js +146 -0
  43. package/dist/src/tools/analytics.test.js.map +1 -0
  44. package/dist/src/tools/analyze.d.ts.map +1 -1
  45. package/dist/src/tools/analyze.js +7 -1
  46. package/dist/src/tools/analyze.js.map +1 -1
  47. package/dist/src/tools/audit-tools.d.ts +172 -0
  48. package/dist/src/tools/audit-tools.d.ts.map +1 -0
  49. package/dist/src/tools/audit-tools.js +187 -0
  50. package/dist/src/tools/audit-tools.js.map +1 -0
  51. package/dist/src/tools/audit-tools.test.d.ts +10 -0
  52. package/dist/src/tools/audit-tools.test.d.ts.map +1 -0
  53. package/dist/src/tools/audit-tools.test.js +147 -0
  54. package/dist/src/tools/audit-tools.test.js.map +1 -0
  55. package/dist/src/tools/compliance-tools.d.ts +103 -0
  56. package/dist/src/tools/compliance-tools.d.ts.map +1 -0
  57. package/dist/src/tools/compliance-tools.js +257 -0
  58. package/dist/src/tools/compliance-tools.js.map +1 -0
  59. package/dist/src/tools/compliance-tools.service.d.ts +19 -0
  60. package/dist/src/tools/compliance-tools.service.d.ts.map +1 -0
  61. package/dist/src/tools/compliance-tools.service.js +107 -0
  62. package/dist/src/tools/compliance-tools.service.js.map +1 -0
  63. package/dist/src/tools/compliance-tools.service.test.d.ts +6 -0
  64. package/dist/src/tools/compliance-tools.service.test.d.ts.map +1 -0
  65. package/dist/src/tools/compliance-tools.service.test.js +140 -0
  66. package/dist/src/tools/compliance-tools.service.test.js.map +1 -0
  67. package/dist/src/tools/compliance-tools.test.d.ts +6 -0
  68. package/dist/src/tools/compliance-tools.test.d.ts.map +1 -0
  69. package/dist/src/tools/compliance-tools.test.js +136 -0
  70. package/dist/src/tools/compliance-tools.test.js.map +1 -0
  71. package/dist/src/tools/get-skill.d.ts.map +1 -1
  72. package/dist/src/tools/get-skill.js +24 -1
  73. package/dist/src/tools/get-skill.js.map +1 -1
  74. package/dist/src/tools/index-local.d.ts.map +1 -1
  75. package/dist/src/tools/index-local.js +4 -0
  76. package/dist/src/tools/index-local.js.map +1 -1
  77. package/dist/src/tools/install.d.ts.map +1 -1
  78. package/dist/src/tools/install.js +11 -1
  79. package/dist/src/tools/install.js.map +1 -1
  80. package/dist/src/tools/install.tool.d.ts +4 -0
  81. package/dist/src/tools/install.tool.d.ts.map +1 -1
  82. package/dist/src/tools/install.tool.js +4 -0
  83. package/dist/src/tools/install.tool.js.map +1 -1
  84. package/dist/src/tools/install.types.d.ts +4 -0
  85. package/dist/src/tools/install.types.d.ts.map +1 -1
  86. package/dist/src/tools/install.types.js +5 -0
  87. package/dist/src/tools/install.types.js.map +1 -1
  88. package/dist/src/tools/integration-tools.d.ts +210 -0
  89. package/dist/src/tools/integration-tools.d.ts.map +1 -0
  90. package/dist/src/tools/integration-tools.js +264 -0
  91. package/dist/src/tools/integration-tools.js.map +1 -0
  92. package/dist/src/tools/integration-tools.service.d.ts +54 -0
  93. package/dist/src/tools/integration-tools.service.d.ts.map +1 -0
  94. package/dist/src/tools/integration-tools.service.js +299 -0
  95. package/dist/src/tools/integration-tools.service.js.map +1 -0
  96. package/dist/src/tools/integration-tools.service.test.d.ts +8 -0
  97. package/dist/src/tools/integration-tools.service.test.d.ts.map +1 -0
  98. package/dist/src/tools/integration-tools.service.test.js +401 -0
  99. package/dist/src/tools/integration-tools.service.test.js.map +1 -0
  100. package/dist/src/tools/integration-tools.stub.d.ts +13 -0
  101. package/dist/src/tools/integration-tools.stub.d.ts.map +1 -0
  102. package/dist/src/tools/integration-tools.stub.js +133 -0
  103. package/dist/src/tools/integration-tools.stub.js.map +1 -0
  104. package/dist/src/tools/integration-tools.test.d.ts +6 -0
  105. package/dist/src/tools/integration-tools.test.d.ts.map +1 -0
  106. package/dist/src/tools/integration-tools.test.js +259 -0
  107. package/dist/src/tools/integration-tools.test.js.map +1 -0
  108. package/dist/src/tools/publish-private.d.ts +60 -0
  109. package/dist/src/tools/publish-private.d.ts.map +1 -0
  110. package/dist/src/tools/publish-private.js +85 -0
  111. package/dist/src/tools/publish-private.js.map +1 -0
  112. package/dist/src/tools/publish-private.test.d.ts +6 -0
  113. package/dist/src/tools/publish-private.test.d.ts.map +1 -0
  114. package/dist/src/tools/publish-private.test.js +118 -0
  115. package/dist/src/tools/publish-private.test.js.map +1 -0
  116. package/dist/src/tools/publish.types.d.ts +2 -2
  117. package/dist/src/tools/rbac-tools.d.ts +180 -0
  118. package/dist/src/tools/rbac-tools.d.ts.map +1 -0
  119. package/dist/src/tools/rbac-tools.js +300 -0
  120. package/dist/src/tools/rbac-tools.js.map +1 -0
  121. package/dist/src/tools/rbac-tools.test.d.ts +6 -0
  122. package/dist/src/tools/rbac-tools.test.d.ts.map +1 -0
  123. package/dist/src/tools/rbac-tools.test.js +299 -0
  124. package/dist/src/tools/rbac-tools.test.js.map +1 -0
  125. package/dist/src/tools/rbac-tools.types.d.ts +70 -0
  126. package/dist/src/tools/rbac-tools.types.d.ts.map +1 -0
  127. package/dist/src/tools/rbac-tools.types.js +119 -0
  128. package/dist/src/tools/rbac-tools.types.js.map +1 -0
  129. package/dist/src/tools/recommend.helpers.d.ts.map +1 -1
  130. package/dist/src/tools/recommend.helpers.js +2 -1
  131. package/dist/src/tools/recommend.helpers.js.map +1 -1
  132. package/dist/src/tools/recommend.js +3 -3
  133. package/dist/src/tools/recommend.js.map +1 -1
  134. package/dist/src/tools/registry-tools.d.ts +133 -0
  135. package/dist/src/tools/registry-tools.d.ts.map +1 -0
  136. package/dist/src/tools/registry-tools.js +246 -0
  137. package/dist/src/tools/registry-tools.js.map +1 -0
  138. package/dist/src/tools/registry-tools.test.d.ts +6 -0
  139. package/dist/src/tools/registry-tools.test.d.ts.map +1 -0
  140. package/dist/src/tools/registry-tools.test.js +167 -0
  141. package/dist/src/tools/registry-tools.test.js.map +1 -0
  142. package/dist/src/tools/search.formatter.d.ts.map +1 -1
  143. package/dist/src/tools/search.formatter.js +11 -1
  144. package/dist/src/tools/search.formatter.js.map +1 -1
  145. package/dist/src/tools/skill-audit.d.ts +3 -3
  146. package/dist/src/tools/skill-audit.d.ts.map +1 -1
  147. package/dist/src/tools/skill-audit.js +5 -5
  148. package/dist/src/tools/skill-audit.js.map +1 -1
  149. package/dist/src/tools/skill-audit.test.js +5 -5
  150. package/dist/src/tools/skill-audit.test.js.map +1 -1
  151. package/dist/src/tools/skill-pack-audit.d.ts +22 -1
  152. package/dist/src/tools/skill-pack-audit.d.ts.map +1 -1
  153. package/dist/src/tools/skill-pack-audit.helpers.d.ts +53 -0
  154. package/dist/src/tools/skill-pack-audit.helpers.d.ts.map +1 -0
  155. package/dist/src/tools/skill-pack-audit.helpers.js +181 -0
  156. package/dist/src/tools/skill-pack-audit.helpers.js.map +1 -0
  157. package/dist/src/tools/skill-pack-audit.js +122 -5
  158. package/dist/src/tools/skill-pack-audit.js.map +1 -1
  159. package/dist/src/tools/skill-pack-audit.types.d.ts +70 -0
  160. package/dist/src/tools/skill-pack-audit.types.d.ts.map +1 -0
  161. package/dist/src/tools/skill-pack-audit.types.js +8 -0
  162. package/dist/src/tools/skill-pack-audit.types.js.map +1 -0
  163. package/dist/src/tools/skill-rescan.d.ts.map +1 -1
  164. package/dist/src/tools/skill-rescan.js +2 -3
  165. package/dist/src/tools/skill-rescan.js.map +1 -1
  166. package/dist/src/tools/skill-rescan.test.js +2 -2
  167. package/dist/src/tools/skill-rescan.test.js.map +1 -1
  168. package/dist/src/tools/sso-tools.d.ts +136 -0
  169. package/dist/src/tools/sso-tools.d.ts.map +1 -0
  170. package/dist/src/tools/sso-tools.js +214 -0
  171. package/dist/src/tools/sso-tools.js.map +1 -0
  172. package/dist/src/tools/sso-tools.test.d.ts +6 -0
  173. package/dist/src/tools/sso-tools.test.d.ts.map +1 -0
  174. package/dist/src/tools/sso-tools.test.js +167 -0
  175. package/dist/src/tools/sso-tools.test.js.map +1 -0
  176. package/dist/src/tools/suggest.d.ts.map +1 -1
  177. package/dist/src/tools/suggest.js +7 -1
  178. package/dist/src/tools/suggest.js.map +1 -1
  179. package/dist/src/tools/team-workspace.d.ts +179 -0
  180. package/dist/src/tools/team-workspace.d.ts.map +1 -0
  181. package/dist/src/tools/team-workspace.js +243 -0
  182. package/dist/src/tools/team-workspace.js.map +1 -0
  183. package/dist/src/tools/team-workspace.stub.d.ts +13 -0
  184. package/dist/src/tools/team-workspace.stub.d.ts.map +1 -0
  185. package/dist/src/tools/team-workspace.stub.js +76 -0
  186. package/dist/src/tools/team-workspace.stub.js.map +1 -0
  187. package/dist/src/tools/team-workspace.test.d.ts +7 -0
  188. package/dist/src/tools/team-workspace.test.d.ts.map +1 -0
  189. package/dist/src/tools/team-workspace.test.js +273 -0
  190. package/dist/src/tools/team-workspace.test.js.map +1 -0
  191. package/dist/src/tools/validate.helpers.d.ts.map +1 -1
  192. package/dist/src/tools/validate.helpers.js +15 -0
  193. package/dist/src/tools/validate.helpers.js.map +1 -1
  194. package/dist/src/utils/team-resolver.d.ts +20 -0
  195. package/dist/src/utils/team-resolver.d.ts.map +1 -0
  196. package/dist/src/utils/team-resolver.js +52 -0
  197. package/dist/src/utils/team-resolver.js.map +1 -0
  198. package/dist/src/utils/url-validator.d.ts +24 -0
  199. package/dist/src/utils/url-validator.d.ts.map +1 -0
  200. package/dist/src/utils/url-validator.js +59 -0
  201. package/dist/src/utils/url-validator.js.map +1 -0
  202. package/dist/tests/integration/recommend.integration.test.js +1 -1
  203. package/dist/tests/integration/recommend.integration.test.js.map +1 -1
  204. package/dist/tests/recommend.test.js +1 -1
  205. package/dist/tests/recommend.test.js.map +1 -1
  206. package/dist/tests/unit/skill-pack-audit.test.js +225 -0
  207. package/dist/tests/unit/skill-pack-audit.test.js.map +1 -1
  208. package/package.json +3 -3
  209. package/server.json +2 -2
  210. package/dist/vitest.config.d.ts +0 -6
  211. package/dist/vitest.config.d.ts.map +0 -1
  212. package/dist/vitest.config.js +0 -23
  213. package/dist/vitest.config.js.map +0 -1
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @fileoverview Stub data generators and fallback handlers for analytics MCP tools
3
+ * @module @skillsmith/mcp-server/tools/analytics.stub
4
+ * @see SMI-3899: Team Usage Analytics MCP Tools (Wave 2b)
5
+ * @see SMI-3914: Wave 0 stub extraction
6
+ * @see SMI-3916: Wave 2 — stub fallbacks extracted from analytics.ts
7
+ *
8
+ * Extracted from analytics.ts for file-size compliance.
9
+ * Provides deterministic mock data generators and fallback handler
10
+ * implementations used when no real database is available.
11
+ */
12
+ /** Map period string to number of days */
13
+ export declare function periodDays(period: string): number;
14
+ /** Generate mock daily trend data for the given number of days */
15
+ export declare function generateDailyTrend(days: number): Array<{
16
+ date: string;
17
+ calls: number;
18
+ }>;
19
+ /** Stub fallback for team analytics dashboard */
20
+ export declare function stubTeamAnalyticsDashboard(period: string): string;
21
+ /** Stub fallback for team usage report */
22
+ export declare function stubTeamUsageReport(period: string, format: string): string;
23
+ /** Stub fallback for enterprise analytics dashboard */
24
+ export declare function stubAnalyticsDashboard(period: string, includeRecommendations: boolean): string;
25
+ /** Stub fallback for enterprise usage report */
26
+ export declare function stubUsageReport(period: string, format: string): string;
27
+ //# sourceMappingURL=analytics.stub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.stub.d.ts","sourceRoot":"","sources":["../../../src/tools/analytics.stub.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH,0CAA0C;AAC1C,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CASjD;AAED,kEAAkE;AAClE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAavF;AAMD,iDAAiD;AACjD,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAwCjE;AAED,0CAA0C;AAC1C,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAwC1E;AAED,uDAAuD;AACvD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,sBAAsB,EAAE,OAAO,GAAG,MAAM,CAkD9F;AAED,gDAAgD;AAChD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAqEtE"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * @fileoverview Stub data generators and fallback handlers for analytics MCP tools
3
+ * @module @skillsmith/mcp-server/tools/analytics.stub
4
+ * @see SMI-3899: Team Usage Analytics MCP Tools (Wave 2b)
5
+ * @see SMI-3914: Wave 0 stub extraction
6
+ * @see SMI-3916: Wave 2 — stub fallbacks extracted from analytics.ts
7
+ *
8
+ * Extracted from analytics.ts for file-size compliance.
9
+ * Provides deterministic mock data generators and fallback handler
10
+ * implementations used when no real database is available.
11
+ */
12
+ // ============================================================================
13
+ // Mock data helpers
14
+ // ============================================================================
15
+ /** Map period string to number of days */
16
+ export function periodDays(period) {
17
+ switch (period) {
18
+ case '7d':
19
+ return 7;
20
+ case '90d':
21
+ return 90;
22
+ default:
23
+ return 30;
24
+ }
25
+ }
26
+ /** Generate mock daily trend data for the given number of days */
27
+ export function generateDailyTrend(days) {
28
+ const trend = [];
29
+ const now = new Date();
30
+ for (let i = days - 1; i >= 0; i--) {
31
+ const date = new Date(now);
32
+ date.setDate(date.getDate() - i);
33
+ trend.push({
34
+ date: date.toISOString().split('T')[0],
35
+ // Deterministic "random" based on day offset to keep output stable
36
+ calls: 20 + ((i * 7 + 3) % 30),
37
+ });
38
+ }
39
+ return trend;
40
+ }
41
+ // ============================================================================
42
+ // Stub fallback handlers — used when no real database is available
43
+ // ============================================================================
44
+ /** Stub fallback for team analytics dashboard */
45
+ export function stubTeamAnalyticsDashboard(period) {
46
+ const days = periodDays(period);
47
+ const trend = generateDailyTrend(days);
48
+ const totalCalls = trend.reduce((sum, d) => sum + d.calls, 0);
49
+ const lines = [
50
+ `# Team Analytics Dashboard (${period})`,
51
+ '',
52
+ '## Summary',
53
+ `- **Period**: Last ${days} days`,
54
+ `- **Total tool calls**: ${totalCalls}`,
55
+ `- **Active users**: 4`,
56
+ `- **Avg calls/user/day**: ${(totalCalls / (days * 4)).toFixed(1)}`,
57
+ `- **Data source**: stub`,
58
+ '',
59
+ '## Top Tools',
60
+ '| Tool | Calls | % of Total |',
61
+ '|------|-------|------------|',
62
+ `| search | ${Math.round(totalCalls * 0.35)} | 35% |`,
63
+ `| install_skill | ${Math.round(totalCalls * 0.22)} | 22% |`,
64
+ `| skill_recommend | ${Math.round(totalCalls * 0.18)} | 18% |`,
65
+ `| skill_validate | ${Math.round(totalCalls * 0.12)} | 12% |`,
66
+ `| skill_compare | ${Math.round(totalCalls * 0.08)} | 8% |`,
67
+ `| other | ${Math.round(totalCalls * 0.05)} | 5% |`,
68
+ '',
69
+ '## Per-User Usage',
70
+ '| User | Calls | Top Tool |',
71
+ '|------|-------|----------|',
72
+ `| alice@example.com | ${Math.round(totalCalls * 0.32)} | search |`,
73
+ `| bob@example.com | ${Math.round(totalCalls * 0.28)} | install_skill |`,
74
+ `| carol@example.com | ${Math.round(totalCalls * 0.24)} | skill_recommend |`,
75
+ `| dave@example.com | ${Math.round(totalCalls * 0.16)} | skill_validate |`,
76
+ '',
77
+ '## Daily Trend (last 7 days)',
78
+ '| Date | Calls |',
79
+ '|------|-------|',
80
+ ...trend.slice(-7).map((d) => `| ${d.date} | ${d.calls} |`),
81
+ ];
82
+ return lines.join('\n');
83
+ }
84
+ /** Stub fallback for team usage report */
85
+ export function stubTeamUsageReport(period, format) {
86
+ const days = periodDays(period);
87
+ const totalCalls = days * 25;
88
+ const previousCalls = Math.round(totalCalls * 0.85);
89
+ const changePercent = (((totalCalls - previousCalls) / previousCalls) * 100).toFixed(1);
90
+ const lines = [
91
+ `# Team Usage Report (${period})`,
92
+ '',
93
+ '## Period Summary',
94
+ `- **Current period**: ${totalCalls} total calls`,
95
+ `- **Previous period**: ${previousCalls} total calls`,
96
+ `- **Change**: +${changePercent}%`,
97
+ `- **Active users**: 4`,
98
+ `- **New skills installed**: 12`,
99
+ `- **Data source**: stub`,
100
+ '',
101
+ '## Usage by Category',
102
+ '| Category | Current | Previous | Change |',
103
+ '|----------|---------|----------|--------|',
104
+ `| Discovery (search, recommend) | ${Math.round(totalCalls * 0.45)} | ${Math.round(previousCalls * 0.42)} | +22% |`,
105
+ `| Management (install, uninstall) | ${Math.round(totalCalls * 0.3)} | ${Math.round(previousCalls * 0.32)} | +8% |`,
106
+ `| Quality (validate, audit) | ${Math.round(totalCalls * 0.15)} | ${Math.round(previousCalls * 0.16)} | +8% |`,
107
+ `| Collaboration (workspace, share) | ${Math.round(totalCalls * 0.1)} | ${Math.round(previousCalls * 0.1)} | +15% |`,
108
+ ];
109
+ if (format === 'detailed') {
110
+ lines.push('', '## Detailed Breakdown by User', '| User | Discovery | Management | Quality | Collaboration | Total |', '|------|-----------|------------|---------|---------------|-------|', `| alice@example.com | 95 | 60 | 30 | 15 | ${Math.round(totalCalls * 0.32)} |`, `| bob@example.com | 80 | 70 | 20 | 5 | ${Math.round(totalCalls * 0.28)} |`, `| carol@example.com | 65 | 45 | 35 | 40 | ${Math.round(totalCalls * 0.24)} |`, `| dave@example.com | 40 | 30 | 25 | 5 | ${Math.round(totalCalls * 0.16)} |`);
111
+ }
112
+ return lines.join('\n');
113
+ }
114
+ /** Stub fallback for enterprise analytics dashboard */
115
+ export function stubAnalyticsDashboard(period, includeRecommendations) {
116
+ const days = periodDays(period);
117
+ const totalCalls = days * 85;
118
+ const lines = [
119
+ `# Enterprise Analytics Dashboard (${period})`,
120
+ '',
121
+ '## Organization Summary',
122
+ `- **Period**: Last ${days} days`,
123
+ `- **Total tool calls**: ${totalCalls}`,
124
+ `- **Active teams**: 3`,
125
+ `- **Active users**: 18`,
126
+ `- **Skills installed org-wide**: 47`,
127
+ `- **Data source**: stub`,
128
+ '',
129
+ '## Team Breakdown',
130
+ '| Team | Users | Calls | Top Tool |',
131
+ '|------|-------|-------|----------|',
132
+ `| Engineering | 10 | ${Math.round(totalCalls * 0.55)} | search |`,
133
+ `| Data Science | 5 | ${Math.round(totalCalls * 0.3)} | skill_recommend |`,
134
+ `| DevOps | 3 | ${Math.round(totalCalls * 0.15)} | skill_audit |`,
135
+ '',
136
+ '## Skill Adoption',
137
+ '| Skill | Installed By | First Used | Adoption Rate |',
138
+ '|-------|-------------|------------|---------------|',
139
+ '| governance | 15 users | 2026-01-15 | 83% |',
140
+ '| security-auditor | 12 users | 2026-02-01 | 67% |',
141
+ '| docker-optimizer | 8 users | 2026-02-20 | 44% |',
142
+ '| ci-doctor | 6 users | 2026-03-05 | 33% |',
143
+ ];
144
+ if (includeRecommendations) {
145
+ lines.push('', '## Recommendation Accuracy', `- **Recommendations made**: ${Math.round(totalCalls * 0.18)}`, `- **Accepted**: ${Math.round(totalCalls * 0.18 * 0.72)} (72%)`, `- **Installed after recommendation**: ${Math.round(totalCalls * 0.18 * 0.45)} (45%)`, `- **Still active after 7 days**: ${Math.round(totalCalls * 0.18 * 0.38)} (38%)`, '', '## Top Recommended Skills', '| Skill | Times Recommended | Accept Rate |', '|-------|-------------------|-------------|', '| governance | 42 | 85% |', '| security-auditor | 35 | 74% |', '| flaky-test-detector | 28 | 68% |');
146
+ }
147
+ return lines.join('\n');
148
+ }
149
+ /** Stub fallback for enterprise usage report */
150
+ export function stubUsageReport(period, format) {
151
+ const days = periodDays(period);
152
+ const totalCalls = days * 85;
153
+ const previousCalls = Math.round(totalCalls * 0.78);
154
+ const changePercent = (((totalCalls - previousCalls) / previousCalls) * 100).toFixed(1);
155
+ if (format === 'csv') {
156
+ const csvLines = [
157
+ 'metric,current_period,previous_period,change_percent',
158
+ `total_calls,${totalCalls},${previousCalls},${changePercent}`,
159
+ `active_users,18,15,20.0`,
160
+ `active_teams,3,3,0.0`,
161
+ `skills_installed,47,38,23.7`,
162
+ `recommendations_made,${Math.round(totalCalls * 0.18)},${Math.round(previousCalls * 0.18)},${changePercent}`,
163
+ `recommendation_accept_rate,72,68,5.9`,
164
+ `security_audits,${Math.round(totalCalls * 0.05)},${Math.round(previousCalls * 0.04)},42.3`,
165
+ ];
166
+ return csvLines.join('\n');
167
+ }
168
+ const lines = [
169
+ `# Enterprise Usage Report (${period})`,
170
+ '',
171
+ '## Executive Summary',
172
+ `- **Period**: Last ${days} days`,
173
+ `- **Total tool calls**: ${totalCalls} (+${changePercent}% vs previous)`,
174
+ `- **Active users**: 18 (up from 15)`,
175
+ `- **Active teams**: 3`,
176
+ `- **Skills installed**: 47 (up from 38)`,
177
+ `- **Data source**: stub`,
178
+ '',
179
+ '## Usage by Tier Feature',
180
+ '| Feature | Calls | % of Total | Trend |',
181
+ '|---------|-------|------------|-------|',
182
+ `| Core tools | ${Math.round(totalCalls * 0.5)} | 50% | stable |`,
183
+ `| Version tracking | ${Math.round(totalCalls * 0.15)} | 15% | +12% |`,
184
+ `| Team workspaces | ${Math.round(totalCalls * 0.12)} | 12% | +25% |`,
185
+ `| Security audit | ${Math.round(totalCalls * 0.08)} | 8% | +18% |`,
186
+ `| Audit logging | ${Math.round(totalCalls * 0.1)} | 10% | +30% |`,
187
+ `| SIEM export | ${Math.round(totalCalls * 0.05)} | 5% | +15% |`,
188
+ '',
189
+ '## License Utilization',
190
+ '- **Seats provisioned**: 25',
191
+ '- **Seats active**: 18 (72%)',
192
+ '- **API quota used**: 42%',
193
+ '- **License expires**: 2027-01-15',
194
+ ];
195
+ if (format === 'detailed') {
196
+ lines.push('', '## Per-Team Detailed Breakdown', '', '### Engineering (10 users)', '| User | Total | search | install | validate | audit |', '|------|-------|--------|---------|----------|-------|', '| eng-lead | 320 | 120 | 80 | 60 | 60 |', '| dev-1 | 280 | 100 | 90 | 50 | 40 |', '| dev-2 | 240 | 90 | 70 | 40 | 40 |', '', '### Data Science (5 users)', '| User | Total | search | recommend | compare | suggest |', '|------|-------|--------|-----------|---------|---------|', '| ds-lead | 210 | 70 | 80 | 30 | 30 |', '| analyst-1 | 180 | 60 | 60 | 30 | 30 |');
197
+ }
198
+ return lines.join('\n');
199
+ }
200
+ //# sourceMappingURL=analytics.stub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.stub.js","sourceRoot":"","sources":["../../../src/tools/analytics.stub.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Tests for analytics MCP tools
3
+ * @see SMI-3899: Team Usage Analytics MCP Tools (Wave 2b)
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=analytics.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.test.d.ts","sourceRoot":"","sources":["../../../src/tools/analytics.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,146 @@
1
+ /**
2
+ * @fileoverview Tests for analytics MCP tools
3
+ * @see SMI-3899: Team Usage Analytics MCP Tools (Wave 2b)
4
+ */
5
+ import { describe, it, expect } from 'vitest';
6
+ import { executeTeamAnalyticsDashboard, executeTeamUsageReport, executeAnalyticsDashboard, executeUsageReport, teamAnalyticsDashboardInputSchema, teamUsageReportInputSchema, analyticsDashboardInputSchema, usageReportInputSchema, } from './analytics.js';
7
+ /** Minimal mock ToolContext — analytics handlers don't use it in MVP */
8
+ const mockContext = {};
9
+ describe('analytics tools', () => {
10
+ describe('input schema validation', () => {
11
+ it('teamAnalyticsDashboardInputSchema defaults period to 30d', () => {
12
+ const result = teamAnalyticsDashboardInputSchema.parse({});
13
+ expect(result.period).toBe('30d');
14
+ });
15
+ it('teamAnalyticsDashboardInputSchema accepts valid periods', () => {
16
+ expect(teamAnalyticsDashboardInputSchema.parse({ period: '7d' }).period).toBe('7d');
17
+ expect(teamAnalyticsDashboardInputSchema.parse({ period: '90d' }).period).toBe('90d');
18
+ });
19
+ it('teamAnalyticsDashboardInputSchema rejects invalid periods', () => {
20
+ expect(() => teamAnalyticsDashboardInputSchema.parse({ period: '1d' })).toThrow();
21
+ });
22
+ it('teamUsageReportInputSchema defaults format to summary', () => {
23
+ const result = teamUsageReportInputSchema.parse({});
24
+ expect(result.format).toBe('summary');
25
+ });
26
+ it('teamUsageReportInputSchema accepts detailed format', () => {
27
+ const result = teamUsageReportInputSchema.parse({ format: 'detailed' });
28
+ expect(result.format).toBe('detailed');
29
+ });
30
+ it('analyticsDashboardInputSchema defaults includeRecommendations to false', () => {
31
+ const result = analyticsDashboardInputSchema.parse({});
32
+ expect(result.includeRecommendations).toBe(false);
33
+ });
34
+ it('usageReportInputSchema accepts csv format', () => {
35
+ const result = usageReportInputSchema.parse({ format: 'csv' });
36
+ expect(result.format).toBe('csv');
37
+ });
38
+ it('usageReportInputSchema rejects invalid format', () => {
39
+ expect(() => usageReportInputSchema.parse({ format: 'xml' })).toThrow();
40
+ });
41
+ });
42
+ describe('executeTeamAnalyticsDashboard', () => {
43
+ it('returns markdown with expected sections', async () => {
44
+ const input = teamAnalyticsDashboardInputSchema.parse({ period: '30d' });
45
+ const result = await executeTeamAnalyticsDashboard(input, mockContext);
46
+ expect(result).toContain('# Team Analytics Dashboard (30d)');
47
+ expect(result).toContain('## Summary');
48
+ expect(result).toContain('## Top Tools');
49
+ expect(result).toContain('## Per-User Usage');
50
+ expect(result).toContain('## Daily Trend');
51
+ });
52
+ it('adjusts data for 7d period', async () => {
53
+ const input = teamAnalyticsDashboardInputSchema.parse({ period: '7d' });
54
+ const result = await executeTeamAnalyticsDashboard(input, mockContext);
55
+ expect(result).toContain('# Team Analytics Dashboard (7d)');
56
+ expect(result).toContain('Last 7 days');
57
+ });
58
+ it('includes table formatting', async () => {
59
+ const input = teamAnalyticsDashboardInputSchema.parse({});
60
+ const result = await executeTeamAnalyticsDashboard(input, mockContext);
61
+ // Verify markdown table delimiters are present
62
+ expect(result).toContain('|------|');
63
+ expect(result).toContain('alice@example.com');
64
+ });
65
+ });
66
+ describe('executeTeamUsageReport', () => {
67
+ it('returns summary format by default', async () => {
68
+ const input = teamUsageReportInputSchema.parse({});
69
+ const result = await executeTeamUsageReport(input, mockContext);
70
+ expect(result).toContain('# Team Usage Report (30d)');
71
+ expect(result).toContain('## Period Summary');
72
+ expect(result).toContain('## Usage by Category');
73
+ // Summary should not have detailed user breakdown
74
+ expect(result).not.toContain('## Detailed Breakdown by User');
75
+ });
76
+ it('returns detailed format with user breakdown', async () => {
77
+ const input = teamUsageReportInputSchema.parse({ format: 'detailed' });
78
+ const result = await executeTeamUsageReport(input, mockContext);
79
+ expect(result).toContain('## Detailed Breakdown by User');
80
+ expect(result).toContain('alice@example.com');
81
+ });
82
+ it('includes period comparison data', async () => {
83
+ const input = teamUsageReportInputSchema.parse({});
84
+ const result = await executeTeamUsageReport(input, mockContext);
85
+ expect(result).toContain('Previous period');
86
+ expect(result).toContain('Change');
87
+ });
88
+ });
89
+ describe('executeAnalyticsDashboard', () => {
90
+ it('returns enterprise dashboard without recommendations by default', async () => {
91
+ const input = analyticsDashboardInputSchema.parse({});
92
+ const result = await executeAnalyticsDashboard(input, mockContext);
93
+ expect(result).toContain('# Enterprise Analytics Dashboard (30d)');
94
+ expect(result).toContain('## Organization Summary');
95
+ expect(result).toContain('## Team Breakdown');
96
+ expect(result).toContain('## Skill Adoption');
97
+ expect(result).not.toContain('## Recommendation Accuracy');
98
+ });
99
+ it('includes recommendations when requested', async () => {
100
+ const input = analyticsDashboardInputSchema.parse({ includeRecommendations: true });
101
+ const result = await executeAnalyticsDashboard(input, mockContext);
102
+ expect(result).toContain('## Recommendation Accuracy');
103
+ expect(result).toContain('## Top Recommended Skills');
104
+ });
105
+ it('shows multi-team data', async () => {
106
+ const input = analyticsDashboardInputSchema.parse({});
107
+ const result = await executeAnalyticsDashboard(input, mockContext);
108
+ expect(result).toContain('Engineering');
109
+ expect(result).toContain('Data Science');
110
+ expect(result).toContain('DevOps');
111
+ });
112
+ });
113
+ describe('executeUsageReport', () => {
114
+ it('returns summary format by default', async () => {
115
+ const input = usageReportInputSchema.parse({});
116
+ const result = await executeUsageReport(input, mockContext);
117
+ expect(result).toContain('# Enterprise Usage Report (30d)');
118
+ expect(result).toContain('## Executive Summary');
119
+ expect(result).toContain('## Usage by Tier Feature');
120
+ expect(result).toContain('## License Utilization');
121
+ });
122
+ it('returns CSV format', async () => {
123
+ const input = usageReportInputSchema.parse({ format: 'csv' });
124
+ const result = await executeUsageReport(input, mockContext);
125
+ expect(result).toContain('metric,current_period,previous_period,change_percent');
126
+ expect(result).toContain('total_calls,');
127
+ expect(result).toContain('active_users,');
128
+ // CSV should not contain markdown headers
129
+ expect(result).not.toContain('#');
130
+ });
131
+ it('returns detailed format with per-team breakdown', async () => {
132
+ const input = usageReportInputSchema.parse({ format: 'detailed' });
133
+ const result = await executeUsageReport(input, mockContext);
134
+ expect(result).toContain('## Per-Team Detailed Breakdown');
135
+ expect(result).toContain('### Engineering');
136
+ expect(result).toContain('### Data Science');
137
+ });
138
+ it('includes period comparison in summary', async () => {
139
+ const input = usageReportInputSchema.parse({});
140
+ const result = await executeUsageReport(input, mockContext);
141
+ expect(result).toContain('vs previous');
142
+ expect(result).toContain('up from');
143
+ });
144
+ });
145
+ });
146
+ //# sourceMappingURL=analytics.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.test.js","sourceRoot":"","sources":["../../../src/tools/analytics.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/tools/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB;;GAEG;AACH,eAAO,MAAM,kBAAkB;IAC7B,mDAAmD;;IAEnD,+CAA+C;;IAE/C,6BAA6B;;IAE7B,2CAA2C;;;;;;;;;;;;EAE3C,CAAA;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAE7D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,uCAAuC;IACvC,MAAM,EAAE,OAAO,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,UAAU,EAAE,gBAAgB,EAAE,CAAA;IAC9B,uBAAuB;IACvB,YAAY,EAAE,iBAAiB,EAAE,CAAA;IACjC,4BAA4B;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,sBAAsB;IACtB,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAA;QACnB,WAAW,EAAE,MAAM,CAAA;QACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KACnC,CAAA;IACD,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,sBAAsB;IACtB,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,CAAA;KACpB,CAAA;CACF;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkC7B,CAAA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAclF;AAsDD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAoEvE"}
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/tools/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB;;GAEG;AACH,eAAO,MAAM,kBAAkB;IAC7B,mDAAmD;;IAEnD,+CAA+C;;IAE/C,6BAA6B;;IAE7B,2CAA2C;;;;;;;;;;;;EAE3C,CAAA;AAEF;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAE7D;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,mBAAmB;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,uCAAuC;IACvC,MAAM,EAAE,OAAO,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,0BAA0B;IAC1B,UAAU,EAAE,gBAAgB,EAAE,CAAA;IAC9B,uBAAuB;IACvB,YAAY,EAAE,iBAAiB,EAAE,CAAA;IACjC,4BAA4B;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,sBAAsB;IACtB,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAA;QACnB,WAAW,EAAE,MAAM,CAAA;QACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KACnC,CAAA;IACD,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAA;IACf,sBAAsB;IACtB,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,CAAA;KACpB,CAAA;CACF;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkC7B,CAAA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAmBlF;AAsDD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,CAoEvE"}
@@ -19,8 +19,10 @@
19
19
  * include_dev_deps: false
20
20
  * });
21
21
  */
22
+ import { resolve } from 'path';
22
23
  import { z } from 'zod';
23
24
  import { CodebaseAnalyzer } from '@skillsmith/core';
25
+ import { hasPathTraversal } from './validate.helpers.js';
24
26
  /**
25
27
  * Zod schema for analyze tool input validation
26
28
  */
@@ -92,8 +94,12 @@ export const analyzeToolSchema = {
92
94
  export async function executeAnalyze(input) {
93
95
  // Validate input
94
96
  const validated = analyzeInputSchema.parse(input);
97
+ if (hasPathTraversal(validated.path)) {
98
+ throw new Error('Path contains path traversal pattern');
99
+ }
100
+ const resolvedPath = resolve(validated.path);
95
101
  const analyzer = new CodebaseAnalyzer();
96
- const context = await analyzer.analyze(validated.path, {
102
+ const context = await analyzer.analyze(resolvedPath, {
97
103
  maxFiles: validated.max_files,
98
104
  excludeDirs: validated.exclude_dirs,
99
105
  includeDevDeps: validated.include_dev_deps,
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/tools/analyze.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/tools/analyze.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AAC9B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,gBAAgB,EAA4C,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,mDAAmD;IACnD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IAC7B,+CAA+C;IAC/C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACrD,6BAA6B;IAC7B,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC5C,2CAA2C;IAC3C,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;CAC5C,CAAC,CAAA;AAmDF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,gFAAgF;QAChF,oDAAoD;QACpD,sDAAsD;IACxD,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,8DAA8D;gBAC3E,OAAO,EAAE,GAAG;aACb;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,sDAAsD;gBACnE,OAAO,EAAE,CAAC;gBACV,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,IAAI;aACd;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,WAAW,EAAE,sEAAsE;aACpF;YACD,gBAAgB,EAAE;gBAChB,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,sDAAsD;gBACnE,OAAO,EAAE,IAAI;aACd;SACF;QACD,QAAQ,EAAE,EAAE;KACb;CACF,CAAA;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAmB;IACtD,iBAAiB;IACjB,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAEjD,IAAI,gBAAgB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;IACzD,CAAC;IACD,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IAE5C,MAAM,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAA;IAEvC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE;QACnD,QAAQ,EAAE,SAAS,CAAC,SAAS;QAC7B,WAAW,EAAE,SAAS,CAAC,YAAY;QACnC,cAAc,EAAE,SAAS,CAAC,gBAAgB;KAC3C,CAAC,CAAA;IAEF,+BAA+B;IAC/B,OAAO,0BAA0B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AACtD,CAAC;AAED;;GAEG;AACH,SAAS,0BAA0B,CACjC,OAAwB,EACxB,QAA0B;IAE1B,4CAA4C;IAC5C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAA;IACvC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAClC,wBAAwB;QACxB,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/D,sDAAsD;YACtD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACnC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;YACjF,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,MAAM,UAAU,GAAuB,OAAO,CAAC,UAAU;SACtD,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,CAAgB,EAAE,EAAE,CAAC,CAAC;QAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC;KAC3C,CAAC,CAAC,CAAA;IAEL,kCAAkC;IAClC,MAAM,YAAY,GAAwB,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACtF,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,MAAM,EAAE,CAAC,CAAC,KAAK;KAChB,CAAC,CAAC,CAAA;IAEH,cAAc;IACd,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;IAE5C,OAAO;QACL,UAAU;QACV,YAAY;QACZ,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/C,KAAK,EAAE;YACL,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;YACrC,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,UAAU;YACrC,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,gBAAgB;SAC3C;QACD,OAAO;QACP,MAAM,EAAE;YACN,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU;SACzC;KACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAyB;IAC7D,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;IAE3C,QAAQ;IACR,KAAK,CAAC,IAAI,CACR,UAAU,QAAQ,CAAC,KAAK,CAAC,WAAW,aAAa,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,CAC/F,CAAA;IACD,KAAK,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,MAAM,CAAC,WAAW,IAAI,CAAC,CAAA;IACxD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,aAAa;IACb,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC;SACxD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC;SACzC,IAAI,CAAC,IAAI,CAAC,CAAA;IACb,KAAK,CAAC,IAAI,CAAC,eAAe,SAAS,EAAE,CAAC,CAAA;IACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEd,aAAa;IACb,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;QAClC,KAAK,MAAM,EAAE,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,eAAe,CAAC,CAAA;QAC7D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;IAED,eAAe;IACf,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAC/D,MAAM,OAAO,GAAG,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAE7D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,iBAAiB,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAA;YAChD,KAAK,CAAC,IAAI,CACR,KAAK,QAAQ;iBACV,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;iBACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAA;YACD,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACzB,KAAK,CAAC,IAAI,CAAC,aAAa,QAAQ,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAA;YACtD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChB,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,qBAAqB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAA;YACnD,KAAK,CAAC,IAAI,CACR,KAAK,OAAO;iBACT,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;iBACZ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAA;YACD,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,CAAA;YACrD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAChB,CAAC;IACH,CAAC;IAED,UAAU;IACV,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACjB,KAAK,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;IAE1C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC"}