@gonzih/skill-radar 0.1.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.
@@ -0,0 +1,154 @@
1
+ import { resolveCategory, ROLE_TRENDS } from '../data/trends.js';
2
+ // Rough effort scores for skill domains (lower = easier to pick up)
3
+ const EFFORT_HINTS = {
4
+ "typescript": 30,
5
+ "sql": 25,
6
+ "python": 30,
7
+ "a/b testing": 35,
8
+ "okr": 20,
9
+ "data storytelling": 25,
10
+ "figma": 25,
11
+ "seo": 30,
12
+ "gdpr": 35,
13
+ "privacy": 35,
14
+ "llm": 50,
15
+ "rag": 55,
16
+ "kubernetes": 60,
17
+ "rust": 70,
18
+ "go": 45,
19
+ "mlops": 65,
20
+ "feature engineering": 55,
21
+ "causal inference": 70,
22
+ "fine-tun": 65,
23
+ "webassembly": 70,
24
+ "ebpf": 80,
25
+ "quantum": 85,
26
+ "system design": 60,
27
+ "observability": 50,
28
+ "security": 55,
29
+ "accessibility": 30,
30
+ "motion design": 45,
31
+ "change management": 40,
32
+ "psychological safety": 30,
33
+ "inclusive leadership": 35,
34
+ "async communication": 20,
35
+ "ehr": 40,
36
+ "telehealth": 35,
37
+ "clinical informatics": 55,
38
+ "financial modeling": 55,
39
+ "esg": 45,
40
+ "regulatory": 50,
41
+ "legal tech": 40,
42
+ "smart contracts": 65,
43
+ };
44
+ function estimateEffortScore(skill) {
45
+ const lower = skill.toLowerCase();
46
+ for (const [keyword, score] of Object.entries(EFFORT_HINTS)) {
47
+ if (lower.includes(keyword))
48
+ return score;
49
+ }
50
+ return 50; // default medium effort
51
+ }
52
+ function fuzzyMatch(userSkills, target) {
53
+ const targetLower = target.toLowerCase();
54
+ const targetWords = targetLower.split(/[\s/,()+]+/).filter((w) => w.length > 2);
55
+ return userSkills.some((us) => {
56
+ const usLower = us.toLowerCase();
57
+ // Direct inclusion check
58
+ if (usLower.includes(targetLower) || targetLower.includes(usLower))
59
+ return true;
60
+ // Word-level match: if any significant word from target appears in user skill
61
+ return targetWords.some((word) => usLower.includes(word) && word.length > 3);
62
+ });
63
+ }
64
+ function calculateTargetLevel(priority, target) {
65
+ const promotionBonus = target.toLowerCase().includes('promot') ? 10 : 0;
66
+ const switchBonus = target.toLowerCase().includes('switch') ? 5 : 0;
67
+ const base = {
68
+ critical: 85,
69
+ high: 70,
70
+ medium: 60,
71
+ low: 45,
72
+ };
73
+ return Math.min(100, base[priority] + promotionBonus + switchBonus);
74
+ }
75
+ export function analyzeSkills(params) {
76
+ const { profileId, role, currentSkills, yearsExperience, target } = params;
77
+ const category = resolveCategory(role);
78
+ const trends = ROLE_TRENDS[category];
79
+ const gaps = [];
80
+ // Process trending skills (critical / high priority)
81
+ for (let i = 0; i < trends.trending.length; i++) {
82
+ const skill = trends.trending[i];
83
+ const hasSkill = fuzzyMatch(currentSkills, skill);
84
+ // First ~4 trending = critical, rest = high
85
+ const priority = i < 4 ? 'critical' : 'high';
86
+ const impactScore = priority === 'critical' ? 90 : 75;
87
+ const effortScore = estimateEffortScore(skill);
88
+ // Experienced users get some credit even without explicit mention
89
+ const experienceBonus = Math.min(30, yearsExperience * 3);
90
+ const currentLevel = hasSkill
91
+ ? Math.min(100, 60 + experienceBonus)
92
+ : Math.max(0, experienceBonus - 10);
93
+ const targetLevel = calculateTargetLevel(priority, target);
94
+ const gap = Math.max(0, targetLevel - currentLevel);
95
+ if (gap > 0 || !hasSkill) {
96
+ gaps.push({
97
+ skill,
98
+ category,
99
+ currentLevel,
100
+ targetLevel,
101
+ gap,
102
+ priority,
103
+ impactScore,
104
+ effortScore,
105
+ roi: impactScore / (effortScore + 1),
106
+ });
107
+ }
108
+ }
109
+ // Process emerging skills (medium priority)
110
+ for (const skill of trends.emerging) {
111
+ const hasSkill = fuzzyMatch(currentSkills, skill);
112
+ if (hasSkill)
113
+ continue; // if they already have it, not a gap
114
+ const impactScore = 40;
115
+ const effortScore = estimateEffortScore(skill);
116
+ const currentLevel = 0;
117
+ const targetLevel = calculateTargetLevel('medium', target);
118
+ gaps.push({
119
+ skill,
120
+ category,
121
+ currentLevel,
122
+ targetLevel,
123
+ gap: targetLevel,
124
+ priority: 'medium',
125
+ impactScore,
126
+ effortScore,
127
+ roi: impactScore / (effortScore + 1),
128
+ });
129
+ }
130
+ // Identify strengths: user skills that appear in trending
131
+ const strengths = currentSkills.filter((us) => trends.trending.some((ts) => fuzzyMatch([us], ts)));
132
+ // Identify at-risk: user skills that appear in decaying
133
+ const atRisk = currentSkills.filter((us) => trends.decaying.some((ds) => fuzzyMatch([us], ds)));
134
+ // Underutilized: strong skills (in trending) not at the top of user's listed experience
135
+ const underutilized = strengths.slice(3); // rough heuristic
136
+ // Sort gaps by ROI descending
137
+ const sortedByRoi = [...gaps].sort((a, b) => b.roi - a.roi);
138
+ const prioritized = sortedByRoi.slice(0, 5);
139
+ // gapScore = average of top-10 gaps normalized to 0-100
140
+ const top10 = sortedByRoi.slice(0, 10);
141
+ const gapScore = top10.length > 0
142
+ ? Math.round(top10.reduce((sum, g) => sum + g.gap, 0) / top10.length)
143
+ : 0;
144
+ return {
145
+ profileId,
146
+ gapScore,
147
+ gaps,
148
+ prioritized,
149
+ strengths,
150
+ atRisk,
151
+ underutilized,
152
+ };
153
+ }
154
+ //# sourceMappingURL=analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/engine/analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { LearningResource } from '../data/resources.js';
2
+ export interface DailyAction {
3
+ day: number;
4
+ action: string;
5
+ type: 'read' | 'watch' | 'code' | 'practice' | 'network' | 'build';
6
+ estimatedMinutes: number;
7
+ }
8
+ export interface Week {
9
+ weekNumber: number;
10
+ theme: string;
11
+ concept: string;
12
+ conceptResource: LearningResource | null;
13
+ practiceExercise: string;
14
+ stretchGoal: string;
15
+ estimatedHours: number;
16
+ dailyActions: DailyAction[];
17
+ }
18
+ export interface LearningPlan {
19
+ profileId: string;
20
+ month1Focus: string;
21
+ month2Focus: string;
22
+ month3Focus: string;
23
+ totalWeeks: 12;
24
+ hoursPerWeek: number;
25
+ weeks: Week[];
26
+ createdAt: string;
27
+ }
28
+ export declare function buildPlan(params: {
29
+ profileId: string;
30
+ focusSkills: string[];
31
+ hoursPerWeek: number;
32
+ }): LearningPlan;
33
+ //# sourceMappingURL=planner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.d.ts","sourceRoot":"","sources":["../../src/engine/planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAwB,MAAM,sBAAsB,CAAC;AAE9E,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;IACnE,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,IAAI;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACzC,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,WAAW,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,EAAE,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAkPD,wBAAgB,SAAS,CAAC,MAAM,EAAE;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,YAAY,CAwEf"}
@@ -0,0 +1,303 @@
1
+ import { getResourcesForSkill } from '../data/resources.js';
2
+ // Generate a specific practice exercise based on a skill name
3
+ function generateExercise(skill) {
4
+ const lower = skill.toLowerCase();
5
+ if (lower.includes('llm') || lower.includes('rag') || lower.includes('ai/ml')) {
6
+ return `Build a simple Q&A chatbot using an LLM API that answers questions from a small document corpus`;
7
+ }
8
+ if (lower.includes('typescript') || lower.includes('javascript')) {
9
+ return `Refactor an existing JavaScript project to TypeScript, adding strict type annotations`;
10
+ }
11
+ if (lower.includes('kubernetes') || lower.includes('cloud-native')) {
12
+ return `Deploy a containerized web app to a local Minikube cluster with a service and ingress`;
13
+ }
14
+ if (lower.includes('sql') || lower.includes('data')) {
15
+ return `Write 10 progressively complex SQL queries against a public dataset (e.g., GitHub Archive on BigQuery)`;
16
+ }
17
+ if (lower.includes('python')) {
18
+ return `Create a Python script that fetches, transforms, and visualizes data from a public API`;
19
+ }
20
+ if (lower.includes('rust')) {
21
+ return `Complete all Rustlings exercises and write a small CLI tool using clap`;
22
+ }
23
+ if (lower.includes('go')) {
24
+ return `Build a concurrent HTTP server in Go that proxies and caches external API responses`;
25
+ }
26
+ if (lower.includes('system design')) {
27
+ return `Design a URL shortener service with capacity planning, data model, and API contracts`;
28
+ }
29
+ if (lower.includes('figma') || lower.includes('design')) {
30
+ return `Redesign the onboarding flow of an app you use, with a Figma prototype and component library`;
31
+ }
32
+ if (lower.includes('security')) {
33
+ return `Run an OWASP ZAP scan against a test application and document the top 5 vulnerabilities found`;
34
+ }
35
+ if (lower.includes('observability')) {
36
+ return `Instrument a sample microservice with OpenTelemetry traces, metrics, and logs; visualize in Grafana`;
37
+ }
38
+ if (lower.includes('mlops')) {
39
+ return `Build an ML pipeline with automated retraining, model registry, and drift detection using open-source tools`;
40
+ }
41
+ if (lower.includes('a/b') || lower.includes('testing')) {
42
+ return `Design and document a complete A/B test: hypothesis, metrics, sample size calculation, and success criteria`;
43
+ }
44
+ if (lower.includes('okr')) {
45
+ return `Write a full OKR set for a fictional product team: 1 objective, 3 key results, with weekly check-in cadence`;
46
+ }
47
+ if (lower.includes('storytelling') || lower.includes('visualization')) {
48
+ return `Take a messy dataset and create a compelling narrative with 3 visualizations using D3.js or Observable Plot`;
49
+ }
50
+ if (lower.includes('legal') || lower.includes('contract') || lower.includes('privacy')) {
51
+ return `Review a standard SaaS contract using an AI tool, annotate 5 key risk clauses, and propose redlines`;
52
+ }
53
+ if (lower.includes('change management') || lower.includes('leadership')) {
54
+ return `Draft a change management communication plan for a fictional team restructuring, including FAQs and timeline`;
55
+ }
56
+ if (lower.includes('financial') || lower.includes('model')) {
57
+ return `Build a 3-statement financial model (income, balance sheet, cash flow) for a fictional SaaS company`;
58
+ }
59
+ if (lower.includes('telehealth') || lower.includes('ehr') || lower.includes('clinical')) {
60
+ return `Map the patient journey for a telehealth visit, identifying 3 key data touchpoints and privacy considerations`;
61
+ }
62
+ if (lower.includes('seo') || lower.includes('content')) {
63
+ return `Conduct a content gap analysis for a blog using free tools, then outline 5 articles targeting underserved queries`;
64
+ }
65
+ return `Apply "${skill}" to a real project at work or build a small side project demonstrating the concept`;
66
+ }
67
+ // Generate a stretch goal for the week
68
+ function generateStretchGoal(skill) {
69
+ const lower = skill.toLowerCase();
70
+ if (lower.includes('llm') || lower.includes('rag')) {
71
+ return `Add streaming responses and conversation memory to your chatbot; publish it on Hugging Face Spaces`;
72
+ }
73
+ if (lower.includes('kubernetes')) {
74
+ return `Set up autoscaling (HPA) and a canary deployment pipeline for your app`;
75
+ }
76
+ if (lower.includes('rust')) {
77
+ return `Contribute a small bug fix or documentation improvement to a popular Rust open-source project`;
78
+ }
79
+ if (lower.includes('sql')) {
80
+ return `Write a performance tuning case study: identify a slow query, optimize it, and benchmark the improvement`;
81
+ }
82
+ if (lower.includes('system design')) {
83
+ return `Present your design in a mock interview format and record it for self-review`;
84
+ }
85
+ if (lower.includes('mlops')) {
86
+ return `Publish your ML pipeline as an open-source template on GitHub with full documentation`;
87
+ }
88
+ if (lower.includes('okr')) {
89
+ return `Facilitate a 30-minute OKR planning session with real colleagues and collect feedback`;
90
+ }
91
+ return `Share what you built on LinkedIn or a relevant community (dev.to, Hashnode, etc.) and collect feedback`;
92
+ }
93
+ // Generate daily micro-actions for a week focused on a skill
94
+ function generateDailyActions(skill, weekNumber) {
95
+ const lower = skill.toLowerCase();
96
+ const isFoundation = weekNumber <= 4;
97
+ const isApplication = weekNumber > 4 && weekNumber <= 8;
98
+ if (isFoundation) {
99
+ return [
100
+ {
101
+ day: 1,
102
+ action: `Read the introduction section of the best free resource for "${skill}"`,
103
+ type: 'read',
104
+ estimatedMinutes: 20,
105
+ },
106
+ {
107
+ day: 2,
108
+ action: `Watch a 15-minute explainer video on "${skill}" core concepts`,
109
+ type: 'watch',
110
+ estimatedMinutes: 15,
111
+ },
112
+ {
113
+ day: 3,
114
+ action: `Write a 1-page summary of what you've learned about "${skill}" so far`,
115
+ type: 'practice',
116
+ estimatedMinutes: 20,
117
+ },
118
+ {
119
+ day: 4,
120
+ action: `Find and follow 3 experts in "${skill}" on LinkedIn or Twitter/X`,
121
+ type: 'network',
122
+ estimatedMinutes: 10,
123
+ },
124
+ {
125
+ day: 5,
126
+ action: `Start the hands-on exercise for "${skill}" — focus on setup and first steps`,
127
+ type: 'code',
128
+ estimatedMinutes: 30,
129
+ },
130
+ {
131
+ day: 6,
132
+ action: `Continue the exercise; aim to have a working prototype or completed tutorial`,
133
+ type: 'code',
134
+ estimatedMinutes: 45,
135
+ },
136
+ {
137
+ day: 7,
138
+ action: `Review what you built, note 3 things you learned, and plan next week's focus`,
139
+ type: 'practice',
140
+ estimatedMinutes: 15,
141
+ },
142
+ ];
143
+ }
144
+ if (isApplication) {
145
+ return [
146
+ {
147
+ day: 1,
148
+ action: `Review your week-${weekNumber - 4} notes on "${skill}"; identify the gap to bridge into practice`,
149
+ type: 'read',
150
+ estimatedMinutes: 15,
151
+ },
152
+ {
153
+ day: 2,
154
+ action: `Start building your application project that uses "${skill}"`,
155
+ type: 'build',
156
+ estimatedMinutes: 45,
157
+ },
158
+ {
159
+ day: 3,
160
+ action: `Solve one real problem at work using "${skill}" or document a plan to do so`,
161
+ type: 'practice',
162
+ estimatedMinutes: 30,
163
+ },
164
+ {
165
+ day: 4,
166
+ action: `Write a brief case study or README for your "${skill}" project`,
167
+ type: 'build',
168
+ estimatedMinutes: 20,
169
+ },
170
+ {
171
+ day: 5,
172
+ action: `Get feedback: share your project draft with a peer or mentor`,
173
+ type: 'network',
174
+ estimatedMinutes: 30,
175
+ },
176
+ {
177
+ day: 6,
178
+ action: `Incorporate feedback and polish your "${skill}" project`,
179
+ type: 'build',
180
+ estimatedMinutes: 40,
181
+ },
182
+ {
183
+ day: 7,
184
+ action: `Add your "${skill}" project to your portfolio or LinkedIn profile`,
185
+ type: 'network',
186
+ estimatedMinutes: 15,
187
+ },
188
+ ];
189
+ }
190
+ // Visibility phase (weeks 9-12)
191
+ return [
192
+ {
193
+ day: 1,
194
+ action: `Draft a LinkedIn post or blog article about your "${skill}" journey`,
195
+ type: 'build',
196
+ estimatedMinutes: 30,
197
+ },
198
+ {
199
+ day: 2,
200
+ action: `Reach out to one professional in your network who uses "${skill}" for a 20-min coffee chat`,
201
+ type: 'network',
202
+ estimatedMinutes: 20,
203
+ },
204
+ {
205
+ day: 3,
206
+ action: `Research one certification or credential related to "${skill}" and assess fit`,
207
+ type: 'read',
208
+ estimatedMinutes: 20,
209
+ },
210
+ {
211
+ day: 4,
212
+ action: `Contribute to an open-source project or community forum related to "${skill}"`,
213
+ type: 'practice',
214
+ estimatedMinutes: 30,
215
+ },
216
+ {
217
+ day: 5,
218
+ action: `Update your resume/LinkedIn to highlight your "${skill}" achievements`,
219
+ type: 'build',
220
+ estimatedMinutes: 20,
221
+ },
222
+ {
223
+ day: 6,
224
+ action: `Publish your article or post about "${skill}"`,
225
+ type: 'network',
226
+ estimatedMinutes: 15,
227
+ },
228
+ {
229
+ day: 7,
230
+ action: `Reflect: rate your "${skill}" level (0-10), what changed, and your next 90-day goal`,
231
+ type: 'practice',
232
+ estimatedMinutes: 15,
233
+ },
234
+ ];
235
+ }
236
+ export function buildPlan(params) {
237
+ const { profileId, focusSkills, hoursPerWeek } = params;
238
+ // Ensure we have at least 12 skill slots (cycle if fewer)
239
+ const skills = [];
240
+ for (let i = 0; i < 12; i++) {
241
+ skills.push(focusSkills[i % focusSkills.length] ?? 'General skill development');
242
+ }
243
+ const weeks = [];
244
+ // Month 1: Foundation (weeks 1-4)
245
+ for (let w = 1; w <= 4; w++) {
246
+ const skill = skills[w - 1];
247
+ const resources = getResourcesForSkill(skill);
248
+ const conceptResource = resources.length > 0 ? resources[0] : null;
249
+ weeks.push({
250
+ weekNumber: w,
251
+ theme: `Foundation: ${skill}`,
252
+ concept: skill,
253
+ conceptResource,
254
+ practiceExercise: generateExercise(skill),
255
+ stretchGoal: generateStretchGoal(skill),
256
+ estimatedHours: hoursPerWeek,
257
+ dailyActions: generateDailyActions(skill, w),
258
+ });
259
+ }
260
+ // Month 2: Application (weeks 5-8)
261
+ for (let w = 5; w <= 8; w++) {
262
+ const skill = skills[w - 1];
263
+ const resources = getResourcesForSkill(skill, 'intermediate');
264
+ const conceptResource = resources.length > 0 ? resources[0] : null;
265
+ weeks.push({
266
+ weekNumber: w,
267
+ theme: `Application: ${skill} in practice`,
268
+ concept: skill,
269
+ conceptResource,
270
+ practiceExercise: `Build a real project or workflow improvement using ${skill}`,
271
+ stretchGoal: generateStretchGoal(skill),
272
+ estimatedHours: hoursPerWeek,
273
+ dailyActions: generateDailyActions(skill, w),
274
+ });
275
+ }
276
+ // Month 3: Visibility (weeks 9-12)
277
+ for (let w = 9; w <= 12; w++) {
278
+ const skill = skills[w - 1];
279
+ const resources = getResourcesForSkill(skill, 'advanced');
280
+ const conceptResource = resources.length > 0 ? resources[0] : null;
281
+ weeks.push({
282
+ weekNumber: w,
283
+ theme: `Visibility: Showcase your ${skill} expertise`,
284
+ concept: skill,
285
+ conceptResource,
286
+ practiceExercise: `Document and publish your work with ${skill} for portfolio/credentialing`,
287
+ stretchGoal: `Speak at a meetup or write a detailed technical post about your ${skill} project`,
288
+ estimatedHours: hoursPerWeek,
289
+ dailyActions: generateDailyActions(skill, w),
290
+ });
291
+ }
292
+ return {
293
+ profileId,
294
+ month1Focus: `Foundation — learn the fundamentals of: ${skills.slice(0, 4).join(', ')}`,
295
+ month2Focus: `Application — build real projects using: ${skills.slice(4, 8).join(', ')}`,
296
+ month3Focus: `Visibility — showcase expertise in: ${skills.slice(8, 12).join(', ')}`,
297
+ totalWeeks: 12,
298
+ hoursPerWeek,
299
+ weeks,
300
+ createdAt: new Date().toISOString(),
301
+ };
302
+ }
303
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/engine/planner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AA+B9E,8DAA8D;AAC9D,SAAS,gBAAgB,CAAC,KAAa;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9E,OAAO,iGAAiG,CAAC;IAC3G,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACjE,OAAO,uFAAuF,CAAC;IACjG,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACnE,OAAO,uFAAuF,CAAC;IACjG,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACpD,OAAO,wGAAwG,CAAC;IAClH,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,OAAO,wFAAwF,CAAC;IAClG,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,wEAAwE,CAAC;IAClF,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,qFAAqF,CAAC;IAC/F,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,OAAO,sFAAsF,CAAC;IAChG,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxD,OAAO,8FAA8F,CAAC;IACxG,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,+FAA+F,CAAC;IACzG,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,OAAO,qGAAqG,CAAC;IAC/G,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,6GAA6G,CAAC;IACvH,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,OAAO,6GAA6G,CAAC;IACvH,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,6GAA6G,CAAC;IACvH,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACtE,OAAO,6GAA6G,CAAC;IACvH,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACvF,OAAO,qGAAqG,CAAC;IAC/G,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACxE,OAAO,8GAA8G,CAAC;IACxH,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,OAAO,qGAAqG,CAAC;IAC/G,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACxF,OAAO,+GAA+G,CAAC;IACzH,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,OAAO,mHAAmH,CAAC;IAC7H,CAAC;IACD,OAAO,UAAU,KAAK,qFAAqF,CAAC;AAC9G,CAAC;AAED,uCAAuC;AACvC,SAAS,mBAAmB,CAAC,KAAa;IACxC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO,oGAAoG,CAAC;IAC9G,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,wEAAwE,CAAC;IAClF,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO,+FAA+F,CAAC;IACzG,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,0GAA0G,CAAC;IACpH,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QACpC,OAAO,8EAA8E,CAAC;IACxF,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,uFAAuF,CAAC;IACjG,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,uFAAuF,CAAC;IACjG,CAAC;IACD,OAAO,wGAAwG,CAAC;AAClH,CAAC;AAED,6DAA6D;AAC7D,SAAS,oBAAoB,CAAC,KAAa,EAAE,UAAkB;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,YAAY,GAAG,UAAU,IAAI,CAAC,CAAC;IACrC,MAAM,aAAa,GAAG,UAAU,GAAG,CAAC,IAAI,UAAU,IAAI,CAAC,CAAC;IAExD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO;YACL;gBACE,GAAG,EAAE,CAAC;gBACN,MAAM,EAAE,gEAAgE,KAAK,GAAG;gBAChF,IAAI,EAAE,MAAM;gBACZ,gBAAgB,EAAE,EAAE;aACrB;YACD;gBACE,GAAG,EAAE,CAAC;gBACN,MAAM,EAAE,yCAAyC,KAAK,iBAAiB;gBACvE,IAAI,EAAE,OAAO;gBACb,gBAAgB,EAAE,EAAE;aACrB;YACD;gBACE,GAAG,EAAE,CAAC;gBACN,MAAM,EAAE,wDAAwD,KAAK,UAAU;gBAC/E,IAAI,EAAE,UAAU;gBAChB,gBAAgB,EAAE,EAAE;aACrB;YACD;gBACE,GAAG,EAAE,CAAC;gBACN,MAAM,EAAE,iCAAiC,KAAK,4BAA4B;gBAC1E,IAAI,EAAE,SAAS;gBACf,gBAAgB,EAAE,EAAE;aACrB;YACD;gBACE,GAAG,EAAE,CAAC;gBACN,MAAM,EAAE,oCAAoC,KAAK,oCAAoC;gBACrF,IAAI,EAAE,MAAM;gBACZ,gBAAgB,EAAE,EAAE;aACrB;YACD;gBACE,GAAG,EAAE,CAAC;gBACN,MAAM,EAAE,8EAA8E;gBACtF,IAAI,EAAE,MAAM;gBACZ,gBAAgB,EAAE,EAAE;aACrB;YACD;gBACE,GAAG,EAAE,CAAC;gBACN,MAAM,EAAE,8EAA8E;gBACtF,IAAI,EAAE,UAAU;gBAChB,gBAAgB,EAAE,EAAE;aACrB;SACF,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO;YACL;gBACE,GAAG,EAAE,CAAC;gBACN,MAAM,EAAE,oBAAoB,UAAU,GAAG,CAAC,cAAc,KAAK,6CAA6C;gBAC1G,IAAI,EAAE,MAAM;gBACZ,gBAAgB,EAAE,EAAE;aACrB;YACD;gBACE,GAAG,EAAE,CAAC;gBACN,MAAM,EAAE,sDAAsD,KAAK,GAAG;gBACtE,IAAI,EAAE,OAAO;gBACb,gBAAgB,EAAE,EAAE;aACrB;YACD;gBACE,GAAG,EAAE,CAAC;gBACN,MAAM,EAAE,yCAAyC,KAAK,+BAA+B;gBACrF,IAAI,EAAE,UAAU;gBAChB,gBAAgB,EAAE,EAAE;aACrB;YACD;gBACE,GAAG,EAAE,CAAC;gBACN,MAAM,EAAE,gDAAgD,KAAK,WAAW;gBACxE,IAAI,EAAE,OAAO;gBACb,gBAAgB,EAAE,EAAE;aACrB;YACD;gBACE,GAAG,EAAE,CAAC;gBACN,MAAM,EAAE,8DAA8D;gBACtE,IAAI,EAAE,SAAS;gBACf,gBAAgB,EAAE,EAAE;aACrB;YACD;gBACE,GAAG,EAAE,CAAC;gBACN,MAAM,EAAE,yCAAyC,KAAK,WAAW;gBACjE,IAAI,EAAE,OAAO;gBACb,gBAAgB,EAAE,EAAE;aACrB;YACD;gBACE,GAAG,EAAE,CAAC;gBACN,MAAM,EAAE,aAAa,KAAK,iDAAiD;gBAC3E,IAAI,EAAE,SAAS;gBACf,gBAAgB,EAAE,EAAE;aACrB;SACF,CAAC;IACJ,CAAC;IAED,gCAAgC;IAChC,OAAO;QACL;YACE,GAAG,EAAE,CAAC;YACN,MAAM,EAAE,qDAAqD,KAAK,WAAW;YAC7E,IAAI,EAAE,OAAO;YACb,gBAAgB,EAAE,EAAE;SACrB;QACD;YACE,GAAG,EAAE,CAAC;YACN,MAAM,EAAE,2DAA2D,KAAK,4BAA4B;YACpG,IAAI,EAAE,SAAS;YACf,gBAAgB,EAAE,EAAE;SACrB;QACD;YACE,GAAG,EAAE,CAAC;YACN,MAAM,EAAE,wDAAwD,KAAK,kBAAkB;YACvF,IAAI,EAAE,MAAM;YACZ,gBAAgB,EAAE,EAAE;SACrB;QACD;YACE,GAAG,EAAE,CAAC;YACN,MAAM,EAAE,uEAAuE,KAAK,GAAG;YACvF,IAAI,EAAE,UAAU;YAChB,gBAAgB,EAAE,EAAE;SACrB;QACD;YACE,GAAG,EAAE,CAAC;YACN,MAAM,EAAE,kDAAkD,KAAK,gBAAgB;YAC/E,IAAI,EAAE,OAAO;YACb,gBAAgB,EAAE,EAAE;SACrB;QACD;YACE,GAAG,EAAE,CAAC;YACN,MAAM,EAAE,uCAAuC,KAAK,GAAG;YACvD,IAAI,EAAE,SAAS;YACf,gBAAgB,EAAE,EAAE;SACrB;QACD;YACE,GAAG,EAAE,CAAC;YACN,MAAM,EAAE,uBAAuB,KAAK,yDAAyD;YAC7F,IAAI,EAAE,UAAU;YAChB,gBAAgB,EAAE,EAAE;SACrB;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAIzB;IACC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,GAAG,MAAM,CAAC;IAExD,0DAA0D;IAC1D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,2BAA2B,CAAC,CAAC;IAClF,CAAC;IAED,MAAM,KAAK,GAAW,EAAE,CAAC;IAEzB,kCAAkC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC;YACT,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,eAAe,KAAK,EAAE;YAC7B,OAAO,EAAE,KAAK;YACd,eAAe;YACf,gBAAgB,EAAE,gBAAgB,CAAC,KAAK,CAAC;YACzC,WAAW,EAAE,mBAAmB,CAAC,KAAK,CAAC;YACvC,cAAc,EAAE,YAAY;YAC5B,YAAY,EAAE,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IAED,mCAAmC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAC9D,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC;YACT,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,gBAAgB,KAAK,cAAc;YAC1C,OAAO,EAAE,KAAK;YACd,eAAe;YACf,gBAAgB,EAAE,sDAAsD,KAAK,EAAE;YAC/E,WAAW,EAAE,mBAAmB,CAAC,KAAK,CAAC;YACvC,cAAc,EAAE,YAAY;YAC5B,YAAY,EAAE,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IAED,mCAAmC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,MAAM,SAAS,GAAG,oBAAoB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC1D,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC;YACT,UAAU,EAAE,CAAC;YACb,KAAK,EAAE,6BAA6B,KAAK,YAAY;YACrD,OAAO,EAAE,KAAK;YACd,eAAe;YACf,gBAAgB,EAAE,uCAAuC,KAAK,8BAA8B;YAC5F,WAAW,EAAE,mEAAmE,KAAK,UAAU;YAC/F,cAAc,EAAE,YAAY;YAC5B,YAAY,EAAE,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,SAAS;QACT,WAAW,EAAE,2CAA2C,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACvF,WAAW,EAAE,4CAA4C,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACxF,WAAW,EAAE,uCAAuC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACpF,UAAU,EAAE,EAAE;QACd,YAAY;QACZ,KAAK;QACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
5
+ import { TOOL_DEFINITIONS, handleAnalyzeSkills, handleBuildPlan, handleGetTrendingSkills, handleWeeklyCheckin, handleGetResources, handleCompareToMarket, } from './tools/index.js';
6
+ const server = new Server({ name: 'skill-radar', version: '0.1.0' }, { capabilities: { tools: {} } });
7
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
8
+ tools: TOOL_DEFINITIONS,
9
+ }));
10
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
11
+ const { name, arguments: args } = request.params;
12
+ const safeArgs = (args ?? {});
13
+ try {
14
+ let text;
15
+ switch (name) {
16
+ case 'analyze_skills':
17
+ text = await handleAnalyzeSkills(safeArgs);
18
+ break;
19
+ case 'build_plan':
20
+ text = await handleBuildPlan(safeArgs);
21
+ break;
22
+ case 'get_trending_skills':
23
+ text = await handleGetTrendingSkills(safeArgs);
24
+ break;
25
+ case 'weekly_checkin':
26
+ text = await handleWeeklyCheckin(safeArgs);
27
+ break;
28
+ case 'get_resources':
29
+ text = await handleGetResources(safeArgs);
30
+ break;
31
+ case 'compare_to_market':
32
+ text = await handleCompareToMarket(safeArgs);
33
+ break;
34
+ default:
35
+ text = `Unknown tool: ${name}`;
36
+ }
37
+ return {
38
+ content: [{ type: 'text', text }],
39
+ };
40
+ }
41
+ catch (error) {
42
+ const message = error instanceof Error ? error.message : String(error);
43
+ return {
44
+ content: [{ type: 'text', text: `Error: ${message}` }],
45
+ isError: true,
46
+ };
47
+ }
48
+ });
49
+ const transport = new StdioServerTransport();
50
+ await server.connect(transport);
51
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,EACzC,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAC;AAEF,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,EAAE,gBAAgB;CACxB,CAAC,CAAC,CAAC;AAEJ,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IACjD,MAAM,QAAQ,GAAG,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;IAEzD,IAAI,CAAC;QACH,IAAI,IAAY,CAAC;QAEjB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,gBAAgB;gBACnB,IAAI,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC3C,MAAM;YACR,KAAK,YAAY;gBACf,IAAI,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;gBACvC,MAAM;YACR,KAAK,qBAAqB;gBACxB,IAAI,GAAG,MAAM,uBAAuB,CAAC,QAAQ,CAAC,CAAC;gBAC/C,MAAM;YACR,KAAK,gBAAgB;gBACnB,IAAI,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;gBAC3C,MAAM;YACR,KAAK,eAAe;gBAClB,IAAI,GAAG,MAAM,kBAAkB,CAAC,QAAQ,CAAC,CAAC;gBAC1C,MAAM;YACR,KAAK,mBAAmB;gBACtB,IAAI,GAAG,MAAM,qBAAqB,CAAC,QAAQ,CAAC,CAAC;gBAC7C,MAAM;YACR;gBACE,IAAI,GAAG,iBAAiB,IAAI,EAAE,CAAC;QACnC,CAAC;QAED,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAClC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;YACtD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}