@yassirbenmoussa/aicommerce-sdk 1.0.0 → 1.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 CHANGED
@@ -7,11 +7,11 @@ AI-powered product recommendations for e-commerce. This SDK allows you to easily
7
7
  ### npm / yarn / pnpm
8
8
 
9
9
  ```bash
10
- npm install @ai-commerce/sdk
10
+ npm install @yassirbenmoussa/aicommerce-sdk
11
11
  # or
12
- yarn add @ai-commerce/sdk
12
+ yarn add @yassirbenmoussa/aicommerce-sdk
13
13
  # or
14
- pnpm add @ai-commerce/sdk
14
+ pnpm add @yassirbenmoussa/aicommerce-sdk
15
15
  ```
16
16
 
17
17
  ### Script Tag (CDN)
@@ -25,7 +25,7 @@ pnpm add @ai-commerce/sdk
25
25
  ### ES Modules / TypeScript
26
26
 
27
27
  ```typescript
28
- import { AICommerce } from '@ai-commerce/sdk';
28
+ import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';
29
29
 
30
30
  // Initialize the client
31
31
  const client = new AICommerce({
@@ -42,7 +42,7 @@ console.log(response.products); // Recommended products
42
42
  ### CommonJS
43
43
 
44
44
  ```javascript
45
- const { AICommerce } = require('@ai-commerce/sdk');
45
+ const { AICommerce } = require('@yassirbenmoussa/aicommerce-sdk');
46
46
 
47
47
  const client = new AICommerce({
48
48
  apiKey: 'your-api-key',
@@ -139,13 +139,13 @@ import type {
139
139
  ChatResponse,
140
140
  Product,
141
141
  ChatContext
142
- } from '@ai-commerce/sdk';
142
+ } from '@yassirbenmoussa/aicommerce-sdk';
143
143
  ```
144
144
 
145
145
  ## Error Handling
146
146
 
147
147
  ```typescript
148
- import { AICommerce, AICommerceError } from '@ai-commerce/sdk';
148
+ import { AICommerce, AICommerceError } from '@yassirbenmoussa/aicommerce-sdk';
149
149
 
150
150
  try {
151
151
  const response = await client.chat('Hello');
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/index.ts"],"names":["AICommerce","AICommerceError"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Session,\r\n APIError,\r\n} from './types';\r\n\r\n/**\r\n * AI Commerce SDK Client\r\n * \r\n * @example\r\n * ```typescript\r\n * import { AICommerce } from '@ai-commerce/sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop under $1000');\r\n * console.log(response.products);\r\n * ```\r\n */\r\nexport class AICommerce {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly timeout: number;\r\n private sessionToken: string | null = null;\r\n\r\n constructor(config: AICommerceConfig) {\r\n if (!config.apiKey) {\r\n throw new Error('AICommerce: apiKey is required');\r\n }\r\n\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = this.normalizeUrl(config.baseUrl || this.detectBaseUrl());\r\n this.timeout = config.timeout || 30000;\r\n }\r\n\r\n /**\r\n * Detect the base URL based on environment\r\n */\r\n private detectBaseUrl(): string {\r\n // Browser environment\r\n if (typeof window !== 'undefined') {\r\n return window.location.origin;\r\n }\r\n // Node.js or default\r\n return 'https://api.aicommerce.dev';\r\n }\r\n\r\n /**\r\n * Normalize URL (remove trailing slash)\r\n */\r\n private normalizeUrl(url: string): string {\r\n return url.replace(/\\/$/, '');\r\n }\r\n\r\n /**\r\n * Make an API request\r\n */\r\n private async request<T>(\r\n endpoint: string,\r\n options: RequestInit = {}\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${endpoint}`;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n ...options,\r\n signal: controller.signal,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n ...(this.sessionToken && { 'X-Session-Token': this.sessionToken }),\r\n ...options.headers,\r\n },\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const error: APIError = {\r\n code: errorData.code || 'UNKNOWN_ERROR',\r\n message: errorData.message || errorData.error || `HTTP ${response.status}`,\r\n status: response.status,\r\n };\r\n throw new AICommerceError(error.message, error.code, error.status);\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof AICommerceError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new AICommerceError('Request timeout', 'TIMEOUT', 408);\r\n }\r\n\r\n throw new AICommerceError(\r\n error instanceof Error ? error.message : 'Unknown error',\r\n 'NETWORK_ERROR',\r\n 0\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Send a chat message and get product recommendations\r\n * \r\n * @param message - The user's message or full ChatRequest object\r\n * @param context - Optional context for better recommendations\r\n * @returns Chat response with AI reply and products\r\n * \r\n * @example\r\n * ```typescript\r\n * // Simple usage\r\n * const response = await client.chat('I need running shoes');\r\n * \r\n * // With context\r\n * const response = await client.chat('I need running shoes', {\r\n * budget: { max: 150 },\r\n * preferences: ['comfortable', 'lightweight']\r\n * });\r\n * ```\r\n */\r\n async chat(\r\n message: string | ChatRequest,\r\n context?: ChatContext\r\n ): Promise<ChatResponse> {\r\n const request: ChatRequest = typeof message === 'string'\r\n ? { message, context, sessionToken: this.sessionToken || undefined }\r\n : { ...message, sessionToken: message.sessionToken || this.sessionToken || undefined };\r\n\r\n const response = await this.request<ChatResponse>('/api/v1/chat', {\r\n method: 'POST',\r\n body: JSON.stringify(request),\r\n });\r\n\r\n // Store session token for follow-up messages\r\n if (response.sessionToken) {\r\n this.sessionToken = response.sessionToken;\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Create a new chat session\r\n * \r\n * @returns Session information with token\r\n */\r\n async createSession(): Promise<Session> {\r\n const response = await this.request<{ session: Session }>('/api/v1/chat/session', {\r\n method: 'POST',\r\n });\r\n\r\n this.sessionToken = response.session.token;\r\n return response.session;\r\n }\r\n\r\n /**\r\n * Clear the current session\r\n */\r\n clearSession(): void {\r\n this.sessionToken = null;\r\n }\r\n\r\n /**\r\n * Get the current session token\r\n */\r\n getSessionToken(): string | null {\r\n return this.sessionToken;\r\n }\r\n\r\n /**\r\n * Set a session token (for restoring sessions)\r\n */\r\n setSessionToken(token: string): void {\r\n this.sessionToken = token;\r\n }\r\n\r\n /**\r\n * Static method for one-off chat requests\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await AICommerce.quickChat({\r\n * apiKey: 'your-api-key',\r\n * message: 'I need a laptop'\r\n * });\r\n * ```\r\n */\r\n static async quickChat(options: {\r\n apiKey: string;\r\n message: string;\r\n baseUrl?: string;\r\n context?: ChatContext;\r\n }): Promise<ChatResponse> {\r\n const client = new AICommerce({\r\n apiKey: options.apiKey,\r\n baseUrl: options.baseUrl,\r\n });\r\n return client.chat(options.message, options.context);\r\n }\r\n}\r\n\r\n/**\r\n * Custom error class for AI Commerce SDK\r\n */\r\nexport class AICommerceError extends Error {\r\n readonly code: string;\r\n readonly status: number;\r\n\r\n constructor(message: string, code: string, status: number) {\r\n super(message);\r\n this.name = 'AICommerceError';\r\n this.code = code;\r\n this.status = status;\r\n\r\n // Maintain proper prototype chain\r\n Object.setPrototypeOf(this, AICommerceError.prototype);\r\n }\r\n}\r\n","/**\r\n * AI Commerce SDK\r\n * \r\n * AI-powered product recommendations for e-commerce\r\n * \r\n * @packageDocumentation\r\n * @module @ai-commerce/sdk\r\n * \r\n * @example\r\n * ```typescript\r\n * // npm usage\r\n * import { AICommerce } from '@ai-commerce/sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop');\r\n * console.log(response.products);\r\n * ```\r\n * \r\n * @example\r\n * ```html\r\n * <!-- Script tag usage -->\r\n * <script src=\"https://cdn.aicommerce.dev/sdk.min.js\"></script>\r\n * <script>\r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * client.chat('I need a laptop').then(response => {\r\n * console.log(response.products);\r\n * });\r\n * </script>\r\n * ```\r\n */\r\n\r\n// Export main client\r\nexport { AICommerce, AICommerceError } from './client';\r\n\r\n// Export all types\r\nexport type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Product,\r\n Session,\r\n APIError,\r\n EventType,\r\n EventCallback,\r\n} from './types';\r\n\r\n// Version\r\nexport const VERSION = '1.0.0';\r\n\r\n// For UMD builds, attach to window\r\nif (typeof window !== 'undefined') {\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerce = require('./client').AICommerce;\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerceError = require('./client').AICommerceError;\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/index.ts"],"names":["AICommerce","AICommerceError"],"mappings":"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","file":"index.cjs","sourcesContent":["import type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Session,\r\n APIError,\r\n} from './types';\r\n\r\n/**\r\n * AI Commerce SDK Client\r\n * \r\n * @example\r\n * ```typescript\r\n * import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop under $1000');\r\n * console.log(response.products);\r\n * ```\r\n */\r\nexport class AICommerce {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly timeout: number;\r\n private sessionToken: string | null = null;\r\n\r\n constructor(config: AICommerceConfig) {\r\n if (!config.apiKey) {\r\n throw new Error('AICommerce: apiKey is required');\r\n }\r\n\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = this.normalizeUrl(config.baseUrl || this.detectBaseUrl());\r\n this.timeout = config.timeout || 30000;\r\n }\r\n\r\n /**\r\n * Detect the base URL based on environment\r\n */\r\n private detectBaseUrl(): string {\r\n // Browser environment\r\n if (typeof window !== 'undefined') {\r\n return window.location.origin;\r\n }\r\n // Node.js or default\r\n return 'https://api.aicommerce.dev';\r\n }\r\n\r\n /**\r\n * Normalize URL (remove trailing slash)\r\n */\r\n private normalizeUrl(url: string): string {\r\n return url.replace(/\\/$/, '');\r\n }\r\n\r\n /**\r\n * Make an API request\r\n */\r\n private async request<T>(\r\n endpoint: string,\r\n options: RequestInit = {}\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${endpoint}`;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n ...options,\r\n signal: controller.signal,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n ...(this.sessionToken && { 'X-Session-Token': this.sessionToken }),\r\n ...options.headers,\r\n },\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const error: APIError = {\r\n code: errorData.code || 'UNKNOWN_ERROR',\r\n message: errorData.message || errorData.error || `HTTP ${response.status}`,\r\n status: response.status,\r\n };\r\n throw new AICommerceError(error.message, error.code, error.status);\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof AICommerceError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new AICommerceError('Request timeout', 'TIMEOUT', 408);\r\n }\r\n\r\n throw new AICommerceError(\r\n error instanceof Error ? error.message : 'Unknown error',\r\n 'NETWORK_ERROR',\r\n 0\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Send a chat message and get product recommendations\r\n * \r\n * @param message - The user's message or full ChatRequest object\r\n * @param context - Optional context for better recommendations\r\n * @returns Chat response with AI reply and products\r\n * \r\n * @example\r\n * ```typescript\r\n * // Simple usage\r\n * const response = await client.chat('I need running shoes');\r\n * \r\n * // With context\r\n * const response = await client.chat('I need running shoes', {\r\n * budget: { max: 150 },\r\n * preferences: ['comfortable', 'lightweight']\r\n * });\r\n * ```\r\n */\r\n async chat(\r\n message: string | ChatRequest,\r\n context?: ChatContext\r\n ): Promise<ChatResponse> {\r\n const request: ChatRequest = typeof message === 'string'\r\n ? { message, context, sessionToken: this.sessionToken || undefined }\r\n : { ...message, sessionToken: message.sessionToken || this.sessionToken || undefined };\r\n\r\n const response = await this.request<ChatResponse>('/api/v1/chat', {\r\n method: 'POST',\r\n body: JSON.stringify(request),\r\n });\r\n\r\n // Store session token for follow-up messages\r\n if (response.sessionToken) {\r\n this.sessionToken = response.sessionToken;\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Create a new chat session\r\n * \r\n * @returns Session information with token\r\n */\r\n async createSession(): Promise<Session> {\r\n const response = await this.request<{ session: Session }>('/api/v1/chat/session', {\r\n method: 'POST',\r\n });\r\n\r\n this.sessionToken = response.session.token;\r\n return response.session;\r\n }\r\n\r\n /**\r\n * Clear the current session\r\n */\r\n clearSession(): void {\r\n this.sessionToken = null;\r\n }\r\n\r\n /**\r\n * Get the current session token\r\n */\r\n getSessionToken(): string | null {\r\n return this.sessionToken;\r\n }\r\n\r\n /**\r\n * Set a session token (for restoring sessions)\r\n */\r\n setSessionToken(token: string): void {\r\n this.sessionToken = token;\r\n }\r\n\r\n /**\r\n * Static method for one-off chat requests\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await AICommerce.quickChat({\r\n * apiKey: 'your-api-key',\r\n * message: 'I need a laptop'\r\n * });\r\n * ```\r\n */\r\n static async quickChat(options: {\r\n apiKey: string;\r\n message: string;\r\n baseUrl?: string;\r\n context?: ChatContext;\r\n }): Promise<ChatResponse> {\r\n const client = new AICommerce({\r\n apiKey: options.apiKey,\r\n baseUrl: options.baseUrl,\r\n });\r\n return client.chat(options.message, options.context);\r\n }\r\n}\r\n\r\n/**\r\n * Custom error class for AI Commerce SDK\r\n */\r\nexport class AICommerceError extends Error {\r\n readonly code: string;\r\n readonly status: number;\r\n\r\n constructor(message: string, code: string, status: number) {\r\n super(message);\r\n this.name = 'AICommerceError';\r\n this.code = code;\r\n this.status = status;\r\n\r\n // Maintain proper prototype chain\r\n Object.setPrototypeOf(this, AICommerceError.prototype);\r\n }\r\n}\r\n","/**\r\n * AI Commerce SDK\r\n * \r\n * AI-powered product recommendations for e-commerce\r\n * \r\n * @packageDocumentation\r\n * @module @yassirbenmoussa/aicommerce-sdk\r\n * \r\n * @example\r\n * ```typescript\r\n * // npm usage\r\n * import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop');\r\n * console.log(response.products);\r\n * ```\r\n * \r\n * @example\r\n * ```html\r\n * <!-- Script tag usage -->\r\n * <script src=\"https://cdn.aicommerce.dev/sdk.min.js\"></script>\r\n * <script>\r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * client.chat('I need a laptop').then(response => {\r\n * console.log(response.products);\r\n * });\r\n * </script>\r\n * ```\r\n */\r\n\r\n// Export main client\r\nexport { AICommerce, AICommerceError } from './client';\r\n\r\n// Export all types\r\nexport type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Product,\r\n Session,\r\n APIError,\r\n EventType,\r\n EventCallback,\r\n} from './types';\r\n\r\n// Version\r\nexport const VERSION = '1.0.0';\r\n\r\n// For UMD builds, attach to window\r\nif (typeof window !== 'undefined') {\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerce = require('./client').AICommerce;\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerceError = require('./client').AICommerceError;\r\n}\r\n"]}
package/dist/index.d.mts CHANGED
@@ -98,7 +98,7 @@ type EventCallback<T = unknown> = (data: T) => void;
98
98
  *
99
99
  * @example
100
100
  * ```typescript
101
- * import { AICommerce } from '@ai-commerce/sdk';
101
+ * import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';
102
102
  *
103
103
  * const client = new AICommerce({ apiKey: 'your-api-key' });
104
104
  * const response = await client.chat('I need a laptop under $1000');
@@ -194,12 +194,12 @@ declare class AICommerceError extends Error {
194
194
  * AI-powered product recommendations for e-commerce
195
195
  *
196
196
  * @packageDocumentation
197
- * @module @ai-commerce/sdk
197
+ * @module @yassirbenmoussa/aicommerce-sdk
198
198
  *
199
199
  * @example
200
200
  * ```typescript
201
201
  * // npm usage
202
- * import { AICommerce } from '@ai-commerce/sdk';
202
+ * import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';
203
203
  *
204
204
  * const client = new AICommerce({ apiKey: 'your-api-key' });
205
205
  * const response = await client.chat('I need a laptop');
package/dist/index.d.ts CHANGED
@@ -98,7 +98,7 @@ type EventCallback<T = unknown> = (data: T) => void;
98
98
  *
99
99
  * @example
100
100
  * ```typescript
101
- * import { AICommerce } from '@ai-commerce/sdk';
101
+ * import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';
102
102
  *
103
103
  * const client = new AICommerce({ apiKey: 'your-api-key' });
104
104
  * const response = await client.chat('I need a laptop under $1000');
@@ -194,12 +194,12 @@ declare class AICommerceError extends Error {
194
194
  * AI-powered product recommendations for e-commerce
195
195
  *
196
196
  * @packageDocumentation
197
- * @module @ai-commerce/sdk
197
+ * @module @yassirbenmoussa/aicommerce-sdk
198
198
  *
199
199
  * @example
200
200
  * ```typescript
201
201
  * // npm usage
202
- * import { AICommerce } from '@ai-commerce/sdk';
202
+ * import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';
203
203
  *
204
204
  * const client = new AICommerce({ apiKey: 'your-api-key' });
205
205
  * const response = await client.chat('I need a laptop');
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/index.ts"],"names":["client_exports","__export","AICommerce","AICommerceError","init_client","__esmMin","_AICommerce","config","url","endpoint","options","controller","timeoutId","response","errorData","error","message","context","request","token","_AICommerceError","code","status","VERSION"],"mappings":"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","file":"index.min.js","sourcesContent":["import type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Session,\r\n APIError,\r\n} from './types';\r\n\r\n/**\r\n * AI Commerce SDK Client\r\n * \r\n * @example\r\n * ```typescript\r\n * import { AICommerce } from '@ai-commerce/sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop under $1000');\r\n * console.log(response.products);\r\n * ```\r\n */\r\nexport class AICommerce {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly timeout: number;\r\n private sessionToken: string | null = null;\r\n\r\n constructor(config: AICommerceConfig) {\r\n if (!config.apiKey) {\r\n throw new Error('AICommerce: apiKey is required');\r\n }\r\n\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = this.normalizeUrl(config.baseUrl || this.detectBaseUrl());\r\n this.timeout = config.timeout || 30000;\r\n }\r\n\r\n /**\r\n * Detect the base URL based on environment\r\n */\r\n private detectBaseUrl(): string {\r\n // Browser environment\r\n if (typeof window !== 'undefined') {\r\n return window.location.origin;\r\n }\r\n // Node.js or default\r\n return 'https://api.aicommerce.dev';\r\n }\r\n\r\n /**\r\n * Normalize URL (remove trailing slash)\r\n */\r\n private normalizeUrl(url: string): string {\r\n return url.replace(/\\/$/, '');\r\n }\r\n\r\n /**\r\n * Make an API request\r\n */\r\n private async request<T>(\r\n endpoint: string,\r\n options: RequestInit = {}\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${endpoint}`;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n ...options,\r\n signal: controller.signal,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n ...(this.sessionToken && { 'X-Session-Token': this.sessionToken }),\r\n ...options.headers,\r\n },\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const error: APIError = {\r\n code: errorData.code || 'UNKNOWN_ERROR',\r\n message: errorData.message || errorData.error || `HTTP ${response.status}`,\r\n status: response.status,\r\n };\r\n throw new AICommerceError(error.message, error.code, error.status);\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof AICommerceError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new AICommerceError('Request timeout', 'TIMEOUT', 408);\r\n }\r\n\r\n throw new AICommerceError(\r\n error instanceof Error ? error.message : 'Unknown error',\r\n 'NETWORK_ERROR',\r\n 0\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Send a chat message and get product recommendations\r\n * \r\n * @param message - The user's message or full ChatRequest object\r\n * @param context - Optional context for better recommendations\r\n * @returns Chat response with AI reply and products\r\n * \r\n * @example\r\n * ```typescript\r\n * // Simple usage\r\n * const response = await client.chat('I need running shoes');\r\n * \r\n * // With context\r\n * const response = await client.chat('I need running shoes', {\r\n * budget: { max: 150 },\r\n * preferences: ['comfortable', 'lightweight']\r\n * });\r\n * ```\r\n */\r\n async chat(\r\n message: string | ChatRequest,\r\n context?: ChatContext\r\n ): Promise<ChatResponse> {\r\n const request: ChatRequest = typeof message === 'string'\r\n ? { message, context, sessionToken: this.sessionToken || undefined }\r\n : { ...message, sessionToken: message.sessionToken || this.sessionToken || undefined };\r\n\r\n const response = await this.request<ChatResponse>('/api/v1/chat', {\r\n method: 'POST',\r\n body: JSON.stringify(request),\r\n });\r\n\r\n // Store session token for follow-up messages\r\n if (response.sessionToken) {\r\n this.sessionToken = response.sessionToken;\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Create a new chat session\r\n * \r\n * @returns Session information with token\r\n */\r\n async createSession(): Promise<Session> {\r\n const response = await this.request<{ session: Session }>('/api/v1/chat/session', {\r\n method: 'POST',\r\n });\r\n\r\n this.sessionToken = response.session.token;\r\n return response.session;\r\n }\r\n\r\n /**\r\n * Clear the current session\r\n */\r\n clearSession(): void {\r\n this.sessionToken = null;\r\n }\r\n\r\n /**\r\n * Get the current session token\r\n */\r\n getSessionToken(): string | null {\r\n return this.sessionToken;\r\n }\r\n\r\n /**\r\n * Set a session token (for restoring sessions)\r\n */\r\n setSessionToken(token: string): void {\r\n this.sessionToken = token;\r\n }\r\n\r\n /**\r\n * Static method for one-off chat requests\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await AICommerce.quickChat({\r\n * apiKey: 'your-api-key',\r\n * message: 'I need a laptop'\r\n * });\r\n * ```\r\n */\r\n static async quickChat(options: {\r\n apiKey: string;\r\n message: string;\r\n baseUrl?: string;\r\n context?: ChatContext;\r\n }): Promise<ChatResponse> {\r\n const client = new AICommerce({\r\n apiKey: options.apiKey,\r\n baseUrl: options.baseUrl,\r\n });\r\n return client.chat(options.message, options.context);\r\n }\r\n}\r\n\r\n/**\r\n * Custom error class for AI Commerce SDK\r\n */\r\nexport class AICommerceError extends Error {\r\n readonly code: string;\r\n readonly status: number;\r\n\r\n constructor(message: string, code: string, status: number) {\r\n super(message);\r\n this.name = 'AICommerceError';\r\n this.code = code;\r\n this.status = status;\r\n\r\n // Maintain proper prototype chain\r\n Object.setPrototypeOf(this, AICommerceError.prototype);\r\n }\r\n}\r\n","/**\r\n * AI Commerce SDK\r\n * \r\n * AI-powered product recommendations for e-commerce\r\n * \r\n * @packageDocumentation\r\n * @module @ai-commerce/sdk\r\n * \r\n * @example\r\n * ```typescript\r\n * // npm usage\r\n * import { AICommerce } from '@ai-commerce/sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop');\r\n * console.log(response.products);\r\n * ```\r\n * \r\n * @example\r\n * ```html\r\n * <!-- Script tag usage -->\r\n * <script src=\"https://cdn.aicommerce.dev/sdk.min.js\"></script>\r\n * <script>\r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * client.chat('I need a laptop').then(response => {\r\n * console.log(response.products);\r\n * });\r\n * </script>\r\n * ```\r\n */\r\n\r\n// Export main client\r\nexport { AICommerce, AICommerceError } from './client';\r\n\r\n// Export all types\r\nexport type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Product,\r\n Session,\r\n APIError,\r\n EventType,\r\n EventCallback,\r\n} from './types';\r\n\r\n// Version\r\nexport const VERSION = '1.0.0';\r\n\r\n// For UMD builds, attach to window\r\nif (typeof window !== 'undefined') {\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerce = require('./client').AICommerce;\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerceError = require('./client').AICommerceError;\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/index.ts"],"names":["client_exports","__export","AICommerce","AICommerceError","init_client","__esmMin","_AICommerce","config","url","endpoint","options","controller","timeoutId","response","errorData","error","message","context","request","token","_AICommerceError","code","status","VERSION"],"mappings":"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","file":"index.min.js","sourcesContent":["import type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Session,\r\n APIError,\r\n} from './types';\r\n\r\n/**\r\n * AI Commerce SDK Client\r\n * \r\n * @example\r\n * ```typescript\r\n * import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop under $1000');\r\n * console.log(response.products);\r\n * ```\r\n */\r\nexport class AICommerce {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly timeout: number;\r\n private sessionToken: string | null = null;\r\n\r\n constructor(config: AICommerceConfig) {\r\n if (!config.apiKey) {\r\n throw new Error('AICommerce: apiKey is required');\r\n }\r\n\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = this.normalizeUrl(config.baseUrl || this.detectBaseUrl());\r\n this.timeout = config.timeout || 30000;\r\n }\r\n\r\n /**\r\n * Detect the base URL based on environment\r\n */\r\n private detectBaseUrl(): string {\r\n // Browser environment\r\n if (typeof window !== 'undefined') {\r\n return window.location.origin;\r\n }\r\n // Node.js or default\r\n return 'https://api.aicommerce.dev';\r\n }\r\n\r\n /**\r\n * Normalize URL (remove trailing slash)\r\n */\r\n private normalizeUrl(url: string): string {\r\n return url.replace(/\\/$/, '');\r\n }\r\n\r\n /**\r\n * Make an API request\r\n */\r\n private async request<T>(\r\n endpoint: string,\r\n options: RequestInit = {}\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${endpoint}`;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n ...options,\r\n signal: controller.signal,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n ...(this.sessionToken && { 'X-Session-Token': this.sessionToken }),\r\n ...options.headers,\r\n },\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const error: APIError = {\r\n code: errorData.code || 'UNKNOWN_ERROR',\r\n message: errorData.message || errorData.error || `HTTP ${response.status}`,\r\n status: response.status,\r\n };\r\n throw new AICommerceError(error.message, error.code, error.status);\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof AICommerceError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new AICommerceError('Request timeout', 'TIMEOUT', 408);\r\n }\r\n\r\n throw new AICommerceError(\r\n error instanceof Error ? error.message : 'Unknown error',\r\n 'NETWORK_ERROR',\r\n 0\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Send a chat message and get product recommendations\r\n * \r\n * @param message - The user's message or full ChatRequest object\r\n * @param context - Optional context for better recommendations\r\n * @returns Chat response with AI reply and products\r\n * \r\n * @example\r\n * ```typescript\r\n * // Simple usage\r\n * const response = await client.chat('I need running shoes');\r\n * \r\n * // With context\r\n * const response = await client.chat('I need running shoes', {\r\n * budget: { max: 150 },\r\n * preferences: ['comfortable', 'lightweight']\r\n * });\r\n * ```\r\n */\r\n async chat(\r\n message: string | ChatRequest,\r\n context?: ChatContext\r\n ): Promise<ChatResponse> {\r\n const request: ChatRequest = typeof message === 'string'\r\n ? { message, context, sessionToken: this.sessionToken || undefined }\r\n : { ...message, sessionToken: message.sessionToken || this.sessionToken || undefined };\r\n\r\n const response = await this.request<ChatResponse>('/api/v1/chat', {\r\n method: 'POST',\r\n body: JSON.stringify(request),\r\n });\r\n\r\n // Store session token for follow-up messages\r\n if (response.sessionToken) {\r\n this.sessionToken = response.sessionToken;\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Create a new chat session\r\n * \r\n * @returns Session information with token\r\n */\r\n async createSession(): Promise<Session> {\r\n const response = await this.request<{ session: Session }>('/api/v1/chat/session', {\r\n method: 'POST',\r\n });\r\n\r\n this.sessionToken = response.session.token;\r\n return response.session;\r\n }\r\n\r\n /**\r\n * Clear the current session\r\n */\r\n clearSession(): void {\r\n this.sessionToken = null;\r\n }\r\n\r\n /**\r\n * Get the current session token\r\n */\r\n getSessionToken(): string | null {\r\n return this.sessionToken;\r\n }\r\n\r\n /**\r\n * Set a session token (for restoring sessions)\r\n */\r\n setSessionToken(token: string): void {\r\n this.sessionToken = token;\r\n }\r\n\r\n /**\r\n * Static method for one-off chat requests\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await AICommerce.quickChat({\r\n * apiKey: 'your-api-key',\r\n * message: 'I need a laptop'\r\n * });\r\n * ```\r\n */\r\n static async quickChat(options: {\r\n apiKey: string;\r\n message: string;\r\n baseUrl?: string;\r\n context?: ChatContext;\r\n }): Promise<ChatResponse> {\r\n const client = new AICommerce({\r\n apiKey: options.apiKey,\r\n baseUrl: options.baseUrl,\r\n });\r\n return client.chat(options.message, options.context);\r\n }\r\n}\r\n\r\n/**\r\n * Custom error class for AI Commerce SDK\r\n */\r\nexport class AICommerceError extends Error {\r\n readonly code: string;\r\n readonly status: number;\r\n\r\n constructor(message: string, code: string, status: number) {\r\n super(message);\r\n this.name = 'AICommerceError';\r\n this.code = code;\r\n this.status = status;\r\n\r\n // Maintain proper prototype chain\r\n Object.setPrototypeOf(this, AICommerceError.prototype);\r\n }\r\n}\r\n","/**\r\n * AI Commerce SDK\r\n * \r\n * AI-powered product recommendations for e-commerce\r\n * \r\n * @packageDocumentation\r\n * @module @yassirbenmoussa/aicommerce-sdk\r\n * \r\n * @example\r\n * ```typescript\r\n * // npm usage\r\n * import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop');\r\n * console.log(response.products);\r\n * ```\r\n * \r\n * @example\r\n * ```html\r\n * <!-- Script tag usage -->\r\n * <script src=\"https://cdn.aicommerce.dev/sdk.min.js\"></script>\r\n * <script>\r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * client.chat('I need a laptop').then(response => {\r\n * console.log(response.products);\r\n * });\r\n * </script>\r\n * ```\r\n */\r\n\r\n// Export main client\r\nexport { AICommerce, AICommerceError } from './client';\r\n\r\n// Export all types\r\nexport type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Product,\r\n Session,\r\n APIError,\r\n EventType,\r\n EventCallback,\r\n} from './types';\r\n\r\n// Version\r\nexport const VERSION = '1.0.0';\r\n\r\n// For UMD builds, attach to window\r\nif (typeof window !== 'undefined') {\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerce = require('./client').AICommerce;\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerceError = require('./client').AICommerceError;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAqBa,UAAA,CAAA,CAkMA;AAvNb,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,eAAA,GAAA;AAqBO,IAAM,UAAA,GAAN,MAAM,WAAA,CAAW;AAAA,MAMpB,YAAY,MAAA,EAA0B;AAFtC,QAAA,IAAA,CAAQ,YAAA,GAA8B,IAAA;AAGlC,QAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAChB,UAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,QACpD;AAEA,QAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,QAAA,IAAA,CAAK,UAAU,IAAA,CAAK,YAAA,CAAa,OAAO,OAAA,IAAW,IAAA,CAAK,eAAe,CAAA;AACvE,QAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,GAAA;AAAA,MACrC;AAAA;AAAA;AAAA;AAAA,MAKQ,aAAA,GAAwB;AAE5B,QAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,UAAA,OAAO,OAAO,QAAA,CAAS,MAAA;AAAA,QAC3B;AAEA,QAAA,OAAO,4BAAA;AAAA,MACX;AAAA;AAAA;AAAA;AAAA,MAKQ,aAAa,GAAA,EAAqB;AACtC,QAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,OAAA,CACV,QAAA,EACA,OAAA,GAAuB,EAAC,EACd;AACV,QAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,GAAG,QAAQ,CAAA,CAAA;AAEtC,QAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,QAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,OAAO,CAAA;AAEnE,QAAA,IAAI;AACA,UAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,YAC9B,GAAG,OAAA;AAAA,YACH,QAAQ,UAAA,CAAW,MAAA;AAAA,YACnB,OAAA,EAAS;AAAA,cACL,cAAA,EAAgB,kBAAA;AAAA,cAChB,aAAa,IAAA,CAAK,MAAA;AAAA,cAClB,GAAI,IAAA,CAAK,YAAA,IAAgB,EAAE,iBAAA,EAAmB,KAAK,YAAA,EAAa;AAAA,cAChE,GAAG,OAAA,CAAQ;AAAA;AACf,WACH,CAAA;AAED,UAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,UAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACd,YAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACxD,YAAA,MAAM,KAAA,GAAkB;AAAA,cACpB,IAAA,EAAM,UAAU,IAAA,IAAQ,eAAA;AAAA,cACxB,SAAS,SAAA,CAAU,OAAA,IAAW,UAAU,KAAA,IAAS,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,CAAA;AAAA,cACxE,QAAQ,QAAA,CAAS;AAAA,aACrB;AACA,YAAA,MAAM,IAAI,eAAA,CAAgB,KAAA,CAAM,SAAS,KAAA,CAAM,IAAA,EAAM,MAAM,MAAM,CAAA;AAAA,UACrE;AAEA,UAAA,OAAO,SAAS,IAAA,EAAK;AAAA,QACzB,SAAS,KAAA,EAAO;AACZ,UAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,UAAA,IAAI,iBAAiB,eAAA,EAAiB;AAClC,YAAA,MAAM,KAAA;AAAA,UACV;AAEA,UAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACvD,YAAA,MAAM,IAAI,eAAA,CAAgB,iBAAA,EAAmB,SAAA,EAAW,GAAG,CAAA;AAAA,UAC/D;AAEA,UAAA,MAAM,IAAI,eAAA;AAAA,YACN,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAAA,YACzC,eAAA;AAAA,YACA;AAAA,WACJ;AAAA,QACJ;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAqBA,MAAM,IAAA,CACF,OAAA,EACA,OAAA,EACqB;AACrB,QAAA,MAAM,OAAA,GAAuB,OAAO,OAAA,KAAY,QAAA,GAC1C,EAAE,OAAA,EAAS,OAAA,EAAS,cAAc,IAAA,CAAK,YAAA,IAAgB,QAAU,GACjE,EAAE,GAAG,OAAA,EAAS,YAAA,EAAc,QAAQ,YAAA,IAAgB,IAAA,CAAK,gBAAgB,MAAA,EAAU;AAEzF,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAsB,cAAA,EAAgB;AAAA,UAC9D,MAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,SAC/B,CAAA;AAGD,QAAA,IAAI,SAAS,YAAA,EAAc;AACvB,UAAA,IAAA,CAAK,eAAe,QAAA,CAAS,YAAA;AAAA,QACjC;AAEA,QAAA,OAAO,QAAA;AAAA,MACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAM,aAAA,GAAkC;AACpC,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAA8B,sBAAA,EAAwB;AAAA,UAC9E,MAAA,EAAQ;AAAA,SACX,CAAA;AAED,QAAA,IAAA,CAAK,YAAA,GAAe,SAAS,OAAA,CAAQ,KAAA;AACrC,QAAA,OAAO,QAAA,CAAS,OAAA;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKA,YAAA,GAAqB;AACjB,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,eAAA,GAAiC;AAC7B,QAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAgB,KAAA,EAAqB;AACjC,QAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,aAAa,UAAU,OAAA,EAKG;AACtB,QAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAW;AAAA,UAC1B,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,SAAS,OAAA,CAAQ;AAAA,SACpB,CAAA;AACD,QAAA,OAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,QAAQ,OAAO,CAAA;AAAA,MACvD;AAAA,KACJ;AAKO,IAAM,eAAA,GAAN,MAAM,gBAAA,SAAwB,KAAA,CAAM;AAAA,MAIvC,WAAA,CAAY,OAAA,EAAiB,IAAA,EAAc,MAAA,EAAgB;AACvD,QAAA,KAAA,CAAM,OAAO,CAAA;AACb,QAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAGd,QAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,gBAAA,CAAgB,SAAS,CAAA;AAAA,MACzD;AAAA,KACJ;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpMA,WAAA,EAAA;AAgBO,IAAM,OAAA,GAAU;AAGvB,IAAI,OAAO,WAAW,WAAA,EAAa;AAE/B,EAAA,MAAA,CAAO,aAAa,CAAA,WAAA,EAAA,EAAA,YAAA,CAAA,cAAA,CAAA,EAAoB,UAAA;AAExC,EAAA,MAAA,CAAO,kBAAkB,CAAA,WAAA,EAAA,EAAA,YAAA,CAAA,cAAA,CAAA,EAAoB,eAAA;AACjD","file":"index.mjs","sourcesContent":["import type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Session,\r\n APIError,\r\n} from './types';\r\n\r\n/**\r\n * AI Commerce SDK Client\r\n * \r\n * @example\r\n * ```typescript\r\n * import { AICommerce } from '@ai-commerce/sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop under $1000');\r\n * console.log(response.products);\r\n * ```\r\n */\r\nexport class AICommerce {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly timeout: number;\r\n private sessionToken: string | null = null;\r\n\r\n constructor(config: AICommerceConfig) {\r\n if (!config.apiKey) {\r\n throw new Error('AICommerce: apiKey is required');\r\n }\r\n\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = this.normalizeUrl(config.baseUrl || this.detectBaseUrl());\r\n this.timeout = config.timeout || 30000;\r\n }\r\n\r\n /**\r\n * Detect the base URL based on environment\r\n */\r\n private detectBaseUrl(): string {\r\n // Browser environment\r\n if (typeof window !== 'undefined') {\r\n return window.location.origin;\r\n }\r\n // Node.js or default\r\n return 'https://api.aicommerce.dev';\r\n }\r\n\r\n /**\r\n * Normalize URL (remove trailing slash)\r\n */\r\n private normalizeUrl(url: string): string {\r\n return url.replace(/\\/$/, '');\r\n }\r\n\r\n /**\r\n * Make an API request\r\n */\r\n private async request<T>(\r\n endpoint: string,\r\n options: RequestInit = {}\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${endpoint}`;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n ...options,\r\n signal: controller.signal,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n ...(this.sessionToken && { 'X-Session-Token': this.sessionToken }),\r\n ...options.headers,\r\n },\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const error: APIError = {\r\n code: errorData.code || 'UNKNOWN_ERROR',\r\n message: errorData.message || errorData.error || `HTTP ${response.status}`,\r\n status: response.status,\r\n };\r\n throw new AICommerceError(error.message, error.code, error.status);\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof AICommerceError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new AICommerceError('Request timeout', 'TIMEOUT', 408);\r\n }\r\n\r\n throw new AICommerceError(\r\n error instanceof Error ? error.message : 'Unknown error',\r\n 'NETWORK_ERROR',\r\n 0\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Send a chat message and get product recommendations\r\n * \r\n * @param message - The user's message or full ChatRequest object\r\n * @param context - Optional context for better recommendations\r\n * @returns Chat response with AI reply and products\r\n * \r\n * @example\r\n * ```typescript\r\n * // Simple usage\r\n * const response = await client.chat('I need running shoes');\r\n * \r\n * // With context\r\n * const response = await client.chat('I need running shoes', {\r\n * budget: { max: 150 },\r\n * preferences: ['comfortable', 'lightweight']\r\n * });\r\n * ```\r\n */\r\n async chat(\r\n message: string | ChatRequest,\r\n context?: ChatContext\r\n ): Promise<ChatResponse> {\r\n const request: ChatRequest = typeof message === 'string'\r\n ? { message, context, sessionToken: this.sessionToken || undefined }\r\n : { ...message, sessionToken: message.sessionToken || this.sessionToken || undefined };\r\n\r\n const response = await this.request<ChatResponse>('/api/v1/chat', {\r\n method: 'POST',\r\n body: JSON.stringify(request),\r\n });\r\n\r\n // Store session token for follow-up messages\r\n if (response.sessionToken) {\r\n this.sessionToken = response.sessionToken;\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Create a new chat session\r\n * \r\n * @returns Session information with token\r\n */\r\n async createSession(): Promise<Session> {\r\n const response = await this.request<{ session: Session }>('/api/v1/chat/session', {\r\n method: 'POST',\r\n });\r\n\r\n this.sessionToken = response.session.token;\r\n return response.session;\r\n }\r\n\r\n /**\r\n * Clear the current session\r\n */\r\n clearSession(): void {\r\n this.sessionToken = null;\r\n }\r\n\r\n /**\r\n * Get the current session token\r\n */\r\n getSessionToken(): string | null {\r\n return this.sessionToken;\r\n }\r\n\r\n /**\r\n * Set a session token (for restoring sessions)\r\n */\r\n setSessionToken(token: string): void {\r\n this.sessionToken = token;\r\n }\r\n\r\n /**\r\n * Static method for one-off chat requests\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await AICommerce.quickChat({\r\n * apiKey: 'your-api-key',\r\n * message: 'I need a laptop'\r\n * });\r\n * ```\r\n */\r\n static async quickChat(options: {\r\n apiKey: string;\r\n message: string;\r\n baseUrl?: string;\r\n context?: ChatContext;\r\n }): Promise<ChatResponse> {\r\n const client = new AICommerce({\r\n apiKey: options.apiKey,\r\n baseUrl: options.baseUrl,\r\n });\r\n return client.chat(options.message, options.context);\r\n }\r\n}\r\n\r\n/**\r\n * Custom error class for AI Commerce SDK\r\n */\r\nexport class AICommerceError extends Error {\r\n readonly code: string;\r\n readonly status: number;\r\n\r\n constructor(message: string, code: string, status: number) {\r\n super(message);\r\n this.name = 'AICommerceError';\r\n this.code = code;\r\n this.status = status;\r\n\r\n // Maintain proper prototype chain\r\n Object.setPrototypeOf(this, AICommerceError.prototype);\r\n }\r\n}\r\n","/**\r\n * AI Commerce SDK\r\n * \r\n * AI-powered product recommendations for e-commerce\r\n * \r\n * @packageDocumentation\r\n * @module @ai-commerce/sdk\r\n * \r\n * @example\r\n * ```typescript\r\n * // npm usage\r\n * import { AICommerce } from '@ai-commerce/sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop');\r\n * console.log(response.products);\r\n * ```\r\n * \r\n * @example\r\n * ```html\r\n * <!-- Script tag usage -->\r\n * <script src=\"https://cdn.aicommerce.dev/sdk.min.js\"></script>\r\n * <script>\r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * client.chat('I need a laptop').then(response => {\r\n * console.log(response.products);\r\n * });\r\n * </script>\r\n * ```\r\n */\r\n\r\n// Export main client\r\nexport { AICommerce, AICommerceError } from './client';\r\n\r\n// Export all types\r\nexport type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Product,\r\n Session,\r\n APIError,\r\n EventType,\r\n EventCallback,\r\n} from './types';\r\n\r\n// Version\r\nexport const VERSION = '1.0.0';\r\n\r\n// For UMD builds, attach to window\r\nif (typeof window !== 'undefined') {\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerce = require('./client').AICommerce;\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerceError = require('./client').AICommerceError;\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/client.ts","../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,cAAA,GAAA,EAAA;AAAA,QAAA,CAAA,cAAA,EAAA;AAAA,EAAA,UAAA,EAAA,MAAA,UAAA;AAAA,EAAA,eAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAAA,IAqBa,UAAA,CAAA,CAkMA;AAvNb,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,eAAA,GAAA;AAqBO,IAAM,UAAA,GAAN,MAAM,WAAA,CAAW;AAAA,MAMpB,YAAY,MAAA,EAA0B;AAFtC,QAAA,IAAA,CAAQ,YAAA,GAA8B,IAAA;AAGlC,QAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAChB,UAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,QACpD;AAEA,QAAA,IAAA,CAAK,SAAS,MAAA,CAAO,MAAA;AACrB,QAAA,IAAA,CAAK,UAAU,IAAA,CAAK,YAAA,CAAa,OAAO,OAAA,IAAW,IAAA,CAAK,eAAe,CAAA;AACvE,QAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,GAAA;AAAA,MACrC;AAAA;AAAA;AAAA;AAAA,MAKQ,aAAA,GAAwB;AAE5B,QAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAC/B,UAAA,OAAO,OAAO,QAAA,CAAS,MAAA;AAAA,QAC3B;AAEA,QAAA,OAAO,4BAAA;AAAA,MACX;AAAA;AAAA;AAAA;AAAA,MAKQ,aAAa,GAAA,EAAqB;AACtC,QAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA,MAKA,MAAc,OAAA,CACV,QAAA,EACA,OAAA,GAAuB,EAAC,EACd;AACV,QAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,GAAG,QAAQ,CAAA,CAAA;AAEtC,QAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,QAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,OAAO,CAAA;AAEnE,QAAA,IAAI;AACA,UAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,YAC9B,GAAG,OAAA;AAAA,YACH,QAAQ,UAAA,CAAW,MAAA;AAAA,YACnB,OAAA,EAAS;AAAA,cACL,cAAA,EAAgB,kBAAA;AAAA,cAChB,aAAa,IAAA,CAAK,MAAA;AAAA,cAClB,GAAI,IAAA,CAAK,YAAA,IAAgB,EAAE,iBAAA,EAAmB,KAAK,YAAA,EAAa;AAAA,cAChE,GAAG,OAAA,CAAQ;AAAA;AACf,WACH,CAAA;AAED,UAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,UAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACd,YAAA,MAAM,SAAA,GAAY,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AACxD,YAAA,MAAM,KAAA,GAAkB;AAAA,cACpB,IAAA,EAAM,UAAU,IAAA,IAAQ,eAAA;AAAA,cACxB,SAAS,SAAA,CAAU,OAAA,IAAW,UAAU,KAAA,IAAS,CAAA,KAAA,EAAQ,SAAS,MAAM,CAAA,CAAA;AAAA,cACxE,QAAQ,QAAA,CAAS;AAAA,aACrB;AACA,YAAA,MAAM,IAAI,eAAA,CAAgB,KAAA,CAAM,SAAS,KAAA,CAAM,IAAA,EAAM,MAAM,MAAM,CAAA;AAAA,UACrE;AAEA,UAAA,OAAO,SAAS,IAAA,EAAK;AAAA,QACzB,SAAS,KAAA,EAAO;AACZ,UAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,UAAA,IAAI,iBAAiB,eAAA,EAAiB;AAClC,YAAA,MAAM,KAAA;AAAA,UACV;AAEA,UAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,IAAA,KAAS,YAAA,EAAc;AACvD,YAAA,MAAM,IAAI,eAAA,CAAgB,iBAAA,EAAmB,SAAA,EAAW,GAAG,CAAA;AAAA,UAC/D;AAEA,UAAA,MAAM,IAAI,eAAA;AAAA,YACN,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,eAAA;AAAA,YACzC,eAAA;AAAA,YACA;AAAA,WACJ;AAAA,QACJ;AAAA,MACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAqBA,MAAM,IAAA,CACF,OAAA,EACA,OAAA,EACqB;AACrB,QAAA,MAAM,OAAA,GAAuB,OAAO,OAAA,KAAY,QAAA,GAC1C,EAAE,OAAA,EAAS,OAAA,EAAS,cAAc,IAAA,CAAK,YAAA,IAAgB,QAAU,GACjE,EAAE,GAAG,OAAA,EAAS,YAAA,EAAc,QAAQ,YAAA,IAAgB,IAAA,CAAK,gBAAgB,MAAA,EAAU;AAEzF,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAAsB,cAAA,EAAgB;AAAA,UAC9D,MAAA,EAAQ,MAAA;AAAA,UACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,OAAO;AAAA,SAC/B,CAAA;AAGD,QAAA,IAAI,SAAS,YAAA,EAAc;AACvB,UAAA,IAAA,CAAK,eAAe,QAAA,CAAS,YAAA;AAAA,QACjC;AAEA,QAAA,OAAO,QAAA;AAAA,MACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAM,aAAA,GAAkC;AACpC,QAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA,CAA8B,sBAAA,EAAwB;AAAA,UAC9E,MAAA,EAAQ;AAAA,SACX,CAAA;AAED,QAAA,IAAA,CAAK,YAAA,GAAe,SAAS,OAAA,CAAQ,KAAA;AACrC,QAAA,OAAO,QAAA,CAAS,OAAA;AAAA,MACpB;AAAA;AAAA;AAAA;AAAA,MAKA,YAAA,GAAqB;AACjB,QAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA,MAKA,eAAA,GAAiC;AAC7B,QAAA,OAAO,IAAA,CAAK,YAAA;AAAA,MAChB;AAAA;AAAA;AAAA;AAAA,MAKA,gBAAgB,KAAA,EAAqB;AACjC,QAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAaA,aAAa,UAAU,OAAA,EAKG;AACtB,QAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAW;AAAA,UAC1B,QAAQ,OAAA,CAAQ,MAAA;AAAA,UAChB,SAAS,OAAA,CAAQ;AAAA,SACpB,CAAA;AACD,QAAA,OAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,QAAQ,OAAO,CAAA;AAAA,MACvD;AAAA,KACJ;AAKO,IAAM,eAAA,GAAN,MAAM,gBAAA,SAAwB,KAAA,CAAM;AAAA,MAIvC,WAAA,CAAY,OAAA,EAAiB,IAAA,EAAc,MAAA,EAAgB;AACvD,QAAA,KAAA,CAAM,OAAO,CAAA;AACb,QAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAGd,QAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,gBAAA,CAAgB,SAAS,CAAA;AAAA,MACzD;AAAA,KACJ;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACpMA,WAAA,EAAA;AAgBO,IAAM,OAAA,GAAU;AAGvB,IAAI,OAAO,WAAW,WAAA,EAAa;AAE/B,EAAA,MAAA,CAAO,aAAa,CAAA,WAAA,EAAA,EAAA,YAAA,CAAA,cAAA,CAAA,EAAoB,UAAA;AAExC,EAAA,MAAA,CAAO,kBAAkB,CAAA,WAAA,EAAA,EAAA,YAAA,CAAA,cAAA,CAAA,EAAoB,eAAA;AACjD","file":"index.mjs","sourcesContent":["import type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Session,\r\n APIError,\r\n} from './types';\r\n\r\n/**\r\n * AI Commerce SDK Client\r\n * \r\n * @example\r\n * ```typescript\r\n * import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop under $1000');\r\n * console.log(response.products);\r\n * ```\r\n */\r\nexport class AICommerce {\r\n private readonly apiKey: string;\r\n private readonly baseUrl: string;\r\n private readonly timeout: number;\r\n private sessionToken: string | null = null;\r\n\r\n constructor(config: AICommerceConfig) {\r\n if (!config.apiKey) {\r\n throw new Error('AICommerce: apiKey is required');\r\n }\r\n\r\n this.apiKey = config.apiKey;\r\n this.baseUrl = this.normalizeUrl(config.baseUrl || this.detectBaseUrl());\r\n this.timeout = config.timeout || 30000;\r\n }\r\n\r\n /**\r\n * Detect the base URL based on environment\r\n */\r\n private detectBaseUrl(): string {\r\n // Browser environment\r\n if (typeof window !== 'undefined') {\r\n return window.location.origin;\r\n }\r\n // Node.js or default\r\n return 'https://api.aicommerce.dev';\r\n }\r\n\r\n /**\r\n * Normalize URL (remove trailing slash)\r\n */\r\n private normalizeUrl(url: string): string {\r\n return url.replace(/\\/$/, '');\r\n }\r\n\r\n /**\r\n * Make an API request\r\n */\r\n private async request<T>(\r\n endpoint: string,\r\n options: RequestInit = {}\r\n ): Promise<T> {\r\n const url = `${this.baseUrl}${endpoint}`;\r\n\r\n const controller = new AbortController();\r\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\r\n\r\n try {\r\n const response = await fetch(url, {\r\n ...options,\r\n signal: controller.signal,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-API-Key': this.apiKey,\r\n ...(this.sessionToken && { 'X-Session-Token': this.sessionToken }),\r\n ...options.headers,\r\n },\r\n });\r\n\r\n clearTimeout(timeoutId);\r\n\r\n if (!response.ok) {\r\n const errorData = await response.json().catch(() => ({}));\r\n const error: APIError = {\r\n code: errorData.code || 'UNKNOWN_ERROR',\r\n message: errorData.message || errorData.error || `HTTP ${response.status}`,\r\n status: response.status,\r\n };\r\n throw new AICommerceError(error.message, error.code, error.status);\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n clearTimeout(timeoutId);\r\n\r\n if (error instanceof AICommerceError) {\r\n throw error;\r\n }\r\n\r\n if (error instanceof Error && error.name === 'AbortError') {\r\n throw new AICommerceError('Request timeout', 'TIMEOUT', 408);\r\n }\r\n\r\n throw new AICommerceError(\r\n error instanceof Error ? error.message : 'Unknown error',\r\n 'NETWORK_ERROR',\r\n 0\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Send a chat message and get product recommendations\r\n * \r\n * @param message - The user's message or full ChatRequest object\r\n * @param context - Optional context for better recommendations\r\n * @returns Chat response with AI reply and products\r\n * \r\n * @example\r\n * ```typescript\r\n * // Simple usage\r\n * const response = await client.chat('I need running shoes');\r\n * \r\n * // With context\r\n * const response = await client.chat('I need running shoes', {\r\n * budget: { max: 150 },\r\n * preferences: ['comfortable', 'lightweight']\r\n * });\r\n * ```\r\n */\r\n async chat(\r\n message: string | ChatRequest,\r\n context?: ChatContext\r\n ): Promise<ChatResponse> {\r\n const request: ChatRequest = typeof message === 'string'\r\n ? { message, context, sessionToken: this.sessionToken || undefined }\r\n : { ...message, sessionToken: message.sessionToken || this.sessionToken || undefined };\r\n\r\n const response = await this.request<ChatResponse>('/api/v1/chat', {\r\n method: 'POST',\r\n body: JSON.stringify(request),\r\n });\r\n\r\n // Store session token for follow-up messages\r\n if (response.sessionToken) {\r\n this.sessionToken = response.sessionToken;\r\n }\r\n\r\n return response;\r\n }\r\n\r\n /**\r\n * Create a new chat session\r\n * \r\n * @returns Session information with token\r\n */\r\n async createSession(): Promise<Session> {\r\n const response = await this.request<{ session: Session }>('/api/v1/chat/session', {\r\n method: 'POST',\r\n });\r\n\r\n this.sessionToken = response.session.token;\r\n return response.session;\r\n }\r\n\r\n /**\r\n * Clear the current session\r\n */\r\n clearSession(): void {\r\n this.sessionToken = null;\r\n }\r\n\r\n /**\r\n * Get the current session token\r\n */\r\n getSessionToken(): string | null {\r\n return this.sessionToken;\r\n }\r\n\r\n /**\r\n * Set a session token (for restoring sessions)\r\n */\r\n setSessionToken(token: string): void {\r\n this.sessionToken = token;\r\n }\r\n\r\n /**\r\n * Static method for one-off chat requests\r\n * \r\n * @example\r\n * ```typescript\r\n * const response = await AICommerce.quickChat({\r\n * apiKey: 'your-api-key',\r\n * message: 'I need a laptop'\r\n * });\r\n * ```\r\n */\r\n static async quickChat(options: {\r\n apiKey: string;\r\n message: string;\r\n baseUrl?: string;\r\n context?: ChatContext;\r\n }): Promise<ChatResponse> {\r\n const client = new AICommerce({\r\n apiKey: options.apiKey,\r\n baseUrl: options.baseUrl,\r\n });\r\n return client.chat(options.message, options.context);\r\n }\r\n}\r\n\r\n/**\r\n * Custom error class for AI Commerce SDK\r\n */\r\nexport class AICommerceError extends Error {\r\n readonly code: string;\r\n readonly status: number;\r\n\r\n constructor(message: string, code: string, status: number) {\r\n super(message);\r\n this.name = 'AICommerceError';\r\n this.code = code;\r\n this.status = status;\r\n\r\n // Maintain proper prototype chain\r\n Object.setPrototypeOf(this, AICommerceError.prototype);\r\n }\r\n}\r\n","/**\r\n * AI Commerce SDK\r\n * \r\n * AI-powered product recommendations for e-commerce\r\n * \r\n * @packageDocumentation\r\n * @module @yassirbenmoussa/aicommerce-sdk\r\n * \r\n * @example\r\n * ```typescript\r\n * // npm usage\r\n * import { AICommerce } from '@yassirbenmoussa/aicommerce-sdk';\r\n * \r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * const response = await client.chat('I need a laptop');\r\n * console.log(response.products);\r\n * ```\r\n * \r\n * @example\r\n * ```html\r\n * <!-- Script tag usage -->\r\n * <script src=\"https://cdn.aicommerce.dev/sdk.min.js\"></script>\r\n * <script>\r\n * const client = new AICommerce({ apiKey: 'your-api-key' });\r\n * client.chat('I need a laptop').then(response => {\r\n * console.log(response.products);\r\n * });\r\n * </script>\r\n * ```\r\n */\r\n\r\n// Export main client\r\nexport { AICommerce, AICommerceError } from './client';\r\n\r\n// Export all types\r\nexport type {\r\n AICommerceConfig,\r\n ChatRequest,\r\n ChatResponse,\r\n ChatContext,\r\n Product,\r\n Session,\r\n APIError,\r\n EventType,\r\n EventCallback,\r\n} from './types';\r\n\r\n// Version\r\nexport const VERSION = '1.0.0';\r\n\r\n// For UMD builds, attach to window\r\nif (typeof window !== 'undefined') {\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerce = require('./client').AICommerce;\r\n // @ts-expect-error - Attaching to window for UMD\r\n window.AICommerceError = require('./client').AICommerceError;\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yassirbenmoussa/aicommerce-sdk",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "AI Commerce SDK - AI-powered product recommendations for e-commerce",
5
5
  "author": "AI Commerce",
6
6
  "license": "MIT",