@vue-skuilder/mcp 0.1.17 → 0.1.20

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.
package/dist/index.js CHANGED
@@ -606,13 +606,17 @@ async function handleSchemaResource(_courseDB, dataShapeName) {
606
606
  if (dataShape.fields) {
607
607
  for (const field of dataShape.fields) {
608
608
  const jsonType = field.type === "int" ? "integer" : "string";
609
+ let description = "";
610
+ if (field.validator) {
611
+ description += `Instructions: ${field.validator.instructions} `, description += `Placeholder: ${field.validator.placeholder}`;
612
+ } else {
613
+ description = `Field ${field.name} (${field.type})`;
614
+ }
609
615
  jsonSchema.properties[field.name] = {
610
616
  type: jsonType,
611
- description: field.description || `Field ${field.name} (${field.type})`
617
+ description
612
618
  };
613
- if (field.required) {
614
- jsonSchema.required.push(field.name);
615
- }
619
+ jsonSchema.required.push(field.name);
616
620
  }
617
621
  }
618
622
  return {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/server.ts","../src/resources/course.ts","../src/resources/cards.ts","../src/utils/pouchdb.ts","../src/utils/tools.ts","../src/resources/shapes.ts","../src/resources/tags.ts","../src/resources/schema.ts","../src/resources/index.ts","../src/types/tools.ts","../src/tools/create-card.ts","../src/tools/update-card.ts","../src/tools/tag-card.ts","../src/tools/delete-card.ts","../src/tools/index.ts","../src/prompts/fill-in-card-authoring.ts","../src/prompts/elo-scoring-guidance.ts","../src/prompts/index.ts"],"sourcesContent":["export { MCPServer } from './server.js';\nexport type { MCPServerOptions } from './server.js';\n\n// Types\nexport * from './types/index.js';\n\n// Resources\nexport * from './resources/index.js';\n\n// Tools\nexport * from './tools/index.js';","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport type { CourseDBInterface } from '@vue-skuilder/db';\nimport type { SkLogger } from '@vue-skuilder/common';\nimport {\n handleCourseConfigResource,\n handleCardsAllResource,\n handleCardsTagResource,\n handleCardsShapeResource,\n handleCardsEloResource,\n handleShapesAllResource,\n handleShapeSpecificResource,\n handleTagsAllResource,\n handleTagsStatsResource,\n handleTagSpecificResource,\n handleTagsUnionResource,\n handleTagsIntersectResource,\n handleTagsExclusiveResource,\n handleTagsDistributionResource,\n handleSchemaResource,\n RESOURCE_PATTERNS,\n} from './resources/index.js';\nimport {\n handleCreateCard,\n handleUpdateCard,\n handleTagCard,\n handleDeleteCard,\n TOOL_PATTERNS,\n} from './tools/index.js';\nimport {\n type CreateCardInput,\n type UpdateCardInput,\n type TagCardInput,\n type DeleteCardInput,\n CreateCardInputMCPSchema,\n UpdateCardInputMCPSchema,\n TagCardInputMCPSchema,\n DeleteCardInputMCPSchema,\n} from './types/tools.js';\nimport {\n createFillInCardAuthoringPrompt,\n createEloScoringGuidancePrompt,\n PROMPT_PATTERNS,\n} from './prompts/index.js';\n\nexport interface MCPServerOptions {\n enableSourceLinking?: boolean;\n maxCardsPerQuery?: number;\n allowedDataShapes?: string[];\n eloCalibrationMode?: 'strict' | 'adaptive' | 'manual';\n logger?: SkLogger;\n}\n\nexport class MCPServer {\n private mcpServer: McpServer;\n private transport?: Transport;\n private logger: SkLogger;\n\n constructor(\n private courseDB: CourseDBInterface,\n private readonly options: MCPServerOptions = {}\n ) {\n // Use provided logger or no-op logger as default\n this.logger = options.logger || { debug: () => {}, info: () => {}, warn: () => {}, error: () => {} };\n this.mcpServer = new McpServer({\n name: 'vue-skuilder-mcp',\n version: '0.1.0',\n });\n\n this.setupCapabilities();\n }\n\n private setupCapabilities(): void {\n // Register course://config resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.COURSE_CONFIG,\n RESOURCE_PATTERNS.COURSE_CONFIG,\n {\n title: 'Course Configuration',\n description: 'Course configuration with metadata and ELO statistics',\n mimeType: 'application/json',\n },\n async (uri) => {\n this.logger.debug('MCP Server: Accessing course config resource');\n try {\n const result = await handleCourseConfigResource(this.courseDB);\n this.logger.info(`MCP Server: Course config accessed - ${result.config.name}`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n } catch (error) {\n this.logger.error('MCP Server: Failed to access course config', error);\n throw error;\n }\n }\n );\n\n // Register cards://all resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.CARDS_ALL,\n RESOURCE_PATTERNS.CARDS_ALL,\n {\n title: 'All Course Cards',\n description: 'List all cards in the course with pagination support',\n mimeType: 'application/json',\n },\n async (uri) => {\n const url = new URL(uri.href);\n const limit = parseInt(url.searchParams.get('limit') || '50', 10);\n const offset = parseInt(url.searchParams.get('offset') || '0', 10);\n\n this.logger.debug(`MCP Server: Fetching cards, limit=${limit}, offset=${offset}`);\n const result = await handleCardsAllResource(this.courseDB, limit, offset);\n this.logger.info(`MCP Server: Retrieved ${result.cards.length} cards`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register cards://tag/{tagName} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.CARDS_TAG,\n new ResourceTemplate('cards://tag/{tagName}', { list: undefined }),\n {\n title: 'Cards by Tag',\n description: 'Filter cards by tag name with pagination support',\n mimeType: 'application/json',\n },\n async (uri, { tagName }) => {\n const url = new URL(uri.href);\n const limit = parseInt(url.searchParams.get('limit') || '50', 10);\n const offset = parseInt(url.searchParams.get('offset') || '0', 10);\n\n this.logger.debug(`MCP Server: Fetching cards by tag '${tagName}', limit=${limit}, offset=${offset}`);\n const result = await handleCardsTagResource(\n this.courseDB,\n tagName as string,\n limit,\n offset\n );\n this.logger.info(`MCP Server: Retrieved ${result.cards.length} cards for tag '${tagName}'`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register cards://shape/{shapeName} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.CARDS_SHAPE,\n new ResourceTemplate('cards://shape/{shapeName}', { list: undefined }),\n {\n title: 'Cards by DataShape',\n description: 'Filter cards by DataShape with pagination support',\n mimeType: 'application/json',\n },\n async (uri, { shapeName }) => {\n const url = new URL(uri.href);\n const limit = parseInt(url.searchParams.get('limit') || '50', 10);\n const offset = parseInt(url.searchParams.get('offset') || '0', 10);\n\n this.logger.debug(`MCP Server: Fetching cards by shape '${shapeName}', limit=${limit}, offset=${offset}`);\n const result = await handleCardsShapeResource(\n this.courseDB,\n shapeName as string,\n limit,\n offset\n );\n this.logger.info(`MCP Server: Retrieved ${result.cards.length} cards for shape '${shapeName}'`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register cards://elo/{eloRange} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.CARDS_ELO,\n new ResourceTemplate('cards://elo/{eloRange}', { list: undefined }),\n {\n title: 'Cards by ELO Range',\n description: 'Filter cards by ELO range (format: min-max, e.g., 1200-1800)',\n mimeType: 'application/json',\n },\n async (uri, { eloRange }) => {\n const url = new URL(uri.href);\n const limit = parseInt(url.searchParams.get('limit') || '50', 10);\n const offset = parseInt(url.searchParams.get('offset') || '0', 10);\n\n this.logger.debug(`MCP Server: Fetching cards by ELO range '${eloRange}', limit=${limit}, offset=${offset}`);\n const result = await handleCardsEloResource(\n this.courseDB,\n eloRange as string,\n limit,\n offset\n );\n this.logger.info(`MCP Server: Retrieved ${result.cards.length} cards for ELO range '${eloRange}'`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register shapes://all resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.SHAPES_ALL,\n RESOURCE_PATTERNS.SHAPES_ALL,\n {\n title: 'All DataShapes',\n description: 'List all available DataShapes in the course',\n mimeType: 'application/json',\n },\n async (uri) => {\n this.logger.debug('MCP Server: Fetching all shapes');\n const result = await handleShapesAllResource(this.courseDB);\n this.logger.info(`MCP Server: Retrieved ${result.shapes.length} shapes`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register shapes://{shapeName} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.SHAPES_SPECIFIC,\n new ResourceTemplate('shapes://{shapeName}', { list: undefined }),\n {\n title: 'Specific DataShape',\n description: 'Get detailed information about a specific DataShape',\n mimeType: 'application/json',\n },\n async (uri, { shapeName }) => {\n this.logger.debug(`MCP Server: Fetching shape '${shapeName}'`);\n const result = await handleShapeSpecificResource(this.courseDB, shapeName as string);\n this.logger.info(`MCP Server: Retrieved shape '${shapeName}'`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register tags://all resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.TAGS_ALL,\n RESOURCE_PATTERNS.TAGS_ALL,\n {\n title: 'All Tags',\n description: 'List all available tags in the course',\n mimeType: 'application/json',\n },\n async (uri) => {\n this.logger.debug('MCP Server: Fetching all tags');\n const result = await handleTagsAllResource(this.courseDB);\n this.logger.info(`MCP Server: Retrieved ${result.tags.length} tags`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register tags://stats resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.TAGS_STATS,\n RESOURCE_PATTERNS.TAGS_STATS,\n {\n title: 'Tag Statistics',\n description: 'Get usage statistics for tags in the course',\n mimeType: 'application/json',\n },\n async (uri) => {\n this.logger.debug('MCP Server: Fetching tag statistics');\n const result = await handleTagsStatsResource(this.courseDB);\n this.logger.info('MCP Server: Retrieved tag statistics');\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register tags://{tagName} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.TAGS_SPECIFIC,\n new ResourceTemplate('tags://{tagName}', { list: undefined }),\n {\n title: 'Specific Tag',\n description: 'Get detailed information about a specific tag',\n mimeType: 'application/json',\n },\n async (uri, { tagName }) => {\n this.logger.debug(`MCP Server: Fetching tag '${tagName}'`);\n const result = await handleTagSpecificResource(this.courseDB, tagName as string);\n this.logger.info(`MCP Server: Retrieved tag '${tagName}' with ${result.cardCount} cards`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register tags://union/{tags} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.TAGS_UNION,\n new ResourceTemplate('tags://union/{tags}', { list: undefined }),\n {\n title: 'Tags Union',\n description: 'Find cards with ANY of the specified tags (format: tag1+tag2)',\n mimeType: 'application/json',\n },\n async (uri, { tags }) => {\n this.logger.debug(`MCP Server: Fetching union of tags '${tags}'`);\n const result = await handleTagsUnionResource(this.courseDB, tags as string);\n this.logger.info(`MCP Server: Retrieved ${result.cardIds.length} cards for tag union '${tags}'`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register tags://intersect/{tags} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.TAGS_INTERSECT,\n new ResourceTemplate('tags://intersect/{tags}', { list: undefined }),\n {\n title: 'Tags Intersect',\n description: 'Find cards with ALL of the specified tags (format: tag1+tag2)',\n mimeType: 'application/json',\n },\n async (uri, { tags }) => {\n this.logger.debug(`MCP Server: Fetching intersection of tags '${tags}'`);\n const result = await handleTagsIntersectResource(this.courseDB, tags as string);\n this.logger.info(`MCP Server: Retrieved ${result.cardIds.length} cards for tag intersection '${tags}'`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register tags://exclusive/{tags} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.TAGS_EXCLUSIVE,\n new ResourceTemplate('tags://exclusive/{tags}', { list: undefined }),\n {\n title: 'Tags Exclusive',\n description: 'Find cards with first tag but NOT second tag (format: tag1-tag2)',\n mimeType: 'application/json',\n },\n async (uri, { tags }) => {\n this.logger.debug(`MCP Server: Fetching exclusive tags '${tags}'`);\n const result = await handleTagsExclusiveResource(this.courseDB, tags as string);\n this.logger.info(`MCP Server: Retrieved ${result.cardIds.length} cards for tag exclusion '${tags}'`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register tags://distribution resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.TAGS_DISTRIBUTION,\n RESOURCE_PATTERNS.TAGS_DISTRIBUTION,\n {\n title: 'Tag Distribution',\n description: 'Get frequency distribution of all tags in the course',\n mimeType: 'application/json',\n },\n async (uri) => {\n this.logger.debug('MCP Server: Fetching tag distribution');\n const result = await handleTagsDistributionResource(this.courseDB);\n this.logger.info(`MCP Server: Retrieved tag distribution with ${result.distribution.length} entries`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register schema://{dataShapeName} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.SCHEMA_SPECIFIC,\n new ResourceTemplate('schema://{dataShapeName}', { list: undefined }),\n {\n title: 'DataShape Schema',\n description: 'Get JSON Schema for a specific DataShape to validate card data',\n mimeType: 'application/json',\n },\n async (uri, { dataShapeName }) => {\n this.logger.debug(`MCP Server: Fetching schema for '${dataShapeName}'`);\n const result = await handleSchemaResource(this.courseDB, dataShapeName as string);\n if (result.available) {\n this.logger.info(`MCP Server: Retrieved schema for '${dataShapeName}'`);\n } else {\n this.logger.warn(`MCP Server: Schema not available for '${dataShapeName}'`);\n }\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register create_card tool\n this.mcpServer.registerTool(\n TOOL_PATTERNS.CREATE_CARD,\n {\n title: 'Create Card',\n description: 'Create a new course card with specified datashape and content',\n inputSchema: CreateCardInputMCPSchema as any,\n },\n // @ts-ignore - MCP SDK type incompatibility with Zod v4\n async (input) => {\n const createInput = input as CreateCardInput;\n this.logger.info(`MCP Server: Creating card with datashape '${createInput.datashape}'`);\n const result = await handleCreateCard(this.courseDB, createInput);\n this.logger.info(`MCP Server: Created card ${result.cardId}`);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Register update_card tool\n this.mcpServer.registerTool(\n TOOL_PATTERNS.UPDATE_CARD,\n {\n title: 'Update Card',\n description: 'Update an existing course card (data, tags, ELO, sourceRef)',\n inputSchema: UpdateCardInputMCPSchema as any,\n },\n // @ts-ignore - MCP SDK type incompatibility with Zod v4\n async (input) => {\n const updateInput = input as UpdateCardInput;\n this.logger.info(`MCP Server: Updating card ${updateInput.cardId}`);\n const result = await handleUpdateCard(this.courseDB, updateInput);\n this.logger.info(`MCP Server: Updated card ${updateInput.cardId}`);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Register tag_card tool\n this.mcpServer.registerTool(\n TOOL_PATTERNS.TAG_CARD,\n {\n title: 'Tag Card',\n description: 'Add or remove tags from a course card with optional ELO update',\n inputSchema: TagCardInputMCPSchema as any,\n },\n // @ts-ignore - MCP SDK type incompatibility with Zod v4\n async (input) => {\n const tagInput = input as TagCardInput;\n this.logger.info(`MCP Server: ${tagInput.action === 'add' ? 'Adding' : 'Removing'} tags [${tagInput.tags.join(', ')}] ${tagInput.action === 'add' ? 'to' : 'from'} card ${tagInput.cardId}`);\n const result = await handleTagCard(this.courseDB, tagInput);\n this.logger.info(`MCP Server: Tag operation completed for card ${tagInput.cardId}`);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Register delete_card tool\n this.mcpServer.registerTool(\n TOOL_PATTERNS.DELETE_CARD,\n {\n title: 'Delete Card',\n description: 'Safely delete a course card with confirmation requirement',\n inputSchema: DeleteCardInputMCPSchema as any,\n },\n // @ts-ignore - MCP SDK type incompatibility with Zod v4\n async (input) => {\n const deleteInput = input as DeleteCardInput;\n this.logger.warn(`MCP Server: Deleting card ${deleteInput.cardId}${deleteInput.reason ? ` (reason: ${deleteInput.reason})` : ''}`);\n const result = await handleDeleteCard(this.courseDB, deleteInput);\n this.logger.info(`MCP Server: Card ${deleteInput.cardId} deletion completed`);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Register fill-in-card-authoring prompt\n this.mcpServer.registerPrompt(\n PROMPT_PATTERNS.FILL_IN_CARD_AUTHORING,\n {\n title: 'Author Fill-In Card',\n description:\n 'Generate a fill-in-the-blank or multiple-choice card using Vue-Skuilder syntax.',\n argsSchema: {},\n },\n () => ({\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: createFillInCardAuthoringPrompt(),\n },\n },\n ],\n })\n );\n\n // Register elo-scoring-guidance prompt\n this.mcpServer.registerPrompt(\n PROMPT_PATTERNS.ELO_SCORING_GUIDANCE,\n {\n title: 'ELO Scoring Guidance',\n description: 'Guidance for assigning ELO difficulty ratings to flashcard content.',\n argsSchema: {},\n },\n () => ({\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: createEloScoringGuidancePrompt(),\n },\n },\n ],\n })\n );\n\n // Use options to configure server capabilities\n if (this.options.enableSourceLinking) {\n // Will configure source linking when implemented\n }\n\n // Configuration ready for Phase 2 implementation\n }\n\n async start(transport: Transport): Promise<void> {\n this.transport = transport;\n this.logger.info('MCP Server: Starting connection...');\n try {\n await this.mcpServer.connect(transport);\n this.logger.info('MCP Server: Connected successfully');\n } catch (error) {\n this.logger.error('MCP Server: Failed to start connection', error);\n throw error;\n }\n }\n\n async stop(): Promise<void> {\n this.logger.info('MCP Server: Stopping connection...');\n try {\n if (this.transport) {\n await this.transport.close();\n }\n await this.mcpServer.close();\n this.logger.info('MCP Server: Stopped successfully');\n } catch (error) {\n this.logger.error('MCP Server: Error during shutdown', error);\n throw error;\n }\n }\n\n // Getter for accessing the underlying MCP server (for testing)\n get server(): McpServer {\n return this.mcpServer;\n }\n\n // Getter for accessing the course database\n get courseDatabase(): CourseDBInterface {\n return this.courseDB;\n }\n}\n","import { z } from 'zod';\nimport type { CourseDBInterface } from '@vue-skuilder/db';\nimport type { CourseResource } from '../types/resources.js';\n\nexport async function handleCourseConfigResource(\n courseDB: CourseDBInterface\n): Promise<CourseResource> {\n try {\n // Get course configuration\n const config = await courseDB.getCourseConfig();\n \n // TODO: Implement proper ELO distribution calculation\n // For now, provide basic structure\n const eloStats = {\n min: 1000,\n max: 2000,\n mean: 1500,\n distribution: [100, 200, 300, 250, 150] // Placeholder histogram\n };\n\n return {\n config,\n eloStats\n };\n } catch (error) {\n throw new Error(`Failed to load course config: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n// URI pattern validation\nexport const CourseConfigUriSchema = z.string().regex(/^course:\\/\\/config$/);\nexport type CourseConfigUri = z.infer<typeof CourseConfigUriSchema>;","import type { CourseDBInterface } from '@vue-skuilder/db';\nimport { z } from 'zod';\nimport { isSuccessRow } from '../utils/index.js';\n\n// Types for card resources\nexport interface CardResourceData {\n cardId: string;\n datashape: string;\n data: any;\n tags: string[];\n elo?: number;\n created?: string;\n modified?: string;\n}\n\nexport interface CardsCollection {\n cards: CardResourceData[];\n total: number;\n page?: number;\n limit?: number;\n filter?: string;\n}\n\n// Schema for ELO range parsing\nconst EloRangeSchema = z.object({\n min: z.number().min(0).max(5000),\n max: z.number().min(0).max(5000)\n}).refine(data => data.min <= data.max, {\n message: \"Min ELO must be less than or equal to max ELO\"\n});\n\n/**\n * Handle cards://all resource - List all cards in the course\n */\nexport async function handleCardsAllResource(\n courseDB: CourseDBInterface,\n limit: number = 50,\n offset: number = 0\n): Promise<CardsCollection> {\n try {\n // Get course info for total count\n const courseInfo = await courseDB.getCourseInfo();\n \n // Get cards using ELO-based query (this gives us all cards sorted by ELO)\n const eloCenteredCards = await courseDB.getCardsByELO(1500, limit + offset);\n \n // Skip offset cards and take limit\n const targetCards = eloCenteredCards.slice(offset, offset + limit);\n \n if (targetCards.length === 0) {\n return {\n cards: [],\n total: courseInfo.cardCount,\n page: Math.floor(offset / limit) + 1,\n limit,\n filter: 'all'\n };\n }\n\n // Get card documents\n const cardDocs = await courseDB.getCourseDocs(targetCards.map(card => card.cardID));\n \n // Get ELO data for these cards \n const eloData = await courseDB.getCardEloData(targetCards.map(card => card.cardID));\n const eloMap = new Map(eloData.map((elo, index) => [targetCards[index], elo.global?.score || 1500]));\n\n // Transform to CardResourceData format\n const cards: CardResourceData[] = [];\n for (const row of cardDocs.rows) {\n if (isSuccessRow(row)) {\n const doc = row.doc;\n cards.push({\n cardId: doc._id,\n datashape: (doc as any).shape?.name || 'unknown',\n data: (doc as any).data || {},\n tags: [], // Will be populated separately if needed\n elo: eloMap.get(doc._id),\n created: (doc as any).created,\n modified: (doc as any).modified\n });\n }\n }\n\n return {\n cards,\n total: courseInfo.cardCount,\n page: Math.floor(offset / limit) + 1,\n limit,\n filter: 'all'\n };\n\n } catch (error) {\n console.error('Error fetching all cards:', error);\n throw new Error(`Failed to fetch cards: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle cards://tag/[tagName] resource - Filter cards by tag\n */\nexport async function handleCardsTagResource(\n courseDB: CourseDBInterface,\n tagName: string,\n limit: number = 50,\n offset: number = 0\n): Promise<CardsCollection> {\n try {\n // Get the tag to validate it exists\n const tag = await courseDB.getTag(tagName);\n if (!tag) {\n throw new Error(`Tag not found: ${tagName}`);\n }\n\n // Note: The current CourseDBInterface doesn't have a direct method to get cards by tag\n // We would need to implement this by querying the tag associations\n // For now, we'll return a placeholder that explains this limitation\n \n return {\n cards: [],\n total: 0,\n page: Math.floor(offset / limit) + 1,\n limit,\n filter: `tag:${tagName}`,\n };\n\n } catch (error) {\n console.error(`Error fetching cards for tag ${tagName}:`, error);\n throw new Error(`Failed to fetch cards for tag ${tagName}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle cards://shape/[shapeName] resource - Filter cards by DataShape\n */\nexport async function handleCardsShapeResource(\n courseDB: CourseDBInterface,\n shapeName: string,\n limit: number = 50,\n offset: number = 0\n): Promise<CardsCollection> {\n try {\n // Validate shape exists in course config\n const courseConfig = await courseDB.getCourseConfig();\n const validShapes = courseConfig.dataShapes.map(ds => ds.name);\n \n if (!validShapes.includes(shapeName)) {\n throw new Error(`DataShape not found: ${shapeName}. Available: ${validShapes.join(', ')}`);\n }\n\n // Note: Direct filtering by DataShape would require a more sophisticated query\n // For now, we'll get all cards and filter in memory (not optimal for large datasets)\n const allCardIds = await courseDB.getCardsByELO(1500, 1000); // Get more cards to filter from\n \n if (allCardIds.length === 0) {\n return {\n cards: [],\n total: 0,\n page: Math.floor(offset / limit) + 1,\n limit,\n filter: `shape:${shapeName}`\n };\n }\n\n // Get card documents to check their shapes\n const cardDocs = await courseDB.getCourseDocs(allCardIds.map(c => c.cardID));\n \n // Filter by shape and collect card IDs\n const filteredCardIds: string[] = [];\n const allFilteredRows: any[] = [];\n \n for (const row of cardDocs.rows) {\n if (isSuccessRow(row) && (row.doc as any).shape?.name === shapeName) {\n allFilteredRows.push(row);\n filteredCardIds.push(row.doc._id);\n }\n }\n \n // Apply pagination to filtered results\n const paginatedRows = allFilteredRows.slice(offset, offset + limit);\n const paginatedCardIds = paginatedRows.map(row => row.doc._id);\n\n // Get ELO data for paginated cards\n const eloData = await courseDB.getCardEloData(paginatedCardIds);\n const eloMap = new Map(eloData.map((elo, index) => [paginatedCardIds[index], elo.global?.score || 1500]));\n\n // Transform to CardResourceData format\n const cards: CardResourceData[] = [];\n for (const row of paginatedRows) {\n if (isSuccessRow(row)) {\n const doc = row.doc;\n cards.push({\n cardId: doc._id,\n datashape: (doc as any).shape?.name || 'unknown',\n data: (doc as any).data || {},\n tags: [],\n elo: eloMap.get(doc._id),\n created: (doc as any).created,\n modified: (doc as any).modified\n });\n }\n }\n\n // Count total filtered cards\n const totalFiltered = filteredCardIds.length;\n\n return {\n cards,\n total: totalFiltered,\n page: Math.floor(offset / limit) + 1,\n limit,\n filter: `shape:${shapeName}`\n };\n\n } catch (error) {\n console.error(`Error fetching cards for shape ${shapeName}:`, error);\n throw new Error(`Failed to fetch cards for shape ${shapeName}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle cards://elo/[min]-[max] resource - Filter cards by ELO range\n */\nexport async function handleCardsEloResource(\n courseDB: CourseDBInterface,\n eloRange: string,\n limit: number = 50,\n offset: number = 0\n): Promise<CardsCollection> {\n try {\n // Parse ELO range (format: \"1200-1800\")\n const [minStr, maxStr] = eloRange.split('-');\n if (!minStr || !maxStr) {\n throw new Error(`Invalid ELO range format: ${eloRange}. Expected format: min-max (e.g., 1200-1800)`);\n }\n\n const parsedRange = EloRangeSchema.parse({\n min: parseInt(minStr, 10),\n max: parseInt(maxStr, 10)\n });\n\n // Get cards around the middle of the ELO range\n const targetElo = Math.floor((parsedRange.min + parsedRange.max) / 2);\n const cards = await courseDB.getCardsByELO(targetElo, 1000); // Get more to filter from\n \n if (cards.length === 0) {\n return {\n cards: [],\n total: 0,\n page: Math.floor(offset / limit) + 1,\n limit,\n filter: `elo:${eloRange}`\n };\n }\n\n // Get ELO data for all cards\n const eloData = await courseDB.getCardEloData(cards.map(c => c.cardID));\n \n // Filter by ELO range\n const filteredEloData = eloData\n .map((elo, index) => ({ elo, cardId: cards[index] }))\n .filter(({ elo }) => {\n const score = elo.global?.score || 1500;\n return score >= parsedRange.min && score <= parsedRange.max;\n });\n\n // Apply pagination\n const paginatedEloData = filteredEloData.slice(offset, offset + limit);\n const paginatedCards = paginatedEloData.map(({ cardId }) => cardId);\n\n if (paginatedCards.length === 0) {\n return {\n cards: [],\n total: filteredEloData.length,\n page: Math.floor(offset / limit) + 1,\n limit,\n filter: `elo:${eloRange}`\n };\n }\n\n // Get card documents\n const cardDocs = await courseDB.getCourseDocs(paginatedCards.map(c => c.cardID));\n const eloMap = new Map(paginatedEloData.map(({ elo, cardId }) => [cardId, elo.global?.score || 1500]));\n\n // Transform to CardResourceData format\n const cardsData: CardResourceData[] = [];\n for (const row of cardDocs.rows) {\n if (isSuccessRow(row)) {\n const doc = row.doc;\n cardsData.push({\n cardId: doc._id,\n datashape: (doc as any).shape?.name || 'unknown',\n data: (doc as any).data || {},\n tags: [],\n elo: eloMap.get(doc._id),\n created: (doc as any).created,\n modified: (doc as any).modified\n });\n }\n }\n\n return {\n cards: cardsData,\n total: filteredEloData.length,\n page: Math.floor(offset / limit) + 1,\n limit,\n filter: `elo:${eloRange}`\n };\n\n } catch (error) {\n console.error(`Error fetching cards for ELO range ${eloRange}:`, error);\n throw new Error(`Failed to fetch cards for ELO range ${eloRange}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}","/**\n * Type guard for successful PouchDB rows\n * Filters out error rows and ensures doc property exists\n */\nexport function isSuccessRow<T = any>(row: any): row is { doc: NonNullable<T>; id: string; key: string; value: any } {\n return row.doc != null && !('error' in row);\n}\n\n/**\n * Safely extracts documents from PouchDB AllDocsResponse\n * Returns only successful rows with valid documents\n */\nexport function extractSuccessfulDocs<T>(rows: any[]): T[] {\n const docs: T[] = [];\n for (const row of rows) {\n if (isSuccessRow(row)) {\n docs.push(row.doc);\n }\n }\n return docs;\n}\n\n/**\n * Safely filters and maps PouchDB rows with type safety\n */\nexport function filterAndMapDocs<T, R>(\n rows: any[],\n filterFn: (doc: T) => boolean,\n mapFn: (doc: T) => R\n): R[] {\n const results: R[] = [];\n for (const row of rows) {\n if (isSuccessRow(row)) {\n const doc = row.doc as T;\n if (filterFn(doc)) {\n results.push(mapFn(doc));\n }\n }\n }\n return results;\n}","import { z } from 'zod';\n\n// Shared constants\nexport const MCP_AGENT_AUTHOR = 'mcp-agent';\n\n// Common error handling utility\nexport function handleToolError(error: unknown, context: string): never {\n if (error instanceof z.ZodError) {\n throw new Error(`Invalid input: ${error.errors.map(e => e.message).join(', ')}`);\n }\n \n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error(`Error in ${context}:`, error);\n throw new Error(`${context} failed: ${message}`);\n}\n\n// Logging utilities\nexport function logToolStart(toolName: string, input: any): void {\n console.log(`[${toolName}] Starting with input:`, JSON.stringify(input, null, 2));\n}\n\nexport function logToolSuccess(toolName: string, result: any): void {\n console.log(`[${toolName}] Completed successfully:`, JSON.stringify(result, null, 2));\n}\n\nexport function logToolWarning(toolName: string, message: string, details?: any): void {\n console.warn(`[${toolName}] Warning: ${message}`, details || '');\n}\n\nexport function logToolError(toolName: string, message: string, error?: any): void {\n console.error(`[${toolName}] Error: ${message}`, error || '');\n}","import type { CourseDBInterface } from '@vue-skuilder/db';\nimport { isSuccessRow } from '../utils/index.js';\n\nexport interface ShapeResource {\n name: string;\n description?: string;\n schema: any; // The serialized Zod schema as JSON - this is what create_card validates against\n category?: string;\n examples?: any[];\n}\n\nexport interface ShapesCollection {\n shapes: ShapeResource[];\n total: number;\n availableShapes: string[];\n}\n\n/**\n * Handle shapes://all resource - List all available DataShapes for this course\n */\nexport async function handleShapesAllResource(\n courseDB: CourseDBInterface\n): Promise<ShapesCollection> {\n try {\n // Get course-specific DataShapes from the course configuration\n const config = await courseDB.getCourseConfig();\n const dataShapes = config.dataShapes || [];\n\n // Transform DataShapes to ShapeResource format\n const shapes: ShapeResource[] = dataShapes.map((shape) => {\n // Parse the serialized Zod schema if available\n let schema: any = null;\n if (shape.serializedZodSchema) {\n try {\n schema = JSON.parse(shape.serializedZodSchema);\n } catch (error) {\n console.warn(`Failed to parse schema for ${shape.name}:`, error);\n schema = { error: 'Failed to parse schema' };\n }\n }\n\n return {\n name: shape.name,\n description: `DataShape for ${shape.name} content type`,\n schema, // Return the actual JSON schema that create_card validates against\n category: 'course-content',\n examples: [], // Could be populated with example cards\n };\n });\n\n const availableShapes = dataShapes.map((shape) => shape.name);\n\n return {\n shapes,\n total: shapes.length,\n availableShapes,\n };\n } catch (error) {\n console.error('Error fetching all shapes:', error);\n throw new Error(\n `Failed to fetch shapes: ${error instanceof Error ? error.message : `Unknown error: ${JSON.stringify(error)}`}`\n );\n }\n}\n\n/**\n * Handle shapes://[shapeName] resource - Get specific DataShape definition for this course\n */\nexport async function handleShapeSpecificResource(\n courseDB: CourseDBInterface,\n shapeName: string\n): Promise<ShapeResource> {\n try {\n // Get course-specific DataShapes from the course configuration\n const config = await courseDB.getCourseConfig();\n const dataShapes = config.dataShapes || [];\n\n // Find the specific shape\n const targetShape = dataShapes.find((shape) => shape.name === shapeName);\n if (!targetShape) {\n const availableShapes = dataShapes.map((s) => s.name);\n throw new Error(\n `DataShape not found: ${shapeName}. Available shapes: ${availableShapes.join(', ')}`\n );\n }\n\n // Parse the serialized Zod schema\n let schema: any = null;\n if (targetShape.serializedZodSchema) {\n try {\n schema = JSON.parse(targetShape.serializedZodSchema);\n } catch (error) {\n console.warn(`Failed to parse schema for ${shapeName}:`, error);\n schema = { error: 'Failed to parse schema' };\n }\n }\n\n // Get examples by finding cards that use this shape\n let examples: any[] = [];\n try {\n // Get a few cards that use this shape to provide examples\n const cards = await courseDB.getCardsByELO(1500, 10); // Get some sample cards\n if (cards.length > 0) {\n const cardDocs = await courseDB.getCourseDocs(cards.map(c=>c.cardID).slice(0, 5)); // Limit to 5 examples\n examples = [];\n for (const row of cardDocs.rows) {\n if (isSuccessRow(row) && (row.doc as any).shape?.name === shapeName) {\n const data = (row.doc as any)?.data;\n if (data) {\n examples.push(data);\n if (examples.length >= 3) break; // Max 3 examples\n }\n }\n }\n }\n } catch (error) {\n console.warn('Could not fetch examples for shape:', error);\n // Continue without examples\n }\n\n return {\n name: targetShape.name,\n description: `DataShape definition for ${targetShape.name} content type`,\n schema, // Return the actual JSON schema that create_card validates against\n category: 'course-content',\n examples,\n };\n } catch (error) {\n console.error(`Error fetching shape ${shapeName}:`, error);\n throw new Error(\n `Failed to fetch shape ${shapeName}: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n","import type { CourseDBInterface } from '@vue-skuilder/db';\n\nexport interface TagResource {\n name: string;\n description?: string;\n cardCount: number;\n cardIds: string[];\n created?: string;\n author?: string;\n metadata?: any;\n}\n\nexport interface TagsCollection {\n tags: TagResource[];\n total: number;\n stats?: {\n totalTags: number;\n totalTaggedCards: number;\n averageTagsPerCard: number;\n mostUsedTags: { name: string; count: number }[];\n };\n}\n\nexport interface TagDistribution {\n tagName: string;\n frequency: number;\n percentage: number;\n cardIds: string[];\n}\n\n/**\n * Handle tags://all resource - List all available tags\n */\nexport async function handleTagsAllResource(\n courseDB: CourseDBInterface\n): Promise<TagsCollection> {\n try {\n // Get all tag stubs for the course\n const tagStubsResponse = await courseDB.getCourseTagStubs();\n const tagStubs = tagStubsResponse.rows || [];\n\n // Transform to TagResource format\n const tags: TagResource[] = [];\n for (const stub of tagStubs) {\n if (stub.doc) {\n tags.push({\n name: (stub.doc as any).name || stub.id,\n description: (stub.doc as any).snippet || `Tag: ${(stub.doc as any).name}`,\n cardCount: (stub.doc as any).taggedCards?.length || 0,\n cardIds: [], // stub does not contain cardIDs\n created: (stub.doc as any).created,\n author: (stub.doc as any).author,\n metadata: (stub.doc as any).metadata\n });\n }\n }\n\n return {\n tags,\n total: tags.length,\n stats: {\n totalTags: tags.length,\n totalTaggedCards: 0, // Would need additional queries\n averageTagsPerCard: 0, // Would need calculation\n mostUsedTags: [] // Would need tag usage analysis\n }\n };\n\n } catch (error) {\n console.error('Error fetching all tags:', error);\n throw new Error(`Failed to fetch tags: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle tags://stats resource - Tag usage statistics\n */\nexport async function handleTagsStatsResource(\n courseDB: CourseDBInterface\n): Promise<TagsCollection['stats']> {\n try {\n // Get all tags\n const tagStubsResponse = await courseDB.getCourseTagStubs();\n const totalTags = tagStubsResponse.rows?.length || 0;\n\n // Get course info for context \n const courseInfo = await courseDB.getCourseInfo();\n console.log('Course info loaded for stats:', courseInfo.cardCount);\n\n // Note: Comprehensive tag statistics would require additional methods\n // in CourseDBInterface to efficiently query tag-card associations\n return {\n totalTags,\n totalTaggedCards: 0, // Placeholder\n averageTagsPerCard: 0, // Placeholder\n mostUsedTags: [] // Placeholder\n };\n\n } catch (error) {\n console.error('Error fetching tag stats:', error);\n throw new Error(`Failed to fetch tag statistics: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle tags://[tagName] resource - Specific tag details + card count\n */\nexport async function handleTagSpecificResource(\n courseDB: CourseDBInterface,\n tagName: string\n): Promise<TagResource> {\n try {\n // Get the specific tag\n const tag = await courseDB.getTag(tagName);\n if (!tag) {\n throw new Error(`Tag not found: ${tagName}`);\n }\n\n return {\n name: (tag as any).name || tagName,\n description: (tag as any).snippet || `Tag: ${tagName}`,\n cardCount: (tag as any).taggedCards?.length || 0,\n cardIds: (tag as any).taggedCards || [],\n created: (tag as any).created,\n author: (tag as any).author,\n metadata: (tag as any).metadata\n };\n\n } catch (error) {\n console.error(`Error fetching tag ${tagName}:`, error);\n throw new Error(`Failed to fetch tag ${tagName}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle tags://union/[tag1]+[tag2] resource - Cards with ANY of these tags\n */\nexport async function handleTagsUnionResource(\n courseDB: CourseDBInterface,\n tagsParam: string\n): Promise<{ cardIds: string[]; tags: string[]; operation: 'union' }> {\n try {\n const tags = tagsParam.split('+').map(tag => tag.trim());\n \n if (tags.length === 0) {\n throw new Error('No tags specified for union operation');\n }\n\n // Validate all tags exist\n for (const tagName of tags) {\n try {\n await courseDB.getTag(tagName);\n } catch {\n throw new Error(`Tag not found: ${tagName}`);\n }\n }\n\n // Note: Union operation would require specialized queries\n // Current CourseDBInterface doesn't provide tag-based card filtering\n return {\n cardIds: [], // Placeholder\n tags,\n operation: 'union'\n };\n\n } catch (error) {\n console.error(`Error performing tags union for ${tagsParam}:`, error);\n throw new Error(`Failed to perform tags union: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle tags://intersect/[tag1]+[tag2] resource - Cards with ALL these tags\n */\nexport async function handleTagsIntersectResource(\n courseDB: CourseDBInterface,\n tagsParam: string\n): Promise<{ cardIds: string[]; tags: string[]; operation: 'intersect' }> {\n try {\n const tags = tagsParam.split('+').map(tag => tag.trim());\n \n if (tags.length === 0) {\n throw new Error('No tags specified for intersect operation');\n }\n\n // Validate all tags exist\n for (const tagName of tags) {\n try {\n await courseDB.getTag(tagName);\n } catch {\n throw new Error(`Tag not found: ${tagName}`);\n }\n }\n\n // Note: Intersect operation would require specialized queries\n return {\n cardIds: [], // Placeholder\n tags,\n operation: 'intersect'\n };\n\n } catch (error) {\n console.error(`Error performing tags intersect for ${tagsParam}:`, error);\n throw new Error(`Failed to perform tags intersect: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle tags://exclusive/[tag1]-[tag2] resource - Cards with tag1 but NOT tag2\n */\nexport async function handleTagsExclusiveResource(\n courseDB: CourseDBInterface,\n tagsParam: string\n): Promise<{ cardIds: string[]; includeTag: string; excludeTag: string; operation: 'exclusive' }> {\n try {\n const [includeTag, excludeTag] = tagsParam.split('-').map(tag => tag.trim());\n \n if (!includeTag || !excludeTag) {\n throw new Error('Both include and exclude tags must be specified (format: tag1-tag2)');\n }\n\n // Validate both tags exist\n try {\n await courseDB.getTag(includeTag);\n await courseDB.getTag(excludeTag);\n } catch (error) {\n throw new Error(`One or both tags not found: ${includeTag}, ${excludeTag}`);\n }\n\n // Note: Exclusive operation would require specialized queries\n return {\n cardIds: [], // Placeholder\n includeTag,\n excludeTag,\n operation: 'exclusive'\n };\n\n } catch (error) {\n console.error(`Error performing tags exclusive for ${tagsParam}:`, error);\n throw new Error(`Failed to perform tags exclusive: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle tags://distribution resource - Tag frequency distribution\n */\nexport async function handleTagsDistributionResource(\n courseDB: CourseDBInterface\n): Promise<{ distribution: TagDistribution[]; totalTags: number; totalCards: number }> {\n try {\n // Get all tags\n const tagStubsResponse = await courseDB.getCourseTagStubs();\n const tags = tagStubsResponse.rows || [];\n \n // Get course info\n const courseInfo = await courseDB.getCourseInfo();\n\n // Note: Full distribution analysis would require additional queries\n // to map tags to cards and calculate frequencies\n const distribution: TagDistribution[] = tags.map(stub => ({\n tagName: stub.doc?.name || stub.id,\n frequency: 0, // Placeholder\n percentage: 0, // Placeholder\n cardIds: [] // Placeholder\n }));\n\n return {\n distribution,\n totalTags: tags.length,\n totalCards: courseInfo.cardCount\n };\n\n } catch (error) {\n console.error('Error calculating tag distribution:', error);\n throw new Error(`Failed to calculate tag distribution: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}","import { CourseDBInterface } from '@vue-skuilder/db';\n\n/**\n * Schema resource response structure\n */\nexport interface SchemaResource {\n dataShapeName: string;\n jsonSchema: object;\n schemaString: string;\n available: boolean;\n lastUpdated?: string;\n}\n\n/**\n * Handle schema resource request for a specific DataShape\n * Returns the JSON Schema for the DataShape if available\n */\nexport async function handleSchemaResource(\n _courseDB: CourseDBInterface,\n dataShapeName: string\n): Promise<SchemaResource> {\n // Import DataShapes from courseware backend (avoids Vue dependencies)\n const { getAllDataShapesRaw } = await import('@vue-skuilder/courseware/backend');\n const dataShapes = getAllDataShapesRaw();\n \n // Find the DataShape\n const dataShape = dataShapes.find(ds => ds.name === dataShapeName);\n \n if (!dataShape) {\n return {\n dataShapeName,\n jsonSchema: {},\n schemaString: '',\n available: false,\n };\n }\n\n // Generate JSON Schema from DataShape fields\n const jsonSchema = {\n type: 'object',\n properties: {} as any,\n required: [] as string[],\n title: dataShape.name,\n };\n\n if (dataShape.fields) {\n for (const field of dataShape.fields) {\n // Map Vue-Skuilder field types to JSON Schema types\n const jsonType = field.type === 'int' ? 'integer' : 'string';\n \n jsonSchema.properties[field.name] = {\n type: jsonType,\n description: field.description || `Field ${field.name} (${field.type})`,\n };\n if (field.required) {\n jsonSchema.required.push(field.name);\n }\n }\n }\n\n return {\n dataShapeName,\n jsonSchema,\n schemaString: JSON.stringify(jsonSchema, null, 2),\n available: true,\n };\n}","// Resource registry and exports\nexport * from './course.js';\nexport * from './cards.js';\nexport * from './shapes.js';\nexport * from './tags.js';\nexport * from './schema.js';\n\n// Resource URI patterns\nexport const RESOURCE_PATTERNS = {\n COURSE_CONFIG: 'course://config',\n CARDS_ALL: 'cards://all',\n CARDS_TAG: 'cards://tag/{tagName}',\n CARDS_SHAPE: 'cards://shape/{shapeName}',\n CARDS_ELO: 'cards://elo/{eloRange}',\n SHAPES_ALL: 'shapes://all',\n SHAPES_SPECIFIC: 'shapes://{shapeName}',\n TAGS_ALL: 'tags://all',\n TAGS_STATS: 'tags://stats',\n TAGS_SPECIFIC: 'tags://{tagName}',\n TAGS_UNION: 'tags://union/{tags}',\n TAGS_INTERSECT: 'tags://intersect/{tags}',\n TAGS_EXCLUSIVE: 'tags://exclusive/{tags}',\n TAGS_DISTRIBUTION: 'tags://distribution',\n SCHEMA_SPECIFIC: 'schema://{dataShapeName}',\n} as const;","import { z } from 'zod';\n\n// Tool input/output schema\n\n// Plain object schemas for MCP SDK compatibility\nexport const CreateCardInputMCPSchema = {\n datashape: z.string(),\n data: z.any(),\n tags: z.array(z.string()).optional(),\n elo: z.number().optional(),\n sourceRef: z.string().optional(),\n};\n\n// Zod schemas for runtime validation\nexport const CreateCardInputSchema = z.object(CreateCardInputMCPSchema);\n\nexport type CreateCardInput = z.infer<typeof CreateCardInputSchema>;\n\nexport interface CreateCardOutput {\n cardId: string;\n initialElo: number;\n created: boolean;\n}\n\nexport const UpdateCardInputMCPSchema = {\n cardId: z.string(),\n data: z.any().optional(),\n tags: z.array(z.string()).optional(),\n elo: z.number().optional(),\n sourceRef: z.string().optional(),\n};\n// Update Card Tool\nexport const UpdateCardInputSchema = z.object(UpdateCardInputMCPSchema);\n\nexport type UpdateCardInput = z.infer<typeof UpdateCardInputSchema>;\n\nexport interface UpdateCardOutput {\n cardId: string;\n updated: boolean;\n changes: {\n data?: boolean;\n tags?: boolean;\n elo?: boolean;\n sourceRef?: boolean;\n };\n}\n\nexport const TagCardInputMCPSchema = {\n cardId: z.string(),\n action: z.enum(['add', 'remove']),\n tags: z.array(z.string()),\n updateELO: z.boolean().optional().default(false),\n};\n\n// Tag Card Tool\nexport const TagCardInputSchema = z.object(TagCardInputMCPSchema);\n\nexport type TagCardInput = z.infer<typeof TagCardInputSchema>;\n\nexport interface TagCardOutput {\n cardId: string;\n action: string;\n tagsProcessed: string[];\n success: boolean;\n currentTags: string[];\n}\n\nexport const DeleteCardInputMCPSchema = {\n cardId: z.string(),\n confirm: z.boolean().default(false),\n reason: z.string().optional(),\n};\n\n// Delete Card Tool\nexport const DeleteCardInputSchema = z.object(DeleteCardInputMCPSchema);\n\nexport type DeleteCardInput = z.infer<typeof DeleteCardInputSchema>;\n\nexport interface DeleteCardOutput {\n cardId: string;\n deleted: boolean;\n message: string;\n}\n","import type { CourseDBInterface } from '@vue-skuilder/db';\nimport {\n CreateCardInputSchema,\n type CreateCardInput,\n type CreateCardOutput,\n} from '../types/tools.js';\nimport { toCourseElo, NameSpacer, FieldType, type DataShape, type FieldDefinition } from '@vue-skuilder/common';\nimport {\n MCP_AGENT_AUTHOR,\n handleToolError,\n logToolStart,\n logToolSuccess,\n logToolWarning,\n} from '../utils/index.js';\n\n/**\n * Reconstructs a minimal DataShape from course config's serialized JSON Schema\n * Only extracts field names and types - no validators or custom logic\n */\nfunction reconstructDataShapeFromConfig(\n dataShapeName: string,\n serializedSchema: string\n): DataShape {\n const jsonSchema = JSON.parse(serializedSchema);\n const fields: FieldDefinition[] = [];\n\n if (jsonSchema.properties) {\n for (const [fieldName, fieldSchema] of Object.entries(jsonSchema.properties)) {\n const schema = fieldSchema as any;\n\n // Map JSON Schema types to FieldType enum\n let fieldType: FieldType = FieldType.STRING; // default\n\n if (schema.type === 'string') {\n if (schema.contentEncoding === 'base64' || fieldName.toLowerCase().includes('image')) {\n fieldType = FieldType.IMAGE;\n } else if (fieldName.toLowerCase().includes('audio')) {\n fieldType = FieldType.AUDIO;\n } else if (schema.description?.includes('Markdown') || schema.description?.includes('markdown')) {\n fieldType = FieldType.MARKDOWN;\n } else {\n fieldType = FieldType.STRING;\n }\n } else if (schema.type === 'number') {\n fieldType = FieldType.NUMBER;\n } else if (schema.type === 'integer') {\n fieldType = FieldType.INT;\n } else if (schema.type === 'array') {\n // Check if it's uploads/media\n if (fieldName === 'Uploads' || fieldName.toLowerCase().includes('upload')) {\n fieldType = FieldType.MEDIA_UPLOADS;\n }\n }\n\n fields.push({\n name: fieldName,\n type: fieldType,\n });\n }\n }\n\n return {\n name: dataShapeName as any, // Cast to DataShapeName - it's just a string at runtime\n fields,\n };\n}\n\nexport async function handleCreateCard(\n courseDB: CourseDBInterface,\n input: CreateCardInput\n): Promise<CreateCardOutput> {\n const TOOL_NAME = 'create_card';\n\n try {\n // Validate input and log start\n const validatedInput = CreateCardInputSchema.parse(input);\n\n // Fix: Claude Code's MCP client sends data as a JSON string instead of an object\n // Parse it if it's a string\n if (typeof validatedInput.data === 'string') {\n try {\n validatedInput.data = JSON.parse(validatedInput.data);\n } catch (e) {\n throw new Error(`Invalid JSON in data parameter: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n logToolStart(TOOL_NAME, validatedInput);\n\n // Get course config to validate datashape\n const courseConfig = await courseDB.getCourseConfig();\n const availableDataShapes = courseConfig.dataShapes.map((ds) => ds.name);\n\n if (!availableDataShapes.includes(validatedInput.datashape)) {\n const errorMsg = `Invalid datashape: ${validatedInput.datashape}. Available: ${availableDataShapes.join(', ')}`;\n logToolWarning(TOOL_NAME, errorMsg);\n throw new Error(errorMsg);\n }\n\n // Extract courseware name and local datashape name from fully-qualified name\n let shapeDescriptor: any;\n try {\n shapeDescriptor = NameSpacer.getDataShapeDescriptor(validatedInput.datashape);\n } catch (error) {\n const errorMsg = `Malformed datashape name: ${validatedInput.datashape}. Expected format: course.datashape.name`;\n logToolWarning(TOOL_NAME, errorMsg);\n throw new Error(errorMsg);\n }\n\n // Get the DataShape definition from course config\n const matchingDataShape = courseConfig.dataShapes.find(\n (ds) => ds.name === validatedInput.datashape\n );\n if (!matchingDataShape) {\n const errorMsg = `DataShape not found in course configuration: ${validatedInput.datashape}`;\n logToolWarning(TOOL_NAME, errorMsg);\n throw new Error(errorMsg);\n }\n\n // Reconstruct DataShape from course config's serialized schema\n // This bypasses the need for runtime courseware loading - we only need\n // field names and types, which we can derive from the JSON Schema\n const dataShape = reconstructDataShapeFromConfig(\n shapeDescriptor.dataShape,\n matchingDataShape.serializedZodSchema!\n );\n\n logToolStart(\n TOOL_NAME,\n `Using DataShape with ${dataShape.fields.length} fields (reconstructed from course config)`\n );\n\n // Create the card via courseDB\n const result = await courseDB.addNote(\n shapeDescriptor.course, // Use courseware name, not courseID\n dataShape,\n validatedInput.data,\n MCP_AGENT_AUTHOR,\n validatedInput.tags || [],\n undefined, // No uploads for now\n validatedInput.elo ? toCourseElo(validatedInput.elo) : undefined\n );\n\n if (result.status !== 'ok') {\n const errorMsg = `Failed to create card: ${result.message || 'Unknown error'}`;\n throw new Error(errorMsg);\n }\n\n // Extract initial ELO from result or use default\n const initialElo = validatedInput.elo || 1500;\n\n const output = {\n cardId: result.id || 'unknown',\n initialElo,\n created: true,\n };\n\n logToolSuccess(TOOL_NAME, output);\n return output;\n } catch (error) {\n handleToolError(error, TOOL_NAME);\n }\n}\n","import type { CourseDBInterface } from '@vue-skuilder/db';\nimport { UpdateCardInputSchema, type UpdateCardInput, type UpdateCardOutput } from '../types/tools.js';\nimport { toCourseElo } from '@vue-skuilder/common';\nimport { MCP_AGENT_AUTHOR, handleToolError, logToolStart, logToolSuccess, logToolWarning } from '../utils/index.js';\n\nexport async function handleUpdateCard(\n courseDB: CourseDBInterface,\n input: UpdateCardInput\n): Promise<UpdateCardOutput> {\n const TOOL_NAME = 'update_card';\n \n try {\n // Validate input and log start\n const validatedInput = UpdateCardInputSchema.parse(input);\n logToolStart(TOOL_NAME, validatedInput);\n \n // Track what changes were made\n const changes = {\n data: false,\n tags: false,\n elo: false,\n sourceRef: false\n };\n\n // Verify the card exists\n try {\n await courseDB.getCourseDoc(validatedInput.cardId);\n } catch (error) {\n throw new Error(`Card not found: ${validatedInput.cardId}`);\n }\n\n // Update ELO if provided\n if (validatedInput.elo !== undefined) {\n try {\n const courseElo = toCourseElo(validatedInput.elo);\n await courseDB.updateCardElo(validatedInput.cardId, courseElo);\n changes.elo = true;\n } catch (error) {\n logToolWarning(TOOL_NAME, `Failed to update ELO for card ${validatedInput.cardId}`, error);\n throw new Error(`Failed to update ELO: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n // Update tags if provided\n if (validatedInput.tags !== undefined) {\n try {\n // Get current tags to determine what needs to be added/removed\n const currentTagsResponse = await courseDB.getAppliedTags(validatedInput.cardId);\n const currentTagNames = currentTagsResponse.rows.map(row => row.doc?.name).filter(Boolean) as string[];\n \n const newTags = validatedInput.tags;\n const tagsToAdd = newTags.filter(tag => !currentTagNames.includes(tag));\n const tagsToRemove = currentTagNames.filter(tag => !newTags.includes(tag));\n\n // Add new tags\n for (const tagName of tagsToAdd) {\n try {\n // Check if tag exists, if not create it\n try {\n await courseDB.getTag(tagName);\n } catch {\n // Tag doesn't exist, create it\n await courseDB.createTag(tagName, MCP_AGENT_AUTHOR);\n }\n \n await courseDB.addTagToCard(validatedInput.cardId, tagName);\n } catch (error) {\n logToolWarning(TOOL_NAME, `Failed to add tag ${tagName} to card`, error);\n // Continue with other tags\n }\n }\n\n // Remove old tags\n for (const tagName of tagsToRemove) {\n try {\n await courseDB.removeTagFromCard(validatedInput.cardId, tagName);\n } catch (error) {\n logToolWarning(TOOL_NAME, `Failed to remove tag ${tagName} from card`, error);\n // Continue with other tags\n }\n }\n\n if (tagsToAdd.length > 0 || tagsToRemove.length > 0) {\n changes.tags = true;\n }\n } catch (error) {\n logToolWarning(TOOL_NAME, `Failed to update tags for card ${validatedInput.cardId}`, error);\n throw new Error(`Failed to update tags: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n // Update data and sourceRef if provided\n // Note: CourseDBInterface doesn't have direct methods for updating card data\n // This would require more complex PouchDB operations\n if (validatedInput.data !== undefined || validatedInput.sourceRef !== undefined) {\n logToolWarning(TOOL_NAME, 'Data and sourceRef updates are not yet implemented - require direct PouchDB operations');\n // TODO: Implement direct document updates for data and sourceRef\n // For now, we'll skip these updates but note them in the response\n }\n\n const updated = changes.elo || changes.tags || changes.data || changes.sourceRef;\n\n const output = {\n cardId: validatedInput.cardId,\n updated,\n changes\n };\n \n logToolSuccess(TOOL_NAME, output);\n return output;\n\n } catch (error) {\n handleToolError(error, TOOL_NAME);\n }\n}","import type { CourseDBInterface } from '@vue-skuilder/db';\nimport { TagCardInputSchema, type TagCardInput, type TagCardOutput } from '../types/tools.js';\nimport { MCP_AGENT_AUTHOR, handleToolError, logToolStart, logToolSuccess, logToolWarning } from '../utils/index.js';\n\nexport async function handleTagCard(\n courseDB: CourseDBInterface,\n input: TagCardInput\n): Promise<TagCardOutput> {\n const TOOL_NAME = 'tag_card';\n \n try {\n // Validate input and log start\n const validatedInput = TagCardInputSchema.parse(input);\n logToolStart(TOOL_NAME, validatedInput);\n \n // Verify the card exists\n try {\n await courseDB.getCourseDoc(validatedInput.cardId);\n } catch (error) {\n throw new Error(`Card not found: ${validatedInput.cardId}`);\n }\n\n const tagsProcessed: string[] = [];\n let success = true;\n \n // Process each tag\n for (const tagName of validatedInput.tags) {\n try {\n if (validatedInput.action === 'add') {\n // Check if tag exists, if not create it\n try {\n await courseDB.getTag(tagName);\n } catch {\n // Tag doesn't exist, create it\n await courseDB.createTag(tagName, MCP_AGENT_AUTHOR);\n }\n \n // Add tag to card\n await courseDB.addTagToCard(\n validatedInput.cardId, \n tagName, \n validatedInput.updateELO\n );\n tagsProcessed.push(tagName);\n \n } else if (validatedInput.action === 'remove') {\n // Remove tag from card\n await courseDB.removeTagFromCard(validatedInput.cardId, tagName);\n tagsProcessed.push(tagName);\n }\n } catch (error) {\n logToolWarning(TOOL_NAME, `Failed to ${validatedInput.action} tag ${tagName}`, error);\n success = false;\n // Continue with other tags\n }\n }\n\n // Get current tags to return in response\n let currentTags: string[] = [];\n try {\n const currentTagsResponse = await courseDB.getAppliedTags(validatedInput.cardId);\n currentTags = currentTagsResponse.rows\n .map(row => row.doc?.name)\n .filter(Boolean) as string[];\n } catch (error) {\n logToolWarning(TOOL_NAME, 'Failed to fetch current tags', error);\n }\n\n const output = {\n cardId: validatedInput.cardId,\n action: validatedInput.action,\n tagsProcessed,\n success: success && tagsProcessed.length === validatedInput.tags.length,\n currentTags\n };\n \n logToolSuccess(TOOL_NAME, output);\n return output;\n\n } catch (error) {\n handleToolError(error, TOOL_NAME);\n }\n}","import type { CourseDBInterface } from '@vue-skuilder/db';\nimport { DeleteCardInputSchema, type DeleteCardInput, type DeleteCardOutput } from '../types/tools.js';\nimport { handleToolError, logToolStart, logToolSuccess, logToolWarning, logToolError } from '../utils/index.js';\n\nexport async function handleDeleteCard(\n courseDB: CourseDBInterface,\n input: DeleteCardInput\n): Promise<DeleteCardOutput> {\n const TOOL_NAME = 'delete_card';\n \n try {\n // Validate input and log start\n const validatedInput = DeleteCardInputSchema.parse(input);\n logToolStart(TOOL_NAME, validatedInput);\n \n // Safety check: require explicit confirmation\n if (!validatedInput.confirm) {\n return {\n cardId: validatedInput.cardId,\n deleted: false,\n message: 'Card deletion requires explicit confirmation. Set confirm: true to proceed.'\n };\n }\n\n // Verify the card exists before attempting deletion\n let cardExists = true;\n try {\n await courseDB.getCourseDoc(validatedInput.cardId);\n } catch (error) {\n cardExists = false;\n }\n\n if (!cardExists) {\n return {\n cardId: validatedInput.cardId,\n deleted: false,\n message: `Card not found: ${validatedInput.cardId}`\n };\n }\n\n // Get card information before deletion for logging\n let cardInfo = '';\n try {\n const cardDoc = await courseDB.getCourseDoc(validatedInput.cardId);\n const cardData = cardDoc as any;\n cardInfo = `Card: ${cardData.shape?.name || 'unknown shape'}`;\n } catch (error) {\n logToolWarning(TOOL_NAME, 'Could not fetch card info before deletion', error);\n }\n\n // Attempt to delete the card\n try {\n const result = await courseDB.removeCard(validatedInput.cardId);\n \n if (result.ok) {\n const reason = validatedInput.reason ? ` Reason: ${validatedInput.reason}` : '';\n const message = `Card successfully deleted. ${cardInfo}${reason}`;\n \n logToolSuccess(TOOL_NAME, `Card deleted: ${validatedInput.cardId}${reason}`);\n \n return {\n cardId: validatedInput.cardId,\n deleted: true,\n message\n };\n } else {\n return {\n cardId: validatedInput.cardId,\n deleted: false,\n message: `Failed to delete card: ${result.rev || 'Unknown error'}`\n };\n }\n } catch (error) {\n logToolError(TOOL_NAME, `Error deleting card ${validatedInput.cardId}`, error);\n return {\n cardId: validatedInput.cardId,\n deleted: false,\n message: `Failed to delete card: ${error instanceof Error ? error.message : 'Unknown error'}`\n };\n }\n\n } catch (error) {\n handleToolError(error, TOOL_NAME);\n }\n}","// Tools registry and exports\nexport * from './create-card.js';\nexport * from './update-card.js';\nexport * from './tag-card.js';\nexport * from './delete-card.js';\n\n// Tool patterns\nexport const TOOL_PATTERNS = {\n CREATE_CARD: 'create_card',\n UPDATE_CARD: 'update_card',\n TAG_CARD: 'tag_card',\n DELETE_CARD: 'delete_card',\n} as const;","/* eslint-disable max-len */\nexport function createFillInCardAuthoringPrompt(): string {\n return `# GUIDE: Authoring \"fillIn\" type Flashcards\n\nThis guide provides the technical specifications for authoring a \"fillIn\" type flashcard for the Vue-Skuilder platform. When you need to create a new card, you should use the 'create_card' tool and format the content as described below.\n\n## 1. Tool: 'create_card'\n\nYou should call the 'create_card' tool with the following parameters:\n\n- 'datashape': Must be 'fillIn'.\n- 'data': A markdown string containing the question and the interactive '{{...}}' elements.\n- 'tags': (Optional) An array of strings for tagging, e.g., ['go', 'concurrency'].\n- 'elo': (Optional) An integer representing the estimated difficulty (e.g., 1250).\n\n**IMPORTANT**: Do NOT include 'tags:' or 'elo:' information inside the 'data' string itself. These are tool parameters.\n\n## 2. Content Formatting ('data' parameter)\n\nThe 'data' string is composed of a question and special interactive elements using '{{...}}' syntax.\n\n### A. Simple Fill-in-the-Blank\n- For a single correct answer.\n- **Syntax**: '{{answer}}'\n- **Example**: 'The capital of France is {{Paris}}.'\n\n### B. Fill-in-the-Blank with Alternatives\n- For when multiple text inputs are acceptable for the same blank.\n- **Syntax**: '{{answer1|answer2}}'\n- **Example**: 'A common way to declare a variable in JavaScript that can be reassigned is using the {{let|var}} keyword.'\n\n### C. Multiple Choice\n- For presenting a question with several options.\n- **Syntax**: '{{correct_answer1|correct_answer2||distractor1|distractor2|distractor3|...}}'\n- **Details**:\n - List one or more correct answers first, separated by '|'.\n - Use a double pipe '||' to separate correct answers from distractors.\n - List one or more incorrect answers (distractors) after the '||', separated by '|'.\n - **Many distractors can be added** - the rendering layer will limit runtime display to a maximum of 5 rendered distractors.\n - **Front-load the most relevant distractors** - they will be weighted more favorably in selection.\n- **Example (Single Correct)**: 'What is the main gas found in the air we breathe? {{Nitrogen||Oxygen|Carbon Dioxide|Hydrogen}}'\n- **Example (Multiple Correct)**: 'Which of the following are primary colors? {{Red|Blue|Yellow||Green|Orange|Purple}}' (The system will pick one correct answer to display with the distractors).\n- **Example (Many Distractors)**: 'Which letter comes after M in the alphabet? {{N||O|L|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|D|E|F|G|H|I|J|K}}' (Only 5 distractors will be shown, with O and L being most likely due to their position).\n\n### D. Overlapping Cards for Difficulty Scaling\n- **It is normal and advisable** to present the same content in overlapping cards with different distractor sets to scale difficulty.\n- **Progressive difficulty**: Start with dissimilar distractors, then increase similarity to make the question harder.\n- **Examples (Spelling/Phonics)**: Given an image of a car:\n - **Easy**: 'What word matches this image? {{car||airplane}}' (very different options)\n - **Medium**: 'What word matches this image? {{car||cat}}' (similar sounds)\n - **Hard**: 'What word matches this image? {{car||care}}' (very similar spelling)\n - **Harder**: 'What word matches this image? {{car||care|cat|far}}' (multiple similar options)\n- **Benefits**: This approach allows learners to build confidence with easier versions before tackling more challenging variants of the same concept.\n\n## 3. Best Practices & Tips\n\n- **Clarity is Key**: Ensure your questions are clear and the blanks/choices are unambiguous.\n- **Keep Answers Concise**: For fill-in-the-blanks, prefer short, specific answers (1-3 words is ideal). Long answers are hard for users to match. Use multiple-choice for more complex answers.\n- **Code in Questions**: You can and should use markdown code blocks in the question body for context.\n - **Example**:\n Given the code:\n \\`\\`\\`go\n func main() {\n x := 10\n fmt.Println(x)\n }\n \\`\\`\\`\n The above program will {{compile and run correctly||fail at compilation|fail at runtime}}.\n- **Code in Answers**: Code blocks ARE allowed inside the '{{...}}' syntax.\n - **Example**: '{{\\`go\\\\nfunc main() {\\\\n fmt.Println(\"Hello\")\\\\n}\\\\n\\`}}'\n- **CRITICAL**: Do NOT place the '{{...}}' syntax inside a markdown code block (e.g., \\`\\`\\` ... {{...}} ... \\`\\`\\`). The interactive element must be outside of any code fences.\n- **Review Syntax**: Carefully check your use of '|' and '||' in multiple-choice questions to avoid parsing errors.\n\n## 4. Example Agent Workflow\n\nThis is an example of how an agent might use this guide.\n\n**User Request:** \"Make a card about Go channels.\"\n\n**Agent's Thought Process:**\n1. I need to create a \"fillIn\" card about Go channels.\n2. A good multiple-choice question would be about the operator used to send a value to a channel.\n3. The question will be: \"In Go, what operator is used to send a value to a channel?\"\n4. The correct answer is '<-'. Some good distractors would be '->', '<<', and '>>'.\n5. The 'data' string for the tool call will be: 'In Go, what operator is used to send a value to a channel? {{<-||->|<<|>>}}'\n6. I'll tag it with 'go' and 'channels'.\n7. This is a fundamental concept, so I'll give it an ELO of 1100.\n8. Now I will call the 'create_card' tool with these parameters.\n\n**Resulting Tool Call:**\n<tool_code>\nprint(default_api.create_card(\n datashape='fillIn',\n data='In Go, what operator is used to send a value to a channel? {{<-||->|<<|>>}}',\n tags=['go', 'channels'],\n elo=1100\n))\n</tool_code>`;\n}\n","/* eslint-disable max-len */\nexport function createEloScoringGuidancePrompt(): string {\n return `# GUIDE: ELO Scoring for Content\n\nThis guide provides guidance for agents on assigning ELO ratings to content. The ELO system helps provide initial difficulty sorting for new content.\n\n## Understanding ELO Ratings\n\nELO ratings use a chess-like rating scale to indicate content difficulty:\n\n- **100-500**: Beginner level, basic knowledge\n- **500-1000**: Some knowledge, early understanding\n- **1000-1500**: Intermediate knowledge\n- **1500-2000**: Advanced understanding\n- **2000-2400**: Expert level\n- **2400+**: Elite/master level\n\n## Key Principles\n\n### 1. Rough Initial Sorting\n- Your ELO assignments provide **rough, sane sorting** of new content\n- Aim for reasonable relative difficulty between cards, not perfect precision\n- The system will refine these ratings over time based on real-world performance\n\n### 2. Automated Refinement\n- The platform performs **automated realtime adjustment** of ELO ratings based on actual user performance\n- This convergence forcing function holds **most of the responsibility** for arranging relative difficulty\n- Your initial ratings serve as a starting point, not the final word\n\n### 3. Content-Based Guidelines\n\n#### Basic Knowledge (100-500)\n- Simple facts and definitions\n- Basic vocabulary\n- Elementary concepts\n- **Example**: \"The capital of France is {{Paris}}\"\n\n#### Early Understanding (500-1000)\n- Simple applications of concepts\n- Basic problem-solving\n- Common patterns and rules\n- **Example**: \"In JavaScript, use {{let|var}} to declare a reassignable variable\"\n\n#### Intermediate Knowledge (1000-1500)\n- More complex applications\n- Understanding relationships between concepts\n- Moderate problem-solving skills\n- **Example**: \"Which sorting algorithm has O(n log n) average time complexity? {{mergesort|heapsort||bubblesort|insertionsort}}\"\n\n#### Advanced Understanding (1500-2000)\n- Complex problem-solving\n- Deep conceptual understanding\n- Advanced techniques and patterns\n- **Example**: \"In Go, what happens when you close a channel that's already closed? {{runtime panic||returns false|blocks forever|does nothing}}\"\n\n#### Expert Level (2000-2400)\n- Specialized knowledge\n- Advanced edge cases\n- Professional-level understanding\n- **Example**: \"What's the difference between TCP_NODELAY and TCP_CORK socket options?\"\n\n#### Elite/Master Level (2400+)\n- Cutting-edge knowledge\n- Rare edge cases\n- Research-level understanding\n- **Example**: \"How does the Linux kernel's CFS scheduler handle nice values in relation to vruntime calculations?\"\n\n## Practical Application\n\n### When Assigning ELO Ratings:\n\n1. **Consider the target audience**: Who would reasonably be expected to know this?\n2. **Assess cognitive load**: How much thinking/reasoning is required?\n3. **Evaluate prerequisite knowledge**: What must someone know first?\n4. **Compare relatively**: Is this harder or easier than other cards on similar topics?\n\n### Common Patterns:\n\n- **Definitions and facts**: Usually 100-800\n- **Basic syntax/usage**: Usually 400-1200\n- **Concept application**: Usually 800-1600\n- **Problem-solving**: Usually 1200-2000\n- **Advanced techniques**: Usually 1600-2400+\n\n## Establishing Goalposts for Agentic Runs\n\n### Reference Live Course Data\nWhen appending data to existing courses, try to use existing data to understand the baseline against which we create. ELO is relative and not absolute.\n\n1. **Query existing course statistics** using available MCP resources:\n - \\`course://config\\` - Get overall course ELO distribution\n - \\`tags://stats\\` - Understand tag usage patterns\n - \\`cards://elo/{range}\\` - Sample cards in different difficulty ranges\n\n2. **Establish relative ranges** based on existing content:\n - If the course has cards ranging 800-1600, aim for similar distribution\n - If creating beginner content for an advanced course, adjust baseline accordingly\n - Use tag-specific ELO patterns to inform ratings for similar topics\n\n### Example Goalpost Process\n\\`\\`\\`\n1. Query: cards://elo/1000-1500 (check intermediate range)\n2. Observe: 23 cards average 1250 ELO on \"javascript\" tag\n3. Target: New JavaScript cards should cluster around 1200-1300\n4. Create: Cards with relative difficulty within established range\n\\`\\`\\`\n\n## Remember\n\n- **It's okay to be approximate** - the system will adjust based on real performance\n- **Consistency matters more than perfection** - try to be consistent within topic areas\n- **Focus on relative difficulty** - how does this compare to other cards you've created? re: factual content - specialization matters - more esoteric knowledge should be rated higher\n- **Use live data as your anchor** - let existing course content guide your rating decisions\n\nYour ELO assignments provide the initial scaffolding that allows the platform's adaptive algorithms to efficiently converge on optimal difficulty ratings.`;\n}\n","// Prompts registry and exports\nexport * from './fill-in-card-authoring.js';\nexport * from './elo-scoring-guidance.js';\n\n// Prompt patterns\nexport const PROMPT_PATTERNS = {\n FILL_IN_CARD_AUTHORING: 'fill-in-card-authoring',\n ELO_SCORING_GUIDANCE: 'elo-scoring-guidance',\n} as const;\n"],"mappings":"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","names":["import_zod","import_zod","import_zod","import_common"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/server.ts","../src/resources/course.ts","../src/resources/cards.ts","../src/utils/pouchdb.ts","../src/utils/tools.ts","../src/resources/shapes.ts","../src/resources/tags.ts","../src/resources/schema.ts","../src/resources/index.ts","../src/types/tools.ts","../src/tools/create-card.ts","../src/tools/update-card.ts","../src/tools/tag-card.ts","../src/tools/delete-card.ts","../src/tools/index.ts","../src/prompts/fill-in-card-authoring.ts","../src/prompts/elo-scoring-guidance.ts","../src/prompts/index.ts"],"sourcesContent":["export { MCPServer } from './server.js';\nexport type { MCPServerOptions } from './server.js';\n\n// Types\nexport * from './types/index.js';\n\n// Resources\nexport * from './resources/index.js';\n\n// Tools\nexport * from './tools/index.js';","import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport type { CourseDBInterface } from '@vue-skuilder/db';\nimport type { SkLogger } from '@vue-skuilder/common';\nimport {\n handleCourseConfigResource,\n handleCardsAllResource,\n handleCardsTagResource,\n handleCardsShapeResource,\n handleCardsEloResource,\n handleShapesAllResource,\n handleShapeSpecificResource,\n handleTagsAllResource,\n handleTagsStatsResource,\n handleTagSpecificResource,\n handleTagsUnionResource,\n handleTagsIntersectResource,\n handleTagsExclusiveResource,\n handleTagsDistributionResource,\n handleSchemaResource,\n RESOURCE_PATTERNS,\n} from './resources/index.js';\nimport {\n handleCreateCard,\n handleUpdateCard,\n handleTagCard,\n handleDeleteCard,\n TOOL_PATTERNS,\n} from './tools/index.js';\nimport {\n type CreateCardInput,\n type UpdateCardInput,\n type TagCardInput,\n type DeleteCardInput,\n CreateCardInputMCPSchema,\n UpdateCardInputMCPSchema,\n TagCardInputMCPSchema,\n DeleteCardInputMCPSchema,\n} from './types/tools.js';\nimport {\n createFillInCardAuthoringPrompt,\n createEloScoringGuidancePrompt,\n PROMPT_PATTERNS,\n} from './prompts/index.js';\n\nexport interface MCPServerOptions {\n enableSourceLinking?: boolean;\n maxCardsPerQuery?: number;\n allowedDataShapes?: string[];\n eloCalibrationMode?: 'strict' | 'adaptive' | 'manual';\n logger?: SkLogger;\n}\n\nexport class MCPServer {\n private mcpServer: McpServer;\n private transport?: Transport;\n private logger: SkLogger;\n\n constructor(\n private courseDB: CourseDBInterface,\n private readonly options: MCPServerOptions = {}\n ) {\n // Use provided logger or no-op logger as default\n this.logger = options.logger || { debug: () => {}, info: () => {}, warn: () => {}, error: () => {} };\n this.mcpServer = new McpServer({\n name: 'vue-skuilder-mcp',\n version: '0.1.0',\n });\n\n this.setupCapabilities();\n }\n\n private setupCapabilities(): void {\n // Register course://config resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.COURSE_CONFIG,\n RESOURCE_PATTERNS.COURSE_CONFIG,\n {\n title: 'Course Configuration',\n description: 'Course configuration with metadata and ELO statistics',\n mimeType: 'application/json',\n },\n async (uri) => {\n this.logger.debug('MCP Server: Accessing course config resource');\n try {\n const result = await handleCourseConfigResource(this.courseDB);\n this.logger.info(`MCP Server: Course config accessed - ${result.config.name}`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n } catch (error) {\n this.logger.error('MCP Server: Failed to access course config', error);\n throw error;\n }\n }\n );\n\n // Register cards://all resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.CARDS_ALL,\n RESOURCE_PATTERNS.CARDS_ALL,\n {\n title: 'All Course Cards',\n description: 'List all cards in the course with pagination support',\n mimeType: 'application/json',\n },\n async (uri) => {\n const url = new URL(uri.href);\n const limit = parseInt(url.searchParams.get('limit') || '50', 10);\n const offset = parseInt(url.searchParams.get('offset') || '0', 10);\n\n this.logger.debug(`MCP Server: Fetching cards, limit=${limit}, offset=${offset}`);\n const result = await handleCardsAllResource(this.courseDB, limit, offset);\n this.logger.info(`MCP Server: Retrieved ${result.cards.length} cards`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register cards://tag/{tagName} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.CARDS_TAG,\n new ResourceTemplate('cards://tag/{tagName}', { list: undefined }),\n {\n title: 'Cards by Tag',\n description: 'Filter cards by tag name with pagination support',\n mimeType: 'application/json',\n },\n async (uri, { tagName }) => {\n const url = new URL(uri.href);\n const limit = parseInt(url.searchParams.get('limit') || '50', 10);\n const offset = parseInt(url.searchParams.get('offset') || '0', 10);\n\n this.logger.debug(`MCP Server: Fetching cards by tag '${tagName}', limit=${limit}, offset=${offset}`);\n const result = await handleCardsTagResource(\n this.courseDB,\n tagName as string,\n limit,\n offset\n );\n this.logger.info(`MCP Server: Retrieved ${result.cards.length} cards for tag '${tagName}'`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register cards://shape/{shapeName} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.CARDS_SHAPE,\n new ResourceTemplate('cards://shape/{shapeName}', { list: undefined }),\n {\n title: 'Cards by DataShape',\n description: 'Filter cards by DataShape with pagination support',\n mimeType: 'application/json',\n },\n async (uri, { shapeName }) => {\n const url = new URL(uri.href);\n const limit = parseInt(url.searchParams.get('limit') || '50', 10);\n const offset = parseInt(url.searchParams.get('offset') || '0', 10);\n\n this.logger.debug(`MCP Server: Fetching cards by shape '${shapeName}', limit=${limit}, offset=${offset}`);\n const result = await handleCardsShapeResource(\n this.courseDB,\n shapeName as string,\n limit,\n offset\n );\n this.logger.info(`MCP Server: Retrieved ${result.cards.length} cards for shape '${shapeName}'`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register cards://elo/{eloRange} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.CARDS_ELO,\n new ResourceTemplate('cards://elo/{eloRange}', { list: undefined }),\n {\n title: 'Cards by ELO Range',\n description: 'Filter cards by ELO range (format: min-max, e.g., 1200-1800)',\n mimeType: 'application/json',\n },\n async (uri, { eloRange }) => {\n const url = new URL(uri.href);\n const limit = parseInt(url.searchParams.get('limit') || '50', 10);\n const offset = parseInt(url.searchParams.get('offset') || '0', 10);\n\n this.logger.debug(`MCP Server: Fetching cards by ELO range '${eloRange}', limit=${limit}, offset=${offset}`);\n const result = await handleCardsEloResource(\n this.courseDB,\n eloRange as string,\n limit,\n offset\n );\n this.logger.info(`MCP Server: Retrieved ${result.cards.length} cards for ELO range '${eloRange}'`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register shapes://all resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.SHAPES_ALL,\n RESOURCE_PATTERNS.SHAPES_ALL,\n {\n title: 'All DataShapes',\n description: 'List all available DataShapes in the course',\n mimeType: 'application/json',\n },\n async (uri) => {\n this.logger.debug('MCP Server: Fetching all shapes');\n const result = await handleShapesAllResource(this.courseDB);\n this.logger.info(`MCP Server: Retrieved ${result.shapes.length} shapes`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register shapes://{shapeName} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.SHAPES_SPECIFIC,\n new ResourceTemplate('shapes://{shapeName}', { list: undefined }),\n {\n title: 'Specific DataShape',\n description: 'Get detailed information about a specific DataShape',\n mimeType: 'application/json',\n },\n async (uri, { shapeName }) => {\n this.logger.debug(`MCP Server: Fetching shape '${shapeName}'`);\n const result = await handleShapeSpecificResource(this.courseDB, shapeName as string);\n this.logger.info(`MCP Server: Retrieved shape '${shapeName}'`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register tags://all resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.TAGS_ALL,\n RESOURCE_PATTERNS.TAGS_ALL,\n {\n title: 'All Tags',\n description: 'List all available tags in the course',\n mimeType: 'application/json',\n },\n async (uri) => {\n this.logger.debug('MCP Server: Fetching all tags');\n const result = await handleTagsAllResource(this.courseDB);\n this.logger.info(`MCP Server: Retrieved ${result.tags.length} tags`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register tags://stats resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.TAGS_STATS,\n RESOURCE_PATTERNS.TAGS_STATS,\n {\n title: 'Tag Statistics',\n description: 'Get usage statistics for tags in the course',\n mimeType: 'application/json',\n },\n async (uri) => {\n this.logger.debug('MCP Server: Fetching tag statistics');\n const result = await handleTagsStatsResource(this.courseDB);\n this.logger.info('MCP Server: Retrieved tag statistics');\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register tags://{tagName} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.TAGS_SPECIFIC,\n new ResourceTemplate('tags://{tagName}', { list: undefined }),\n {\n title: 'Specific Tag',\n description: 'Get detailed information about a specific tag',\n mimeType: 'application/json',\n },\n async (uri, { tagName }) => {\n this.logger.debug(`MCP Server: Fetching tag '${tagName}'`);\n const result = await handleTagSpecificResource(this.courseDB, tagName as string);\n this.logger.info(`MCP Server: Retrieved tag '${tagName}' with ${result.cardCount} cards`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register tags://union/{tags} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.TAGS_UNION,\n new ResourceTemplate('tags://union/{tags}', { list: undefined }),\n {\n title: 'Tags Union',\n description: 'Find cards with ANY of the specified tags (format: tag1+tag2)',\n mimeType: 'application/json',\n },\n async (uri, { tags }) => {\n this.logger.debug(`MCP Server: Fetching union of tags '${tags}'`);\n const result = await handleTagsUnionResource(this.courseDB, tags as string);\n this.logger.info(`MCP Server: Retrieved ${result.cardIds.length} cards for tag union '${tags}'`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register tags://intersect/{tags} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.TAGS_INTERSECT,\n new ResourceTemplate('tags://intersect/{tags}', { list: undefined }),\n {\n title: 'Tags Intersect',\n description: 'Find cards with ALL of the specified tags (format: tag1+tag2)',\n mimeType: 'application/json',\n },\n async (uri, { tags }) => {\n this.logger.debug(`MCP Server: Fetching intersection of tags '${tags}'`);\n const result = await handleTagsIntersectResource(this.courseDB, tags as string);\n this.logger.info(`MCP Server: Retrieved ${result.cardIds.length} cards for tag intersection '${tags}'`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register tags://exclusive/{tags} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.TAGS_EXCLUSIVE,\n new ResourceTemplate('tags://exclusive/{tags}', { list: undefined }),\n {\n title: 'Tags Exclusive',\n description: 'Find cards with first tag but NOT second tag (format: tag1-tag2)',\n mimeType: 'application/json',\n },\n async (uri, { tags }) => {\n this.logger.debug(`MCP Server: Fetching exclusive tags '${tags}'`);\n const result = await handleTagsExclusiveResource(this.courseDB, tags as string);\n this.logger.info(`MCP Server: Retrieved ${result.cardIds.length} cards for tag exclusion '${tags}'`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register tags://distribution resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.TAGS_DISTRIBUTION,\n RESOURCE_PATTERNS.TAGS_DISTRIBUTION,\n {\n title: 'Tag Distribution',\n description: 'Get frequency distribution of all tags in the course',\n mimeType: 'application/json',\n },\n async (uri) => {\n this.logger.debug('MCP Server: Fetching tag distribution');\n const result = await handleTagsDistributionResource(this.courseDB);\n this.logger.info(`MCP Server: Retrieved tag distribution with ${result.distribution.length} entries`);\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register schema://{dataShapeName} resource\n this.mcpServer.registerResource(\n RESOURCE_PATTERNS.SCHEMA_SPECIFIC,\n new ResourceTemplate('schema://{dataShapeName}', { list: undefined }),\n {\n title: 'DataShape Schema',\n description: 'Get JSON Schema for a specific DataShape to validate card data',\n mimeType: 'application/json',\n },\n async (uri, { dataShapeName }) => {\n this.logger.debug(`MCP Server: Fetching schema for '${dataShapeName}'`);\n const result = await handleSchemaResource(this.courseDB, dataShapeName as string);\n if (result.available) {\n this.logger.info(`MCP Server: Retrieved schema for '${dataShapeName}'`);\n } else {\n this.logger.warn(`MCP Server: Schema not available for '${dataShapeName}'`);\n }\n return {\n contents: [\n {\n uri: uri.href,\n text: JSON.stringify(result, null, 2),\n mimeType: 'application/json',\n },\n ],\n };\n }\n );\n\n // Register create_card tool\n this.mcpServer.registerTool(\n TOOL_PATTERNS.CREATE_CARD,\n {\n title: 'Create Card',\n description: 'Create a new course card with specified datashape and content',\n inputSchema: CreateCardInputMCPSchema as any,\n },\n // @ts-ignore - MCP SDK type incompatibility with Zod v4\n async (input) => {\n const createInput = input as CreateCardInput;\n this.logger.info(`MCP Server: Creating card with datashape '${createInput.datashape}'`);\n const result = await handleCreateCard(this.courseDB, createInput);\n this.logger.info(`MCP Server: Created card ${result.cardId}`);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Register update_card tool\n this.mcpServer.registerTool(\n TOOL_PATTERNS.UPDATE_CARD,\n {\n title: 'Update Card',\n description: 'Update an existing course card (data, tags, ELO, sourceRef)',\n inputSchema: UpdateCardInputMCPSchema as any,\n },\n // @ts-ignore - MCP SDK type incompatibility with Zod v4\n async (input) => {\n const updateInput = input as UpdateCardInput;\n this.logger.info(`MCP Server: Updating card ${updateInput.cardId}`);\n const result = await handleUpdateCard(this.courseDB, updateInput);\n this.logger.info(`MCP Server: Updated card ${updateInput.cardId}`);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Register tag_card tool\n this.mcpServer.registerTool(\n TOOL_PATTERNS.TAG_CARD,\n {\n title: 'Tag Card',\n description: 'Add or remove tags from a course card with optional ELO update',\n inputSchema: TagCardInputMCPSchema as any,\n },\n // @ts-ignore - MCP SDK type incompatibility with Zod v4\n async (input) => {\n const tagInput = input as TagCardInput;\n this.logger.info(`MCP Server: ${tagInput.action === 'add' ? 'Adding' : 'Removing'} tags [${tagInput.tags.join(', ')}] ${tagInput.action === 'add' ? 'to' : 'from'} card ${tagInput.cardId}`);\n const result = await handleTagCard(this.courseDB, tagInput);\n this.logger.info(`MCP Server: Tag operation completed for card ${tagInput.cardId}`);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Register delete_card tool\n this.mcpServer.registerTool(\n TOOL_PATTERNS.DELETE_CARD,\n {\n title: 'Delete Card',\n description: 'Safely delete a course card with confirmation requirement',\n inputSchema: DeleteCardInputMCPSchema as any,\n },\n // @ts-ignore - MCP SDK type incompatibility with Zod v4\n async (input) => {\n const deleteInput = input as DeleteCardInput;\n this.logger.warn(`MCP Server: Deleting card ${deleteInput.cardId}${deleteInput.reason ? ` (reason: ${deleteInput.reason})` : ''}`);\n const result = await handleDeleteCard(this.courseDB, deleteInput);\n this.logger.info(`MCP Server: Card ${deleteInput.cardId} deletion completed`);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n }\n );\n\n // Register fill-in-card-authoring prompt\n this.mcpServer.registerPrompt(\n PROMPT_PATTERNS.FILL_IN_CARD_AUTHORING,\n {\n title: 'Author Fill-In Card',\n description:\n 'Generate a fill-in-the-blank or multiple-choice card using Vue-Skuilder syntax.',\n argsSchema: {},\n },\n () => ({\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: createFillInCardAuthoringPrompt(),\n },\n },\n ],\n })\n );\n\n // Register elo-scoring-guidance prompt\n this.mcpServer.registerPrompt(\n PROMPT_PATTERNS.ELO_SCORING_GUIDANCE,\n {\n title: 'ELO Scoring Guidance',\n description: 'Guidance for assigning ELO difficulty ratings to flashcard content.',\n argsSchema: {},\n },\n () => ({\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text: createEloScoringGuidancePrompt(),\n },\n },\n ],\n })\n );\n\n // Use options to configure server capabilities\n if (this.options.enableSourceLinking) {\n // Will configure source linking when implemented\n }\n\n // Configuration ready for Phase 2 implementation\n }\n\n async start(transport: Transport): Promise<void> {\n this.transport = transport;\n this.logger.info('MCP Server: Starting connection...');\n try {\n await this.mcpServer.connect(transport);\n this.logger.info('MCP Server: Connected successfully');\n } catch (error) {\n this.logger.error('MCP Server: Failed to start connection', error);\n throw error;\n }\n }\n\n async stop(): Promise<void> {\n this.logger.info('MCP Server: Stopping connection...');\n try {\n if (this.transport) {\n await this.transport.close();\n }\n await this.mcpServer.close();\n this.logger.info('MCP Server: Stopped successfully');\n } catch (error) {\n this.logger.error('MCP Server: Error during shutdown', error);\n throw error;\n }\n }\n\n // Getter for accessing the underlying MCP server (for testing)\n get server(): McpServer {\n return this.mcpServer;\n }\n\n // Getter for accessing the course database\n get courseDatabase(): CourseDBInterface {\n return this.courseDB;\n }\n}\n","import { z } from 'zod';\nimport type { CourseDBInterface } from '@vue-skuilder/db';\nimport type { CourseResource } from '../types/resources.js';\n\nexport async function handleCourseConfigResource(\n courseDB: CourseDBInterface\n): Promise<CourseResource> {\n try {\n // Get course configuration\n const config = await courseDB.getCourseConfig();\n \n // TODO: Implement proper ELO distribution calculation\n // For now, provide basic structure\n const eloStats = {\n min: 1000,\n max: 2000,\n mean: 1500,\n distribution: [100, 200, 300, 250, 150] // Placeholder histogram\n };\n\n return {\n config,\n eloStats\n };\n } catch (error) {\n throw new Error(`Failed to load course config: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n// URI pattern validation\nexport const CourseConfigUriSchema = z.string().regex(/^course:\\/\\/config$/);\nexport type CourseConfigUri = z.infer<typeof CourseConfigUriSchema>;","import type { CourseDBInterface } from '@vue-skuilder/db';\nimport { z } from 'zod';\nimport { isSuccessRow } from '../utils/index.js';\n\n// Types for card resources\nexport interface CardResourceData {\n cardId: string;\n datashape: string;\n data: any;\n tags: string[];\n elo?: number;\n created?: string;\n modified?: string;\n}\n\nexport interface CardsCollection {\n cards: CardResourceData[];\n total: number;\n page?: number;\n limit?: number;\n filter?: string;\n}\n\n// Schema for ELO range parsing\nconst EloRangeSchema = z.object({\n min: z.number().min(0).max(5000),\n max: z.number().min(0).max(5000)\n}).refine(data => data.min <= data.max, {\n message: \"Min ELO must be less than or equal to max ELO\"\n});\n\n/**\n * Handle cards://all resource - List all cards in the course\n */\nexport async function handleCardsAllResource(\n courseDB: CourseDBInterface,\n limit: number = 50,\n offset: number = 0\n): Promise<CardsCollection> {\n try {\n // Get course info for total count\n const courseInfo = await courseDB.getCourseInfo();\n \n // Get cards using ELO-based query (this gives us all cards sorted by ELO)\n const eloCenteredCards = await courseDB.getCardsByELO(1500, limit + offset);\n \n // Skip offset cards and take limit\n const targetCards = eloCenteredCards.slice(offset, offset + limit);\n \n if (targetCards.length === 0) {\n return {\n cards: [],\n total: courseInfo.cardCount,\n page: Math.floor(offset / limit) + 1,\n limit,\n filter: 'all'\n };\n }\n\n // Get card documents\n const cardDocs = await courseDB.getCourseDocs(targetCards.map(card => card.cardID));\n \n // Get ELO data for these cards \n const eloData = await courseDB.getCardEloData(targetCards.map(card => card.cardID));\n const eloMap = new Map(eloData.map((elo, index) => [targetCards[index], elo.global?.score || 1500]));\n\n // Transform to CardResourceData format\n const cards: CardResourceData[] = [];\n for (const row of cardDocs.rows) {\n if (isSuccessRow(row)) {\n const doc = row.doc;\n cards.push({\n cardId: doc._id,\n datashape: (doc as any).shape?.name || 'unknown',\n data: (doc as any).data || {},\n tags: [], // Will be populated separately if needed\n elo: eloMap.get(doc._id),\n created: (doc as any).created,\n modified: (doc as any).modified\n });\n }\n }\n\n return {\n cards,\n total: courseInfo.cardCount,\n page: Math.floor(offset / limit) + 1,\n limit,\n filter: 'all'\n };\n\n } catch (error) {\n console.error('Error fetching all cards:', error);\n throw new Error(`Failed to fetch cards: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle cards://tag/[tagName] resource - Filter cards by tag\n */\nexport async function handleCardsTagResource(\n courseDB: CourseDBInterface,\n tagName: string,\n limit: number = 50,\n offset: number = 0\n): Promise<CardsCollection> {\n try {\n // Get the tag to validate it exists\n const tag = await courseDB.getTag(tagName);\n if (!tag) {\n throw new Error(`Tag not found: ${tagName}`);\n }\n\n // Note: The current CourseDBInterface doesn't have a direct method to get cards by tag\n // We would need to implement this by querying the tag associations\n // For now, we'll return a placeholder that explains this limitation\n \n return {\n cards: [],\n total: 0,\n page: Math.floor(offset / limit) + 1,\n limit,\n filter: `tag:${tagName}`,\n };\n\n } catch (error) {\n console.error(`Error fetching cards for tag ${tagName}:`, error);\n throw new Error(`Failed to fetch cards for tag ${tagName}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle cards://shape/[shapeName] resource - Filter cards by DataShape\n */\nexport async function handleCardsShapeResource(\n courseDB: CourseDBInterface,\n shapeName: string,\n limit: number = 50,\n offset: number = 0\n): Promise<CardsCollection> {\n try {\n // Validate shape exists in course config\n const courseConfig = await courseDB.getCourseConfig();\n const validShapes = courseConfig.dataShapes.map(ds => ds.name);\n \n if (!validShapes.includes(shapeName)) {\n throw new Error(`DataShape not found: ${shapeName}. Available: ${validShapes.join(', ')}`);\n }\n\n // Note: Direct filtering by DataShape would require a more sophisticated query\n // For now, we'll get all cards and filter in memory (not optimal for large datasets)\n const allCardIds = await courseDB.getCardsByELO(1500, 1000); // Get more cards to filter from\n \n if (allCardIds.length === 0) {\n return {\n cards: [],\n total: 0,\n page: Math.floor(offset / limit) + 1,\n limit,\n filter: `shape:${shapeName}`\n };\n }\n\n // Get card documents to check their shapes\n const cardDocs = await courseDB.getCourseDocs(allCardIds.map(c => c.cardID));\n \n // Filter by shape and collect card IDs\n const filteredCardIds: string[] = [];\n const allFilteredRows: any[] = [];\n \n for (const row of cardDocs.rows) {\n if (isSuccessRow(row) && (row.doc as any).shape?.name === shapeName) {\n allFilteredRows.push(row);\n filteredCardIds.push(row.doc._id);\n }\n }\n \n // Apply pagination to filtered results\n const paginatedRows = allFilteredRows.slice(offset, offset + limit);\n const paginatedCardIds = paginatedRows.map(row => row.doc._id);\n\n // Get ELO data for paginated cards\n const eloData = await courseDB.getCardEloData(paginatedCardIds);\n const eloMap = new Map(eloData.map((elo, index) => [paginatedCardIds[index], elo.global?.score || 1500]));\n\n // Transform to CardResourceData format\n const cards: CardResourceData[] = [];\n for (const row of paginatedRows) {\n if (isSuccessRow(row)) {\n const doc = row.doc;\n cards.push({\n cardId: doc._id,\n datashape: (doc as any).shape?.name || 'unknown',\n data: (doc as any).data || {},\n tags: [],\n elo: eloMap.get(doc._id),\n created: (doc as any).created,\n modified: (doc as any).modified\n });\n }\n }\n\n // Count total filtered cards\n const totalFiltered = filteredCardIds.length;\n\n return {\n cards,\n total: totalFiltered,\n page: Math.floor(offset / limit) + 1,\n limit,\n filter: `shape:${shapeName}`\n };\n\n } catch (error) {\n console.error(`Error fetching cards for shape ${shapeName}:`, error);\n throw new Error(`Failed to fetch cards for shape ${shapeName}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle cards://elo/[min]-[max] resource - Filter cards by ELO range\n */\nexport async function handleCardsEloResource(\n courseDB: CourseDBInterface,\n eloRange: string,\n limit: number = 50,\n offset: number = 0\n): Promise<CardsCollection> {\n try {\n // Parse ELO range (format: \"1200-1800\")\n const [minStr, maxStr] = eloRange.split('-');\n if (!minStr || !maxStr) {\n throw new Error(`Invalid ELO range format: ${eloRange}. Expected format: min-max (e.g., 1200-1800)`);\n }\n\n const parsedRange = EloRangeSchema.parse({\n min: parseInt(minStr, 10),\n max: parseInt(maxStr, 10)\n });\n\n // Get cards around the middle of the ELO range\n const targetElo = Math.floor((parsedRange.min + parsedRange.max) / 2);\n const cards = await courseDB.getCardsByELO(targetElo, 1000); // Get more to filter from\n \n if (cards.length === 0) {\n return {\n cards: [],\n total: 0,\n page: Math.floor(offset / limit) + 1,\n limit,\n filter: `elo:${eloRange}`\n };\n }\n\n // Get ELO data for all cards\n const eloData = await courseDB.getCardEloData(cards.map(c => c.cardID));\n \n // Filter by ELO range\n const filteredEloData = eloData\n .map((elo, index) => ({ elo, cardId: cards[index] }))\n .filter(({ elo }) => {\n const score = elo.global?.score || 1500;\n return score >= parsedRange.min && score <= parsedRange.max;\n });\n\n // Apply pagination\n const paginatedEloData = filteredEloData.slice(offset, offset + limit);\n const paginatedCards = paginatedEloData.map(({ cardId }) => cardId);\n\n if (paginatedCards.length === 0) {\n return {\n cards: [],\n total: filteredEloData.length,\n page: Math.floor(offset / limit) + 1,\n limit,\n filter: `elo:${eloRange}`\n };\n }\n\n // Get card documents\n const cardDocs = await courseDB.getCourseDocs(paginatedCards.map(c => c.cardID));\n const eloMap = new Map(paginatedEloData.map(({ elo, cardId }) => [cardId, elo.global?.score || 1500]));\n\n // Transform to CardResourceData format\n const cardsData: CardResourceData[] = [];\n for (const row of cardDocs.rows) {\n if (isSuccessRow(row)) {\n const doc = row.doc;\n cardsData.push({\n cardId: doc._id,\n datashape: (doc as any).shape?.name || 'unknown',\n data: (doc as any).data || {},\n tags: [],\n elo: eloMap.get(doc._id),\n created: (doc as any).created,\n modified: (doc as any).modified\n });\n }\n }\n\n return {\n cards: cardsData,\n total: filteredEloData.length,\n page: Math.floor(offset / limit) + 1,\n limit,\n filter: `elo:${eloRange}`\n };\n\n } catch (error) {\n console.error(`Error fetching cards for ELO range ${eloRange}:`, error);\n throw new Error(`Failed to fetch cards for ELO range ${eloRange}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}","/**\n * Type guard for successful PouchDB rows\n * Filters out error rows and ensures doc property exists\n */\nexport function isSuccessRow<T = any>(row: any): row is { doc: NonNullable<T>; id: string; key: string; value: any } {\n return row.doc != null && !('error' in row);\n}\n\n/**\n * Safely extracts documents from PouchDB AllDocsResponse\n * Returns only successful rows with valid documents\n */\nexport function extractSuccessfulDocs<T>(rows: any[]): T[] {\n const docs: T[] = [];\n for (const row of rows) {\n if (isSuccessRow(row)) {\n docs.push(row.doc);\n }\n }\n return docs;\n}\n\n/**\n * Safely filters and maps PouchDB rows with type safety\n */\nexport function filterAndMapDocs<T, R>(\n rows: any[],\n filterFn: (doc: T) => boolean,\n mapFn: (doc: T) => R\n): R[] {\n const results: R[] = [];\n for (const row of rows) {\n if (isSuccessRow(row)) {\n const doc = row.doc as T;\n if (filterFn(doc)) {\n results.push(mapFn(doc));\n }\n }\n }\n return results;\n}","import { z } from 'zod';\n\n// Shared constants\nexport const MCP_AGENT_AUTHOR = 'mcp-agent';\n\n// Common error handling utility\nexport function handleToolError(error: unknown, context: string): never {\n if (error instanceof z.ZodError) {\n throw new Error(`Invalid input: ${error.errors.map(e => e.message).join(', ')}`);\n }\n \n const message = error instanceof Error ? error.message : 'Unknown error';\n console.error(`Error in ${context}:`, error);\n throw new Error(`${context} failed: ${message}`);\n}\n\n// Logging utilities\nexport function logToolStart(toolName: string, input: any): void {\n console.log(`[${toolName}] Starting with input:`, JSON.stringify(input, null, 2));\n}\n\nexport function logToolSuccess(toolName: string, result: any): void {\n console.log(`[${toolName}] Completed successfully:`, JSON.stringify(result, null, 2));\n}\n\nexport function logToolWarning(toolName: string, message: string, details?: any): void {\n console.warn(`[${toolName}] Warning: ${message}`, details || '');\n}\n\nexport function logToolError(toolName: string, message: string, error?: any): void {\n console.error(`[${toolName}] Error: ${message}`, error || '');\n}","import type { CourseDBInterface } from '@vue-skuilder/db';\nimport { isSuccessRow } from '../utils/index.js';\n\nexport interface ShapeResource {\n name: string;\n description?: string;\n schema: any; // The serialized Zod schema as JSON - this is what create_card validates against\n category?: string;\n examples?: any[];\n}\n\nexport interface ShapesCollection {\n shapes: ShapeResource[];\n total: number;\n availableShapes: string[];\n}\n\n/**\n * Handle shapes://all resource - List all available DataShapes for this course\n */\nexport async function handleShapesAllResource(\n courseDB: CourseDBInterface\n): Promise<ShapesCollection> {\n try {\n // Get course-specific DataShapes from the course configuration\n const config = await courseDB.getCourseConfig();\n const dataShapes = config.dataShapes || [];\n\n // Transform DataShapes to ShapeResource format\n const shapes: ShapeResource[] = dataShapes.map((shape) => {\n // Parse the serialized Zod schema if available\n let schema: any = null;\n if (shape.serializedZodSchema) {\n try {\n schema = JSON.parse(shape.serializedZodSchema);\n } catch (error) {\n console.warn(`Failed to parse schema for ${shape.name}:`, error);\n schema = { error: 'Failed to parse schema' };\n }\n }\n\n return {\n name: shape.name,\n description: `DataShape for ${shape.name} content type`,\n schema, // Return the actual JSON schema that create_card validates against\n category: 'course-content',\n examples: [], // Could be populated with example cards\n };\n });\n\n const availableShapes = dataShapes.map((shape) => shape.name);\n\n return {\n shapes,\n total: shapes.length,\n availableShapes,\n };\n } catch (error) {\n console.error('Error fetching all shapes:', error);\n throw new Error(\n `Failed to fetch shapes: ${error instanceof Error ? error.message : `Unknown error: ${JSON.stringify(error)}`}`\n );\n }\n}\n\n/**\n * Handle shapes://[shapeName] resource - Get specific DataShape definition for this course\n */\nexport async function handleShapeSpecificResource(\n courseDB: CourseDBInterface,\n shapeName: string\n): Promise<ShapeResource> {\n try {\n // Get course-specific DataShapes from the course configuration\n const config = await courseDB.getCourseConfig();\n const dataShapes = config.dataShapes || [];\n\n // Find the specific shape\n const targetShape = dataShapes.find((shape) => shape.name === shapeName);\n if (!targetShape) {\n const availableShapes = dataShapes.map((s) => s.name);\n throw new Error(\n `DataShape not found: ${shapeName}. Available shapes: ${availableShapes.join(', ')}`\n );\n }\n\n // Parse the serialized Zod schema\n let schema: any = null;\n if (targetShape.serializedZodSchema) {\n try {\n schema = JSON.parse(targetShape.serializedZodSchema);\n } catch (error) {\n console.warn(`Failed to parse schema for ${shapeName}:`, error);\n schema = { error: 'Failed to parse schema' };\n }\n }\n\n // Get examples by finding cards that use this shape\n let examples: any[] = [];\n try {\n // Get a few cards that use this shape to provide examples\n const cards = await courseDB.getCardsByELO(1500, 10); // Get some sample cards\n if (cards.length > 0) {\n const cardDocs = await courseDB.getCourseDocs(cards.map(c=>c.cardID).slice(0, 5)); // Limit to 5 examples\n examples = [];\n for (const row of cardDocs.rows) {\n if (isSuccessRow(row) && (row.doc as any).shape?.name === shapeName) {\n const data = (row.doc as any)?.data;\n if (data) {\n examples.push(data);\n if (examples.length >= 3) break; // Max 3 examples\n }\n }\n }\n }\n } catch (error) {\n console.warn('Could not fetch examples for shape:', error);\n // Continue without examples\n }\n\n return {\n name: targetShape.name,\n description: `DataShape definition for ${targetShape.name} content type`,\n schema, // Return the actual JSON schema that create_card validates against\n category: 'course-content',\n examples,\n };\n } catch (error) {\n console.error(`Error fetching shape ${shapeName}:`, error);\n throw new Error(\n `Failed to fetch shape ${shapeName}: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n}\n","import type { CourseDBInterface } from '@vue-skuilder/db';\n\nexport interface TagResource {\n name: string;\n description?: string;\n cardCount: number;\n cardIds: string[];\n created?: string;\n author?: string;\n metadata?: any;\n}\n\nexport interface TagsCollection {\n tags: TagResource[];\n total: number;\n stats?: {\n totalTags: number;\n totalTaggedCards: number;\n averageTagsPerCard: number;\n mostUsedTags: { name: string; count: number }[];\n };\n}\n\nexport interface TagDistribution {\n tagName: string;\n frequency: number;\n percentage: number;\n cardIds: string[];\n}\n\n/**\n * Handle tags://all resource - List all available tags\n */\nexport async function handleTagsAllResource(\n courseDB: CourseDBInterface\n): Promise<TagsCollection> {\n try {\n // Get all tag stubs for the course\n const tagStubsResponse = await courseDB.getCourseTagStubs();\n const tagStubs = tagStubsResponse.rows || [];\n\n // Transform to TagResource format\n const tags: TagResource[] = [];\n for (const stub of tagStubs) {\n if (stub.doc) {\n tags.push({\n name: (stub.doc as any).name || stub.id,\n description: (stub.doc as any).snippet || `Tag: ${(stub.doc as any).name}`,\n cardCount: (stub.doc as any).taggedCards?.length || 0,\n cardIds: [], // stub does not contain cardIDs\n created: (stub.doc as any).created,\n author: (stub.doc as any).author,\n metadata: (stub.doc as any).metadata\n });\n }\n }\n\n return {\n tags,\n total: tags.length,\n stats: {\n totalTags: tags.length,\n totalTaggedCards: 0, // Would need additional queries\n averageTagsPerCard: 0, // Would need calculation\n mostUsedTags: [] // Would need tag usage analysis\n }\n };\n\n } catch (error) {\n console.error('Error fetching all tags:', error);\n throw new Error(`Failed to fetch tags: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle tags://stats resource - Tag usage statistics\n */\nexport async function handleTagsStatsResource(\n courseDB: CourseDBInterface\n): Promise<TagsCollection['stats']> {\n try {\n // Get all tags\n const tagStubsResponse = await courseDB.getCourseTagStubs();\n const totalTags = tagStubsResponse.rows?.length || 0;\n\n // Get course info for context \n const courseInfo = await courseDB.getCourseInfo();\n console.log('Course info loaded for stats:', courseInfo.cardCount);\n\n // Note: Comprehensive tag statistics would require additional methods\n // in CourseDBInterface to efficiently query tag-card associations\n return {\n totalTags,\n totalTaggedCards: 0, // Placeholder\n averageTagsPerCard: 0, // Placeholder\n mostUsedTags: [] // Placeholder\n };\n\n } catch (error) {\n console.error('Error fetching tag stats:', error);\n throw new Error(`Failed to fetch tag statistics: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle tags://[tagName] resource - Specific tag details + card count\n */\nexport async function handleTagSpecificResource(\n courseDB: CourseDBInterface,\n tagName: string\n): Promise<TagResource> {\n try {\n // Get the specific tag\n const tag = await courseDB.getTag(tagName);\n if (!tag) {\n throw new Error(`Tag not found: ${tagName}`);\n }\n\n return {\n name: (tag as any).name || tagName,\n description: (tag as any).snippet || `Tag: ${tagName}`,\n cardCount: (tag as any).taggedCards?.length || 0,\n cardIds: (tag as any).taggedCards || [],\n created: (tag as any).created,\n author: (tag as any).author,\n metadata: (tag as any).metadata\n };\n\n } catch (error) {\n console.error(`Error fetching tag ${tagName}:`, error);\n throw new Error(`Failed to fetch tag ${tagName}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle tags://union/[tag1]+[tag2] resource - Cards with ANY of these tags\n */\nexport async function handleTagsUnionResource(\n courseDB: CourseDBInterface,\n tagsParam: string\n): Promise<{ cardIds: string[]; tags: string[]; operation: 'union' }> {\n try {\n const tags = tagsParam.split('+').map(tag => tag.trim());\n \n if (tags.length === 0) {\n throw new Error('No tags specified for union operation');\n }\n\n // Validate all tags exist\n for (const tagName of tags) {\n try {\n await courseDB.getTag(tagName);\n } catch {\n throw new Error(`Tag not found: ${tagName}`);\n }\n }\n\n // Note: Union operation would require specialized queries\n // Current CourseDBInterface doesn't provide tag-based card filtering\n return {\n cardIds: [], // Placeholder\n tags,\n operation: 'union'\n };\n\n } catch (error) {\n console.error(`Error performing tags union for ${tagsParam}:`, error);\n throw new Error(`Failed to perform tags union: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle tags://intersect/[tag1]+[tag2] resource - Cards with ALL these tags\n */\nexport async function handleTagsIntersectResource(\n courseDB: CourseDBInterface,\n tagsParam: string\n): Promise<{ cardIds: string[]; tags: string[]; operation: 'intersect' }> {\n try {\n const tags = tagsParam.split('+').map(tag => tag.trim());\n \n if (tags.length === 0) {\n throw new Error('No tags specified for intersect operation');\n }\n\n // Validate all tags exist\n for (const tagName of tags) {\n try {\n await courseDB.getTag(tagName);\n } catch {\n throw new Error(`Tag not found: ${tagName}`);\n }\n }\n\n // Note: Intersect operation would require specialized queries\n return {\n cardIds: [], // Placeholder\n tags,\n operation: 'intersect'\n };\n\n } catch (error) {\n console.error(`Error performing tags intersect for ${tagsParam}:`, error);\n throw new Error(`Failed to perform tags intersect: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle tags://exclusive/[tag1]-[tag2] resource - Cards with tag1 but NOT tag2\n */\nexport async function handleTagsExclusiveResource(\n courseDB: CourseDBInterface,\n tagsParam: string\n): Promise<{ cardIds: string[]; includeTag: string; excludeTag: string; operation: 'exclusive' }> {\n try {\n const [includeTag, excludeTag] = tagsParam.split('-').map(tag => tag.trim());\n \n if (!includeTag || !excludeTag) {\n throw new Error('Both include and exclude tags must be specified (format: tag1-tag2)');\n }\n\n // Validate both tags exist\n try {\n await courseDB.getTag(includeTag);\n await courseDB.getTag(excludeTag);\n } catch (error) {\n throw new Error(`One or both tags not found: ${includeTag}, ${excludeTag}`);\n }\n\n // Note: Exclusive operation would require specialized queries\n return {\n cardIds: [], // Placeholder\n includeTag,\n excludeTag,\n operation: 'exclusive'\n };\n\n } catch (error) {\n console.error(`Error performing tags exclusive for ${tagsParam}:`, error);\n throw new Error(`Failed to perform tags exclusive: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}\n\n/**\n * Handle tags://distribution resource - Tag frequency distribution\n */\nexport async function handleTagsDistributionResource(\n courseDB: CourseDBInterface\n): Promise<{ distribution: TagDistribution[]; totalTags: number; totalCards: number }> {\n try {\n // Get all tags\n const tagStubsResponse = await courseDB.getCourseTagStubs();\n const tags = tagStubsResponse.rows || [];\n \n // Get course info\n const courseInfo = await courseDB.getCourseInfo();\n\n // Note: Full distribution analysis would require additional queries\n // to map tags to cards and calculate frequencies\n const distribution: TagDistribution[] = tags.map(stub => ({\n tagName: stub.doc?.name || stub.id,\n frequency: 0, // Placeholder\n percentage: 0, // Placeholder\n cardIds: [] // Placeholder\n }));\n\n return {\n distribution,\n totalTags: tags.length,\n totalCards: courseInfo.cardCount\n };\n\n } catch (error) {\n console.error('Error calculating tag distribution:', error);\n throw new Error(`Failed to calculate tag distribution: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n}","import { CourseDBInterface } from '@vue-skuilder/db';\n\n/**\n * Schema resource response structure\n */\nexport interface SchemaResource {\n dataShapeName: string;\n jsonSchema: object;\n schemaString: string;\n available: boolean;\n lastUpdated?: string;\n}\n\n/**\n * Handle schema resource request for a specific DataShape\n * Returns the JSON Schema for the DataShape if available\n */\nexport async function handleSchemaResource(\n _courseDB: CourseDBInterface,\n dataShapeName: string\n): Promise<SchemaResource> {\n // Import DataShapes from courseware backend (avoids Vue dependencies)\n const { getAllDataShapesRaw } = await import('@vue-skuilder/courseware/backend');\n const dataShapes = getAllDataShapesRaw();\n \n // Find the DataShape\n const dataShape = dataShapes.find(ds => ds.name === dataShapeName);\n \n if (!dataShape) {\n return {\n dataShapeName,\n jsonSchema: {},\n schemaString: '',\n available: false,\n };\n }\n\n // Generate JSON Schema from DataShape fields\n const jsonSchema = {\n type: 'object',\n properties: {} as any,\n required: [] as string[],\n title: dataShape.name,\n };\n\n if (dataShape.fields) {\n for (const field of dataShape.fields) {\n // Map Vue-Skuilder field types to JSON Schema types\n const jsonType = field.type === 'int' ? 'integer' : 'string';\n \n let description: string = '';\n \n if (field.validator) {\n description += `Instructions: ${field.validator.instructions}\\t`,\n description += `Placeholder: ${field.validator.placeholder}`\n } else {\n description = `Field ${field.name} (${field.type})`\n }\n \n jsonSchema.properties[field.name] = {\n type: jsonType,\n description\n };\n \n jsonSchema.required.push(field.name);\n }\n }\n\n return {\n dataShapeName,\n jsonSchema,\n schemaString: JSON.stringify(jsonSchema, null, 2),\n available: true,\n };\n}","// Resource registry and exports\nexport * from './course.js';\nexport * from './cards.js';\nexport * from './shapes.js';\nexport * from './tags.js';\nexport * from './schema.js';\n\n// Resource URI patterns\nexport const RESOURCE_PATTERNS = {\n COURSE_CONFIG: 'course://config',\n CARDS_ALL: 'cards://all',\n CARDS_TAG: 'cards://tag/{tagName}',\n CARDS_SHAPE: 'cards://shape/{shapeName}',\n CARDS_ELO: 'cards://elo/{eloRange}',\n SHAPES_ALL: 'shapes://all',\n SHAPES_SPECIFIC: 'shapes://{shapeName}',\n TAGS_ALL: 'tags://all',\n TAGS_STATS: 'tags://stats',\n TAGS_SPECIFIC: 'tags://{tagName}',\n TAGS_UNION: 'tags://union/{tags}',\n TAGS_INTERSECT: 'tags://intersect/{tags}',\n TAGS_EXCLUSIVE: 'tags://exclusive/{tags}',\n TAGS_DISTRIBUTION: 'tags://distribution',\n SCHEMA_SPECIFIC: 'schema://{dataShapeName}',\n} as const;","import { z } from 'zod';\n\n// Tool input/output schema\n\n// Plain object schemas for MCP SDK compatibility\nexport const CreateCardInputMCPSchema = {\n datashape: z.string(),\n data: z.any(),\n tags: z.array(z.string()).optional(),\n elo: z.number().optional(),\n sourceRef: z.string().optional(),\n};\n\n// Zod schemas for runtime validation\nexport const CreateCardInputSchema = z.object(CreateCardInputMCPSchema);\n\nexport type CreateCardInput = z.infer<typeof CreateCardInputSchema>;\n\nexport interface CreateCardOutput {\n cardId: string;\n initialElo: number;\n created: boolean;\n}\n\nexport const UpdateCardInputMCPSchema = {\n cardId: z.string(),\n data: z.any().optional(),\n tags: z.array(z.string()).optional(),\n elo: z.number().optional(),\n sourceRef: z.string().optional(),\n};\n// Update Card Tool\nexport const UpdateCardInputSchema = z.object(UpdateCardInputMCPSchema);\n\nexport type UpdateCardInput = z.infer<typeof UpdateCardInputSchema>;\n\nexport interface UpdateCardOutput {\n cardId: string;\n updated: boolean;\n changes: {\n data?: boolean;\n tags?: boolean;\n elo?: boolean;\n sourceRef?: boolean;\n };\n}\n\nexport const TagCardInputMCPSchema = {\n cardId: z.string(),\n action: z.enum(['add', 'remove']),\n tags: z.array(z.string()),\n updateELO: z.boolean().optional().default(false),\n};\n\n// Tag Card Tool\nexport const TagCardInputSchema = z.object(TagCardInputMCPSchema);\n\nexport type TagCardInput = z.infer<typeof TagCardInputSchema>;\n\nexport interface TagCardOutput {\n cardId: string;\n action: string;\n tagsProcessed: string[];\n success: boolean;\n currentTags: string[];\n}\n\nexport const DeleteCardInputMCPSchema = {\n cardId: z.string(),\n confirm: z.boolean().default(false),\n reason: z.string().optional(),\n};\n\n// Delete Card Tool\nexport const DeleteCardInputSchema = z.object(DeleteCardInputMCPSchema);\n\nexport type DeleteCardInput = z.infer<typeof DeleteCardInputSchema>;\n\nexport interface DeleteCardOutput {\n cardId: string;\n deleted: boolean;\n message: string;\n}\n","import type { CourseDBInterface } from '@vue-skuilder/db';\nimport {\n CreateCardInputSchema,\n type CreateCardInput,\n type CreateCardOutput,\n} from '../types/tools.js';\nimport { toCourseElo, NameSpacer, FieldType, type DataShape, type FieldDefinition } from '@vue-skuilder/common';\nimport {\n MCP_AGENT_AUTHOR,\n handleToolError,\n logToolStart,\n logToolSuccess,\n logToolWarning,\n} from '../utils/index.js';\n\n/**\n * Reconstructs a minimal DataShape from course config's serialized JSON Schema\n * Only extracts field names and types - no validators or custom logic\n */\nfunction reconstructDataShapeFromConfig(\n dataShapeName: string,\n serializedSchema: string\n): DataShape {\n const jsonSchema = JSON.parse(serializedSchema);\n const fields: FieldDefinition[] = [];\n\n if (jsonSchema.properties) {\n for (const [fieldName, fieldSchema] of Object.entries(jsonSchema.properties)) {\n const schema = fieldSchema as any;\n\n // Map JSON Schema types to FieldType enum\n let fieldType: FieldType = FieldType.STRING; // default\n\n if (schema.type === 'string') {\n if (schema.contentEncoding === 'base64' || fieldName.toLowerCase().includes('image')) {\n fieldType = FieldType.IMAGE;\n } else if (fieldName.toLowerCase().includes('audio')) {\n fieldType = FieldType.AUDIO;\n } else if (schema.description?.includes('Markdown') || schema.description?.includes('markdown')) {\n fieldType = FieldType.MARKDOWN;\n } else {\n fieldType = FieldType.STRING;\n }\n } else if (schema.type === 'number') {\n fieldType = FieldType.NUMBER;\n } else if (schema.type === 'integer') {\n fieldType = FieldType.INT;\n } else if (schema.type === 'array') {\n // Check if it's uploads/media\n if (fieldName === 'Uploads' || fieldName.toLowerCase().includes('upload')) {\n fieldType = FieldType.MEDIA_UPLOADS;\n }\n }\n\n fields.push({\n name: fieldName,\n type: fieldType,\n });\n }\n }\n\n return {\n name: dataShapeName as any, // Cast to DataShapeName - it's just a string at runtime\n fields,\n };\n}\n\nexport async function handleCreateCard(\n courseDB: CourseDBInterface,\n input: CreateCardInput\n): Promise<CreateCardOutput> {\n const TOOL_NAME = 'create_card';\n\n try {\n // Validate input and log start\n const validatedInput = CreateCardInputSchema.parse(input);\n\n // Fix: Claude Code's MCP client sends data as a JSON string instead of an object\n // Parse it if it's a string\n if (typeof validatedInput.data === 'string') {\n try {\n validatedInput.data = JSON.parse(validatedInput.data);\n } catch (e) {\n throw new Error(`Invalid JSON in data parameter: ${e instanceof Error ? e.message : String(e)}`);\n }\n }\n\n logToolStart(TOOL_NAME, validatedInput);\n\n // Get course config to validate datashape\n const courseConfig = await courseDB.getCourseConfig();\n const availableDataShapes = courseConfig.dataShapes.map((ds) => ds.name);\n\n if (!availableDataShapes.includes(validatedInput.datashape)) {\n const errorMsg = `Invalid datashape: ${validatedInput.datashape}. Available: ${availableDataShapes.join(', ')}`;\n logToolWarning(TOOL_NAME, errorMsg);\n throw new Error(errorMsg);\n }\n\n // Extract courseware name and local datashape name from fully-qualified name\n let shapeDescriptor: any;\n try {\n shapeDescriptor = NameSpacer.getDataShapeDescriptor(validatedInput.datashape);\n } catch (error) {\n const errorMsg = `Malformed datashape name: ${validatedInput.datashape}. Expected format: course.datashape.name`;\n logToolWarning(TOOL_NAME, errorMsg);\n throw new Error(errorMsg);\n }\n\n // Get the DataShape definition from course config\n const matchingDataShape = courseConfig.dataShapes.find(\n (ds) => ds.name === validatedInput.datashape\n );\n if (!matchingDataShape) {\n const errorMsg = `DataShape not found in course configuration: ${validatedInput.datashape}`;\n logToolWarning(TOOL_NAME, errorMsg);\n throw new Error(errorMsg);\n }\n\n // Reconstruct DataShape from course config's serialized schema\n // This bypasses the need for runtime courseware loading - we only need\n // field names and types, which we can derive from the JSON Schema\n const dataShape = reconstructDataShapeFromConfig(\n shapeDescriptor.dataShape,\n matchingDataShape.serializedZodSchema!\n );\n\n logToolStart(\n TOOL_NAME,\n `Using DataShape with ${dataShape.fields.length} fields (reconstructed from course config)`\n );\n\n // Create the card via courseDB\n const result = await courseDB.addNote(\n shapeDescriptor.course, // Use courseware name, not courseID\n dataShape,\n validatedInput.data,\n MCP_AGENT_AUTHOR,\n validatedInput.tags || [],\n undefined, // No uploads for now\n validatedInput.elo ? toCourseElo(validatedInput.elo) : undefined\n );\n\n if (result.status !== 'ok') {\n const errorMsg = `Failed to create card: ${result.message || 'Unknown error'}`;\n throw new Error(errorMsg);\n }\n\n // Extract initial ELO from result or use default\n const initialElo = validatedInput.elo || 1500;\n\n const output = {\n cardId: result.id || 'unknown',\n initialElo,\n created: true,\n };\n\n logToolSuccess(TOOL_NAME, output);\n return output;\n } catch (error) {\n handleToolError(error, TOOL_NAME);\n }\n}\n","import type { CourseDBInterface } from '@vue-skuilder/db';\nimport { UpdateCardInputSchema, type UpdateCardInput, type UpdateCardOutput } from '../types/tools.js';\nimport { toCourseElo } from '@vue-skuilder/common';\nimport { MCP_AGENT_AUTHOR, handleToolError, logToolStart, logToolSuccess, logToolWarning } from '../utils/index.js';\n\nexport async function handleUpdateCard(\n courseDB: CourseDBInterface,\n input: UpdateCardInput\n): Promise<UpdateCardOutput> {\n const TOOL_NAME = 'update_card';\n \n try {\n // Validate input and log start\n const validatedInput = UpdateCardInputSchema.parse(input);\n logToolStart(TOOL_NAME, validatedInput);\n \n // Track what changes were made\n const changes = {\n data: false,\n tags: false,\n elo: false,\n sourceRef: false\n };\n\n // Verify the card exists\n try {\n await courseDB.getCourseDoc(validatedInput.cardId);\n } catch (error) {\n throw new Error(`Card not found: ${validatedInput.cardId}`);\n }\n\n // Update ELO if provided\n if (validatedInput.elo !== undefined) {\n try {\n const courseElo = toCourseElo(validatedInput.elo);\n await courseDB.updateCardElo(validatedInput.cardId, courseElo);\n changes.elo = true;\n } catch (error) {\n logToolWarning(TOOL_NAME, `Failed to update ELO for card ${validatedInput.cardId}`, error);\n throw new Error(`Failed to update ELO: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n // Update tags if provided\n if (validatedInput.tags !== undefined) {\n try {\n // Get current tags to determine what needs to be added/removed\n const currentTagsResponse = await courseDB.getAppliedTags(validatedInput.cardId);\n const currentTagNames = currentTagsResponse.rows.map(row => row.doc?.name).filter(Boolean) as string[];\n \n const newTags = validatedInput.tags;\n const tagsToAdd = newTags.filter(tag => !currentTagNames.includes(tag));\n const tagsToRemove = currentTagNames.filter(tag => !newTags.includes(tag));\n\n // Add new tags\n for (const tagName of tagsToAdd) {\n try {\n // Check if tag exists, if not create it\n try {\n await courseDB.getTag(tagName);\n } catch {\n // Tag doesn't exist, create it\n await courseDB.createTag(tagName, MCP_AGENT_AUTHOR);\n }\n \n await courseDB.addTagToCard(validatedInput.cardId, tagName);\n } catch (error) {\n logToolWarning(TOOL_NAME, `Failed to add tag ${tagName} to card`, error);\n // Continue with other tags\n }\n }\n\n // Remove old tags\n for (const tagName of tagsToRemove) {\n try {\n await courseDB.removeTagFromCard(validatedInput.cardId, tagName);\n } catch (error) {\n logToolWarning(TOOL_NAME, `Failed to remove tag ${tagName} from card`, error);\n // Continue with other tags\n }\n }\n\n if (tagsToAdd.length > 0 || tagsToRemove.length > 0) {\n changes.tags = true;\n }\n } catch (error) {\n logToolWarning(TOOL_NAME, `Failed to update tags for card ${validatedInput.cardId}`, error);\n throw new Error(`Failed to update tags: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n // Update data and sourceRef if provided\n // Note: CourseDBInterface doesn't have direct methods for updating card data\n // This would require more complex PouchDB operations\n if (validatedInput.data !== undefined || validatedInput.sourceRef !== undefined) {\n logToolWarning(TOOL_NAME, 'Data and sourceRef updates are not yet implemented - require direct PouchDB operations');\n // TODO: Implement direct document updates for data and sourceRef\n // For now, we'll skip these updates but note them in the response\n }\n\n const updated = changes.elo || changes.tags || changes.data || changes.sourceRef;\n\n const output = {\n cardId: validatedInput.cardId,\n updated,\n changes\n };\n \n logToolSuccess(TOOL_NAME, output);\n return output;\n\n } catch (error) {\n handleToolError(error, TOOL_NAME);\n }\n}","import type { CourseDBInterface } from '@vue-skuilder/db';\nimport { TagCardInputSchema, type TagCardInput, type TagCardOutput } from '../types/tools.js';\nimport { MCP_AGENT_AUTHOR, handleToolError, logToolStart, logToolSuccess, logToolWarning } from '../utils/index.js';\n\nexport async function handleTagCard(\n courseDB: CourseDBInterface,\n input: TagCardInput\n): Promise<TagCardOutput> {\n const TOOL_NAME = 'tag_card';\n \n try {\n // Validate input and log start\n const validatedInput = TagCardInputSchema.parse(input);\n logToolStart(TOOL_NAME, validatedInput);\n \n // Verify the card exists\n try {\n await courseDB.getCourseDoc(validatedInput.cardId);\n } catch (error) {\n throw new Error(`Card not found: ${validatedInput.cardId}`);\n }\n\n const tagsProcessed: string[] = [];\n let success = true;\n \n // Process each tag\n for (const tagName of validatedInput.tags) {\n try {\n if (validatedInput.action === 'add') {\n // Check if tag exists, if not create it\n try {\n await courseDB.getTag(tagName);\n } catch {\n // Tag doesn't exist, create it\n await courseDB.createTag(tagName, MCP_AGENT_AUTHOR);\n }\n \n // Add tag to card\n await courseDB.addTagToCard(\n validatedInput.cardId, \n tagName, \n validatedInput.updateELO\n );\n tagsProcessed.push(tagName);\n \n } else if (validatedInput.action === 'remove') {\n // Remove tag from card\n await courseDB.removeTagFromCard(validatedInput.cardId, tagName);\n tagsProcessed.push(tagName);\n }\n } catch (error) {\n logToolWarning(TOOL_NAME, `Failed to ${validatedInput.action} tag ${tagName}`, error);\n success = false;\n // Continue with other tags\n }\n }\n\n // Get current tags to return in response\n let currentTags: string[] = [];\n try {\n const currentTagsResponse = await courseDB.getAppliedTags(validatedInput.cardId);\n currentTags = currentTagsResponse.rows\n .map(row => row.doc?.name)\n .filter(Boolean) as string[];\n } catch (error) {\n logToolWarning(TOOL_NAME, 'Failed to fetch current tags', error);\n }\n\n const output = {\n cardId: validatedInput.cardId,\n action: validatedInput.action,\n tagsProcessed,\n success: success && tagsProcessed.length === validatedInput.tags.length,\n currentTags\n };\n \n logToolSuccess(TOOL_NAME, output);\n return output;\n\n } catch (error) {\n handleToolError(error, TOOL_NAME);\n }\n}","import type { CourseDBInterface } from '@vue-skuilder/db';\nimport { DeleteCardInputSchema, type DeleteCardInput, type DeleteCardOutput } from '../types/tools.js';\nimport { handleToolError, logToolStart, logToolSuccess, logToolWarning, logToolError } from '../utils/index.js';\n\nexport async function handleDeleteCard(\n courseDB: CourseDBInterface,\n input: DeleteCardInput\n): Promise<DeleteCardOutput> {\n const TOOL_NAME = 'delete_card';\n \n try {\n // Validate input and log start\n const validatedInput = DeleteCardInputSchema.parse(input);\n logToolStart(TOOL_NAME, validatedInput);\n \n // Safety check: require explicit confirmation\n if (!validatedInput.confirm) {\n return {\n cardId: validatedInput.cardId,\n deleted: false,\n message: 'Card deletion requires explicit confirmation. Set confirm: true to proceed.'\n };\n }\n\n // Verify the card exists before attempting deletion\n let cardExists = true;\n try {\n await courseDB.getCourseDoc(validatedInput.cardId);\n } catch (error) {\n cardExists = false;\n }\n\n if (!cardExists) {\n return {\n cardId: validatedInput.cardId,\n deleted: false,\n message: `Card not found: ${validatedInput.cardId}`\n };\n }\n\n // Get card information before deletion for logging\n let cardInfo = '';\n try {\n const cardDoc = await courseDB.getCourseDoc(validatedInput.cardId);\n const cardData = cardDoc as any;\n cardInfo = `Card: ${cardData.shape?.name || 'unknown shape'}`;\n } catch (error) {\n logToolWarning(TOOL_NAME, 'Could not fetch card info before deletion', error);\n }\n\n // Attempt to delete the card\n try {\n const result = await courseDB.removeCard(validatedInput.cardId);\n \n if (result.ok) {\n const reason = validatedInput.reason ? ` Reason: ${validatedInput.reason}` : '';\n const message = `Card successfully deleted. ${cardInfo}${reason}`;\n \n logToolSuccess(TOOL_NAME, `Card deleted: ${validatedInput.cardId}${reason}`);\n \n return {\n cardId: validatedInput.cardId,\n deleted: true,\n message\n };\n } else {\n return {\n cardId: validatedInput.cardId,\n deleted: false,\n message: `Failed to delete card: ${result.rev || 'Unknown error'}`\n };\n }\n } catch (error) {\n logToolError(TOOL_NAME, `Error deleting card ${validatedInput.cardId}`, error);\n return {\n cardId: validatedInput.cardId,\n deleted: false,\n message: `Failed to delete card: ${error instanceof Error ? error.message : 'Unknown error'}`\n };\n }\n\n } catch (error) {\n handleToolError(error, TOOL_NAME);\n }\n}","// Tools registry and exports\nexport * from './create-card.js';\nexport * from './update-card.js';\nexport * from './tag-card.js';\nexport * from './delete-card.js';\n\n// Tool patterns\nexport const TOOL_PATTERNS = {\n CREATE_CARD: 'create_card',\n UPDATE_CARD: 'update_card',\n TAG_CARD: 'tag_card',\n DELETE_CARD: 'delete_card',\n} as const;","/* eslint-disable max-len */\nexport function createFillInCardAuthoringPrompt(): string {\n return `# GUIDE: Authoring \"fillIn\" type Flashcards\n\nThis guide provides the technical specifications for authoring a \"fillIn\" type flashcard for the Vue-Skuilder platform. When you need to create a new card, you should use the 'create_card' tool and format the content as described below.\n\n## 1. Tool: 'create_card'\n\nYou should call the 'create_card' tool with the following parameters:\n\n- 'datashape': Must be 'fillIn'.\n- 'data': A markdown string containing the question and the interactive '{{...}}' elements.\n- 'tags': (Optional) An array of strings for tagging, e.g., ['go', 'concurrency'].\n- 'elo': (Optional) An integer representing the estimated difficulty (e.g., 1250).\n\n**IMPORTANT**: Do NOT include 'tags:' or 'elo:' information inside the 'data' string itself. These are tool parameters.\n\n## 2. Content Formatting ('data' parameter)\n\nThe 'data' string is composed of a question and special interactive elements using '{{...}}' syntax.\n\n### A. Simple Fill-in-the-Blank\n- For a single correct answer.\n- **Syntax**: '{{answer}}'\n- **Example**: 'The capital of France is {{Paris}}.'\n\n### B. Fill-in-the-Blank with Alternatives\n- For when multiple text inputs are acceptable for the same blank.\n- **Syntax**: '{{answer1|answer2}}'\n- **Example**: 'A common way to declare a variable in JavaScript that can be reassigned is using the {{let|var}} keyword.'\n\n### C. Multiple Choice\n- For presenting a question with several options.\n- **Syntax**: '{{correct_answer1|correct_answer2||distractor1|distractor2|distractor3|...}}'\n- **Details**:\n - List one or more correct answers first, separated by '|'.\n - Use a double pipe '||' to separate correct answers from distractors.\n - List one or more incorrect answers (distractors) after the '||', separated by '|'.\n - **Many distractors can be added** - the rendering layer will limit runtime display to a maximum of 5 rendered distractors.\n - **Front-load the most relevant distractors** - they will be weighted more favorably in selection.\n- **Example (Single Correct)**: 'What is the main gas found in the air we breathe? {{Nitrogen||Oxygen|Carbon Dioxide|Hydrogen}}'\n- **Example (Multiple Correct)**: 'Which of the following are primary colors? {{Red|Blue|Yellow||Green|Orange|Purple}}' (The system will pick one correct answer to display with the distractors).\n- **Example (Many Distractors)**: 'Which letter comes after M in the alphabet? {{N||O|L|P|Q|R|S|T|U|V|W|X|Y|Z|A|B|C|D|E|F|G|H|I|J|K}}' (Only 5 distractors will be shown, with O and L being most likely due to their position).\n\n### D. Overlapping Cards for Difficulty Scaling\n- **It is normal and advisable** to present the same content in overlapping cards with different distractor sets to scale difficulty.\n- **Progressive difficulty**: Start with dissimilar distractors, then increase similarity to make the question harder.\n- **Examples (Spelling/Phonics)**: Given an image of a car:\n - **Easy**: 'What word matches this image? {{car||airplane}}' (very different options)\n - **Medium**: 'What word matches this image? {{car||cat}}' (similar sounds)\n - **Hard**: 'What word matches this image? {{car||care}}' (very similar spelling)\n - **Harder**: 'What word matches this image? {{car||care|cat|far}}' (multiple similar options)\n- **Benefits**: This approach allows learners to build confidence with easier versions before tackling more challenging variants of the same concept.\n\n## 3. Best Practices & Tips\n\n- **Clarity is Key**: Ensure your questions are clear and the blanks/choices are unambiguous.\n- **Keep Answers Concise**: For fill-in-the-blanks, prefer short, specific answers (1-3 words is ideal). Long answers are hard for users to match. Use multiple-choice for more complex answers.\n- **Code in Questions**: You can and should use markdown code blocks in the question body for context.\n - **Example**:\n Given the code:\n \\`\\`\\`go\n func main() {\n x := 10\n fmt.Println(x)\n }\n \\`\\`\\`\n The above program will {{compile and run correctly||fail at compilation|fail at runtime}}.\n- **Code in Answers**: Code blocks ARE allowed inside the '{{...}}' syntax.\n - **Example**: '{{\\`go\\\\nfunc main() {\\\\n fmt.Println(\"Hello\")\\\\n}\\\\n\\`}}'\n- **CRITICAL**: Do NOT place the '{{...}}' syntax inside a markdown code block (e.g., \\`\\`\\` ... {{...}} ... \\`\\`\\`). The interactive element must be outside of any code fences.\n- **Review Syntax**: Carefully check your use of '|' and '||' in multiple-choice questions to avoid parsing errors.\n\n## 4. Example Agent Workflow\n\nThis is an example of how an agent might use this guide.\n\n**User Request:** \"Make a card about Go channels.\"\n\n**Agent's Thought Process:**\n1. I need to create a \"fillIn\" card about Go channels.\n2. A good multiple-choice question would be about the operator used to send a value to a channel.\n3. The question will be: \"In Go, what operator is used to send a value to a channel?\"\n4. The correct answer is '<-'. Some good distractors would be '->', '<<', and '>>'.\n5. The 'data' string for the tool call will be: 'In Go, what operator is used to send a value to a channel? {{<-||->|<<|>>}}'\n6. I'll tag it with 'go' and 'channels'.\n7. This is a fundamental concept, so I'll give it an ELO of 1100.\n8. Now I will call the 'create_card' tool with these parameters.\n\n**Resulting Tool Call:**\n<tool_code>\nprint(default_api.create_card(\n datashape='fillIn',\n data='In Go, what operator is used to send a value to a channel? {{<-||->|<<|>>}}',\n tags=['go', 'channels'],\n elo=1100\n))\n</tool_code>`;\n}\n","/* eslint-disable max-len */\nexport function createEloScoringGuidancePrompt(): string {\n return `# GUIDE: ELO Scoring for Content\n\nThis guide provides guidance for agents on assigning ELO ratings to content. The ELO system helps provide initial difficulty sorting for new content.\n\n## Understanding ELO Ratings\n\nELO ratings use a chess-like rating scale to indicate content difficulty:\n\n- **100-500**: Beginner level, basic knowledge\n- **500-1000**: Some knowledge, early understanding\n- **1000-1500**: Intermediate knowledge\n- **1500-2000**: Advanced understanding\n- **2000-2400**: Expert level\n- **2400+**: Elite/master level\n\n## Key Principles\n\n### 1. Rough Initial Sorting\n- Your ELO assignments provide **rough, sane sorting** of new content\n- Aim for reasonable relative difficulty between cards, not perfect precision\n- The system will refine these ratings over time based on real-world performance\n\n### 2. Automated Refinement\n- The platform performs **automated realtime adjustment** of ELO ratings based on actual user performance\n- This convergence forcing function holds **most of the responsibility** for arranging relative difficulty\n- Your initial ratings serve as a starting point, not the final word\n\n### 3. Content-Based Guidelines\n\n#### Basic Knowledge (100-500)\n- Simple facts and definitions\n- Basic vocabulary\n- Elementary concepts\n- **Example**: \"The capital of France is {{Paris}}\"\n\n#### Early Understanding (500-1000)\n- Simple applications of concepts\n- Basic problem-solving\n- Common patterns and rules\n- **Example**: \"In JavaScript, use {{let|var}} to declare a reassignable variable\"\n\n#### Intermediate Knowledge (1000-1500)\n- More complex applications\n- Understanding relationships between concepts\n- Moderate problem-solving skills\n- **Example**: \"Which sorting algorithm has O(n log n) average time complexity? {{mergesort|heapsort||bubblesort|insertionsort}}\"\n\n#### Advanced Understanding (1500-2000)\n- Complex problem-solving\n- Deep conceptual understanding\n- Advanced techniques and patterns\n- **Example**: \"In Go, what happens when you close a channel that's already closed? {{runtime panic||returns false|blocks forever|does nothing}}\"\n\n#### Expert Level (2000-2400)\n- Specialized knowledge\n- Advanced edge cases\n- Professional-level understanding\n- **Example**: \"What's the difference between TCP_NODELAY and TCP_CORK socket options?\"\n\n#### Elite/Master Level (2400+)\n- Cutting-edge knowledge\n- Rare edge cases\n- Research-level understanding\n- **Example**: \"How does the Linux kernel's CFS scheduler handle nice values in relation to vruntime calculations?\"\n\n## Practical Application\n\n### When Assigning ELO Ratings:\n\n1. **Consider the target audience**: Who would reasonably be expected to know this?\n2. **Assess cognitive load**: How much thinking/reasoning is required?\n3. **Evaluate prerequisite knowledge**: What must someone know first?\n4. **Compare relatively**: Is this harder or easier than other cards on similar topics?\n\n### Common Patterns:\n\n- **Definitions and facts**: Usually 100-800\n- **Basic syntax/usage**: Usually 400-1200\n- **Concept application**: Usually 800-1600\n- **Problem-solving**: Usually 1200-2000\n- **Advanced techniques**: Usually 1600-2400+\n\n## Establishing Goalposts for Agentic Runs\n\n### Reference Live Course Data\nWhen appending data to existing courses, try to use existing data to understand the baseline against which we create. ELO is relative and not absolute.\n\n1. **Query existing course statistics** using available MCP resources:\n - \\`course://config\\` - Get overall course ELO distribution\n - \\`tags://stats\\` - Understand tag usage patterns\n - \\`cards://elo/{range}\\` - Sample cards in different difficulty ranges\n\n2. **Establish relative ranges** based on existing content:\n - If the course has cards ranging 800-1600, aim for similar distribution\n - If creating beginner content for an advanced course, adjust baseline accordingly\n - Use tag-specific ELO patterns to inform ratings for similar topics\n\n### Example Goalpost Process\n\\`\\`\\`\n1. Query: cards://elo/1000-1500 (check intermediate range)\n2. Observe: 23 cards average 1250 ELO on \"javascript\" tag\n3. Target: New JavaScript cards should cluster around 1200-1300\n4. Create: Cards with relative difficulty within established range\n\\`\\`\\`\n\n## Remember\n\n- **It's okay to be approximate** - the system will adjust based on real performance\n- **Consistency matters more than perfection** - try to be consistent within topic areas\n- **Focus on relative difficulty** - how does this compare to other cards you've created? re: factual content - specialization matters - more esoteric knowledge should be rated higher\n- **Use live data as your anchor** - let existing course content guide your rating decisions\n\nYour ELO assignments provide the initial scaffolding that allows the platform's adaptive algorithms to efficiently converge on optimal difficulty ratings.`;\n}\n","// Prompts registry and exports\nexport * from './fill-in-card-authoring.js';\nexport * from './elo-scoring-guidance.js';\n\n// Prompt patterns\nexport const PROMPT_PATTERNS = {\n FILL_IN_CARD_AUTHORING: 'fill-in-card-authoring',\n ELO_SCORING_GUIDANCE: 'elo-scoring-guidance',\n} as const;\n"],"mappings":"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","names":["import_zod","import_zod","import_zod","import_common"]}