algokit-mcp 1.0.2 → 1.0.3

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 (102) hide show
  1. package/README.md +138 -16
  2. package/dist/api/boj-scraper.js +1 -1
  3. package/dist/api/boj-scraper.js.map +1 -1
  4. package/dist/api/programmers-scraper.d.ts +0 -5
  5. package/dist/api/programmers-scraper.d.ts.map +1 -1
  6. package/dist/api/programmers-scraper.js +59 -90
  7. package/dist/api/programmers-scraper.js.map +1 -1
  8. package/dist/index.js +38 -35
  9. package/dist/index.js.map +1 -1
  10. package/dist/tools/boj/analyze-code-submission-boj.d.ts +67 -0
  11. package/dist/tools/boj/analyze-code-submission-boj.d.ts.map +1 -0
  12. package/dist/tools/boj/analyze-code-submission-boj.js +91 -0
  13. package/dist/tools/boj/analyze-code-submission-boj.js.map +1 -0
  14. package/dist/tools/boj/analyze-problem-boj.d.ts +48 -0
  15. package/dist/tools/boj/analyze-problem-boj.d.ts.map +1 -0
  16. package/dist/tools/boj/analyze-problem-boj.js +52 -0
  17. package/dist/tools/boj/analyze-problem-boj.js.map +1 -0
  18. package/dist/tools/boj/fetch-problem-content-boj.d.ts +49 -0
  19. package/dist/tools/boj/fetch-problem-content-boj.d.ts.map +1 -0
  20. package/dist/tools/boj/fetch-problem-content-boj.js +95 -0
  21. package/dist/tools/boj/fetch-problem-content-boj.js.map +1 -0
  22. package/dist/tools/boj/generate-hint-boj.d.ts +42 -0
  23. package/dist/tools/boj/generate-hint-boj.d.ts.map +1 -0
  24. package/dist/tools/boj/generate-hint-boj.js +82 -0
  25. package/dist/tools/boj/generate-hint-boj.js.map +1 -0
  26. package/dist/tools/boj/generate-review-template-boj.d.ts +48 -0
  27. package/dist/tools/boj/generate-review-template-boj.d.ts.map +1 -0
  28. package/dist/tools/boj/generate-review-template-boj.js +52 -0
  29. package/dist/tools/boj/generate-review-template-boj.js.map +1 -0
  30. package/dist/tools/boj/get-problem-boj.d.ts +22 -0
  31. package/dist/tools/boj/get-problem-boj.d.ts.map +1 -0
  32. package/dist/tools/boj/get-problem-boj.js +89 -0
  33. package/dist/tools/boj/get-problem-boj.js.map +1 -0
  34. package/dist/tools/boj/search-problems-boj.d.ts +42 -0
  35. package/dist/tools/boj/search-problems-boj.d.ts.map +1 -0
  36. package/dist/tools/boj/search-problems-boj.js +143 -0
  37. package/dist/tools/boj/search-problems-boj.js.map +1 -0
  38. package/dist/tools/boj/search-tags-boj.d.ts +22 -0
  39. package/dist/tools/boj/search-tags-boj.d.ts.map +1 -0
  40. package/dist/tools/boj/search-tags-boj.js +70 -0
  41. package/dist/tools/boj/search-tags-boj.js.map +1 -0
  42. package/dist/tools/get-problem-boj.d.ts +22 -0
  43. package/dist/tools/get-problem-boj.d.ts.map +1 -0
  44. package/dist/tools/get-problem-boj.js +89 -0
  45. package/dist/tools/get-problem-boj.js.map +1 -0
  46. package/dist/tools/programmers/analyze-code-submission-programmers.d.ts +60 -0
  47. package/dist/tools/programmers/analyze-code-submission-programmers.d.ts.map +1 -0
  48. package/dist/tools/programmers/analyze-code-submission-programmers.js +85 -0
  49. package/dist/tools/programmers/analyze-code-submission-programmers.js.map +1 -0
  50. package/dist/tools/programmers/analyze-problem-programmers.d.ts +48 -0
  51. package/dist/tools/programmers/analyze-problem-programmers.d.ts.map +1 -0
  52. package/dist/tools/programmers/analyze-problem-programmers.js +53 -0
  53. package/dist/tools/programmers/analyze-problem-programmers.js.map +1 -0
  54. package/dist/tools/programmers/fetch-problem-content-programmers.d.ts +46 -0
  55. package/dist/tools/programmers/fetch-problem-content-programmers.d.ts.map +1 -0
  56. package/dist/tools/programmers/fetch-problem-content-programmers.js +76 -0
  57. package/dist/tools/programmers/fetch-problem-content-programmers.js.map +1 -0
  58. package/dist/tools/programmers/generate-hint-programmers.d.ts +42 -0
  59. package/dist/tools/programmers/generate-hint-programmers.d.ts.map +1 -0
  60. package/dist/tools/programmers/generate-hint-programmers.js +80 -0
  61. package/dist/tools/programmers/generate-hint-programmers.js.map +1 -0
  62. package/dist/tools/programmers/generate-review-template-programmers.d.ts +48 -0
  63. package/dist/tools/programmers/generate-review-template-programmers.d.ts.map +1 -0
  64. package/dist/tools/programmers/generate-review-template-programmers.js +53 -0
  65. package/dist/tools/programmers/generate-review-template-programmers.js.map +1 -0
  66. package/dist/tools/programmers/get-problem-programmers.d.ts +53 -0
  67. package/dist/tools/programmers/get-problem-programmers.d.ts.map +1 -0
  68. package/dist/tools/programmers/get-problem-programmers.js +163 -0
  69. package/dist/tools/programmers/get-problem-programmers.js.map +1 -0
  70. package/dist/tools/programmers/search-problems-programmers.d.ts +73 -0
  71. package/dist/tools/programmers/search-problems-programmers.d.ts.map +1 -0
  72. package/dist/tools/programmers/search-problems-programmers.js +173 -0
  73. package/dist/tools/programmers/search-problems-programmers.js.map +1 -0
  74. package/dist/tools/search-problems-boj.d.ts +42 -0
  75. package/dist/tools/search-problems-boj.d.ts.map +1 -0
  76. package/dist/tools/search-problems-boj.js +143 -0
  77. package/dist/tools/search-problems-boj.js.map +1 -0
  78. package/dist/tools/search-tags-boj.d.ts +22 -0
  79. package/dist/tools/search-tags-boj.d.ts.map +1 -0
  80. package/dist/tools/search-tags-boj.js +70 -0
  81. package/dist/tools/search-tags-boj.js.map +1 -0
  82. package/dist/utils/agent-skill-installer.d.ts +9 -0
  83. package/dist/utils/agent-skill-installer.d.ts.map +1 -0
  84. package/dist/utils/agent-skill-installer.js +94 -0
  85. package/dist/utils/agent-skill-installer.js.map +1 -0
  86. package/dist/utils/claudecode-skill-installer.d.ts +6 -0
  87. package/dist/utils/claudecode-skill-installer.d.ts.map +1 -0
  88. package/dist/utils/claudecode-skill-installer.js +70 -0
  89. package/dist/utils/claudecode-skill-installer.js.map +1 -0
  90. package/dist/utils/skill-installer.d.ts +6 -0
  91. package/dist/utils/skill-installer.d.ts.map +1 -0
  92. package/dist/utils/skill-installer.js +70 -0
  93. package/dist/utils/skill-installer.js.map +1 -0
  94. package/dist/utils/tier-converter.d.ts.map +1 -1
  95. package/dist/utils/tier-converter.js +3 -0
  96. package/dist/utils/tier-converter.js.map +1 -1
  97. package/package.json +3 -4
  98. package/skills/algo:code-review/SKILL.md +134 -0
  99. package/skills/algo:fetch/SKILL.md +102 -0
  100. package/skills/algo:hint/SKILL.md +111 -0
  101. package/skills/algo:review/SKILL.md +123 -0
  102. package/skills/algo:search/SKILL.md +122 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-problems-boj.js","sourceRoot":"","sources":["../../../src/tools/boj/search-problems-boj.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * search_tags 도구
3
+ *
4
+ * 알고리즘 태그를 키워드로 검색합니다.
5
+ */
6
+ import { z } from 'zod';
7
+ /**
8
+ * 입력 스키마
9
+ */
10
+ export declare const SearchTagsInputSchema: z.ZodObject<{
11
+ query: z.ZodString;
12
+ }, "strip", z.ZodTypeAny, {
13
+ query: string;
14
+ }, {
15
+ query: string;
16
+ }>;
17
+ export type SearchTagsInput = z.infer<typeof SearchTagsInputSchema>;
18
+ /**
19
+ * 태그 검색 도구 핸들러
20
+ */
21
+ export declare function searchTags(input: SearchTagsInput): Promise<string>;
22
+ //# sourceMappingURL=search-tags-boj.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-tags-boj.d.ts","sourceRoot":"","sources":["../../../src/tools/boj/search-tags-boj.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;EAEhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AA0CpE;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBxE"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * search_tags 도구
3
+ *
4
+ * 알고리즘 태그를 키워드로 검색합니다.
5
+ */
6
+ import { z } from 'zod';
7
+ import { SolvedAcClient } from '../../api/solvedac-client.js';
8
+ /**
9
+ * 입력 스키마
10
+ */
11
+ export const SearchTagsInputSchema = z.object({
12
+ query: z.string().min(1).describe('태그 검색 키워드 (최소 1글자)'),
13
+ });
14
+ /**
15
+ * 다국어 태그명 추출
16
+ */
17
+ function getTagNames(tag) {
18
+ const korean = tag.displayNames.find(dn => dn.language === 'ko')?.name || tag.key;
19
+ const english = tag.displayNames.find(dn => dn.language === 'en')?.name || tag.key;
20
+ return { korean, english };
21
+ }
22
+ /**
23
+ * 태그 검색 결과를 마크다운 테이블로 포맷팅
24
+ */
25
+ function formatTagResults(tags) {
26
+ if (tags.length === 0) {
27
+ return '검색 결과가 없습니다. 다른 키워드로 시도해보세요.';
28
+ }
29
+ let result = `# 태그 검색 결과\n\n`;
30
+ result += `**총 ${tags.length}개 태그**\n\n`;
31
+ result += `| 태그 키 | 한글명 | 영문명 | 문제 수 |\n`;
32
+ result += `|---------|--------|--------|----------|\n`;
33
+ for (const tag of tags) {
34
+ const { korean, english } = getTagNames(tag);
35
+ const problemCount = tag.problemCount ? tag.problemCount.toLocaleString() : '-';
36
+ result += `| \`${tag.key}\` | ${korean} | ${english} | ${problemCount}개 |\n`;
37
+ }
38
+ result += `\n---\n`;
39
+ result += `💡 **팁**: 태그 키를 사용하여 \`search_problems\` 도구로 해당 태그의 문제를 검색할 수 있습니다.\n`;
40
+ result += `\n**사용 예시**:\n`;
41
+ result += `\`\`\`\n`;
42
+ result += `search_problems(tag: "${tags[0]?.key || 'dp'}")\n`;
43
+ result += `\`\`\`\n`;
44
+ return result;
45
+ }
46
+ /**
47
+ * 태그 검색 도구 핸들러
48
+ */
49
+ export async function searchTags(input) {
50
+ // 입력 검증 (공백 제거)
51
+ const query = input.query.trim();
52
+ if (query.length === 0) {
53
+ throw new Error('검색 키워드는 최소 1글자 이상이어야 합니다.');
54
+ }
55
+ const client = new SolvedAcClient();
56
+ try {
57
+ // API 호출
58
+ const tags = await client.searchTags(query);
59
+ // 결과 포맷팅
60
+ return formatTagResults(tags);
61
+ }
62
+ catch (error) {
63
+ // 에러 처리
64
+ if (error instanceof Error) {
65
+ throw new Error(`태그 검색 중 오류가 발생했습니다: ${error.message}`);
66
+ }
67
+ throw new Error('태그 검색 중 알 수 없는 오류가 발생했습니다.');
68
+ }
69
+ }
70
+ //# sourceMappingURL=search-tags-boj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-tags-boj.js","sourceRoot":"","sources":["../../../src/tools/boj/search-tags-boj.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * get_problem 도구
3
+ *
4
+ * 특정 BOJ 문제의 상세 정보를 조회합니다.
5
+ */
6
+ import { z } from 'zod';
7
+ /**
8
+ * 입력 스키마
9
+ */
10
+ export declare const GetProblemInputSchema: z.ZodObject<{
11
+ problem_id: z.ZodNumber;
12
+ }, "strip", z.ZodTypeAny, {
13
+ problem_id: number;
14
+ }, {
15
+ problem_id: number;
16
+ }>;
17
+ export type GetProblemInput = z.infer<typeof GetProblemInputSchema>;
18
+ /**
19
+ * 문제 상세 조회 도구 핸들러
20
+ */
21
+ export declare function getProblem(input: GetProblemInput): Promise<string>;
22
+ //# sourceMappingURL=get-problem-boj.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-problem-boj.d.ts","sourceRoot":"","sources":["../../src/tools/get-problem-boj.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;EAEhC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAgEpE;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBxE"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * get_problem 도구
3
+ *
4
+ * 특정 BOJ 문제의 상세 정보를 조회합니다.
5
+ */
6
+ import { z } from 'zod';
7
+ import { SolvedAcClient } from '../api/solvedac-client.js';
8
+ import { ProblemNotFoundError } from '../api/types.js';
9
+ import { getTierBadge, levelToTier } from '../utils/tier-converter.js';
10
+ /**
11
+ * 입력 스키마
12
+ */
13
+ export const GetProblemInputSchema = z.object({
14
+ problem_id: z.number().int().positive().describe('BOJ 문제 번호 (양의 정수)'),
15
+ });
16
+ /**
17
+ * 한글 태그명 추출 (우선순위: 한글 > 영어 > 키)
18
+ */
19
+ function getKoreanTagName(tag) {
20
+ const korean = tag.displayNames.find(dn => dn.language === 'ko');
21
+ if (korean)
22
+ return korean.name;
23
+ const english = tag.displayNames.find(dn => dn.language === 'en');
24
+ if (english)
25
+ return english.name;
26
+ return tag.key;
27
+ }
28
+ /**
29
+ * 문제 상세 정보를 마크다운으로 포맷팅
30
+ */
31
+ function formatProblemDetail(problem) {
32
+ const tierBadge = getTierBadge(problem.level);
33
+ const tierName = levelToTier(problem.level);
34
+ const bojLink = `https://www.acmicpc.net/problem/${problem.problemId}`;
35
+ let result = `# [${problem.problemId}] ${problem.titleKo}\n\n`;
36
+ // 기본 정보
37
+ result += `## 📋 기본 정보\n\n`;
38
+ result += `- **문제 번호**: ${problem.problemId}\n`;
39
+ result += `- **제목**: ${problem.titleKo}\n`;
40
+ result += `- **난이도**: ${tierBadge} (레벨 ${problem.level})\n`;
41
+ result += `- **링크**: [BOJ ${problem.problemId}](${bojLink})\n\n`;
42
+ // 태그
43
+ if (problem.tags.length > 0) {
44
+ result += `## 🏷️ 알고리즘 태그\n\n`;
45
+ const tagList = problem.tags.map(tag => {
46
+ const koreanName = getKoreanTagName(tag);
47
+ return `- **${koreanName}** (\`${tag.key}\`)`;
48
+ }).join('\n');
49
+ result += `${tagList}\n\n`;
50
+ }
51
+ // 통계
52
+ result += `## 📊 통계\n\n`;
53
+ result += `- **해결한 사용자**: ${problem.acceptedUserCount.toLocaleString()}명\n`;
54
+ result += `- **평균 시도 횟수**: ${problem.averageTries.toFixed(1)}회\n`;
55
+ // 풀이 가능 여부
56
+ if (problem.isSolvable !== undefined) {
57
+ result += `- **풀이 가능**: ${problem.isSolvable ? '✅ 예' : '❌ 아니오'}\n`;
58
+ }
59
+ if (problem.isPartial !== undefined) {
60
+ result += `- **부분 점수**: ${problem.isPartial ? '✅ 있음' : '❌ 없음'}\n`;
61
+ }
62
+ result += `\n---\n`;
63
+ result += `💡 **팁**: 위 링크를 클릭하면 BOJ에서 문제를 확인할 수 있습니다.\n`;
64
+ return result;
65
+ }
66
+ /**
67
+ * 문제 상세 조회 도구 핸들러
68
+ */
69
+ export async function getProblem(input) {
70
+ const client = new SolvedAcClient();
71
+ try {
72
+ // API 호출
73
+ const problem = await client.getProblem(input.problem_id);
74
+ // 결과 포맷팅
75
+ return formatProblemDetail(problem);
76
+ }
77
+ catch (error) {
78
+ // 에러 처리
79
+ if (error instanceof ProblemNotFoundError) {
80
+ throw new Error(`문제 ${input.problem_id}를 찾을 수 없습니다. 문제 번호를 확인해주세요.\n` +
81
+ `BOJ 링크: https://www.acmicpc.net/problem/${input.problem_id}`);
82
+ }
83
+ if (error instanceof Error) {
84
+ throw new Error(`문제 조회 중 오류가 발생했습니다: ${error.message}`);
85
+ }
86
+ throw new Error('문제 조회 중 알 수 없는 오류가 발생했습니다.');
87
+ }
88
+ }
89
+ //# sourceMappingURL=get-problem-boj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-problem-boj.js","sourceRoot":"","sources":["../../src/tools/get-problem-boj.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * analyze_code_submission_programmers MCP 도구
3
+ *
4
+ * 프로그래머스 사용자 코드 분석 및 피드백 제공
5
+ */
6
+ import { z } from 'zod';
7
+ import type { ProgrammersScraper } from '../../api/programmers-scraper.js';
8
+ /**
9
+ * 입력 스키마
10
+ */
11
+ export declare const AnalyzeCodeSubmissionProgrammersInputSchema: z.ZodObject<{
12
+ problem_id: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
13
+ code: z.ZodString;
14
+ language: z.ZodEnum<["python", "cpp", "javascript", "java", "go"]>;
15
+ analysis_type: z.ZodDefault<z.ZodOptional<z.ZodEnum<["full", "hint", "debug", "review"]>>>;
16
+ }, "strip", z.ZodTypeAny, {
17
+ language: "python" | "cpp" | "javascript" | "java" | "go";
18
+ code: string;
19
+ problem_id: string | number;
20
+ analysis_type: "full" | "hint" | "debug" | "review";
21
+ }, {
22
+ language: "python" | "cpp" | "javascript" | "java" | "go";
23
+ code: string;
24
+ problem_id: string | number;
25
+ analysis_type?: "full" | "hint" | "debug" | "review" | undefined;
26
+ }>;
27
+ export type AnalyzeCodeSubmissionProgrammersInput = z.infer<typeof AnalyzeCodeSubmissionProgrammersInputSchema>;
28
+ /**
29
+ * MCP TextContent 타입
30
+ */
31
+ interface TextContent {
32
+ type: 'text';
33
+ text: string;
34
+ }
35
+ /**
36
+ * analyze_code_submission_programmers 도구 핸들러
37
+ */
38
+ export declare function analyzeCodeSubmissionProgrammersTool(scraper: ProgrammersScraper): {
39
+ name: string;
40
+ description: string;
41
+ inputSchema: z.ZodObject<{
42
+ problem_id: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
43
+ code: z.ZodString;
44
+ language: z.ZodEnum<["python", "cpp", "javascript", "java", "go"]>;
45
+ analysis_type: z.ZodDefault<z.ZodOptional<z.ZodEnum<["full", "hint", "debug", "review"]>>>;
46
+ }, "strip", z.ZodTypeAny, {
47
+ language: "python" | "cpp" | "javascript" | "java" | "go";
48
+ code: string;
49
+ problem_id: string | number;
50
+ analysis_type: "full" | "hint" | "debug" | "review";
51
+ }, {
52
+ language: "python" | "cpp" | "javascript" | "java" | "go";
53
+ code: string;
54
+ problem_id: string | number;
55
+ analysis_type?: "full" | "hint" | "debug" | "review" | undefined;
56
+ }>;
57
+ handler: (input: AnalyzeCodeSubmissionProgrammersInput) => Promise<TextContent>;
58
+ };
59
+ export {};
60
+ //# sourceMappingURL=analyze-code-submission-programmers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-code-submission-programmers.d.ts","sourceRoot":"","sources":["../../../src/tools/programmers/analyze-code-submission-programmers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAM3E;;GAEG;AACH,eAAO,MAAM,2CAA2C;;;;;;;;;;;;;;;EAStD,CAAC;AAEH,MAAM,MAAM,qCAAqC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2CAA2C,CAAC,CAAC;AAEhH;;GAEG;AACH,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,oCAAoC,CAAC,OAAO,EAAE,kBAAkB;;;;;;;;;;;;;;;;;;;qBAmBrD,qCAAqC,KAAG,OAAO,CAAC,WAAW,CAAC;EAiDtF"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * analyze_code_submission_programmers MCP 도구
3
+ *
4
+ * 프로그래머스 사용자 코드 분석 및 피드백 제공
5
+ */
6
+ import { z } from 'zod';
7
+ import { ProgrammersScrapeError } from '../../api/programmers-scraper.js';
8
+ import { parseProgrammersUrl } from '../../utils/url-parser.js';
9
+ import { programmersToProblemContent } from '../../utils/programmers-converter.js';
10
+ import { CodeAnalyzer } from '../../services/code-analyzer.js';
11
+ /**
12
+ * 입력 스키마
13
+ */
14
+ export const AnalyzeCodeSubmissionProgrammersInputSchema = z.object({
15
+ problem_id: z.union([z.string(), z.number()])
16
+ .describe('프로그래머스 문제 ID 또는 URL'),
17
+ code: z.string().min(1)
18
+ .describe('분석할 사용자 코드'),
19
+ language: z.enum(['python', 'cpp', 'javascript', 'java', 'go'])
20
+ .describe('프로그래밍 언어'),
21
+ analysis_type: z.enum(['full', 'hint', 'debug', 'review']).optional().default('full')
22
+ .describe('분석 타입 (기본값: full)'),
23
+ });
24
+ /**
25
+ * analyze_code_submission_programmers 도구 핸들러
26
+ */
27
+ export function analyzeCodeSubmissionProgrammersTool(scraper) {
28
+ return {
29
+ name: 'analyze_code_submission_programmers',
30
+ description: `프로그래머스 문제에 대한 사용자 코드를 분석하여 피드백을 제공합니다.
31
+
32
+ 문제 본문과 사용자 코드를 결합하여 LLM 분석용 프롬프트를 생성합니다.
33
+
34
+ **분석 타입**:
35
+ - full: 전체 분석 (정확성, 복잡도, 개선점)
36
+ - hint: 힌트 제공 (핵심 개념, 접근 방법)
37
+ - debug: 디버깅 (에러 원인, 로직 오류)
38
+ - review: 코드 리뷰 (스타일, 가독성)
39
+
40
+ **응답 구조**: problemInfo, codeMetadata, analysisPrompts, suggestedQuestions
41
+
42
+ **지원 언어**: Python, C++, JavaScript, Java, Go
43
+
44
+ ⚠️ 플랫폼 판별: 문제 번호만 입력된 경우 대화 맥락에서 플랫폼을 파악하거나, 맥락이 없으면 반드시 BOJ/프로그래머스 중 어느 플랫폼인지 사용자에게 확인 후 호출하세요.`,
45
+ inputSchema: AnalyzeCodeSubmissionProgrammersInputSchema,
46
+ handler: async (input) => {
47
+ try {
48
+ const { problem_id, code, language, analysis_type } = AnalyzeCodeSubmissionProgrammersInputSchema.parse(input);
49
+ const parsedId = parseProgrammersUrl(problem_id);
50
+ if (!parsedId) {
51
+ throw new Error(`유효하지 않은 프로그래머스 문제 ID 또는 URL: ${problem_id}`);
52
+ }
53
+ // 1. 문제 본문 조회
54
+ const detail = await scraper.getProblem(parsedId);
55
+ const problemContent = programmersToProblemContent(detail);
56
+ // 2. CodeSubmission 객체 생성
57
+ const submission = {
58
+ problemId: parseInt(parsedId, 10) || 0,
59
+ code,
60
+ language: language,
61
+ submittedAt: new Date().toISOString(),
62
+ };
63
+ // 3. CodeAnalyzer로 분석
64
+ const analyzer = new CodeAnalyzer();
65
+ const result = await analyzer.analyzeCode(problemContent, submission, analysis_type);
66
+ return {
67
+ type: 'text',
68
+ text: JSON.stringify(result, null, 2),
69
+ };
70
+ }
71
+ catch (error) {
72
+ if (error instanceof z.ZodError) {
73
+ throw new Error(`입력 검증 실패: ${error.issues[0].message}`);
74
+ }
75
+ if (error instanceof ProgrammersScrapeError) {
76
+ if (error.code === 'NAVIGATION_ERROR') {
77
+ throw new Error(`문제를 찾을 수 없습니다: ${input.problem_id}`);
78
+ }
79
+ }
80
+ throw error;
81
+ }
82
+ },
83
+ };
84
+ }
85
+ //# sourceMappingURL=analyze-code-submission-programmers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-code-submission-programmers.js","sourceRoot":"","sources":["../../../src/tools/programmers/analyze-code-submission-programmers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * analyze_problem_programmers MCP 도구
3
+ *
4
+ * 프로그래머스 문제 분석 및 구조화된 힌트 데이터 제공
5
+ */
6
+ import { z } from 'zod';
7
+ import type { ProgrammersProblemAnalyzer } from '../../services/programmers-problem-analyzer.js';
8
+ /**
9
+ * 입력 스키마
10
+ */
11
+ export declare const AnalyzeProblemProgrammersInputSchema: z.ZodObject<{
12
+ problem_id: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
13
+ include_similar: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
14
+ }, "strip", z.ZodTypeAny, {
15
+ problem_id: string | number;
16
+ include_similar: boolean;
17
+ }, {
18
+ problem_id: string | number;
19
+ include_similar?: boolean | undefined;
20
+ }>;
21
+ export type AnalyzeProblemProgrammersInput = z.infer<typeof AnalyzeProblemProgrammersInputSchema>;
22
+ /**
23
+ * MCP TextContent 타입
24
+ */
25
+ interface TextContent {
26
+ type: 'text';
27
+ text: string;
28
+ }
29
+ /**
30
+ * analyze_problem_programmers 도구 핸들러
31
+ */
32
+ export declare function analyzeProblemProgrammersTool(analyzer: ProgrammersProblemAnalyzer): {
33
+ name: string;
34
+ description: string;
35
+ inputSchema: z.ZodObject<{
36
+ problem_id: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
37
+ include_similar: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
38
+ }, "strip", z.ZodTypeAny, {
39
+ problem_id: string | number;
40
+ include_similar: boolean;
41
+ }, {
42
+ problem_id: string | number;
43
+ include_similar?: boolean | undefined;
44
+ }>;
45
+ handler: (input: AnalyzeProblemProgrammersInput) => Promise<TextContent>;
46
+ };
47
+ export {};
48
+ //# sourceMappingURL=analyze-problem-programmers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-problem-programmers.d.ts","sourceRoot":"","sources":["../../../src/tools/programmers/analyze-problem-programmers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gDAAgD,CAAC;AAIjG;;GAEG;AACH,eAAO,MAAM,oCAAoC;;;;;;;;;EAK/C,CAAC;AAEH,MAAM,MAAM,8BAA8B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oCAAoC,CAAC,CAAC;AAElG;;GAEG;AACH,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,0BAA0B;;;;;;;;;;;;;qBAKvD,8BAA8B,KAAG,OAAO,CAAC,WAAW,CAAC;EA8B/E"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * analyze_problem_programmers MCP 도구
3
+ *
4
+ * 프로그래머스 문제 분석 및 구조화된 힌트 데이터 제공
5
+ */
6
+ import { z } from 'zod';
7
+ import { ProgrammersScrapeError } from '../../api/programmers-scraper.js';
8
+ import { parseProgrammersUrl } from '../../utils/url-parser.js';
9
+ /**
10
+ * 입력 스키마
11
+ */
12
+ export const AnalyzeProblemProgrammersInputSchema = z.object({
13
+ problem_id: z.union([z.string(), z.number()])
14
+ .describe('프로그래머스 문제 ID 또는 URL'),
15
+ include_similar: z.boolean().optional().default(true)
16
+ .describe('유사 문제 추천 포함 여부'),
17
+ });
18
+ /**
19
+ * analyze_problem_programmers 도구 핸들러
20
+ */
21
+ export function analyzeProblemProgrammersTool(analyzer) {
22
+ return {
23
+ name: 'analyze_problem_programmers',
24
+ description: '프로그래머스 문제를 분석하여 구조화된 힌트 데이터를 제공합니다. 난이도 컨텍스트, 3단계 힌트 가이드 프롬프트를 포함합니다.\n\n⚠️ 플랫폼 판별: 문제 번호만 입력된 경우 대화 맥락에서 플랫폼을 파악하거나, 맥락이 없으면 반드시 BOJ/프로그래머스 중 어느 플랫폼인지 사용자에게 확인 후 호출하세요.',
25
+ inputSchema: AnalyzeProblemProgrammersInputSchema,
26
+ handler: async (input) => {
27
+ try {
28
+ const { problem_id, include_similar } = AnalyzeProblemProgrammersInputSchema.parse(input);
29
+ const parsedId = parseProgrammersUrl(problem_id);
30
+ if (!parsedId) {
31
+ throw new Error(`유효하지 않은 프로그래머스 문제 ID 또는 URL: ${problem_id}`);
32
+ }
33
+ const analysis = await analyzer.analyze(parsedId, include_similar);
34
+ return {
35
+ type: 'text',
36
+ text: JSON.stringify(analysis, null, 2),
37
+ };
38
+ }
39
+ catch (error) {
40
+ if (error instanceof z.ZodError) {
41
+ throw new Error(`입력 검증 실패: ${error.issues[0].message}`);
42
+ }
43
+ if (error instanceof ProgrammersScrapeError) {
44
+ if (error.code === 'NAVIGATION_ERROR') {
45
+ throw new Error(`문제를 찾을 수 없습니다: ${input.problem_id}`);
46
+ }
47
+ }
48
+ throw error;
49
+ }
50
+ },
51
+ };
52
+ }
53
+ //# sourceMappingURL=analyze-problem-programmers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze-problem-programmers.js","sourceRoot":"","sources":["../../../src/tools/programmers/analyze-problem-programmers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAEhE;;GAEG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3D,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;SAC1C,QAAQ,CAAC,qBAAqB,CAAC;IAClC,eAAe,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;SAClD,QAAQ,CAAC,gBAAgB,CAAC;CAC9B,CAAC,CAAC;AAYH;;GAEG;AACH,MAAM,UAAU,6BAA6B,CAAC,QAAoC;IAChF,OAAO;QACL,IAAI,EAAE,6BAA6B;QACnC,WAAW,EAAE,2KAA2K;QACxL,WAAW,EAAE,oCAAoC;QACjD,OAAO,EAAE,KAAK,EAAE,KAAqC,EAAwB,EAAE;YAC7E,IAAI,CAAC;gBACH,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,GAAG,oCAAoC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAE1F,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;gBACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,EAAE,CAAC,CAAC;gBAChE,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;gBAEnE,OAAO;oBACL,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;iBACxC,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;oBAChC,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1D,CAAC;gBAED,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;oBAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;wBACtC,MAAM,IAAI,KAAK,CAAC,kBAAmB,KAAwC,CAAC,UAAU,EAAE,CAAC,CAAC;oBAC5F,CAAC;gBACH,CAAC;gBAED,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * fetch_problem_content_programmers MCP 도구
3
+ *
4
+ * 프로그래머스 문제 본문을 ProblemContent 형태로 반환
5
+ */
6
+ import { z } from 'zod';
7
+ import type { ProgrammersScraper } from '../../api/programmers-scraper.js';
8
+ /**
9
+ * 입력 스키마
10
+ */
11
+ export declare const FetchProblemContentProgrammersInputSchema: z.ZodObject<{
12
+ problem_id: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ problem_id: string | number;
15
+ }, {
16
+ problem_id: string | number;
17
+ }>;
18
+ export type FetchProblemContentProgrammersInput = z.infer<typeof FetchProblemContentProgrammersInputSchema>;
19
+ /**
20
+ * MCP TextContent 타입
21
+ */
22
+ interface TextContent {
23
+ type: 'text';
24
+ text: string;
25
+ }
26
+ /**
27
+ * fetch_problem_content_programmers 핸들러 (재사용 가능)
28
+ */
29
+ export declare function handleFetchProblemContentProgrammers(args: unknown, scraper: ProgrammersScraper): Promise<TextContent>;
30
+ /**
31
+ * fetch_problem_content_programmers 도구 핸들러
32
+ */
33
+ export declare function fetchProblemContentProgrammersTool(scraper: ProgrammersScraper): {
34
+ name: string;
35
+ description: string;
36
+ inputSchema: z.ZodObject<{
37
+ problem_id: z.ZodUnion<[z.ZodString, z.ZodNumber]>;
38
+ }, "strip", z.ZodTypeAny, {
39
+ problem_id: string | number;
40
+ }, {
41
+ problem_id: string | number;
42
+ }>;
43
+ handler: (input: FetchProblemContentProgrammersInput) => Promise<TextContent>;
44
+ };
45
+ export {};
46
+ //# sourceMappingURL=fetch-problem-content-programmers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-problem-content-programmers.d.ts","sourceRoot":"","sources":["../../../src/tools/programmers/fetch-problem-content-programmers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAK3E;;GAEG;AACH,eAAO,MAAM,yCAAyC;;;;;;EAGpD,CAAC;AAEH,MAAM,MAAM,mCAAmC,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yCAAyC,CAAC,CAAC;AAE5G;;GAEG;AACH,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,wBAAsB,oCAAoC,CACxD,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,WAAW,CAAC,CAgCtB;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAAC,OAAO,EAAE,kBAAkB;;;;;;;;;;qBAqBzD,mCAAmC;EAGvD"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * fetch_problem_content_programmers MCP 도구
3
+ *
4
+ * 프로그래머스 문제 본문을 ProblemContent 형태로 반환
5
+ */
6
+ import { z } from 'zod';
7
+ import { ProgrammersScrapeError } from '../../api/programmers-scraper.js';
8
+ import { parseProgrammersUrl } from '../../utils/url-parser.js';
9
+ import { programmersToProblemContent } from '../../utils/programmers-converter.js';
10
+ /**
11
+ * 입력 스키마
12
+ */
13
+ export const FetchProblemContentProgrammersInputSchema = z.object({
14
+ problem_id: z.union([z.string(), z.number()])
15
+ .describe('프로그래머스 문제 ID 또는 URL'),
16
+ });
17
+ /**
18
+ * fetch_problem_content_programmers 핸들러 (재사용 가능)
19
+ */
20
+ export async function handleFetchProblemContentProgrammers(args, scraper) {
21
+ try {
22
+ const { problem_id } = FetchProblemContentProgrammersInputSchema.parse(args);
23
+ const parsedId = parseProgrammersUrl(problem_id);
24
+ if (!parsedId) {
25
+ throw new Error(`유효하지 않은 프로그래머스 문제 ID 또는 URL: ${problem_id}`);
26
+ }
27
+ const detail = await scraper.getProblem(parsedId);
28
+ const content = programmersToProblemContent(detail);
29
+ return {
30
+ type: 'text',
31
+ text: JSON.stringify(content, null, 2),
32
+ };
33
+ }
34
+ catch (error) {
35
+ if (error instanceof z.ZodError) {
36
+ throw new Error(`입력 검증 실패: ${error.issues[0].message}`);
37
+ }
38
+ if (error instanceof ProgrammersScrapeError) {
39
+ if (error.code === 'NAVIGATION_ERROR') {
40
+ throw new Error(`문제를 찾을 수 없습니다: ${args.problem_id}`);
41
+ }
42
+ if (error.code === 'TIMEOUT') {
43
+ throw new Error(`요청이 타임아웃되었습니다: ${args.problem_id}`);
44
+ }
45
+ }
46
+ throw error;
47
+ }
48
+ }
49
+ /**
50
+ * fetch_problem_content_programmers 도구 핸들러
51
+ */
52
+ export function fetchProblemContentProgrammersTool(scraper) {
53
+ return {
54
+ name: 'fetch_problem_content_programmers',
55
+ description: `프로그래머스 문제 본문 스크래핑.
56
+
57
+ 프로그래머스 페이지에서 문제 제목, 설명, 제한사항, 입출력 예시를 가져옵니다.
58
+
59
+ 응답 구조: problemId, title, description, inputFormat, outputFormat, examples, limits, metadata
60
+
61
+ **사용 시나리오**:
62
+ - 문제 풀이 전 문제 본문 확인
63
+ - 코드 분석 시 문제 요구사항 비교
64
+
65
+ **제한사항**:
66
+ - 스크래핑 대상: https://school.programmers.co.kr/learn/courses/30/lessons/{problem_id}
67
+ - 타임아웃: 10초
68
+ - 재시도: 최대 2회
69
+ - 캐시: 30일
70
+
71
+ ⚠️ 플랫폼 판별: 문제 번호만 입력된 경우 대화 맥락에서 플랫폼을 파악하거나, 맥락이 없으면 반드시 BOJ/프로그래머스 중 어느 플랫폼인지 사용자에게 확인 후 호출하세요.`,
72
+ inputSchema: FetchProblemContentProgrammersInputSchema,
73
+ handler: (input) => handleFetchProblemContentProgrammers(input, scraper),
74
+ };
75
+ }
76
+ //# sourceMappingURL=fetch-problem-content-programmers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch-problem-content-programmers.js","sourceRoot":"","sources":["../../../src/tools/programmers/fetch-problem-content-programmers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,2BAA2B,EAAE,MAAM,sCAAsC,CAAC;AAEnF;;GAEG;AACH,MAAM,CAAC,MAAM,yCAAyC,GAAG,CAAC,CAAC,MAAM,CAAC;IAChE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;SAC1C,QAAQ,CAAC,qBAAqB,CAAC;CACnC,CAAC,CAAC;AAYH;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oCAAoC,CACxD,IAAa,EACb,OAA2B;IAE3B,IAAI,CAAC;QACH,MAAM,EAAE,UAAU,EAAE,GAAG,yCAAyC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE7E,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;QAEpD,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;SACvC,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;YAChC,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;YAC5C,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACtC,MAAM,IAAI,KAAK,CAAC,kBAAmB,IAA4C,CAAC,UAAU,EAAE,CAAC,CAAC;YAChG,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,kBAAmB,IAA4C,CAAC,UAAU,EAAE,CAAC,CAAC;YAChG,CAAC;QACH,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kCAAkC,CAAC,OAA2B;IAC5E,OAAO;QACL,IAAI,EAAE,mCAAmC;QACzC,WAAW,EAAE;;;;;;;;;;;;;;;;iGAgBgF;QAC7F,WAAW,EAAE,yCAAyC;QACtD,OAAO,EAAE,CAAC,KAA0C,EAAE,EAAE,CACtD,oCAAoC,CAAC,KAAK,EAAE,OAAO,CAAC;KACvD,CAAC;AACJ,CAAC"}