@channlize/mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +394 -0
- package/dist/index.d.mts +118 -0
- package/dist/index.d.ts +118 -0
- package/dist/index.js +1764 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1739 -0
- package/dist/index.mjs.map +1 -0
- package/dist/server.js +1850 -0
- package/dist/server.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/resources/index.ts","../src/tools/index.ts","../src/prompts/index.ts"],"sourcesContent":["/**\n * @channlize/mcp\n * Model Context Protocol (MCP) server for Channlize\n * Enables AI agents to interact with Channlize platform\n */\n\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListResourcesRequestSchema,\n ListToolsRequestSchema,\n ReadResourceRequestSchema,\n ListPromptsRequestSchema,\n GetPromptRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type {\n ChannlizeMCPConfig,\n MCPServerOptions,\n ToolContext,\n} from './types';\nimport { listResources, getResource } from './resources/index';\nimport { listTools, getTool } from './tools/index';\nimport { listPrompts, getPrompt } from './prompts/index';\n\nexport * from './types';\nexport { listResources, getResource } from './resources/index';\nexport { listTools, getTool } from './tools/index';\nexport { listPrompts, getPrompt } from './prompts/index';\n\n// Re-export core types for convenience\nexport type {\n ChannlizeConfig,\n ContactFormData,\n ChatMessage,\n ChatSession,\n FileAttachment,\n CreateContactResponse,\n CreateChatSessionResponse,\n SendMessageResponse,\n ChannlizeError,\n ValidationError,\n AuthenticationError,\n RateLimitError,\n} from '@channlize/core';\n\n/**\n * Channlize MCP Server\n * Provides resources, tools, and prompts for AI agents\n */\nexport class ChannlizeMCPServer {\n private server: Server;\n private config?: ChannlizeMCPConfig;\n\n constructor(options: MCPServerOptions = {}) {\n this.config = options.config;\n\n this.server = new Server(\n {\n name: options.name || 'channlize-mcp',\n version: options.version || '0.1.0',\n },\n {\n capabilities: {\n resources: {},\n tools: {},\n prompts: {},\n },\n }\n );\n\n this.setupHandlers();\n }\n\n private setupHandlers(): void {\n // List available resources\n this.server.setRequestHandler(ListResourcesRequestSchema, async () => {\n const resources = listResources();\n return {\n resources: resources.map(r => ({\n uri: r.uri,\n name: r.name,\n description: r.description,\n mimeType: r.mimeType,\n })),\n };\n });\n\n // Read a specific resource\n this.server.setRequestHandler(ReadResourceRequestSchema, async request => {\n const resource = getResource(request.params.uri);\n if (!resource) {\n throw new Error(`Resource not found: ${request.params.uri}`);\n }\n\n return {\n contents: [\n {\n uri: resource.uri,\n mimeType: resource.mimeType,\n text: resource.getText(),\n },\n ],\n };\n });\n\n // List available tools\n this.server.setRequestHandler(ListToolsRequestSchema, async () => {\n const tools = listTools();\n return {\n tools: tools.map(t => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n };\n });\n\n // Call a tool\n this.server.setRequestHandler(CallToolRequestSchema, async request => {\n const tool = getTool(request.params.name);\n if (!tool) {\n throw new Error(`Tool not found: ${request.params.name}`);\n }\n\n // Ensure we have config for tool execution\n if (!this.config?.apiKey) {\n throw new Error(\n 'Channlize API key required. Please configure the MCP server with your API credentials.'\n );\n }\n\n const context: ToolContext = {\n config: this.config,\n };\n\n try {\n const result = await tool.handler(request.params.arguments || {}, context);\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(result, null, 2),\n },\n ],\n };\n } catch (error: any) {\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(\n {\n success: false,\n error: error.message || 'Unknown error',\n code: error.code,\n statusCode: error.statusCode,\n },\n null,\n 2\n ),\n },\n ],\n isError: true,\n };\n }\n });\n\n // List available prompts\n this.server.setRequestHandler(ListPromptsRequestSchema, async () => {\n const prompts = listPrompts();\n return {\n prompts: prompts.map(p => ({\n name: p.name,\n description: p.description,\n arguments: p.arguments,\n })),\n };\n });\n\n // Get a prompt\n this.server.setRequestHandler(GetPromptRequestSchema, async request => {\n const prompt = getPrompt(request.params.name);\n if (!prompt) {\n throw new Error(`Prompt not found: ${request.params.name}`);\n }\n\n const args = request.params.arguments as Record<string, string> | undefined;\n const text = prompt.getPrompt(args);\n\n return {\n description: prompt.description,\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text,\n },\n },\n ],\n };\n });\n }\n\n /**\n * Set or update the Channlize configuration\n */\n setConfig(config: ChannlizeMCPConfig): void {\n this.config = config;\n }\n\n /**\n * Get the underlying MCP server instance\n */\n getServer(): Server {\n return this.server;\n }\n\n /**\n * Start the server with stdio transport\n */\n async runStdio(): Promise<void> {\n const transport = new StdioServerTransport();\n await this.server.connect(transport);\n }\n\n /**\n * Close the server\n */\n async close(): Promise<void> {\n await this.server.close();\n }\n}\n\n/**\n * Create and return a new Channlize MCP Server instance\n */\nexport function createMCPServer(options?: MCPServerOptions): ChannlizeMCPServer {\n return new ChannlizeMCPServer(options);\n}\n\n// Default export\nexport default ChannlizeMCPServer;\n\n\n\n\n\n","/**\n * MCP Resources for Channlize\n * Provides read-only context about schemas, API docs, and guides\n */\n\nimport type { ResourceContext } from '../types';\n\nexport interface Resource {\n uri: string;\n name: string;\n description: string;\n mimeType: string;\n getText(): string;\n}\n\nconst CONTACT_FORM_SCHEMA = `{\n \"name\": \"ContactFormData\",\n \"description\": \"Data structure for submitting a contact form inquiry\",\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Contact's full name\",\n \"required\": true\n },\n \"email\": {\n \"type\": \"string\",\n \"format\": \"email\",\n \"description\": \"Contact's email address\",\n \"required\": true\n },\n \"subject\": {\n \"type\": \"string\",\n \"description\": \"Subject line for the inquiry\"\n },\n \"message\": {\n \"type\": \"string\",\n \"description\": \"Message content\",\n \"required\": true\n },\n \"customFields\": {\n \"type\": \"object\",\n \"description\": \"Additional custom fields as key-value pairs\",\n \"additionalProperties\": true\n },\n \"pageUrl\": {\n \"type\": \"string\",\n \"description\": \"URL of the page where form was submitted\"\n },\n \"userAgent\": {\n \"type\": \"string\",\n \"description\": \"User agent string of the submitter\"\n }\n }\n}`;\n\nconst CHAT_SESSION_SCHEMA = `{\n \"name\": \"ChatSession\",\n \"description\": \"Real-time chat session structure\",\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Unique session identifier\"\n },\n \"status\": {\n \"type\": \"string\",\n \"enum\": [\"active\", \"closed\", \"waiting\"],\n \"description\": \"Current session status\"\n },\n \"messages\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"#/definitions/ChatMessage\"\n },\n \"description\": \"Array of messages in this session\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"description\": \"Custom metadata for the session\"\n },\n \"createdAt\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Session creation timestamp\"\n },\n \"updatedAt\": {\n \"type\": \"string\",\n \"format\": \"date-time\",\n \"description\": \"Last update timestamp\"\n }\n },\n \"definitions\": {\n \"ChatMessage\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": { \"type\": \"string\" },\n \"content\": { \"type\": \"string\" },\n \"timestamp\": { \"type\": \"string\", \"format\": \"date-time\" },\n \"author\": { \"type\": \"string\", \"enum\": [\"user\", \"agent\"] },\n \"authorData\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": { \"type\": \"string\" },\n \"email\": { \"type\": \"string\" },\n \"avatarUrl\": { \"type\": \"string\" }\n }\n },\n \"attachments\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/definitions/FileAttachment\" }\n }\n }\n },\n \"FileAttachment\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": { \"type\": \"string\" },\n \"name\": { \"type\": \"string\" },\n \"size\": { \"type\": \"number\" },\n \"type\": { \"type\": \"string\" },\n \"url\": { \"type\": \"string\" }\n }\n }\n }\n}`;\n\nconst API_REFERENCE = `# Channlize API Reference\n\n## Overview\nChannlize is a developer-first support platform that routes customer conversations directly into Slack.\n\nBase URL: \\`http://api.channlize.com\\` (default) or your configured API endpoint\n\n## Authentication\nAll API requests require a Widget Key (API key) in the request body or as a header.\n\n## Endpoints\n\n### Contact Forms\n\n**POST /public/contact**\nSubmit a contact form inquiry.\n\nRequest Body:\n\\`\\`\\`json\n{\n \"widgetKey\": \"your-widget-key\",\n \"name\": \"John Doe\",\n \"email\": \"john@example.com\",\n \"subject\": \"Support Request\",\n \"message\": \"I need help with...\",\n \"pageUrl\": \"https://example.com/contact\",\n \"userAgent\": \"Mozilla/5.0...\"\n}\n\\`\\`\\`\n\nResponse:\n\\`\\`\\`json\n{\n \"data\": {\n \"id\": \"contact_123\",\n \"status\": \"received\",\n \"slackThreadUrl\": \"https://slack.com/...\"\n }\n}\n\\`\\`\\`\n\n### Chat Sessions\n\n**POST /v1/chat/sessions**\nCreate a new chat session.\n\nRequest Body:\n\\`\\`\\`json\n{\n \"metadata\": {\n \"pageUrl\": \"https://example.com\",\n \"userAgent\": \"Mozilla/5.0...\",\n \"customField\": \"value\"\n }\n}\n\\`\\`\\`\n\nResponse:\n\\`\\`\\`json\n{\n \"data\": {\n \"session\": {\n \"id\": \"session_123\",\n \"status\": \"active\",\n \"messages\": [],\n \"createdAt\": \"2025-01-15T10:00:00Z\"\n },\n \"sseEndpoint\": \"/v1/chat/sessions/session_123/events\"\n }\n}\n\\`\\`\\`\n\n**POST /v1/chat/sessions/:sessionId/messages**\nSend a message in a chat session.\n\nRequest: FormData with 'content' field and optional file attachments\n\n**GET /v1/chat/sessions/:sessionId/messages**\nGet messages for a session. Query params: limit, offset\n\n**POST /v1/chat/sessions/:sessionId/close**\nClose a chat session.\n\n## Error Responses\n\nStatus codes:\n- 400: Validation error\n- 401: Authentication failed\n- 429: Rate limit exceeded\n- 500: Server error\n\nError format:\n\\`\\`\\`json\n{\n \"error\": \"Error message\",\n \"code\": \"ERROR_CODE\",\n \"field\": \"fieldName\" // for validation errors\n}\n\\`\\`\\`\n`;\n\nconst QUICK_START = `# Channlize Quick Start\n\n## Installation\n\n\\`\\`\\`bash\n# For React applications\nnpm install @channlize/react\n\n# For non-React applications\nnpm install @channlize/core\n\\`\\`\\`\n\n## React Setup\n\n1. Wrap your app with ChannlizeProvider:\n\n\\`\\`\\`tsx\nimport { ChannlizeProvider } from '@channlize/react';\n\nfunction App() {\n return (\n <ChannlizeProvider\n config={{\n apiKey: 'your-widget-key',\n projectId: 'your-project-id',\n }}\n >\n <YourApp />\n </ChannlizeProvider>\n );\n}\n\\`\\`\\`\n\n2. Use the Form component:\n\n\\`\\`\\`tsx\nimport { Form } from '@channlize/react';\n\nfunction ContactPage() {\n return (\n <Form\n onSuccess={() => console.log('Form submitted!')}\n submitText=\"Send Message\"\n />\n );\n}\n\\`\\`\\`\n\n3. Add live chat:\n\n\\`\\`\\`tsx\nimport { Chat } from '@channlize/react';\n\nfunction SupportPage() {\n return (\n <Chat\n autoStart={true}\n title=\"Customer Support\"\n placeholder=\"How can we help?\"\n />\n );\n}\n\\`\\`\\`\n\n## Core SDK Usage\n\nFor non-React applications:\n\n\\`\\`\\`typescript\nimport { ChannlizeClient } from '@channlize/core';\n\nconst client = new ChannlizeClient({\n apiKey: 'your-widget-key',\n projectId: 'your-project-id',\n});\n\n// Submit contact form\nawait client.submitContactForm({\n name: 'John Doe',\n email: 'john@example.com',\n message: 'I need help!',\n});\n\n// Create chat session\nconst { session } = await client.createChatSession();\n\n// Send message\nawait client.sendMessage(session.id, 'Hello!');\n\\`\\`\\`\n\n## Configuration\n\n- \\`apiKey\\`: Your Channlize widget key (required)\n- \\`projectId\\`: Your project ID (required)\n- \\`baseUrl\\`: API base URL (optional, defaults to api.channlize.com)\n- \\`timeout\\`: Request timeout in ms (optional, defaults to 10000)\n`;\n\nconst REACT_COMPONENTS = `# Channlize React Components\n\n## ChannlizeProvider\n\nWrap your app to provide Channlize configuration to all components.\n\n\\`\\`\\`tsx\n<ChannlizeProvider config={{ apiKey, projectId }}>\n {children}\n</ChannlizeProvider>\n\\`\\`\\`\n\n## Form\n\nA complete contact form with validation and submission handling.\n\n### Props\n- \\`customFields?: Array<CustomField>\\` - Additional form fields\n- \\`onSuccess?: () => void\\` - Success callback\n- \\`onError?: (error: Error) => void\\` - Error callback\n- \\`className?: string\\` - CSS class name\n- \\`styles?: FormStyles\\` - Custom styles object\n- \\`submitText?: string\\` - Submit button text\n- \\`successMessage?: string\\` - Success message text\n\n### Example\n\\`\\`\\`tsx\n<Form\n customFields={[\n {\n name: 'department',\n label: 'Department',\n type: 'select',\n options: ['Sales', 'Support'],\n required: true,\n },\n ]}\n onSuccess={() => alert('Sent!')}\n styles={{\n button: { background: '#007bff', color: 'white' },\n }}\n/>\n\\`\\`\\`\n\n## Chat\n\nReal-time chat widget with message history and file attachments.\n\n### Props\n- \\`autoStart?: boolean\\` - Auto-start chat session\n- \\`metadata?: Record<string, unknown>\\` - Session metadata\n- \\`onMessage?: (message: ChatMessage) => void\\` - New message callback\n- \\`onError?: (error: Error) => void\\` - Error callback\n- \\`className?: string\\` - CSS class name\n- \\`styles?: ChatStyles\\` - Custom styles object\n- \\`title?: string\\` - Chat header title\n- \\`placeholder?: string\\` - Input placeholder text\n- \\`maxHeight?: string\\` - Maximum container height\n\n### Example\n\\`\\`\\`tsx\n<Chat\n autoStart={true}\n title=\"Need Help?\"\n placeholder=\"Type your message...\"\n onMessage={(msg) => console.log('New:', msg)}\n styles={{\n container: { width: '400px', height: '500px' },\n header: { background: '#007bff', color: 'white' },\n }}\n/>\n\\`\\`\\`\n\n## Hooks\n\n### useContactForm()\nHook for managing contact form state.\n\n\\`\\`\\`tsx\nconst { submit, isSubmitting, isSuccess, error, reset } = useContactForm({\n onSuccess: (response) => console.log('Submitted:', response),\n onError: (error) => console.error('Failed:', error),\n});\n\\`\\`\\`\n\n### useChatSession()\nHook for managing chat sessions.\n\n\\`\\`\\`tsx\nconst {\n session,\n messages,\n isConnecting,\n isConnected,\n error,\n sendMessage,\n startSession,\n endSession,\n} = useChatSession({\n autoConnect: false,\n metadata: { page: 'support' },\n onMessage: (message) => console.log('New message:', message),\n});\n\\`\\`\\`\n\n## Styling\n\nAll components accept \\`styles\\` prop for custom styling or \\`className\\` for CSS classes.\n\nCSS class names:\n- \\`.channlize-form\\`\n- \\`.channlize-field\\`\n- \\`.channlize-error\\`\n- \\`.channlize-chat-container\\`\n- \\`.channlize-chat-header\\`\n- \\`.channlize-chat-messages\\`\n- \\`.channlize-message\\`\n- \\`.channlize-message-user\\`\n- \\`.channlize-message-agent\\`\n`;\n\nexport const resources: Resource[] = [\n {\n uri: 'channlize://schema/contact-form',\n name: 'Contact Form Schema',\n description: 'JSON schema for contact form data structure',\n mimeType: 'application/json',\n getText: () => CONTACT_FORM_SCHEMA,\n },\n {\n uri: 'channlize://schema/chat-session',\n name: 'Chat Session Schema',\n description: 'JSON schema for chat session data structure',\n mimeType: 'application/json',\n getText: () => CHAT_SESSION_SCHEMA,\n },\n {\n uri: 'channlize://docs/api-reference',\n name: 'API Reference',\n description: 'Complete Channlize API reference documentation',\n mimeType: 'text/markdown',\n getText: () => API_REFERENCE,\n },\n {\n uri: 'channlize://docs/quick-start',\n name: 'Quick Start Guide',\n description: 'Quick start guide for using Channlize SDK',\n mimeType: 'text/markdown',\n getText: () => QUICK_START,\n },\n {\n uri: 'channlize://docs/react-components',\n name: 'React Components Documentation',\n description: 'Documentation for Channlize React components and hooks',\n mimeType: 'text/markdown',\n getText: () => REACT_COMPONENTS,\n },\n];\n\nexport function getResource(uri: string): Resource | undefined {\n return resources.find(r => r.uri === uri);\n}\n\nexport function listResources(): Resource[] {\n return resources;\n}\n\n","/**\n * MCP Tools for Channlize\n * Wraps ChannlizeClient methods for AI agent interaction\n */\n\nimport { ChannlizeClient } from '@channlize/core';\nimport type { ToolContext } from '../types';\n\nexport interface ToolDefinition {\n name: string;\n description: string;\n inputSchema: {\n type: 'object';\n properties: Record<string, any>;\n required?: string[];\n };\n handler: (args: any, context: ToolContext) => Promise<any>;\n}\n\nfunction createClient(context: ToolContext): ChannlizeClient {\n return new ChannlizeClient({\n apiKey: context.config.apiKey,\n projectId: context.config.projectId || '',\n baseUrl: context.config.baseUrl,\n timeout: context.config.timeout,\n });\n}\n\nexport const tools: ToolDefinition[] = [\n {\n name: 'submit_contact_form',\n description:\n 'Submit a contact form inquiry to Channlize. This creates a new conversation thread in Slack where the team can respond.',\n inputSchema: {\n type: 'object',\n properties: {\n name: {\n type: 'string',\n description: \"Contact's full name\",\n },\n email: {\n type: 'string',\n description: \"Contact's email address\",\n },\n subject: {\n type: 'string',\n description: 'Subject line for the inquiry (optional)',\n },\n message: {\n type: 'string',\n description: 'The message content',\n },\n customFields: {\n type: 'object',\n description:\n 'Additional custom fields as key-value pairs (optional)',\n additionalProperties: true,\n },\n pageUrl: {\n type: 'string',\n description: 'URL of the page where form was submitted (optional)',\n },\n userAgent: {\n type: 'string',\n description: 'User agent string of the submitter (optional)',\n },\n },\n required: ['name', 'email', 'message'],\n },\n handler: async (args, context) => {\n const client = createClient(context);\n const response = await client.submitContactForm({\n name: args.name,\n email: args.email,\n subject: args.subject,\n message: args.message,\n customFields: args.customFields,\n pageUrl: args.pageUrl,\n userAgent: args.userAgent,\n });\n return {\n success: true,\n contactId: response.id,\n status: response.status,\n slackThreadUrl: response.slackThreadUrl,\n message: 'Contact form submitted successfully',\n };\n },\n },\n {\n name: 'create_chat_session',\n description:\n 'Create a new chat session for real-time messaging. Returns a session ID that can be used to send and receive messages.',\n inputSchema: {\n type: 'object',\n properties: {\n metadata: {\n type: 'object',\n description:\n 'Custom metadata to attach to the session (e.g., page URL, user info)',\n additionalProperties: true,\n },\n },\n },\n handler: async (args, context) => {\n const client = createClient(context);\n const response = await client.createChatSession(args.metadata);\n return {\n success: true,\n session: {\n id: response.session.id,\n status: response.session.status,\n createdAt: response.session.createdAt,\n messageCount: response.session.messages?.length || 0,\n },\n sseEndpoint: response.sseEndpoint,\n message: 'Chat session created successfully',\n };\n },\n },\n {\n name: 'send_message',\n description:\n 'Send a message in an existing chat session. The message will be delivered to the Slack thread and the user can see agent replies in real-time.',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: {\n type: 'string',\n description: 'The chat session ID',\n },\n content: {\n type: 'string',\n description: 'The message content to send',\n },\n },\n required: ['sessionId', 'content'],\n },\n handler: async (args, context) => {\n const client = createClient(context);\n const response = await client.sendMessage(args.sessionId, args.content);\n return {\n success: true,\n message: {\n id: response.message.id,\n content: response.message.content,\n timestamp: response.message.timestamp,\n author: response.message.author,\n },\n sessionStatus: response.session.status,\n deliveryMessage: 'Message sent successfully',\n };\n },\n },\n {\n name: 'get_chat_messages',\n description:\n 'Retrieve messages from a chat session. Useful for viewing conversation history.',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: {\n type: 'string',\n description: 'The chat session ID',\n },\n limit: {\n type: 'number',\n description: 'Maximum number of messages to retrieve (default: 50)',\n default: 50,\n },\n offset: {\n type: 'number',\n description: 'Number of messages to skip (default: 0)',\n default: 0,\n },\n },\n required: ['sessionId'],\n },\n handler: async (args, context) => {\n const client = createClient(context);\n const messages = await client.getChatMessages(\n args.sessionId,\n args.limit || 50,\n args.offset || 0\n );\n return {\n success: true,\n sessionId: args.sessionId,\n messageCount: messages.length,\n messages: messages.map(msg => ({\n id: msg.id,\n content: msg.content,\n timestamp: msg.timestamp,\n author: msg.author,\n authorData: msg.authorData,\n hasAttachments: (msg.attachments?.length || 0) > 0,\n })),\n };\n },\n },\n {\n name: 'close_chat_session',\n description:\n 'Close an active chat session. This marks the conversation as complete and stops real-time updates.',\n inputSchema: {\n type: 'object',\n properties: {\n sessionId: {\n type: 'string',\n description: 'The chat session ID to close',\n },\n },\n required: ['sessionId'],\n },\n handler: async (args, context) => {\n const client = createClient(context);\n const session = await client.closeChatSession(args.sessionId);\n return {\n success: true,\n sessionId: session.id,\n status: session.status,\n closedAt: session.updatedAt,\n message: 'Chat session closed successfully',\n };\n },\n },\n];\n\nexport function getTool(name: string): ToolDefinition | undefined {\n return tools.find(t => t.name === name);\n}\n\nexport function listTools(): ToolDefinition[] {\n return tools;\n}\n\n\n\n\n\n","/**\n * MCP Prompts for Channlize\n * Templates for common integration patterns and use cases\n */\n\nexport interface PromptDefinition {\n name: string;\n description: string;\n arguments?: Array<{\n name: string;\n description: string;\n required?: boolean;\n }>;\n getPrompt: (args?: Record<string, string>) => string;\n}\n\nexport const prompts: PromptDefinition[] = [\n {\n name: 'integrate-contact-form',\n description:\n 'Guide for adding a Channlize contact form to a React application',\n arguments: [\n {\n name: 'framework',\n description: 'The React framework being used (e.g., Next.js, Vite, CRA)',\n required: false,\n },\n {\n name: 'styling',\n description: 'The styling approach (e.g., Tailwind, CSS Modules, styled-components)',\n required: false,\n },\n ],\n getPrompt: args => {\n const framework = args?.framework || 'React';\n const styling = args?.styling || 'CSS';\n \n return `# Integrating Channlize Contact Form in ${framework}\n\n## Step 1: Install Dependencies\n\n\\`\\`\\`bash\nnpm install @channlize/react\n\\`\\`\\`\n\n## Step 2: Configure Provider\n\nWrap your application with the ChannlizeProvider at the root level:\n\n\\`\\`\\`tsx\nimport { ChannlizeProvider } from '@channlize/react';\n\nfunction App() {\n return (\n <ChannlizeProvider\n config={{\n apiKey: process.env.NEXT_PUBLIC_CHANNLIZE_API_KEY, // Your widget key\n projectId: process.env.NEXT_PUBLIC_CHANNLIZE_PROJECT_ID,\n baseUrl: process.env.NEXT_PUBLIC_CHANNLIZE_API_URL, // Optional\n }}\n >\n <YourAppContent />\n </ChannlizeProvider>\n );\n}\n\\`\\`\\`\n\n## Step 3: Add Form Component\n\nCreate a contact page or component:\n\n\\`\\`\\`tsx\nimport { Form } from '@channlize/react';\n\nexport default function ContactPage() {\n return (\n <div className=\"container mx-auto py-8\">\n <h1>Contact Us</h1>\n <Form\n onSuccess={() => {\n alert('Thank you! We will get back to you soon.');\n }}\n onError={(error) => {\n console.error('Failed to submit:', error);\n }}\n customFields={[\n {\n name: 'department',\n label: 'Department',\n type: 'select',\n options: ['Sales', 'Support', 'Billing'],\n required: true,\n },\n ]}\n ${styling === 'Tailwind' ? `className=\"max-w-2xl\"` : ''}\n styles={{\n form: { maxWidth: '600px', margin: '0 auto' },\n button: { \n background: '#007bff', \n color: 'white',\n padding: '0.75rem 1.5rem',\n borderRadius: '0.5rem',\n },\n }}\n submitText=\"Send Message\"\n successMessage=\"Thank you! We'll respond shortly.\"\n />\n </div>\n );\n}\n\\`\\`\\`\n\n## Step 4: Environment Variables\n\nAdd to your \\`.env.local\\` or \\`.env\\`:\n\n\\`\\`\\`\nNEXT_PUBLIC_CHANNLIZE_API_KEY=your_widget_key_here\nNEXT_PUBLIC_CHANNLIZE_PROJECT_ID=your_project_id_here\nNEXT_PUBLIC_CHANNLIZE_API_URL=http://api.channlize.com # Optional\n\\`\\`\\`\n\n## Step 5: Customize (Optional)\n\n### Custom Fields\nAdd custom fields to gather specific information:\n\n\\`\\`\\`tsx\ncustomFields={[\n {\n name: 'company',\n label: 'Company Name',\n type: 'text',\n required: false,\n },\n {\n name: 'priority',\n label: 'Priority',\n type: 'select',\n options: ['Low', 'Medium', 'High'],\n required: true,\n },\n]}\n\\`\\`\\`\n\n### Custom Styling with ${styling}\n${styling === 'Tailwind' \n ? 'Use Tailwind classes with the className prop or override styles.'\n : 'Apply custom styles using the styles prop or external CSS.'}\n\n## Tips\n\n- Messages are sent to your configured Slack channel instantly\n- Email fallback is automatic if Slack delivery fails\n- Form includes built-in validation and error handling\n- All fields support accessibility features (ARIA labels, keyboard navigation)\n\n## Next Steps\n\n- Set up Slack workspace integration in your Channlize dashboard\n- Configure channel routing rules\n- Add webhooks for custom workflows\n`;\n },\n },\n {\n name: 'setup-live-chat',\n description:\n 'Guide for implementing the Channlize live chat widget in a React application',\n arguments: [\n {\n name: 'placement',\n description: 'Where to place the chat widget (e.g., \"page\", \"popup\", \"sidebar\")',\n required: false,\n },\n ],\n getPrompt: args => {\n const placement = args?.placement || 'page';\n \n return `# Setting Up Channlize Live Chat Widget\n\n## Step 1: Install Dependencies\n\n\\`\\`\\`bash\nnpm install @channlize/react\n\\`\\`\\`\n\n## Step 2: Configure Provider\n\nEnsure your app is wrapped with ChannlizeProvider:\n\n\\`\\`\\`tsx\nimport { ChannlizeProvider } from '@channlize/react';\n\nfunction App() {\n return (\n <ChannlizeProvider\n config={{\n apiKey: process.env.NEXT_PUBLIC_CHANNLIZE_API_KEY,\n projectId: process.env.NEXT_PUBLIC_CHANNLIZE_PROJECT_ID,\n }}\n >\n <YourAppContent />\n </ChannlizeProvider>\n );\n}\n\\`\\`\\`\n\n## Step 3: Add Chat Component\n\n${placement === 'popup' ? `\n### Popup Widget (Bottom-Right Corner)\n\n\\`\\`\\`tsx\nimport { useState } from 'react';\nimport { Chat } from '@channlize/react';\n\nexport function ChatWidget() {\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <>\n {/* Floating Button */}\n {!isOpen && (\n <button\n onClick={() => setIsOpen(true)}\n style={{\n position: 'fixed',\n bottom: '20px',\n right: '20px',\n width: '60px',\n height: '60px',\n borderRadius: '50%',\n background: '#007bff',\n color: 'white',\n border: 'none',\n fontSize: '24px',\n cursor: 'pointer',\n boxShadow: '0 4px 12px rgba(0,0,0,0.15)',\n zIndex: 1000,\n }}\n >\n 💬\n </button>\n )}\n\n {/* Chat Window */}\n {isOpen && (\n <div\n style={{\n position: 'fixed',\n bottom: '20px',\n right: '20px',\n zIndex: 1000,\n boxShadow: '0 4px 24px rgba(0,0,0,0.15)',\n borderRadius: '12px',\n overflow: 'hidden',\n }}\n >\n <Chat\n autoStart={true}\n title=\"Customer Support\"\n placeholder=\"Type your message...\"\n onMessage={(message) => {\n console.log('New message:', message);\n }}\n styles={{\n container: {\n width: '380px',\n height: '600px',\n display: 'flex',\n flexDirection: 'column',\n background: 'white',\n },\n header: {\n background: '#007bff',\n color: 'white',\n padding: '1rem',\n display: 'flex',\n alignItems: 'center',\n },\n }}\n />\n <button\n onClick={() => setIsOpen(false)}\n style={{\n position: 'absolute',\n top: '10px',\n right: '10px',\n background: 'rgba(255,255,255,0.2)',\n border: 'none',\n color: 'white',\n cursor: 'pointer',\n fontSize: '20px',\n width: '30px',\n height: '30px',\n borderRadius: '50%',\n }}\n >\n ×\n </button>\n </div>\n )}\n </>\n );\n}\n\\`\\`\\`\n` : `\n### Embedded Chat\n\n\\`\\`\\`tsx\nimport { Chat } from '@channlize/react';\n\nexport default function SupportPage() {\n return (\n <div className=\"container mx-auto py-8\">\n <h1>Customer Support</h1>\n <Chat\n autoStart={true}\n title=\"Live Chat Support\"\n placeholder=\"How can we help you today?\"\n onMessage={(message) => {\n // Handle incoming messages\n console.log('New message:', message);\n }}\n onError={(error) => {\n console.error('Chat error:', error);\n }}\n styles={{\n container: {\n width: '100%',\n maxWidth: '800px',\n height: '600px',\n margin: '0 auto',\n border: '1px solid #e0e0e0',\n borderRadius: '12px',\n },\n header: {\n background: '#007bff',\n color: 'white',\n },\n }}\n maxHeight=\"600px\"\n />\n </div>\n );\n}\n\\`\\`\\`\n`}\n\n## Step 4: Advanced Features\n\n### Custom Metadata\nPass context about the user or page:\n\n\\`\\`\\`tsx\n<Chat\n metadata={{\n userId: user?.id,\n userName: user?.name,\n currentPage: window.location.pathname,\n plan: 'pro',\n }}\n/>\n\\`\\`\\`\n\n### Event Handlers\nReact to chat events:\n\n\\`\\`\\`tsx\n<Chat\n onMessage={(message) => {\n // Track analytics\n analytics.track('chat_message_received', {\n author: message.author,\n timestamp: message.timestamp,\n });\n }}\n onError={(error) => {\n // Report errors\n errorReporting.log(error);\n }}\n/>\n\\`\\`\\`\n\n## Real-Time Features\n\n- Messages are delivered instantly via Server-Sent Events (SSE)\n- Agent presence indicators show when team is active\n- File attachments supported (images, documents)\n- Automatic reconnection on connection loss\n- Message history persisted across sessions\n\n## Tips\n\n- Chat sessions are automatically created on first message\n- Sessions remain active until explicitly closed\n- Messages are threaded in Slack for team collaboration\n- Supports multiple concurrent chat sessions per project\n\n## Next Steps\n\n- Configure Slack notifications for new chats\n- Set up auto-responses for common questions\n- Integrate with your analytics platform\n- Add custom routing based on user context\n`;\n },\n },\n {\n name: 'customize-styling',\n description:\n 'Guide for theming and customizing Channlize components',\n getPrompt: () => `# Customizing Channlize Component Styling\n\nChannlize components are designed to be highly customizable to match your brand.\n\n## Styling Approaches\n\n### 1. Inline Styles with \\`styles\\` Prop\n\nThe most direct way to customize appearance:\n\n\\`\\`\\`tsx\n<Form\n styles={{\n form: {\n maxWidth: '600px',\n margin: '0 auto',\n padding: '2rem',\n background: '#f9fafb',\n borderRadius: '8px',\n },\n field: {\n marginBottom: '1.5rem',\n },\n label: {\n display: 'block',\n marginBottom: '0.5rem',\n fontWeight: '600',\n color: '#374151',\n },\n input: {\n width: '100%',\n padding: '0.75rem',\n border: '1px solid #d1d5db',\n borderRadius: '6px',\n fontSize: '1rem',\n },\n textarea: {\n width: '100%',\n padding: '0.75rem',\n border: '1px solid #d1d5db',\n borderRadius: '6px',\n fontSize: '1rem',\n minHeight: '120px',\n },\n button: {\n background: '#3b82f6',\n color: 'white',\n padding: '0.75rem 2rem',\n border: 'none',\n borderRadius: '6px',\n fontSize: '1rem',\n fontWeight: '600',\n cursor: 'pointer',\n transition: 'background 0.2s',\n },\n error: {\n color: '#ef4444',\n fontSize: '0.875rem',\n marginTop: '0.5rem',\n },\n success: {\n background: '#ecfdf5',\n border: '1px solid #10b981',\n padding: '1.5rem',\n borderRadius: '6px',\n color: '#065f46',\n },\n }}\n/>\n\\`\\`\\`\n\n### 2. CSS Classes with \\`className\\` Prop\n\nUse your existing CSS or CSS-in-JS solution:\n\n\\`\\`\\`tsx\n<Form className=\"custom-form\" />\n\\`\\`\\`\n\n\\`\\`\\`css\n/* styles.css */\n.channlize-form {\n max-width: 600px;\n margin: 0 auto;\n}\n\n.channlize-field {\n margin-bottom: 1.5rem;\n}\n\n.channlize-field label {\n font-weight: 600;\n color: var(--primary-text);\n}\n\n.channlize-field input,\n.channlize-field textarea,\n.channlize-field select {\n border: 1px solid var(--border-color);\n border-radius: 6px;\n padding: 0.75rem;\n}\n\n.channlize-form button[type=\"submit\"] {\n background: var(--primary-color);\n color: white;\n}\n\\`\\`\\`\n\n### 3. Tailwind CSS\n\nCombine with Tailwind utility classes:\n\n\\`\\`\\`tsx\n<Form\n className=\"max-w-2xl mx-auto p-8\"\n styles={{\n input: {\n // Tailwind styles as objects don't work well\n // Use className on wrapper or global CSS\n },\n }}\n/>\n\\`\\`\\`\n\n\\`\\`\\`css\n/* globals.css with @layer */\n@layer components {\n .channlize-field input {\n @apply w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500;\n }\n \n .channlize-field textarea {\n @apply w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500;\n }\n \n .channlize-form button[type=\"submit\"] {\n @apply bg-blue-600 hover:bg-blue-700 text-white font-semibold py-3 px-6 rounded-lg transition;\n }\n}\n\\`\\`\\`\n\n## Styling Chat\n\n\\`\\`\\`tsx\n<Chat\n styles={{\n container: {\n border: '1px solid #e5e7eb',\n borderRadius: '12px',\n overflow: 'hidden',\n boxShadow: '0 4px 12px rgba(0,0,0,0.1)',\n },\n header: {\n background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n color: 'white',\n padding: '1rem',\n },\n messages: {\n background: '#f9fafb',\n padding: '1rem',\n },\n messageUser: {\n background: '#3b82f6',\n color: 'white',\n padding: '0.75rem',\n borderRadius: '12px 12px 4px 12px',\n maxWidth: '70%',\n marginLeft: 'auto',\n },\n messageAgent: {\n background: 'white',\n color: '#1f2937',\n padding: '0.75rem',\n borderRadius: '12px 12px 12px 4px',\n maxWidth: '70%',\n border: '1px solid #e5e7eb',\n },\n input: {\n border: '1px solid #d1d5db',\n borderRadius: '6px',\n padding: '0.75rem',\n fontSize: '1rem',\n },\n button: {\n background: '#3b82f6',\n color: 'white',\n padding: '0.75rem 1.5rem',\n borderRadius: '6px',\n border: 'none',\n cursor: 'pointer',\n },\n }}\n/>\n\\`\\`\\`\n\n## CSS Class Reference\n\nAll Channlize components use semantic CSS classes:\n\n**Form:**\n- \\`.channlize-form\\` - Form container\n- \\`.channlize-form-success\\` - Success message container\n- \\`.channlize-field\\` - Field wrapper\n- \\`.channlize-error\\` - Error message\n\n**Chat:**\n- \\`.channlize-chat-container\\` - Main container\n- \\`.channlize-chat-header\\` - Header section\n- \\`.channlize-chat-messages\\` - Messages container\n- \\`.channlize-message\\` - Individual message\n- \\`.channlize-message-user\\` - User message\n- \\`.channlize-message-agent\\` - Agent message\n- \\`.channlize-chat-input-container\\` - Input area\n\n## Dark Mode Example\n\n\\`\\`\\`tsx\nconst darkStyles = {\n form: {\n background: '#1f2937',\n color: '#f9fafb',\n },\n input: {\n background: '#374151',\n color: '#f9fafb',\n border: '1px solid #4b5563',\n },\n button: {\n background: '#3b82f6',\n color: 'white',\n },\n};\n\n<Form styles={darkStyles} />\n\\`\\`\\`\n`,\n },\n {\n name: 'handle-webhooks',\n description:\n 'Guide for integrating Channlize webhooks into custom workflows',\n getPrompt: () => `# Integrating Channlize Webhooks\n\nChannlize can send webhook events to your backend for custom workflows and integrations.\n\n## Available Webhook Events\n\n- \\`conversation.created\\` - New contact form or chat session started\n- \\`message.created\\` - New message in a conversation\n- \\`conversation.closed\\` - Conversation marked as closed\n- \\`agent.assigned\\` - Agent assigned to conversation\n\n## Setting Up Webhooks\n\n### 1. Configure Webhook URL\n\nIn your Channlize dashboard:\n1. Navigate to Project Settings → Webhooks\n2. Add your webhook endpoint URL\n3. Select which events to receive\n4. Save your secret key for verification\n\n### 2. Create Webhook Handler (Next.js API Route)\n\n\\`\\`\\`typescript\n// app/api/webhooks/channlize/route.ts\nimport { NextRequest, NextResponse } from 'next/server';\nimport crypto from 'crypto';\n\nconst WEBHOOK_SECRET = process.env.CHANNLIZE_WEBHOOK_SECRET!;\n\nfunction verifySignature(payload: string, signature: string): boolean {\n const hmac = crypto.createHmac('sha256', WEBHOOK_SECRET);\n const digest = hmac.update(payload).digest('hex');\n return crypto.timingSafeEqual(\n Buffer.from(signature),\n Buffer.from(digest)\n );\n}\n\nexport async function POST(req: NextRequest) {\n const signature = req.headers.get('x-channlize-signature');\n const payload = await req.text();\n\n if (!signature || !verifySignature(payload, signature)) {\n return NextResponse.json(\n { error: 'Invalid signature' },\n { status: 401 }\n );\n }\n\n const event = JSON.parse(payload);\n\n // Handle different event types\n switch (event.type) {\n case 'conversation.created':\n await handleNewConversation(event.data);\n break;\n\n case 'message.created':\n await handleNewMessage(event.data);\n break;\n\n case 'conversation.closed':\n await handleConversationClosed(event.data);\n break;\n\n default:\n console.log('Unhandled event type:', event.type);\n }\n\n return NextResponse.json({ received: true });\n}\n\nasync function handleNewConversation(data: any) {\n // Example: Log to analytics\n await analytics.track('support_conversation_started', {\n conversationId: data.conversation.id,\n type: data.conversation.type, // 'contact_form' or 'chat'\n customerEmail: data.conversation.email,\n });\n\n // Example: Notify sales team for high-value customers\n if (data.conversation.metadata?.customerTier === 'enterprise') {\n await notifySalesTeam({\n conversationId: data.conversation.id,\n customerEmail: data.conversation.email,\n message: data.conversation.initialMessage,\n });\n }\n}\n\nasync function handleNewMessage(data: any) {\n // Example: Auto-tag based on content\n const message = data.message.content.toLowerCase();\n \n if (message.includes('bug') || message.includes('error')) {\n await tagConversation(data.conversation.id, 'bug');\n }\n \n if (message.includes('billing') || message.includes('payment')) {\n await tagConversation(data.conversation.id, 'billing');\n await assignToDepartment(data.conversation.id, 'billing');\n }\n\n // Example: Sentiment analysis\n const sentiment = await analyzeSentiment(message);\n if (sentiment === 'negative') {\n await escalateConversation(data.conversation.id, 'high');\n }\n}\n\nasync function handleConversationClosed(data: any) {\n // Example: Send satisfaction survey\n await sendSurveyEmail({\n to: data.conversation.email,\n conversationId: data.conversation.id,\n resolutionTime: data.metrics.resolutionTime,\n });\n\n // Example: Update CRM\n await updateCRM({\n email: data.conversation.email,\n lastInteraction: new Date(),\n supportTicketId: data.conversation.id,\n resolved: true,\n });\n}\n\\`\\`\\`\n\n### 3. Express.js Example\n\n\\`\\`\\`typescript\nimport express from 'express';\nimport crypto from 'crypto';\n\nconst app = express();\n\n// Raw body needed for signature verification\napp.use('/webhooks/channlize', express.raw({ type: 'application/json' }));\n\napp.post('/webhooks/channlize', (req, res) => {\n const signature = req.headers['x-channlize-signature'];\n const payload = req.body.toString();\n\n // Verify signature\n const hmac = crypto.createHmac('sha256', process.env.CHANNLIZE_WEBHOOK_SECRET);\n const digest = hmac.update(payload).digest('hex');\n\n if (signature !== digest) {\n return res.status(401).json({ error: 'Invalid signature' });\n }\n\n const event = JSON.parse(payload);\n\n // Handle event\n handleEvent(event);\n\n res.json({ received: true });\n});\n\\`\\`\\`\n\n## Webhook Event Payload Examples\n\n### conversation.created\n\n\\`\\`\\`json\n{\n \"type\": \"conversation.created\",\n \"timestamp\": \"2025-01-15T10:00:00Z\",\n \"data\": {\n \"conversation\": {\n \"id\": \"conv_123\",\n \"type\": \"contact_form\",\n \"status\": \"open\",\n \"email\": \"customer@example.com\",\n \"name\": \"John Doe\",\n \"initialMessage\": \"I need help with...\",\n \"metadata\": {\n \"pageUrl\": \"https://example.com/contact\",\n \"userAgent\": \"Mozilla/5.0...\"\n },\n \"createdAt\": \"2025-01-15T10:00:00Z\"\n }\n }\n}\n\\`\\`\\`\n\n### message.created\n\n\\`\\`\\`json\n{\n \"type\": \"message.created\",\n \"timestamp\": \"2025-01-15T10:05:00Z\",\n \"data\": {\n \"message\": {\n \"id\": \"msg_456\",\n \"conversationId\": \"conv_123\",\n \"content\": \"Thanks for reaching out!\",\n \"author\": \"agent\",\n \"authorData\": {\n \"name\": \"Sarah\",\n \"email\": \"sarah@example.com\"\n },\n \"timestamp\": \"2025-01-15T10:05:00Z\"\n },\n \"conversation\": {\n \"id\": \"conv_123\",\n \"status\": \"open\"\n }\n }\n}\n\\`\\`\\`\n\n## Use Cases\n\n1. **CRM Integration**: Sync conversations to Salesforce, HubSpot, etc.\n2. **Analytics**: Track support metrics in your data warehouse\n3. **Auto-routing**: Assign conversations based on content analysis\n4. **Notifications**: Alert teams via SMS, PagerDuty for urgent issues\n5. **AI Enhancement**: Feed messages to AI for sentiment/intent analysis\n6. **Billing**: Track support usage for metered billing\n\n## Security Best Practices\n\n- Always verify webhook signatures\n- Use HTTPS endpoints only\n- Rotate webhook secrets periodically\n- Implement rate limiting on webhook endpoints\n- Log all webhook events for audit trail\n`,\n },\n];\n\nexport function getPrompt(name: string): PromptDefinition | undefined {\n return prompts.find(p => p.name === name);\n}\n\nexport function listPrompts(): PromptDefinition[] {\n return prompts;\n}\n\n"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6OnB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,WAAW,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["resources","tools","prompts"]}
|