@cyanheads/anime-mcp-server 0.1.1

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 (85) hide show
  1. package/AGENTS.md +346 -0
  2. package/CLAUDE.md +346 -0
  3. package/Dockerfile +99 -0
  4. package/LICENSE +201 -0
  5. package/README.md +313 -0
  6. package/changelog/0.1.x/0.1.1.md +42 -0
  7. package/changelog/template.md +127 -0
  8. package/dist/index.d.ts +8 -0
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/index.js +24 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/mcp-server/prompts/index.d.ts +7 -0
  13. package/dist/mcp-server/prompts/index.d.ts.map +1 -0
  14. package/dist/mcp-server/prompts/index.js +7 -0
  15. package/dist/mcp-server/prompts/index.js.map +1 -0
  16. package/dist/mcp-server/resources/definitions/anime-media.resource.d.ts +31 -0
  17. package/dist/mcp-server/resources/definitions/anime-media.resource.d.ts.map +1 -0
  18. package/dist/mcp-server/resources/definitions/anime-media.resource.js +100 -0
  19. package/dist/mcp-server/resources/definitions/anime-media.resource.js.map +1 -0
  20. package/dist/mcp-server/resources/index.d.ts +29 -0
  21. package/dist/mcp-server/resources/index.d.ts.map +1 -0
  22. package/dist/mcp-server/resources/index.js +7 -0
  23. package/dist/mcp-server/resources/index.js.map +1 -0
  24. package/dist/mcp-server/tools/definitions/anime-find-characters.tool.d.ts +77 -0
  25. package/dist/mcp-server/tools/definitions/anime-find-characters.tool.d.ts.map +1 -0
  26. package/dist/mcp-server/tools/definitions/anime-find-characters.tool.js +308 -0
  27. package/dist/mcp-server/tools/definitions/anime-find-characters.tool.js.map +1 -0
  28. package/dist/mcp-server/tools/definitions/anime-get-media.tool.d.ts +92 -0
  29. package/dist/mcp-server/tools/definitions/anime-get-media.tool.d.ts.map +1 -0
  30. package/dist/mcp-server/tools/definitions/anime-get-media.tool.js +425 -0
  31. package/dist/mcp-server/tools/definitions/anime-get-media.tool.js.map +1 -0
  32. package/dist/mcp-server/tools/definitions/anime-get-rankings.tool.d.ts +73 -0
  33. package/dist/mcp-server/tools/definitions/anime-get-rankings.tool.d.ts.map +1 -0
  34. package/dist/mcp-server/tools/definitions/anime-get-rankings.tool.js +154 -0
  35. package/dist/mcp-server/tools/definitions/anime-get-rankings.tool.js.map +1 -0
  36. package/dist/mcp-server/tools/definitions/anime-get-recommendations.tool.d.ts +35 -0
  37. package/dist/mcp-server/tools/definitions/anime-get-recommendations.tool.d.ts.map +1 -0
  38. package/dist/mcp-server/tools/definitions/anime-get-recommendations.tool.js +174 -0
  39. package/dist/mcp-server/tools/definitions/anime-get-recommendations.tool.js.map +1 -0
  40. package/dist/mcp-server/tools/definitions/anime-get-relations.tool.d.ts +43 -0
  41. package/dist/mcp-server/tools/definitions/anime-get-relations.tool.d.ts.map +1 -0
  42. package/dist/mcp-server/tools/definitions/anime-get-relations.tool.js +245 -0
  43. package/dist/mcp-server/tools/definitions/anime-get-relations.tool.js.map +1 -0
  44. package/dist/mcp-server/tools/definitions/anime-get-schedule.tool.d.ts +51 -0
  45. package/dist/mcp-server/tools/definitions/anime-get-schedule.tool.d.ts.map +1 -0
  46. package/dist/mcp-server/tools/definitions/anime-get-schedule.tool.js +196 -0
  47. package/dist/mcp-server/tools/definitions/anime-get-schedule.tool.js.map +1 -0
  48. package/dist/mcp-server/tools/definitions/anime-get-studio.tool.d.ts +50 -0
  49. package/dist/mcp-server/tools/definitions/anime-get-studio.tool.d.ts.map +1 -0
  50. package/dist/mcp-server/tools/definitions/anime-get-studio.tool.js +163 -0
  51. package/dist/mcp-server/tools/definitions/anime-get-studio.tool.js.map +1 -0
  52. package/dist/mcp-server/tools/definitions/anime-search-media.tool.d.ts +73 -0
  53. package/dist/mcp-server/tools/definitions/anime-search-media.tool.d.ts.map +1 -0
  54. package/dist/mcp-server/tools/definitions/anime-search-media.tool.js +229 -0
  55. package/dist/mcp-server/tools/definitions/anime-search-media.tool.js.map +1 -0
  56. package/dist/mcp-server/tools/index.d.ts +435 -0
  57. package/dist/mcp-server/tools/index.d.ts.map +1 -0
  58. package/dist/mcp-server/tools/index.js +23 -0
  59. package/dist/mcp-server/tools/index.js.map +1 -0
  60. package/dist/services/anilist/anilist-service.d.ts +90 -0
  61. package/dist/services/anilist/anilist-service.d.ts.map +1 -0
  62. package/dist/services/anilist/anilist-service.js +496 -0
  63. package/dist/services/anilist/anilist-service.js.map +1 -0
  64. package/dist/services/anilist/types.d.ts +255 -0
  65. package/dist/services/anilist/types.d.ts.map +1 -0
  66. package/dist/services/anilist/types.js +6 -0
  67. package/dist/services/anilist/types.js.map +1 -0
  68. package/dist/services/jikan/jikan-service.d.ts +22 -0
  69. package/dist/services/jikan/jikan-service.d.ts.map +1 -0
  70. package/dist/services/jikan/jikan-service.js +89 -0
  71. package/dist/services/jikan/jikan-service.js.map +1 -0
  72. package/dist/services/jikan/types.d.ts +85 -0
  73. package/dist/services/jikan/types.d.ts.map +1 -0
  74. package/dist/services/jikan/types.js +6 -0
  75. package/dist/services/jikan/types.js.map +1 -0
  76. package/dist/services/kitsu/kitsu-service.d.ts +14 -0
  77. package/dist/services/kitsu/kitsu-service.d.ts.map +1 -0
  78. package/dist/services/kitsu/kitsu-service.js +94 -0
  79. package/dist/services/kitsu/kitsu-service.js.map +1 -0
  80. package/dist/services/kitsu/types.d.ts +17 -0
  81. package/dist/services/kitsu/types.d.ts.map +1 -0
  82. package/dist/services/kitsu/types.js +6 -0
  83. package/dist/services/kitsu/types.js.map +1 -0
  84. package/package.json +103 -0
  85. package/server.json +99 -0
@@ -0,0 +1,100 @@
1
+ /**
2
+ * @fileoverview anime://media/{id} resource — full media record by AniList ID.
3
+ * Delegates to the same service layer as anime_get_media for stable URI-injectable context.
4
+ * @module mcp-server/resources/definitions/anime-media.resource
5
+ */
6
+ import { resource, z } from '@cyanheads/mcp-ts-core';
7
+ import { notFound } from '@cyanheads/mcp-ts-core/errors';
8
+ import * as anilist from '../../../services/anilist/anilist-service.js';
9
+ import * as jikan from '../../../services/jikan/jikan-service.js';
10
+ import * as kitsu from '../../../services/kitsu/kitsu-service.js';
11
+ export const animeMediaResource = resource('anime://media/{id}', {
12
+ name: 'anime-media',
13
+ description: 'Full media record for an anime or manga by AniList ID. ' +
14
+ 'Returns the same data as anime_get_media — title, synopsis, scores, studios, tags, streaming links. ' +
15
+ 'Use as a stable URI for injectable context about a specific title.',
16
+ mimeType: 'application/json',
17
+ params: z.object({
18
+ id: z
19
+ .string()
20
+ .describe('AniList media ID as a string, e.g. "16498". Obtain from anime_search_media.'),
21
+ }),
22
+ output: z.object({
23
+ id: z.number().int().describe('AniList media ID.'),
24
+ id_mal: z.number().int().nullable().describe('MyAnimeList ID, or null.'),
25
+ type: z.string().describe('Media type: ANIME or MANGA.'),
26
+ title: z
27
+ .object({
28
+ romaji: z.string().nullable().describe('Romanized title.'),
29
+ english: z.string().nullable().describe('English title, or null.'),
30
+ native: z.string().nullable().describe('Native script title, or null.'),
31
+ })
32
+ .describe('Title variants.'),
33
+ format: z.string().nullable().describe('Format: TV, MOVIE, OVA, MANGA, etc.'),
34
+ status: z.string().nullable().describe('Production status.'),
35
+ season: z.string().nullable().describe('Broadcast season label, or null.'),
36
+ description: z.string().nullable().describe('Plot synopsis, or null.'),
37
+ episodes: z.number().int().nullable().describe('Episode count (anime), or null.'),
38
+ chapters: z.number().int().nullable().describe('Chapter count (manga), or null.'),
39
+ genres: z.array(z.string().describe('A genre label.')).describe('Genre list.'),
40
+ mean_score: z.number().nullable().describe('AniList mean score 0–100, or null.'),
41
+ mal_score: z.number().nullable().describe('MAL score 0–10.0, or null.'),
42
+ streaming_count: z.number().int().describe('Number of streaming platforms found.'),
43
+ cover_image_url: z.string().nullable().describe('Cover image URL, or null.'),
44
+ site_url: z.string().nullable().describe('AniList page URL.'),
45
+ }),
46
+ async handler(params, ctx) {
47
+ const numericId = parseInt(params.id, 10);
48
+ if (Number.isNaN(numericId) || numericId < 1) {
49
+ throw notFound(`Invalid AniList media ID: ${params.id}`);
50
+ }
51
+ ctx.log.info('Fetching anime media resource', { id: numericId });
52
+ const detail = await anilist.getMediaById(numericId);
53
+ if (!detail) {
54
+ throw notFound(`No media found with AniList ID ${numericId}`, { id: numericId });
55
+ }
56
+ // Fan out to supplements in parallel
57
+ const [jikanResult, kitsuResult] = await Promise.allSettled([
58
+ detail.idMal ? jikan.getMediaFull(detail.idMal, detail.type) : Promise.resolve(null),
59
+ detail.type === 'ANIME' && detail.idMal
60
+ ? kitsu.getAnimeStreamingByMalId(detail.idMal)
61
+ : Promise.resolve(null),
62
+ ]);
63
+ const jikanData = jikanResult.status === 'fulfilled' ? jikanResult.value : null;
64
+ const kitsuData = kitsuResult.status === 'fulfilled' ? kitsuResult.value : null;
65
+ // Count streaming links
66
+ let streamingCount = 0;
67
+ if (kitsuData?.streamingLinks?.length) {
68
+ streamingCount = kitsuData.streamingLinks.length;
69
+ }
70
+ else if (detail.type === 'ANIME') {
71
+ streamingCount = (detail.externalLinks ?? []).filter((l) => l.type === 'STREAMING').length;
72
+ }
73
+ const season = detail.season && detail.seasonYear
74
+ ? `${detail.season} ${detail.seasonYear}`
75
+ : (detail.season ?? null);
76
+ return {
77
+ id: detail.id,
78
+ id_mal: detail.idMal ?? null,
79
+ type: detail.type,
80
+ title: {
81
+ romaji: detail.title.romaji,
82
+ english: detail.title.english,
83
+ native: detail.title.native,
84
+ },
85
+ format: detail.format ?? null,
86
+ status: detail.status ?? null,
87
+ season,
88
+ description: detail.description ?? null,
89
+ episodes: detail.episodes ?? null,
90
+ chapters: detail.chapters ?? null,
91
+ genres: detail.genres ?? [],
92
+ mean_score: detail.meanScore ?? null,
93
+ mal_score: jikanData?.score ?? null,
94
+ streaming_count: streamingCount,
95
+ cover_image_url: detail.coverImage?.extraLarge ?? null,
96
+ site_url: detail.siteUrl ?? null,
97
+ };
98
+ },
99
+ });
100
+ //# sourceMappingURL=anime-media.resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anime-media.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/anime-media.resource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @fileoverview Barrel export for all anime-mcp-server resource definitions.
3
+ * @module mcp-server/resources/index
4
+ */
5
+ export declare const allResourceDefinitions: import("@cyanheads/mcp-ts-core").ResourceDefinition<import("zod").ZodObject<{
6
+ id: import("zod").ZodString;
7
+ }, import("zod/v4/core").$strip>, import("zod").ZodObject<{
8
+ id: import("zod").ZodNumber;
9
+ id_mal: import("zod").ZodNullable<import("zod").ZodNumber>;
10
+ type: import("zod").ZodString;
11
+ title: import("zod").ZodObject<{
12
+ romaji: import("zod").ZodNullable<import("zod").ZodString>;
13
+ english: import("zod").ZodNullable<import("zod").ZodString>;
14
+ native: import("zod").ZodNullable<import("zod").ZodString>;
15
+ }, import("zod/v4/core").$strip>;
16
+ format: import("zod").ZodNullable<import("zod").ZodString>;
17
+ status: import("zod").ZodNullable<import("zod").ZodString>;
18
+ season: import("zod").ZodNullable<import("zod").ZodString>;
19
+ description: import("zod").ZodNullable<import("zod").ZodString>;
20
+ episodes: import("zod").ZodNullable<import("zod").ZodNumber>;
21
+ chapters: import("zod").ZodNullable<import("zod").ZodNumber>;
22
+ genres: import("zod").ZodArray<import("zod").ZodString>;
23
+ mean_score: import("zod").ZodNullable<import("zod").ZodNumber>;
24
+ mal_score: import("zod").ZodNullable<import("zod").ZodNumber>;
25
+ streaming_count: import("zod").ZodNumber;
26
+ cover_image_url: import("zod").ZodNullable<import("zod").ZodString>;
27
+ site_url: import("zod").ZodNullable<import("zod").ZodString>;
28
+ }, import("zod/v4/core").$strip>, undefined>[];
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/resources/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;8CAAuB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @fileoverview Barrel export for all anime-mcp-server resource definitions.
3
+ * @module mcp-server/resources/index
4
+ */
5
+ import { animeMediaResource } from './definitions/anime-media.resource.js';
6
+ export const allResourceDefinitions = [animeMediaResource];
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/mcp-server/resources/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAE3E,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,kBAAkB,CAAC,CAAC"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * @fileoverview anime_find_characters tool — characters and voice actors for a title,
3
+ * or bidirectional lookup by character/VA name.
4
+ * @module mcp-server/tools/definitions/anime-find-characters.tool
5
+ */
6
+ import { z } from '@cyanheads/mcp-ts-core';
7
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
8
+ export declare const animeFindCharacters: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
9
+ id: z.ZodOptional<z.ZodNumber>;
10
+ character_name: z.ZodOptional<z.ZodString>;
11
+ voice_actor_name: z.ZodOptional<z.ZodString>;
12
+ language: z.ZodOptional<z.ZodEnum<{
13
+ JAPANESE: "JAPANESE";
14
+ ENGLISH: "ENGLISH";
15
+ KOREAN: "KOREAN";
16
+ ITALIAN: "ITALIAN";
17
+ SPANISH: "SPANISH";
18
+ PORTUGUESE: "PORTUGUESE";
19
+ FRENCH: "FRENCH";
20
+ GERMAN: "GERMAN";
21
+ HEBREW: "HEBREW";
22
+ HUNGARIAN: "HUNGARIAN";
23
+ }>>;
24
+ page: z.ZodDefault<z.ZodNumber>;
25
+ per_page: z.ZodDefault<z.ZodNumber>;
26
+ }, z.core.$strip>, z.ZodObject<{
27
+ mode: z.ZodEnum<{
28
+ by_media: "by_media";
29
+ by_character: "by_character";
30
+ by_voice_actor: "by_voice_actor";
31
+ }>;
32
+ media_id: z.ZodNullable<z.ZodNumber>;
33
+ has_next_page: z.ZodBoolean;
34
+ characters: z.ZodArray<z.ZodObject<{
35
+ character_id: z.ZodNumber;
36
+ character_name: z.ZodNullable<z.ZodString>;
37
+ character_name_native: z.ZodNullable<z.ZodString>;
38
+ role: z.ZodString;
39
+ character_image_url: z.ZodNullable<z.ZodString>;
40
+ character_site_url: z.ZodNullable<z.ZodString>;
41
+ voice_actors: z.ZodArray<z.ZodObject<{
42
+ va_id: z.ZodNumber;
43
+ va_name: z.ZodNullable<z.ZodString>;
44
+ va_name_native: z.ZodNullable<z.ZodString>;
45
+ language: z.ZodNullable<z.ZodString>;
46
+ va_image_url: z.ZodNullable<z.ZodString>;
47
+ va_site_url: z.ZodNullable<z.ZodString>;
48
+ }, z.core.$strip>>;
49
+ }, z.core.$strip>>;
50
+ voice_actor: z.ZodNullable<z.ZodObject<{
51
+ va_id: z.ZodNumber;
52
+ va_name: z.ZodNullable<z.ZodString>;
53
+ va_name_native: z.ZodNullable<z.ZodString>;
54
+ language: z.ZodNullable<z.ZodString>;
55
+ description: z.ZodNullable<z.ZodString>;
56
+ va_image_url: z.ZodNullable<z.ZodString>;
57
+ va_site_url: z.ZodNullable<z.ZodString>;
58
+ roles: z.ZodArray<z.ZodObject<{
59
+ media_id: z.ZodNumber;
60
+ media_title: z.ZodNullable<z.ZodString>;
61
+ media_format: z.ZodNullable<z.ZodString>;
62
+ character_role: z.ZodString;
63
+ character_name: z.ZodNullable<z.ZodString>;
64
+ }, z.core.$strip>>;
65
+ }, z.core.$strip>>;
66
+ }, z.core.$strip>, readonly [{
67
+ readonly reason: "not_found";
68
+ readonly code: JsonRpcErrorCode.NotFound;
69
+ readonly when: "Name search returns no match from AniList";
70
+ readonly recovery: "Try a broader name search or check spelling. For character searches, use the full name or a distinctive part of it.";
71
+ }, {
72
+ readonly reason: "missing_identifier";
73
+ readonly code: JsonRpcErrorCode.InvalidParams;
74
+ readonly when: "Neither id nor character_name nor voice_actor_name provided";
75
+ readonly recovery: "Provide at least one of: id (media AniList ID), character_name, or voice_actor_name.";
76
+ }], undefined>;
77
+ //# sourceMappingURL=anime-find-characters.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anime-find-characters.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/anime-find-characters.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAgBjE,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA+V9B,CAAC"}
@@ -0,0 +1,308 @@
1
+ /**
2
+ * @fileoverview anime_find_characters tool — characters and voice actors for a title,
3
+ * or bidirectional lookup by character/VA name.
4
+ * @module mcp-server/tools/definitions/anime-find-characters.tool
5
+ */
6
+ import { tool, z } from '@cyanheads/mcp-ts-core';
7
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
8
+ import * as anilist from '../../../services/anilist/anilist-service.js';
9
+ const STAFF_LANGUAGE_VALUES = [
10
+ 'JAPANESE',
11
+ 'ENGLISH',
12
+ 'KOREAN',
13
+ 'ITALIAN',
14
+ 'SPANISH',
15
+ 'PORTUGUESE',
16
+ 'FRENCH',
17
+ 'GERMAN',
18
+ 'HEBREW',
19
+ 'HUNGARIAN',
20
+ ];
21
+ export const animeFindCharacters = tool('anime_find_characters', {
22
+ description: 'Characters and voice actors for a title, or look up a character/VA by name. ' +
23
+ 'Provide "id" for title → cast lookup, or "character_name" / "voice_actor_name" for name-based lookup. ' +
24
+ 'Returns characters with their role, voice actors by language, and cross-links to other media.',
25
+ annotations: { readOnlyHint: true, openWorldHint: true },
26
+ input: z.object({
27
+ id: z
28
+ .number()
29
+ .int()
30
+ .min(1)
31
+ .optional()
32
+ .describe('AniList media ID for title → cast lookup. Use anime_search_media to find this ID.'),
33
+ character_name: z
34
+ .string()
35
+ .max(200)
36
+ .optional()
37
+ .describe("Character name to search for. Returns the character's appearances across media."),
38
+ voice_actor_name: z
39
+ .string()
40
+ .max(200)
41
+ .optional()
42
+ .describe('Voice actor/staff name to search for. Returns their roles across anime.'),
43
+ language: z
44
+ .enum(STAFF_LANGUAGE_VALUES)
45
+ .optional()
46
+ .describe('Filter voice actors by language. Common: JAPANESE, ENGLISH, KOREAN. ' +
47
+ 'Only applies when fetching by media ID.'),
48
+ page: z
49
+ .number()
50
+ .int()
51
+ .min(1)
52
+ .default(1)
53
+ .describe('1-based page number for character/role results.'),
54
+ per_page: z.number().int().min(1).max(25).default(25).describe('Results per page. Maximum 25.'),
55
+ }),
56
+ output: z.object({
57
+ mode: z
58
+ .enum(['by_media', 'by_character', 'by_voice_actor'])
59
+ .describe('Which lookup mode was used.'),
60
+ media_id: z
61
+ .number()
62
+ .int()
63
+ .nullable()
64
+ .describe('AniList media ID used for the lookup, or null for name-based lookup.'),
65
+ has_next_page: z.boolean().describe('Whether more results are available on the next page.'),
66
+ characters: z
67
+ .array(z
68
+ .object({
69
+ character_id: z.number().int().describe('AniList character ID.'),
70
+ character_name: z.string().nullable().describe('Character full name.'),
71
+ character_name_native: z
72
+ .string()
73
+ .nullable()
74
+ .describe('Native script character name, or null.'),
75
+ role: z.string().describe('Role in the media: MAIN, SUPPORTING, or BACKGROUND.'),
76
+ character_image_url: z.string().nullable().describe('Character image URL, or null.'),
77
+ character_site_url: z
78
+ .string()
79
+ .nullable()
80
+ .describe('AniList character page URL, or null.'),
81
+ voice_actors: z
82
+ .array(z
83
+ .object({
84
+ va_id: z.number().int().describe('AniList staff/VA ID.'),
85
+ va_name: z.string().nullable().describe('Voice actor full name.'),
86
+ va_name_native: z
87
+ .string()
88
+ .nullable()
89
+ .describe('Native script VA name, or null.'),
90
+ language: z.string().nullable().describe('Voice acting language.'),
91
+ va_image_url: z.string().nullable().describe('VA image URL, or null.'),
92
+ va_site_url: z.string().nullable().describe('AniList VA page URL, or null.'),
93
+ })
94
+ .describe('A voice actor for this character.'))
95
+ .describe('Voice actors for this character, filtered by language if requested.'),
96
+ })
97
+ .describe('A character entry with voice actor list.'))
98
+ .describe('Characters found. In by_media mode, characters for the title. In by_character mode, one character with their media appearances as context. Empty in by_voice_actor mode.'),
99
+ voice_actor: z
100
+ .object({
101
+ va_id: z.number().int().describe('AniList staff ID.'),
102
+ va_name: z.string().nullable().describe('Voice actor full name.'),
103
+ va_name_native: z.string().nullable().describe('Native script VA name, or null.'),
104
+ language: z.string().nullable().describe('Primary voice acting language.'),
105
+ description: z.string().nullable().describe('Bio/description (HTML stripped), or null.'),
106
+ va_image_url: z.string().nullable().describe('VA image URL, or null.'),
107
+ va_site_url: z.string().nullable().describe('AniList VA page URL, or null.'),
108
+ roles: z
109
+ .array(z
110
+ .object({
111
+ media_id: z.number().int().describe('AniList media ID.'),
112
+ media_title: z.string().nullable().describe('Romanized media title.'),
113
+ media_format: z.string().nullable().describe('Media format.'),
114
+ character_role: z.string().describe('Role: MAIN, SUPPORTING, or BACKGROUND.'),
115
+ character_name: z.string().nullable().describe('Character name in this role.'),
116
+ })
117
+ .describe('A media role entry for this voice actor.'))
118
+ .describe('Media roles for this voice actor.'),
119
+ })
120
+ .nullable()
121
+ .describe('Voice actor detail (populated in by_voice_actor mode only, null otherwise).'),
122
+ }),
123
+ errors: [
124
+ {
125
+ reason: 'not_found',
126
+ code: JsonRpcErrorCode.NotFound,
127
+ when: 'Name search returns no match from AniList',
128
+ recovery: 'Try a broader name search or check spelling. For character searches, use the full name or a distinctive part of it.',
129
+ },
130
+ {
131
+ reason: 'missing_identifier',
132
+ code: JsonRpcErrorCode.InvalidParams,
133
+ when: 'Neither id nor character_name nor voice_actor_name provided',
134
+ recovery: 'Provide at least one of: id (media AniList ID), character_name, or voice_actor_name.',
135
+ },
136
+ ],
137
+ async handler(input, ctx) {
138
+ // Validate: must have at least one identifier
139
+ if (!input.id && !input.character_name && !input.voice_actor_name) {
140
+ throw ctx.fail('missing_identifier', 'Provide at least one of: id, character_name, or voice_actor_name');
141
+ }
142
+ // Mode A: by media ID
143
+ if (input.id) {
144
+ ctx.log.info('Fetching characters by media ID', { id: input.id });
145
+ const result = await anilist.getMediaCharacters({
146
+ mediaId: input.id,
147
+ language: input.language,
148
+ page: input.page,
149
+ perPage: input.per_page,
150
+ });
151
+ return {
152
+ mode: 'by_media',
153
+ media_id: input.id,
154
+ has_next_page: result.hasNextPage,
155
+ characters: result.characters.map((edge) => ({
156
+ character_id: edge.node.id,
157
+ character_name: edge.node.name.full,
158
+ character_name_native: edge.node.name.native,
159
+ role: edge.role,
160
+ character_image_url: edge.node.image?.large ?? null,
161
+ character_site_url: edge.node.siteUrl ?? null,
162
+ voice_actors: edge.voiceActors.map((va) => ({
163
+ va_id: va.id,
164
+ va_name: va.name.full,
165
+ va_name_native: va.name.native,
166
+ language: va.language ?? null,
167
+ va_image_url: va.image?.large ?? null,
168
+ va_site_url: va.siteUrl ?? null,
169
+ })),
170
+ })),
171
+ voice_actor: null,
172
+ };
173
+ }
174
+ // Mode B: by character name
175
+ if (input.character_name) {
176
+ ctx.log.info('Searching character by name', { name: input.character_name });
177
+ const character = await anilist.searchCharacter(input.character_name);
178
+ if (!character) {
179
+ throw ctx.fail('not_found', `No character found matching "${input.character_name}"`);
180
+ }
181
+ // Map each media appearance as a character entry so the agent can see
182
+ // which titles the character appears in and their VAs per appearance.
183
+ const appearances = character.media.nodes.map((_media, i) => {
184
+ const edge = character.media.edges[i];
185
+ return {
186
+ character_id: character.id,
187
+ character_name: character.name.full,
188
+ character_name_native: character.name.native,
189
+ role: edge?.characterRole ?? 'SUPPORTING',
190
+ character_image_url: character.image?.large ?? null,
191
+ character_site_url: character.siteUrl ?? null,
192
+ // Attach media context via voice_actors reuse: each "va" entry here is
193
+ // a VA for this character in this specific media.
194
+ voice_actors: (edge?.voiceActors ?? []).map((va) => ({
195
+ va_id: va.id,
196
+ va_name: va.name.full,
197
+ va_name_native: va.name.native,
198
+ language: va.language ?? null,
199
+ va_image_url: va.image?.large ?? null,
200
+ va_site_url: va.siteUrl ?? null,
201
+ })),
202
+ };
203
+ });
204
+ // If no appearances mapped (edge/node mismatch), fall back to single entry
205
+ const characters = appearances.length > 0
206
+ ? appearances
207
+ : [
208
+ {
209
+ character_id: character.id,
210
+ character_name: character.name.full,
211
+ character_name_native: character.name.native,
212
+ role: 'SUPPORTING',
213
+ character_image_url: character.image?.large ?? null,
214
+ character_site_url: character.siteUrl ?? null,
215
+ voice_actors: [],
216
+ },
217
+ ];
218
+ return {
219
+ mode: 'by_character',
220
+ media_id: null,
221
+ has_next_page: character.media.pageInfo.hasNextPage,
222
+ characters,
223
+ voice_actor: null,
224
+ };
225
+ }
226
+ // Mode C: by voice actor name
227
+ ctx.log.info('Searching VA by name', { name: input.voice_actor_name });
228
+ const staff = await anilist.searchStaff(input.voice_actor_name, input.page, input.per_page);
229
+ if (!staff) {
230
+ throw ctx.fail('not_found', `No voice actor/staff found matching "${input.voice_actor_name}"`);
231
+ }
232
+ return {
233
+ mode: 'by_voice_actor',
234
+ media_id: null,
235
+ has_next_page: staff.characterMedia.pageInfo.hasNextPage,
236
+ characters: [],
237
+ voice_actor: {
238
+ va_id: staff.id,
239
+ va_name: staff.name.full,
240
+ va_name_native: staff.name.native,
241
+ language: staff.language ?? null,
242
+ description: staff.description ?? null,
243
+ va_image_url: staff.image?.large ?? null,
244
+ va_site_url: staff.siteUrl ?? null,
245
+ roles: staff.characterMedia.edges.map((edge) => ({
246
+ media_id: edge.node.id,
247
+ media_title: edge.node.title.romaji,
248
+ media_format: edge.node.format ?? null,
249
+ character_role: edge.characterRole,
250
+ character_name: edge.characters?.[0]?.name.full ?? null,
251
+ })),
252
+ },
253
+ };
254
+ },
255
+ format: (result) => {
256
+ const lines = [`mode: ${result.mode}`];
257
+ if (result.mode === 'by_media') {
258
+ lines.push(`## Characters [media AL:${result.media_id}]`, '');
259
+ if (result.characters.length === 0) {
260
+ lines.push('No characters found.');
261
+ return [{ type: 'text', text: lines.join('\n') }];
262
+ }
263
+ for (const c of result.characters) {
264
+ lines.push(`**${c.character_name ?? 'Unknown'}** (${c.character_name_native ?? '?'}) [char_id:${c.character_id}] [${c.role}]`, ` image: ${c.character_image_url ?? 'none'} | site: ${c.character_site_url ?? 'none'}`);
265
+ for (const v of c.voice_actors) {
266
+ lines.push(` VA: ${v.va_name ?? '?'} (${v.va_name_native ?? '?'}) (${v.language ?? '?'}) [va_id:${v.va_id}] image:${v.va_image_url ?? 'none'} site:${v.va_site_url ?? 'none'}`);
267
+ }
268
+ }
269
+ }
270
+ else if (result.mode === 'by_character') {
271
+ if (result.characters.length === 0) {
272
+ lines.push('No character found.');
273
+ return [{ type: 'text', text: lines.join('\n') }];
274
+ }
275
+ const first = result.characters[0];
276
+ lines.push(`## ${first.character_name ?? 'Unknown'} (${first.character_name_native ?? '?'}) [char_id:${first.character_id}]`, `image: ${first.character_image_url ?? 'none'} | site: ${first.character_site_url ?? 'none'}`, '', `**Appears in ${result.characters.length} title(s):**`);
277
+ for (const c of result.characters) {
278
+ lines.push(` [${c.role}] char_id:${c.character_id}`);
279
+ for (const v of c.voice_actors) {
280
+ lines.push(` VA: ${v.va_name ?? '?'} (${v.va_name_native ?? '?'}) (${v.language ?? '?'}) [va_id:${v.va_id}] image:${v.va_image_url ?? 'none'} site:${v.va_site_url ?? 'none'}`);
281
+ }
282
+ }
283
+ }
284
+ else if (result.mode === 'by_voice_actor') {
285
+ const va = result.voice_actor;
286
+ if (va) {
287
+ lines.push(`## ${va.va_name ?? 'Unknown'} (${va.va_name_native ?? '?'}) (VA)`, `va_id:${va.va_id} | va_name:${va.va_name ?? '?'} | va_name_native:${va.va_name_native ?? '?'} | language:${va.language ?? 'unknown'}`, `va_image_url:${va.va_image_url ?? 'none'} | va_site_url:${va.va_site_url ?? 'none'}`, `description:${va.description ?? 'none'}`, '', '**Roles:**');
288
+ for (const role of va.roles.slice(0, 20)) {
289
+ lines.push(`- character_name:${role.character_name ?? '?'} media_title:${role.media_title ?? 'Unknown'} character_role:${role.character_role} media_format:${role.media_format ?? '?'} [AL:${role.media_id}] media_id:${role.media_id}`);
290
+ }
291
+ if (va.roles.length > 20)
292
+ lines.push(`_…and ${va.roles.length - 20} more_`);
293
+ }
294
+ }
295
+ // Render voice_actor fields when present (also catches synthetic linter samples)
296
+ if (result.mode !== 'by_voice_actor' && result.voice_actor) {
297
+ const va = result.voice_actor;
298
+ lines.push(`va_id:${va.va_id} va_name:${va.va_name ?? '?'} va_name_native:${va.va_name_native ?? '?'} language:${va.language ?? '?'} va_image_url:${va.va_image_url ?? 'none'} va_site_url:${va.va_site_url ?? 'none'} description:${va.description ?? 'none'}`);
299
+ for (const role of va.roles) {
300
+ lines.push(`role: media_id:${role.media_id} media_title:${role.media_title ?? '?'} media_format:${role.media_format ?? '?'} character_role:${role.character_role} character_name:${role.character_name ?? '?'}`);
301
+ }
302
+ }
303
+ if (result.has_next_page)
304
+ lines.push('', '_More results on next page._');
305
+ return [{ type: 'text', text: lines.filter((l) => l !== '').join('\n') }];
306
+ },
307
+ });
308
+ //# sourceMappingURL=anime-find-characters.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anime-find-characters.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/anime-find-characters.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,OAAO,MAAM,uCAAuC,CAAC;AAEjE,MAAM,qBAAqB,GAAG;IAC5B,UAAU;IACV,SAAS;IACT,QAAQ;IACR,SAAS;IACT,SAAS;IACT,YAAY;IACZ,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,WAAW;CACH,CAAC;AAEX,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,uBAAuB,EAAE;IAC/D,WAAW,EACT,8EAA8E;QAC9E,wGAAwG;QACxG,+FAA+F;IACjG,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IAExD,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,EAAE,EAAE,CAAC;aACF,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,EAAE;aACV,QAAQ,CACP,mFAAmF,CACpF;QACH,cAAc,EAAE,CAAC;aACd,MAAM,EAAE;aACR,GAAG,CAAC,GAAG,CAAC;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,iFAAiF,CAAC;QAC9F,gBAAgB,EAAE,CAAC;aAChB,MAAM,EAAE;aACR,GAAG,CAAC,GAAG,CAAC;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,yEAAyE,CAAC;QACtF,QAAQ,EAAE,CAAC;aACR,IAAI,CAAC,qBAAqB,CAAC;aAC3B,QAAQ,EAAE;aACV,QAAQ,CACP,sEAAsE;YACpE,yCAAyC,CAC5C;QACH,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,GAAG,EAAE;aACL,GAAG,CAAC,CAAC,CAAC;aACN,OAAO,CAAC,CAAC,CAAC;aACV,QAAQ,CAAC,iDAAiD,CAAC;QAC9D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,+BAA+B,CAAC;KAChG,CAAC;IAEF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,CAAC;aACJ,IAAI,CAAC,CAAC,UAAU,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;aACpD,QAAQ,CAAC,6BAA6B,CAAC;QAC1C,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,GAAG,EAAE;aACL,QAAQ,EAAE;aACV,QAAQ,CAAC,sEAAsE,CAAC;QACnF,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,sDAAsD,CAAC;QAC3F,UAAU,EAAE,CAAC;aACV,KAAK,CACJ,CAAC;aACE,MAAM,CAAC;YACN,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAChE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YACtE,qBAAqB,EAAE,CAAC;iBACrB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,wCAAwC,CAAC;YACrD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qDAAqD,CAAC;YAChF,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YACpF,kBAAkB,EAAE,CAAC;iBAClB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,sCAAsC,CAAC;YACnD,YAAY,EAAE,CAAC;iBACZ,KAAK,CACJ,CAAC;iBACE,MAAM,CAAC;gBACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;gBACxD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;gBACjE,cAAc,EAAE,CAAC;qBACd,MAAM,EAAE;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,iCAAiC,CAAC;gBAC9C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;gBAClE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;gBACtE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;aAC7E,CAAC;iBACD,QAAQ,CAAC,mCAAmC,CAAC,CACjD;iBACA,QAAQ,CAAC,qEAAqE,CAAC;SACnF,CAAC;aACD,QAAQ,CAAC,0CAA0C,CAAC,CACxD;aACA,QAAQ,CACP,0KAA0K,CAC3K;QACH,WAAW,EAAE,CAAC;aACX,MAAM,CAAC;YACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YACrD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACjE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACjF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YAC1E,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;YACxF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACtE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YAC5E,KAAK,EAAE,CAAC;iBACL,KAAK,CACJ,CAAC;iBACE,MAAM,CAAC;gBACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBACxD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;gBACrE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAC7D,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;gBAC7E,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;aAC/E,CAAC;iBACD,QAAQ,CAAC,0CAA0C,CAAC,CACxD;iBACA,QAAQ,CAAC,mCAAmC,CAAC;SACjD,CAAC;aACD,QAAQ,EAAE;aACV,QAAQ,CAAC,6EAA6E,CAAC;KAC3F,CAAC;IAEF,MAAM,EAAE;QACN;YACE,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,2CAA2C;YACjD,QAAQ,EACN,qHAAqH;SACxH;QACD;YACE,MAAM,EAAE,oBAAoB;YAC5B,IAAI,EAAE,gBAAgB,CAAC,aAAa;YACpC,IAAI,EAAE,6DAA6D;YACnE,QAAQ,EACN,sFAAsF;SACzF;KACF;IAED,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,8CAA8C;QAC9C,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAClE,MAAM,GAAG,CAAC,IAAI,CACZ,oBAAoB,EACpB,kEAAkE,CACnE,CAAC;QACJ,CAAC;QAED,sBAAsB;QACtB,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;YACb,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAElE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC;gBAC9C,OAAO,EAAE,KAAK,CAAC,EAAE;gBACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,OAAO,EAAE,KAAK,CAAC,QAAQ;aACxB,CAAC,CAAC;YAEH,OAAO;gBACL,IAAI,EAAE,UAAmB;gBACzB,QAAQ,EAAE,KAAK,CAAC,EAAE;gBAClB,aAAa,EAAE,MAAM,CAAC,WAAW;gBACjC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC3C,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;oBAC1B,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;oBACnC,qBAAqB,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;oBAC5C,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,mBAAmB,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,IAAI;oBACnD,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI;oBAC7C,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC1C,KAAK,EAAE,EAAE,CAAC,EAAE;wBACZ,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI;wBACrB,cAAc,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM;wBAC9B,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAAI,IAAI;wBAC7B,YAAY,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,IAAI,IAAI;wBACrC,WAAW,EAAE,EAAE,CAAC,OAAO,IAAI,IAAI;qBAChC,CAAC,CAAC;iBACJ,CAAC,CAAC;gBACH,WAAW,EAAE,IAAI;aAClB,CAAC;QACJ,CAAC;QAED,4BAA4B;QAC5B,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YACzB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,CAAC,CAAC;YAE5E,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAEtE,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,gCAAgC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC;YACvF,CAAC;YAED,sEAAsE;YACtE,sEAAsE;YACtE,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC1D,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtC,OAAO;oBACL,YAAY,EAAE,SAAS,CAAC,EAAE;oBAC1B,cAAc,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI;oBACnC,qBAAqB,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM;oBAC5C,IAAI,EAAE,IAAI,EAAE,aAAa,IAAI,YAAY;oBACzC,mBAAmB,EAAE,SAAS,CAAC,KAAK,EAAE,KAAK,IAAI,IAAI;oBACnD,kBAAkB,EAAE,SAAS,CAAC,OAAO,IAAI,IAAI;oBAC7C,uEAAuE;oBACvE,kDAAkD;oBAClD,YAAY,EAAE,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;wBACnD,KAAK,EAAE,EAAE,CAAC,EAAE;wBACZ,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI;wBACrB,cAAc,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM;wBAC9B,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAAI,IAAI;wBAC7B,YAAY,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,IAAI,IAAI;wBACrC,WAAW,EAAE,EAAE,CAAC,OAAO,IAAI,IAAI;qBAChC,CAAC,CAAC;iBACJ,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,2EAA2E;YAC3E,MAAM,UAAU,GACd,WAAW,CAAC,MAAM,GAAG,CAAC;gBACpB,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC;oBACE;wBACE,YAAY,EAAE,SAAS,CAAC,EAAE;wBAC1B,cAAc,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI;wBACnC,qBAAqB,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM;wBAC5C,IAAI,EAAE,YAAY;wBAClB,mBAAmB,EAAE,SAAS,CAAC,KAAK,EAAE,KAAK,IAAI,IAAI;wBACnD,kBAAkB,EAAE,SAAS,CAAC,OAAO,IAAI,IAAI;wBAC7C,YAAY,EAAE,EAAE;qBACjB;iBACF,CAAC;YAER,OAAO;gBACL,IAAI,EAAE,cAAuB;gBAC7B,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW;gBACnD,UAAU;gBACV,WAAW,EAAE,IAAI;aAClB,CAAC;QACJ,CAAC;QAED,8BAA8B;QAC9B,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAEvE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,gBAAiB,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;QAE7F,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,GAAG,CAAC,IAAI,CACZ,WAAW,EACX,wCAAwC,KAAK,CAAC,gBAAgB,GAAG,CAClE,CAAC;QACJ,CAAC;QAED,OAAO;YACL,IAAI,EAAE,gBAAyB;YAC/B,QAAQ,EAAE,IAAI;YACd,aAAa,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,WAAW;YACxD,UAAU,EAAE,EAAE;YACd,WAAW,EAAE;gBACX,KAAK,EAAE,KAAK,CAAC,EAAE;gBACf,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;gBACxB,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;gBACjC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;gBAChC,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI;gBACtC,YAAY,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,IAAI,IAAI;gBACxC,WAAW,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;gBAClC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;oBAC/C,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;oBACtB,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM;oBACnC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI;oBACtC,cAAc,EAAE,IAAI,CAAC,aAAa;oBAClC,cAAc,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;iBACxD,CAAC,CAAC;aACJ;SACF,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;QACjB,MAAM,KAAK,GAAa,CAAC,SAAS,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjD,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,QAAQ,GAAG,EAAE,EAAE,CAAC,CAAC;YAC9D,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;gBACnC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,CAAC,cAAc,IAAI,SAAS,OAAO,CAAC,CAAC,qBAAqB,IAAI,GAAG,cAAc,CAAC,CAAC,YAAY,MAAM,CAAC,CAAC,IAAI,GAAG,EAClH,YAAY,CAAC,CAAC,mBAAmB,IAAI,MAAM,YAAY,CAAC,CAAC,kBAAkB,IAAI,MAAM,EAAE,CACxF,CAAC;gBACF,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;oBAC/B,KAAK,CAAC,IAAI,CACR,SAAS,CAAC,CAAC,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,cAAc,IAAI,GAAG,MAAM,CAAC,CAAC,QAAQ,IAAI,GAAG,YAAY,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,YAAY,IAAI,MAAM,SAAS,CAAC,CAAC,WAAW,IAAI,MAAM,EAAE,CACrK,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAC1C,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBAClC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CACR,MAAM,KAAK,CAAC,cAAc,IAAI,SAAS,KAAK,KAAK,CAAC,qBAAqB,IAAI,GAAG,cAAc,KAAK,CAAC,YAAY,GAAG,EACjH,UAAU,KAAK,CAAC,mBAAmB,IAAI,MAAM,YAAY,KAAK,CAAC,kBAAkB,IAAI,MAAM,EAAE,EAC7F,EAAE,EACF,gBAAgB,MAAM,CAAC,UAAU,CAAC,MAAM,cAAc,CACvD,CAAC;YACF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;gBACtD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,CAAC;oBAC/B,KAAK,CAAC,IAAI,CACR,WAAW,CAAC,CAAC,OAAO,IAAI,GAAG,KAAK,CAAC,CAAC,cAAc,IAAI,GAAG,MAAM,CAAC,CAAC,QAAQ,IAAI,GAAG,YAAY,CAAC,CAAC,KAAK,WAAW,CAAC,CAAC,YAAY,IAAI,MAAM,SAAS,CAAC,CAAC,WAAW,IAAI,MAAM,EAAE,CACvK,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YAC5C,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;YAC9B,IAAI,EAAE,EAAE,CAAC;gBACP,KAAK,CAAC,IAAI,CACR,MAAM,EAAE,CAAC,OAAO,IAAI,SAAS,KAAK,EAAE,CAAC,cAAc,IAAI,GAAG,QAAQ,EAClE,SAAS,EAAE,CAAC,KAAK,cAAc,EAAE,CAAC,OAAO,IAAI,GAAG,qBAAqB,EAAE,CAAC,cAAc,IAAI,GAAG,eAAe,EAAE,CAAC,QAAQ,IAAI,SAAS,EAAE,EACtI,gBAAgB,EAAE,CAAC,YAAY,IAAI,MAAM,kBAAkB,EAAE,CAAC,WAAW,IAAI,MAAM,EAAE,EACrF,eAAe,EAAE,CAAC,WAAW,IAAI,MAAM,EAAE,EACzC,EAAE,EACF,YAAY,CACb,CAAC;gBACF,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;oBACzC,KAAK,CAAC,IAAI,CACR,oBAAoB,IAAI,CAAC,cAAc,IAAI,GAAG,gBAAgB,IAAI,CAAC,WAAW,IAAI,SAAS,mBAAmB,IAAI,CAAC,cAAc,iBAAiB,IAAI,CAAC,YAAY,IAAI,GAAG,QAAQ,IAAI,CAAC,QAAQ,cAAc,IAAI,CAAC,QAAQ,EAAE,CAC7N,CAAC;gBACJ,CAAC;gBACD,IAAI,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE;oBAAE,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC9E,CAAC;QACH,CAAC;QAED,iFAAiF;QACjF,IAAI,MAAM,CAAC,IAAI,KAAK,gBAAgB,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YAC3D,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;YAC9B,KAAK,CAAC,IAAI,CACR,SAAS,EAAE,CAAC,KAAK,YAAY,EAAE,CAAC,OAAO,IAAI,GAAG,mBAAmB,EAAE,CAAC,cAAc,IAAI,GAAG,aAAa,EAAE,CAAC,QAAQ,IAAI,GAAG,iBAAiB,EAAE,CAAC,YAAY,IAAI,MAAM,gBAAgB,EAAE,CAAC,WAAW,IAAI,MAAM,gBAAgB,EAAE,CAAC,WAAW,IAAI,MAAM,EAAE,CACrP,CAAC;YACF,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;gBAC5B,KAAK,CAAC,IAAI,CACR,kBAAkB,IAAI,CAAC,QAAQ,gBAAgB,IAAI,CAAC,WAAW,IAAI,GAAG,iBAAiB,IAAI,CAAC,YAAY,IAAI,GAAG,mBAAmB,IAAI,CAAC,cAAc,mBAAmB,IAAI,CAAC,cAAc,IAAI,GAAG,EAAE,CACrM,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,MAAM,CAAC,aAAa;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,8BAA8B,CAAC,CAAC;QAEzE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;CACF,CAAC,CAAC"}