{"version":3,"sources":["../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/strategies.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/create-strategy.ts","../src/types/strategies.ts","../src/tools/index.ts","../src/prompts/fill-in-card-authoring.ts","../src/prompts/elo-scoring-guidance.ts","../src/prompts/index.ts"],"sourcesContent":["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  handleStrategiesAllResource,\n  handleStrategySpecificResource,\n  handleStrategiesByRoleResource,\n  handleAvailableRolesResource,\n  handleStrategySchemaResource,\n  RESOURCE_PATTERNS,\n} from './resources/index.js';\nimport {\n  handleCreateCard,\n  handleUpdateCard,\n  handleTagCard,\n  handleDeleteCard,\n  handleCreateStrategy,\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  type CreateStrategyInput,\n  CreateStrategyInputMCPSchema,\n} from './types/strategies.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    // ============================================================================\n    // STRATEGY RESOURCES\n    // ============================================================================\n\n    // Register strategies://all resource\n    this.mcpServer.registerResource(\n      RESOURCE_PATTERNS.STRATEGIES_ALL,\n      RESOURCE_PATTERNS.STRATEGIES_ALL,\n      {\n        title: 'All Navigation Strategies',\n        description: 'List all navigation strategies in the course',\n        mimeType: 'application/json',\n      },\n      async (uri) => {\n        this.logger.debug('MCP Server: Fetching all strategies');\n        const result = await handleStrategiesAllResource(this.courseDB);\n        this.logger.info(`MCP Server: Retrieved ${result.total} strategies`);\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 strategies://{strategyId} resource\n    this.mcpServer.registerResource(\n      RESOURCE_PATTERNS.STRATEGIES_SPECIFIC,\n      new ResourceTemplate('strategies://{strategyId}', { list: undefined }),\n      {\n        title: 'Specific Strategy',\n        description: 'Get detailed information about a specific navigation strategy',\n        mimeType: 'application/json',\n      },\n      async (uri, { strategyId }) => {\n        this.logger.debug(`MCP Server: Fetching strategy '${strategyId}'`);\n        const result = await handleStrategySpecificResource(this.courseDB, strategyId as string);\n        this.logger.info(`MCP Server: Retrieved strategy '${strategyId}'`);\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 strategies://role/{roleType} resource\n    this.mcpServer.registerResource(\n      RESOURCE_PATTERNS.STRATEGIES_ROLE,\n      new ResourceTemplate('strategies://role/{roleType}', { list: undefined }),\n      {\n        title: 'Strategies by Role',\n        description: 'Filter strategies by role (generator or filter)',\n        mimeType: 'application/json',\n      },\n      async (uri, { roleType }) => {\n        this.logger.debug(`MCP Server: Fetching strategies by role '${roleType}'`);\n        const result = await handleStrategiesByRoleResource(\n          this.courseDB,\n          roleType as 'generator' | 'filter'\n        );\n        this.logger.info(`MCP Server: Retrieved ${result.total} ${roleType} strategies`);\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 strategies://roles resource\n    this.mcpServer.registerResource(\n      RESOURCE_PATTERNS.STRATEGIES_ROLES,\n      RESOURCE_PATTERNS.STRATEGIES_ROLES,\n      {\n        title: 'Available Strategy Types',\n        description: 'List valid implementingClass values for creating strategies',\n        mimeType: 'application/json',\n      },\n      async (uri) => {\n        this.logger.debug('MCP Server: Fetching available strategy roles');\n        const result = await handleAvailableRolesResource();\n        this.logger.info(`MCP Server: Retrieved ${result.total} available strategy types`);\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 strategies://schema/{implementingClass} resource\n    this.mcpServer.registerResource(\n      RESOURCE_PATTERNS.STRATEGIES_SCHEMA,\n      new ResourceTemplate('strategies://schema/{implementingClass}', { list: undefined }),\n      {\n        title: 'Strategy Config Schema',\n        description: 'Get configuration schema for a specific strategy type',\n        mimeType: 'application/json',\n      },\n      async (uri, { implementingClass }) => {\n        this.logger.debug(`MCP Server: Fetching schema for strategy type '${implementingClass}'`);\n        const result = await handleStrategySchemaResource(implementingClass as string);\n        if (result.available) {\n          this.logger.info(`MCP Server: Retrieved schema for '${implementingClass}'`);\n        } else {\n          this.logger.warn(`MCP Server: Schema not available for '${implementingClass}'`);\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_strategy tool\n    this.mcpServer.registerTool(\n      TOOL_PATTERNS.CREATE_STRATEGY,\n      {\n        title: 'Create Strategy',\n        description: 'Create a new navigation strategy with configuration',\n        inputSchema: CreateStrategyInputMCPSchema as any,\n      },\n      // @ts-ignore - MCP SDK type incompatibility with Zod v4\n      async (input) => {\n        const strategyInput = input as CreateStrategyInput;\n        this.logger.info(`MCP Server: Creating strategy '${strategyInput.name}' with class '${strategyInput.implementingClass}'`);\n        const result = await handleCreateStrategy(this.courseDB, strategyInput);\n        this.logger.info(`MCP Server: Created strategy ${result.strategyId}`);\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/**\n * Helper to transform Card entities to CardResourceData\n * Handles the indirection: Card entity (c-...) -> Data document (dd-...)\n */\nasync function transformCardsToResourceData(\n  courseDB: CourseDBInterface,\n  cardIds: string[],\n  eloMap: Map<any, number>\n): Promise<CardResourceData[]> {\n  if (cardIds.length === 0) return [];\n\n  // Fetch Card entities (c-... IDs)\n  const cardDocs = await courseDB.getCourseDocs(cardIds);\n\n  // Extract data document IDs from Card entities\n  const dataDocIds: string[] = [];\n  const cardToDataMap = new Map<string, string>(); // cardId -> dataDocId\n\n  for (const row of cardDocs.rows) {\n    if (isSuccessRow(row)) {\n      const cardDoc = row.doc as any;\n      const cardId = cardDoc._id;\n      const dataIds = cardDoc.id_displayable_data;\n\n      if (dataIds && dataIds.length > 0) {\n        const dataDocId = dataIds[0]; // Take first data document\n        dataDocIds.push(dataDocId);\n        cardToDataMap.set(cardId, dataDocId);\n      }\n    }\n  }\n\n  // Fetch all data documents\n  const dataDocs = dataDocIds.length > 0\n    ? await courseDB.getCourseDocs(dataDocIds)\n    : { rows: [] };\n\n  // Create map of dataDocId -> data document\n  const dataDocMap = new Map<string, any>();\n  for (const row of dataDocs.rows) {\n    if (isSuccessRow(row)) {\n      dataDocMap.set(row.doc._id, row.doc);\n    }\n  }\n\n  // Transform to CardResourceData format\n  const cards: CardResourceData[] = [];\n  for (const row of cardDocs.rows) {\n    if (isSuccessRow(row)) {\n      const cardDoc = row.doc as any;\n      const cardId = cardDoc._id;\n      const dataDocId = cardToDataMap.get(cardId);\n      const dataDoc = dataDocId ? dataDocMap.get(dataDocId) : null;\n\n      cards.push({\n        cardId: cardId,\n        datashape: dataDoc?.id_datashape || 'unknown',\n        data: dataDoc?.data || {},\n        tags: [], // Tags are stored separately in TAG documents\n        elo: eloMap.get(cardId) || cardDoc.elo?.global?.score || 1500,\n        created: cardDoc.created,\n        modified: cardDoc.modified\n      });\n    }\n  }\n\n  return cards;\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    // First, get total count of card entities\n    const countResult = await (courseDB as any).db.allDocs({\n      startkey: 'c-',\n      endkey: 'c-\\ufff0',\n      include_docs: false\n      // No limit - get all IDs to count them\n    });\n    const totalCards = countResult.rows.length;\n\n    // Now get the paginated card IDs\n    const allCardsResult = await (courseDB as any).db.allDocs({\n      startkey: 'c-',\n      endkey: 'c-\\ufff0',\n      include_docs: true,  // Include docs so we can debug\n      skip: offset,\n      limit: limit\n    });\n\n    const cardIds = allCardsResult.rows.map((row: any) => row.id);\n\n    if (cardIds.length === 0) {\n      return {\n        cards: [],\n        total: totalCards,\n        page: Math.floor(offset / limit) + 1,\n        limit,\n        filter: 'all'\n      };\n    }\n\n    // Extract data document IDs from the Card entities we already fetched\n    const dataDocIds: string[] = [];\n    const cardToDataMap = new Map<string, string>();\n\n    for (const row of allCardsResult.rows) {\n      const cardDoc = row.doc as any;\n      const dataIds = cardDoc.id_displayable_data;\n      if (dataIds && dataIds.length > 0) {\n        const dataDocId = dataIds[0];\n        dataDocIds.push(dataDocId);\n        cardToDataMap.set(cardDoc._id, dataDocId);\n      }\n    }\n\n    // Fetch data documents\n    const dataDocs = dataDocIds.length > 0\n      ? await courseDB.getCourseDocs(dataDocIds, { include_docs: true })\n      : { rows: [] };\n\n    // Create map of dataDocId -> data document\n    const dataDocMap = new Map<string, any>();\n    for (const row of dataDocs.rows) {\n      if (isSuccessRow(row)) {\n        dataDocMap.set(row.doc._id, row.doc);\n      }\n    }\n\n    // Transform to CardResourceData format\n    const cards: CardResourceData[] = [];\n    for (const row of allCardsResult.rows) {\n      const cardDoc = row.doc as any;\n      const cardId = cardDoc._id;\n      const dataDocId = cardToDataMap.get(cardId);\n      const dataDoc = dataDocId ? dataDocMap.get(dataDocId) : null;\n\n      cards.push({\n        cardId: cardId,\n        datashape: dataDoc?.id_datashape || 'unknown',\n        data: dataDoc?.data || {},\n        tags: [],\n        elo: cardDoc.elo?.global?.score || 1500,\n        created: cardDoc.created,\n        modified: cardDoc.modified\n      });\n    }\n\n    return {\n      cards,\n      total: totalCards,\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 all card IDs\n    const cardIds = allCardIds.map(c => c.cardID);\n\n    // Fetch Card entities to get their data doc references\n    const cardDocs = await courseDB.getCourseDocs(cardIds);\n\n    // Extract data document IDs from Card entities\n    const dataDocIds: string[] = [];\n    const cardToDataMap = new Map<string, string>();\n\n    for (const row of cardDocs.rows) {\n      if (isSuccessRow(row)) {\n        const cardDoc = row.doc as any;\n        const dataIds = cardDoc.id_displayable_data;\n        if (dataIds && dataIds.length > 0) {\n          const dataDocId = dataIds[0];\n          dataDocIds.push(dataDocId);\n          cardToDataMap.set(cardDoc._id, dataDocId);\n        }\n      }\n    }\n\n    // Fetch all data documents to check their shapes\n    const dataDocs = dataDocIds.length > 0\n      ? await courseDB.getCourseDocs(dataDocIds)\n      : { rows: [] };\n\n    // Create map: dataDocId -> datashape\n    const dataDocShapeMap = new Map<string, string>();\n    for (const row of dataDocs.rows) {\n      if (isSuccessRow(row)) {\n        const dataDoc = row.doc as any;\n        dataDocShapeMap.set(dataDoc._id, dataDoc.id_datashape);\n      }\n    }\n\n    // Filter cards by shape\n    const filteredCardIds: string[] = [];\n    for (const [cardId, dataDocId] of cardToDataMap.entries()) {\n      const dataShape = dataDocShapeMap.get(dataDocId);\n      if (dataShape === shapeName) {\n        filteredCardIds.push(cardId);\n      }\n    }\n\n    // Apply pagination to filtered card IDs\n    const paginatedCardIds = filteredCardIds.slice(offset, offset + limit);\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 = await transformCardsToResourceData(courseDB, paginatedCardIds, eloMap);\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 IDs\n    const paginatedCardIds = paginatedCards.map(c => c.cardID);\n    const eloMap = new Map(paginatedEloData.map(({ elo, cardId }) => [cardId.cardID, elo.global?.score || 1500]));\n\n    // Transform to CardResourceData format\n    const cardsData = await transformCardsToResourceData(courseDB, paginatedCardIds, eloMap);\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}","import type { CourseDBInterface, ContentNavigationStrategyData } from '@vue-skuilder/db';\nimport {\n  NavigatorRoles,\n  NavigatorRole,\n  Navigators,\n} from '@vue-skuilder/db';\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface StrategySummary {\n  _id: string;\n  name: string;\n  description: string;\n  implementingClass: string;\n  role: 'generator' | 'filter' | 'unknown';\n  hasLearnableWeight: boolean;\n  staticWeight: boolean;\n}\n\nexport interface StrategiesAllResponse {\n  strategies: StrategySummary[];\n  total: number;\n}\n\nexport interface StrategyDetailResponse {\n  strategy: ContentNavigationStrategyData;\n  role: 'generator' | 'filter' | 'unknown';\n  parsedConfig?: object;\n}\n\nexport interface StrategiesByRoleResponse {\n  role: 'generator' | 'filter';\n  strategies: StrategySummary[];\n  total: number;\n}\n\nexport interface NavigatorRoleInfo {\n  implementingClass: string;\n  role: 'generator' | 'filter';\n  description: string;\n}\n\nexport interface AvailableRolesResponse {\n  roles: NavigatorRoleInfo[];\n  total: number;\n}\n\nexport interface StrategySchemaField {\n  name: string;\n  type: string;\n  required: boolean;\n  description: string;\n  default?: unknown;\n}\n\nexport interface StrategySchemaResponse {\n  implementingClass: string;\n  role: 'generator' | 'filter';\n  description: string;\n  schema?: object;\n  example?: object;\n  fields?: StrategySchemaField[];\n  available: boolean;\n}\n\n// ============================================================================\n// ROLE LOOKUP HELPERS\n// ============================================================================\n\n/**\n * Get the role for an implementing class.\n * Returns 'unknown' if the class is not in the NavigatorRoles registry.\n */\nfunction getRoleForImplementingClass(implementingClass: string): 'generator' | 'filter' | 'unknown' {\n  const role = NavigatorRoles[implementingClass as Navigators];\n  if (role === NavigatorRole.GENERATOR) return 'generator';\n  if (role === NavigatorRole.FILTER) return 'filter';\n  return 'unknown';\n}\n\n/**\n * Convert a ContentNavigationStrategyData to a StrategySummary\n */\nfunction toStrategySummary(strategy: ContentNavigationStrategyData): StrategySummary {\n  return {\n    _id: strategy._id,\n    name: strategy.name,\n    description: strategy.description,\n    implementingClass: strategy.implementingClass,\n    role: getRoleForImplementingClass(strategy.implementingClass),\n    hasLearnableWeight: !!strategy.learnable,\n    staticWeight: !!strategy.staticWeight,\n  };\n}\n\n// ============================================================================\n// NAVIGATOR DESCRIPTIONS\n// ============================================================================\n\nconst NAVIGATOR_DESCRIPTIONS: Record<string, string> = {\n  [Navigators.ELO]: 'ELO-based card selection. Selects new cards near the user\\'s estimated skill level for optimal challenge.',\n  [Navigators.SRS]: 'Spaced Repetition System. Schedules reviews of previously-seen cards based on memory decay models.',\n  [Navigators.HIERARCHY]: 'Prerequisite enforcement. Filters cards based on tag prerequisites and mastery thresholds.',\n  [Navigators.INTERFERENCE]: 'Interference mitigation. Reduces confusion by avoiding similar-looking or similar-sounding cards when one is not yet mastered.',\n  [Navigators.RELATIVE_PRIORITY]: 'Tag priority weighting. Boosts or penalizes cards based on course author priority weights assigned to tags.',\n  [Navigators.USER_TAG_PREFERENCE]: 'User preference filtering. Adjusts card weights based on user-expressed tag preferences.',\n};\n\n// ============================================================================\n// SCHEMA DEFINITIONS\n// ============================================================================\n\n/**\n * Schema definitions for each implementing class.\n * These describe the expected structure of serializedData.\n */\nconst STRATEGY_SCHEMAS: Record<string, Omit<StrategySchemaResponse, 'implementingClass' | 'role' | 'available'>> = {\n  [Navigators.ELO]: {\n    description: 'ELO navigator configuration. Controls new card selection based on skill matching.',\n    schema: {\n      type: 'object',\n      properties: {},\n      additionalProperties: false,\n    },\n    example: {},\n    fields: [],\n  },\n  [Navigators.SRS]: {\n    description: 'Spaced Repetition System configuration. Controls review scheduling.',\n    schema: {\n      type: 'object',\n      properties: {},\n      additionalProperties: false,\n    },\n    example: {},\n    fields: [],\n  },\n  [Navigators.HIERARCHY]: {\n    description: 'Hierarchy definition for prerequisite-based filtering.',\n    schema: {\n      type: 'object',\n      properties: {\n        prerequisites: {\n          type: 'array',\n          items: {\n            type: 'object',\n            properties: {\n              tag: { type: 'string', description: 'The tag that has prerequisites' },\n              requires: {\n                type: 'array',\n                items: {\n                  type: 'object',\n                  properties: {\n                    tag: { type: 'string', description: 'Required prerequisite tag' },\n                    threshold: { type: 'number', description: 'Mastery threshold (0-1)' },\n                  },\n                  required: ['tag', 'threshold'],\n                },\n              },\n            },\n            required: ['tag', 'requires'],\n          },\n        },\n      },\n      required: ['prerequisites'],\n    },\n    example: {\n      prerequisites: [\n        {\n          tag: 'advanced-topic',\n          requires: [\n            { tag: 'basic-topic', threshold: 0.7 },\n          ],\n        },\n      ],\n    },\n    fields: [\n      {\n        name: 'prerequisites',\n        type: 'array',\n        required: true,\n        description: 'Array of tag prerequisite definitions',\n      },\n    ],\n  },\n  [Navigators.INTERFERENCE]: {\n    description: 'Interference mitigation configuration. Prevents confusion between similar items.',\n    schema: {\n      type: 'object',\n      properties: {\n        confusionGroups: {\n          type: 'array',\n          items: {\n            type: 'object',\n            properties: {\n              tags: {\n                type: 'array',\n                items: { type: 'string' },\n                description: 'Tags that can interfere with each other',\n              },\n              decayRate: {\n                type: 'number',\n                description: 'How quickly interference penalty decays (0-1)',\n              },\n            },\n            required: ['tags'],\n          },\n        },\n      },\n      required: ['confusionGroups'],\n    },\n    example: {\n      confusionGroups: [\n        { tags: ['letter-b', 'letter-d', 'letter-p'], decayRate: 0.8 },\n      ],\n    },\n    fields: [\n      {\n        name: 'confusionGroups',\n        type: 'array',\n        required: true,\n        description: 'Groups of tags that can interfere with each other during learning',\n      },\n    ],\n  },\n  [Navigators.RELATIVE_PRIORITY]: {\n    description: 'Relative priority configuration. Weights cards by tag importance.',\n    schema: {\n      type: 'object',\n      properties: {\n        priorities: {\n          type: 'object',\n          additionalProperties: { type: 'number' },\n          description: 'Map of tag names to priority weights (0-1)',\n        },\n      },\n      required: ['priorities'],\n    },\n    example: {\n      priorities: {\n        'high-frequency': 0.95,\n        'common-words': 0.8,\n        'rare-words': 0.3,\n      },\n    },\n    fields: [\n      {\n        name: 'priorities',\n        type: 'object',\n        required: true,\n        description: 'Map of tag names to priority weights (0-1, higher = more important)',\n      },\n    ],\n  },\n  [Navigators.USER_TAG_PREFERENCE]: {\n    description: 'User tag preference configuration. Adjusts weights based on user preferences.',\n    schema: {\n      type: 'object',\n      properties: {},\n      additionalProperties: false,\n    },\n    example: {},\n    fields: [],\n  },\n};\n\n// ============================================================================\n// RESOURCE HANDLERS\n// ============================================================================\n\n/**\n * Handle strategies://all resource - List all navigation strategies\n */\nexport async function handleStrategiesAllResource(\n  courseDB: CourseDBInterface\n): Promise<StrategiesAllResponse> {\n  try {\n    const strategies = await courseDB.getAllNavigationStrategies();\n    const summaries = strategies.map(toStrategySummary);\n\n    return {\n      strategies: summaries,\n      total: summaries.length,\n    };\n  } catch (error) {\n    console.error('[Strategies] Error fetching all strategies:', error);\n    throw new Error(\n      `Failed to fetch strategies: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n}\n\n/**\n * Handle strategies://{strategyId} resource - Get specific strategy details\n */\nexport async function handleStrategySpecificResource(\n  courseDB: CourseDBInterface,\n  strategyId: string\n): Promise<StrategyDetailResponse> {\n  try {\n    const strategy = await courseDB.getNavigationStrategy(strategyId);\n\n    // Attempt to parse serializedData as JSON\n    let parsedConfig: object | undefined;\n    if (strategy.serializedData) {\n      try {\n        parsedConfig = JSON.parse(strategy.serializedData);\n      } catch {\n        // serializedData is not valid JSON, leave parsedConfig undefined\n      }\n    }\n\n    return {\n      strategy,\n      role: getRoleForImplementingClass(strategy.implementingClass),\n      parsedConfig,\n    };\n  } catch (error) {\n    console.error(`[Strategies] Error fetching strategy ${strategyId}:`, error);\n    throw new Error(\n      `Failed to fetch strategy ${strategyId}: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n}\n\n/**\n * Handle strategies://role/{roleType} resource - Filter strategies by role\n */\nexport async function handleStrategiesByRoleResource(\n  courseDB: CourseDBInterface,\n  roleType: 'generator' | 'filter'\n): Promise<StrategiesByRoleResponse> {\n  try {\n    const strategies = await courseDB.getAllNavigationStrategies();\n    const summaries = strategies\n      .map(toStrategySummary)\n      .filter((s) => s.role === roleType);\n\n    return {\n      role: roleType,\n      strategies: summaries,\n      total: summaries.length,\n    };\n  } catch (error) {\n    console.error(`[Strategies] Error fetching strategies by role ${roleType}:`, error);\n    throw new Error(\n      `Failed to fetch strategies by role: ${error instanceof Error ? error.message : 'Unknown error'}`\n    );\n  }\n}\n\n/**\n * Handle strategies://roles resource - List available strategy types\n */\nexport async function handleAvailableRolesResource(): Promise<AvailableRolesResponse> {\n  const roles: NavigatorRoleInfo[] = Object.entries(NavigatorRoles).map(([impl, role]) => ({\n    implementingClass: impl,\n    role: role === NavigatorRole.GENERATOR ? 'generator' : 'filter',\n    description: NAVIGATOR_DESCRIPTIONS[impl] || `Navigator: ${impl}`,\n  }));\n\n  return {\n    roles,\n    total: roles.length,\n  };\n}\n\n/**\n * Handle strategies://schema/{implementingClass} resource - Get config schema for a strategy type\n */\nexport async function handleStrategySchemaResource(\n  implementingClass: string\n): Promise<StrategySchemaResponse> {\n  const role = getRoleForImplementingClass(implementingClass);\n\n  if (role === 'unknown') {\n    return {\n      implementingClass,\n      role: 'filter', // Default, though it's unknown\n      description: `Unknown implementing class: ${implementingClass}`,\n      available: false,\n    };\n  }\n\n  const schemaInfo = STRATEGY_SCHEMAS[implementingClass];\n\n  if (!schemaInfo) {\n    return {\n      implementingClass,\n      role,\n      description: NAVIGATOR_DESCRIPTIONS[implementingClass] || `Navigator: ${implementingClass}`,\n      available: false,\n    };\n  }\n\n  return {\n    implementingClass,\n    role,\n    available: true,\n    ...schemaInfo,\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';\nexport * from './strategies.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  // Strategy resources\n  STRATEGIES_ALL: 'strategies://all',\n  STRATEGIES_SPECIFIC: 'strategies://{strategyId}',\n  STRATEGIES_ROLE: 'strategies://role/{roleType}',\n  STRATEGIES_ROLES: 'strategies://roles',\n  STRATEGIES_SCHEMA: 'strategies://schema/{implementingClass}',\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}","import type { CourseDBInterface, ContentNavigationStrategyData } from '@vue-skuilder/db';\nimport { NavigatorRoles, Navigators, DocType } from '@vue-skuilder/db';\nimport {\n  CreateStrategyInputSchema,\n  type CreateStrategyInput,\n  type CreateStrategyOutput,\n} from '../types/strategies.js';\nimport {\n  handleToolError,\n  logToolStart,\n  logToolSuccess,\n  logToolWarning,\n} from '../utils/index.js';\n\nconst TOOL_NAME = 'create_strategy';\n\n/**\n * Sanitize a string for use in a document ID.\n * Replaces spaces and special characters with hyphens.\n */\nfunction sanitizeForId(str: string): string {\n  return str\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, '-')\n    .replace(/^-+|-+$/g, '');\n}\n\n/**\n * Generate a strategy document ID.\n * Format: NAVIGATION_STRATEGY-{implementingClass}-{sanitizedName}\n */\nfunction generateStrategyId(\n  implementingClass: string,\n  name: string,\n  suffix?: string\n): `NAVIGATION_STRATEGY-${string}` {\n  const sanitizedName = sanitizeForId(name);\n  const base = `NAVIGATION_STRATEGY-${implementingClass}-${sanitizedName}`;\n  if (suffix) {\n    return `${base}-${suffix}` as `NAVIGATION_STRATEGY-${string}`;\n  }\n  return base as `NAVIGATION_STRATEGY-${string}`;\n}\n\n/**\n * Check if a strategy ID already exists in the database.\n */\nasync function strategyExists(\n  courseDB: CourseDBInterface,\n  strategyId: string\n): Promise<boolean> {\n  try {\n    await courseDB.getNavigationStrategy(strategyId);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Handle the create_strategy tool.\n *\n * Creates a new navigation strategy with the specified configuration.\n * Validates that the implementing class is a valid NavigatorRoles key.\n * Auto-generates unique IDs with collision handling.\n */\nexport async function handleCreateStrategy(\n  courseDB: CourseDBInterface,\n  input: CreateStrategyInput\n): Promise<CreateStrategyOutput> {\n  try {\n    // Validate input\n    const validatedInput = CreateStrategyInputSchema.parse(input);\n    logToolStart(TOOL_NAME, validatedInput);\n\n    // Validate implementing class against NavigatorRoles\n    const validImplementingClasses = Object.values(Navigators);\n    if (!validImplementingClasses.includes(validatedInput.implementingClass as Navigators)) {\n      const errorMsg = `Invalid implementingClass: \"${validatedInput.implementingClass}\". ` +\n        `Valid options: ${validImplementingClasses.join(', ')}`;\n      logToolWarning(TOOL_NAME, errorMsg);\n      throw new Error(errorMsg);\n    }\n\n    // Validate serializedData is valid JSON if provided\n    if (validatedInput.serializedData) {\n      try {\n        JSON.parse(validatedInput.serializedData);\n      } catch {\n        const errorMsg = 'serializedData must be valid JSON';\n        logToolWarning(TOOL_NAME, errorMsg);\n        throw new Error(errorMsg);\n      }\n    }\n\n    // Generate strategy ID with collision handling\n    let strategyId = generateStrategyId(\n      validatedInput.implementingClass,\n      validatedInput.name\n    );\n\n    // Check for collision and append timestamp suffix if needed\n    if (await strategyExists(courseDB, strategyId)) {\n      const suffix = Date.now().toString();\n      strategyId = generateStrategyId(\n        validatedInput.implementingClass,\n        validatedInput.name,\n        suffix\n      );\n      logToolWarning(\n        TOOL_NAME,\n        `ID collision detected, using suffix: ${strategyId}`\n      );\n    }\n\n    // Construct the strategy document\n    const courseId = courseDB.getCourseID();\n    const strategyData: ContentNavigationStrategyData = {\n      _id: strategyId,\n      docType: DocType.NAVIGATION_STRATEGY,\n      course: courseId,\n      name: validatedInput.name,\n      description: validatedInput.description,\n      implementingClass: validatedInput.implementingClass,\n      serializedData: validatedInput.serializedData || '',\n    };\n\n    // Add optional learnable weight\n    if (validatedInput.learnable) {\n      strategyData.learnable = {\n        weight: validatedInput.learnable.weight,\n        confidence: validatedInput.learnable.confidence,\n        sampleSize: validatedInput.learnable.sampleSize,\n      };\n    }\n\n    // Add optional static weight flag\n    if (validatedInput.staticWeight !== undefined) {\n      strategyData.staticWeight = validatedInput.staticWeight;\n    }\n\n    // Save the strategy to the database\n    await courseDB.addNavigationStrategy(strategyData);\n\n    // Determine role for success message\n    const role = NavigatorRoles[validatedInput.implementingClass as Navigators];\n    const roleLabel = role === 'generator' ? 'generator' : 'filter';\n\n    const output: CreateStrategyOutput = {\n      success: true,\n      strategyId,\n      message: `Created ${roleLabel} strategy: ${validatedInput.name}`,\n    };\n\n    logToolSuccess(TOOL_NAME, output);\n    return output;\n  } catch (error) {\n    handleToolError(error, TOOL_NAME);\n  }\n}","import { z } from 'zod';\n\n// ============================================================================\n// LEARNABLE WEIGHT SCHEMA\n// ============================================================================\n\nexport const LearnableWeightSchema = z.object({\n  /** The current best estimate of optimal weight (multiplier) */\n  weight: z.number().positive(),\n  /** Confidence in this weight (0-1). Higher = narrower exploration spread. */\n  confidence: z.number().min(0).max(1),\n  /** Number of outcome observations that contributed to this weight */\n  sampleSize: z.number().int().nonnegative(),\n});\n\nexport type LearnableWeightInput = z.infer<typeof LearnableWeightSchema>;\n\n// ============================================================================\n// CREATE STRATEGY INPUT SCHEMA\n// ============================================================================\n\n/**\n * MCP-compatible plain object schema for the create_strategy tool.\n * Used by the MCP SDK for tool registration.\n */\nexport const CreateStrategyInputMCPSchema = {\n  name: z.string().min(1).describe('Human-readable name for the strategy'),\n  description: z.string().describe('Description explaining the strategy\\'s purpose'),\n  implementingClass: z.string().describe('Valid NavigatorRoles key (e.g., \"elo\", \"srs\", \"hierarchyDefinition\")'),\n  serializedData: z.string().optional().describe('Optional JSON configuration for the strategy'),\n  learnable: LearnableWeightSchema.optional().describe('Optional evolutionary tuning configuration'),\n  staticWeight: z.boolean().optional().describe('If true, weight is applied exactly without per-user deviation'),\n};\n\n/**\n * Zod schema for runtime validation of create_strategy input.\n */\nexport const CreateStrategyInputSchema = z.object(CreateStrategyInputMCPSchema);\n\nexport type CreateStrategyInput = z.infer<typeof CreateStrategyInputSchema>;\n\n// ============================================================================\n// CREATE STRATEGY OUTPUT\n// ============================================================================\n\nexport interface CreateStrategyOutput {\n  success: boolean;\n  strategyId: string;\n  message: string;\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';\nexport * from './create-strategy.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  CREATE_STRATEGY: 'create_strategy',\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":["z","z","z","z","TOOL_NAME","toCourseElo","TOOL_NAME","toCourseElo","TOOL_NAME","TOOL_NAME","NavigatorRoles","Navigators","z","Navigators","NavigatorRoles"]}