@nxcode/sdk 1.0.5 → 1.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/nxcode.esm.js +304 -12
- package/dist/nxcode.esm.js.map +1 -1
- package/dist/nxcode.js +304 -11
- package/dist/nxcode.js.map +1 -1
- package/dist/nxcode.min.js +1 -1
- package/dist/types/agent.d.ts +102 -0
- package/dist/types/index.d.ts +30 -2
- package/package.json +1 -1
package/dist/nxcode.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nxcode.js","sources":["../src/auth.ts","../src/billing.ts","../src/payment.ts","../src/ai.ts","../src/index.ts"],"sourcesContent":["/**\n * Nxcode SDK - Authentication Module\n */\n\nimport type { NxcodeUser, AuthResult, AuthStateCallback } from './types';\n\nconst STORAGE_KEY = 'nxcode_sdk_auth';\n\ninterface StoredAuth {\n token: string;\n refreshToken: string;\n expiresAt: string;\n user: NxcodeUser;\n}\n\nexport class NxcodeAuth {\n private apiEndpoint: string;\n private appId: string;\n private user: NxcodeUser | null = null;\n private token: string | null = null;\n private refreshToken: string | null = null;\n private expiresAt: Date | null = null;\n private authCallbacks: AuthStateCallback[] = [];\n private popupWindow: Window | null = null;\n private messageHandler: ((event: MessageEvent) => void) | null = null;\n\n constructor(apiEndpoint: string, appId: string) {\n this.apiEndpoint = apiEndpoint;\n this.appId = appId;\n this.loadFromStorage();\n this.setupMessageListener();\n }\n\n /**\n * Initiate login flow via OAuth popup\n */\n async login(provider: 'google' | 'github' = 'google'): Promise<NxcodeUser> {\n return new Promise((resolve, reject) => {\n // Open popup\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n\n const loginUrl = `${this.apiEndpoint}/api/sdk/auth/login?app_id=${this.appId}&provider=${provider}`;\n\n this.popupWindow = window.open(\n loginUrl,\n 'nxcode_login',\n `width=${width},height=${height},left=${left},top=${top}`\n );\n\n if (!this.popupWindow) {\n reject(new Error('Failed to open login popup. Please allow popups for this site.'));\n return;\n }\n\n // Set up timeout\n const timeout = setTimeout(() => {\n this.popupWindow?.close();\n reject(new Error('Login timeout'));\n }, 120000); // 2 minute timeout\n\n // Wait for message from popup\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type !== 'NXCODE_SDK_AUTH') return;\n\n clearTimeout(timeout);\n window.removeEventListener('message', handleMessage);\n\n const result: AuthResult = event.data.payload;\n\n if (result.success && result.user && result.token) {\n this.setAuth(result);\n resolve(result.user);\n } else {\n reject(new Error(result.error || 'Login failed'));\n }\n };\n\n window.addEventListener('message', handleMessage);\n });\n }\n\n /**\n * Logout and clear session\n */\n async logout(): Promise<void> {\n try {\n if (this.token) {\n await fetch(`${this.apiEndpoint}/api/sdk/auth/logout`, {\n method: 'POST',\n headers: this.getHeaders(),\n });\n }\n } catch (error) {\n console.warn('Logout request failed:', error);\n }\n\n this.clearAuth();\n }\n\n /**\n * Get current user\n */\n getUser(): NxcodeUser | null {\n return this.user;\n }\n\n /**\n * Get current auth token\n */\n getToken(): string | null {\n // Check if token is expired\n if (this.expiresAt && new Date() > this.expiresAt) {\n // Token is expired, need to refresh\n // Start refresh in background but don't return the expired token\n this.refreshSession().catch(console.error);\n // Return null to force re-auth rather than using expired token\n return null;\n }\n return this.token;\n }\n\n /**\n * Get token, refreshing if needed (async version)\n */\n async getValidToken(): Promise<string | null> {\n if (this.expiresAt && new Date() > this.expiresAt) {\n await this.refreshSession();\n }\n return this.token;\n }\n\n /**\n * Register callback for auth state changes\n */\n onAuthStateChange(callback: AuthStateCallback): () => void {\n this.authCallbacks.push(callback);\n\n // Call immediately with current state\n callback(this.user);\n\n // Return unsubscribe function\n return () => {\n const index = this.authCallbacks.indexOf(callback);\n if (index > -1) {\n this.authCallbacks.splice(index, 1);\n }\n };\n }\n\n /**\n * Check if user is logged in\n */\n isLoggedIn(): boolean {\n return this.user !== null && this.token !== null;\n }\n\n /**\n * Refresh the current session\n */\n async refreshSession(): Promise<void> {\n if (!this.refreshToken) {\n this.clearAuth();\n return;\n }\n\n try {\n const response = await fetch(`${this.apiEndpoint}/api/sdk/auth/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-App-Id': this.appId,\n },\n body: JSON.stringify({ refreshToken: this.refreshToken }),\n });\n\n if (!response.ok) {\n throw new Error('Refresh failed');\n }\n\n const data = await response.json();\n this.setAuth({\n success: true,\n token: data.token,\n refreshToken: data.refreshToken,\n expiresAt: data.expiresAt,\n user: data.user,\n });\n } catch (error) {\n console.error('Session refresh failed:', error);\n this.clearAuth();\n }\n }\n\n /**\n * Fetch current user info from server\n */\n async fetchUser(): Promise<NxcodeUser | null> {\n if (!this.token) return null;\n\n try {\n const response = await fetch(`${this.apiEndpoint}/api/sdk/auth/me`, {\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n await this.refreshSession();\n return this.user;\n }\n throw new Error('Failed to fetch user');\n }\n\n const user = await response.json();\n this.user = user;\n this.notifyAuthChange();\n this.saveToStorage();\n\n return user;\n } catch (error) {\n console.error('Failed to fetch user:', error);\n return null;\n }\n }\n\n // ==================== Private Methods ====================\n\n private setAuth(result: AuthResult): void {\n if (result.success && result.user && result.token) {\n this.user = result.user;\n this.token = result.token;\n this.refreshToken = result.refreshToken || null;\n this.expiresAt = result.expiresAt ? new Date(result.expiresAt) : null;\n\n this.saveToStorage();\n this.notifyAuthChange();\n }\n }\n\n private clearAuth(): void {\n this.user = null;\n this.token = null;\n this.refreshToken = null;\n this.expiresAt = null;\n\n localStorage.removeItem(`${STORAGE_KEY}_${this.appId}`);\n this.notifyAuthChange();\n }\n\n private saveToStorage(): void {\n if (this.user && this.token) {\n const data: StoredAuth = {\n token: this.token,\n refreshToken: this.refreshToken || '',\n expiresAt: this.expiresAt?.toISOString() || '',\n user: this.user,\n };\n localStorage.setItem(`${STORAGE_KEY}_${this.appId}`, JSON.stringify(data));\n }\n }\n\n private loadFromStorage(): void {\n try {\n const stored = localStorage.getItem(`${STORAGE_KEY}_${this.appId}`);\n if (stored) {\n const data: StoredAuth = JSON.parse(stored);\n this.token = data.token;\n this.refreshToken = data.refreshToken;\n this.expiresAt = data.expiresAt ? new Date(data.expiresAt) : null;\n this.user = data.user;\n\n // Check if expired\n if (this.expiresAt && new Date() > this.expiresAt) {\n this.refreshSession().catch(() => this.clearAuth());\n }\n }\n } catch (error) {\n console.warn('Failed to load auth from storage:', error);\n }\n }\n\n private notifyAuthChange(): void {\n for (const callback of this.authCallbacks) {\n try {\n callback(this.user);\n } catch (error) {\n console.error('Auth callback error:', error);\n }\n }\n }\n\n private setupMessageListener(): void {\n // Already set up message handling in login()\n }\n\n private getHeaders(): HeadersInit {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-App-Id': this.appId,\n };\n\n if (this.token) {\n headers['Authorization'] = `Bearer ${this.token}`;\n }\n\n return headers;\n }\n}\n","/**\n * Nxcode SDK - Billing Module\n */\n\nexport class NxcodeBilling {\n private apiEndpoint: string;\n private appId: string;\n private getToken: () => string | null;\n\n constructor(\n apiEndpoint: string,\n appId: string,\n getToken: () => string | null\n ) {\n this.apiEndpoint = apiEndpoint;\n this.appId = appId;\n this.getToken = getToken;\n }\n\n /**\n * Get user's current balance\n */\n async getBalance(): Promise<number> {\n const token = this.getToken();\n if (!token) {\n throw new Error('Not authenticated. Please login first.');\n }\n\n const response = await fetch(`${this.apiEndpoint}/api/sdk/billing/balance`, {\n headers: this.getHeaders(token),\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Session expired. Please login again.');\n }\n throw new Error('Failed to fetch balance');\n }\n\n const data = await response.json();\n return data.balance;\n }\n\n /**\n * Open top-up page in new tab\n */\n topUp(): void {\n const topUpUrl = `${this.apiEndpoint}/api/sdk/billing/topup?app_id=${this.appId}`;\n window.open(topUpUrl, '_blank');\n }\n\n // ==================== Private Methods ====================\n\n private getHeaders(token: string): HeadersInit {\n return {\n 'Content-Type': 'application/json',\n 'X-App-Id': this.appId,\n 'Authorization': `Bearer ${token}`,\n };\n }\n}\n","/**\n * Nxcode SDK - Payment Module\n */\n\nimport type { ChargeOptions, ChargeResult, Transaction } from './types';\n\nexport class NxcodePayment {\n private apiEndpoint: string;\n private appId: string;\n private getToken: () => string | null;\n\n constructor(\n apiEndpoint: string,\n appId: string,\n getToken: () => string | null\n ) {\n this.apiEndpoint = apiEndpoint;\n this.appId = appId;\n this.getToken = getToken;\n }\n\n /**\n * Process an in-app purchase\n *\n * @param options - Charge options\n * @returns Charge result with transaction details\n */\n async charge(options: ChargeOptions): Promise<ChargeResult> {\n const token = this.getToken();\n if (!token) {\n return {\n success: false,\n error: 'Not authenticated. Please login first.',\n };\n }\n\n try {\n const response = await fetch(`${this.apiEndpoint}/api/sdk/payment/charge`, {\n method: 'POST',\n headers: this.getHeaders(token),\n body: JSON.stringify({\n amount: options.amount,\n description: options.description,\n metadata: options.metadata,\n }),\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n return {\n success: false,\n error: 'Session expired. Please login again.',\n };\n }\n if (response.status === 402) {\n return {\n success: false,\n error: 'Insufficient balance. Please top up.',\n };\n }\n\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n error: errorData.detail || 'Payment failed',\n };\n }\n\n const result = await response.json();\n return result;\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Payment failed',\n };\n }\n }\n\n /**\n * Get user's transaction history\n *\n * @param limit - Maximum number of transactions to return\n * @param offset - Pagination offset\n * @returns Array of transactions\n */\n async getTransactions(limit = 50, offset = 0): Promise<Transaction[]> {\n const token = this.getToken();\n if (!token) {\n throw new Error('Not authenticated. Please login first.');\n }\n\n const response = await fetch(\n `${this.apiEndpoint}/api/sdk/payment/transactions?limit=${limit}&offset=${offset}`,\n {\n headers: this.getHeaders(token),\n }\n );\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Session expired. Please login again.');\n }\n throw new Error('Failed to fetch transactions');\n }\n\n const data = await response.json();\n return data.transactions;\n }\n\n // ==================== Private Methods ====================\n\n private getHeaders(token: string): HeadersInit {\n return {\n 'Content-Type': 'application/json',\n 'X-App-Id': this.appId,\n 'Authorization': `Bearer ${token}`,\n };\n }\n}\n","/**\n * Nxcode SDK - AI Module\n *\n * Provides access to AI capabilities through the Nxcode AI Gateway.\n * All AI calls require user authentication and are billed to the user's balance.\n */\n\n// ==================== Simplified Schema Types ====================\n\n/**\n * Simplified schema type for structured output.\n *\n * Use simple TypeScript-style notation:\n * - Primitives: 'string', 'number', 'boolean'\n * - Arrays: ['string'], ['number'], [{ nested: 'object' }]\n * - Objects: { key: 'type', nested: { ... } }\n *\n * @example\n * // Simple object\n * { name: 'string', age: 'number', active: 'boolean' }\n *\n * // With arrays\n * { tags: ['string'], scores: ['number'] }\n *\n * // Nested objects\n * { user: { name: 'string', profile: { bio: 'string' } } }\n */\nexport type SimpleSchema =\n | 'string'\n | 'number'\n | 'boolean'\n | SimpleSchema[]\n | { [key: string]: SimpleSchema };\n\n/**\n * JSON Schema type (Gemini API format)\n */\ninterface JsonSchema {\n type: 'STRING' | 'NUMBER' | 'INTEGER' | 'BOOLEAN' | 'ARRAY' | 'OBJECT';\n items?: JsonSchema;\n properties?: { [key: string]: JsonSchema };\n required?: string[];\n}\n\n/**\n * Convert simplified schema to JSON Schema (Gemini format)\n */\nfunction toJsonSchema(schema: SimpleSchema): JsonSchema {\n // Primitive types\n if (schema === 'string') {\n return { type: 'STRING' };\n }\n if (schema === 'number') {\n return { type: 'NUMBER' };\n }\n if (schema === 'boolean') {\n return { type: 'BOOLEAN' };\n }\n\n // Array type\n if (Array.isArray(schema)) {\n if (schema.length !== 1) {\n throw new Error('Array schema must have exactly one element type');\n }\n return {\n type: 'ARRAY',\n items: toJsonSchema(schema[0]),\n };\n }\n\n // Object type\n if (typeof schema === 'object' && schema !== null) {\n const properties: { [key: string]: JsonSchema } = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(schema)) {\n properties[key] = toJsonSchema(value);\n required.push(key); // All fields required by default\n }\n\n return {\n type: 'OBJECT',\n properties,\n required,\n };\n }\n\n throw new Error(`Invalid schema type: ${schema}`);\n}\n\n// ==================== Content Part Types ====================\n\n/**\n * Content part for multimodal messages\n */\nexport interface TextPart {\n type: 'text';\n text: string;\n}\n\nexport interface ImagePart {\n type: 'image';\n /** Base64 encoded image data */\n data: string;\n /** MIME type (e.g., 'image/png', 'image/jpeg') */\n mimeType: string;\n}\n\nexport interface ImageUrlPart {\n type: 'image_url';\n /** URL of the image */\n url: string;\n}\n\nexport type ContentPart = TextPart | ImagePart | ImageUrlPart;\n\nexport interface ChatMessage {\n role: 'user' | 'assistant' | 'system';\n /** Text content or array of content parts for multimodal */\n content: string | ContentPart[];\n}\n\nexport interface ChatOptions {\n messages: ChatMessage[];\n model?: string;\n /** Schema for structured output. AI will return JSON matching this schema. */\n responseSchema?: SimpleSchema;\n}\n\nexport interface ChatResponse {\n content: string;\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\nexport interface GenerateOptions {\n prompt: string;\n model?: string;\n /** Schema for structured output. AI will return JSON matching this schema. */\n responseSchema?: SimpleSchema;\n}\n\nexport interface GenerateResponse {\n text: string;\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\nexport interface StreamChunk {\n content: string;\n done: boolean;\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\nexport type StreamCallback = (chunk: StreamChunk) => void;\n\nexport class NxcodeAI {\n private apiEndpoint: string;\n private appId: string;\n private getToken: () => string | null;\n\n constructor(\n apiEndpoint: string,\n appId: string,\n getToken: () => string | null\n ) {\n this.apiEndpoint = apiEndpoint;\n this.appId = appId;\n this.getToken = getToken;\n }\n\n /**\n * Send a chat message and get a response.\n *\n * @example\n * const response = await Nxcode.ai.chat({\n * messages: [\n * { role: 'user', content: 'Hello!' }\n * ]\n * });\n * console.log(response.content);\n */\n async chat(options: ChatOptions): Promise<ChatResponse> {\n const token = this.getToken();\n if (!token) {\n throw new Error('Not authenticated. Please login first.');\n }\n\n const model = options.model || 'fast';\n\n // Build Gemini API request\n const geminiRequest: Record<string, unknown> = {\n contents: this.convertMessagesToGemini(options.messages),\n };\n\n // Add structured output config if schema provided\n if (options.responseSchema) {\n geminiRequest.generationConfig = {\n responseMimeType: 'application/json',\n responseSchema: toJsonSchema(options.responseSchema),\n };\n }\n\n const response = await fetch(\n `${this.apiEndpoint}/api/ai-gateway/v1beta/models/${model}:generateContent`,\n {\n method: 'POST',\n headers: this.getHeaders(token),\n body: JSON.stringify(geminiRequest),\n }\n );\n\n if (!response.ok) {\n await this.handleError(response);\n }\n\n const data = await response.json();\n return this.parseGeminiResponse(data);\n }\n\n /**\n * Generate text from a prompt.\n *\n * @example\n * const response = await Nxcode.ai.generate({\n * prompt: 'Write a haiku about coding'\n * });\n * console.log(response.text);\n */\n async generate(options: GenerateOptions): Promise<GenerateResponse> {\n const result = await this.chat({\n messages: [{ role: 'user', content: options.prompt }],\n model: options.model,\n responseSchema: options.responseSchema,\n });\n\n return {\n text: result.content,\n usage: result.usage,\n };\n }\n\n /**\n * Stream a chat response in real-time.\n *\n * @example\n * await Nxcode.ai.chatStream({\n * messages: [{ role: 'user', content: 'Tell me a story' }],\n * onChunk: (chunk) => {\n * process.stdout.write(chunk.content);\n * if (chunk.done) console.log('\\n--- Done ---');\n * }\n * });\n */\n async chatStream(\n options: ChatOptions & { onChunk: StreamCallback }\n ): Promise<void> {\n const token = this.getToken();\n // Allow anonymous streaming if app permits\n const headers = token ? this.getHeaders(token) : this.getAnonymousHeaders();\n\n const model = options.model || 'fast';\n\n const geminiRequest = {\n contents: this.convertMessagesToGemini(options.messages),\n };\n\n const response = await fetch(\n `${this.apiEndpoint}/api/ai-gateway/v1beta/models/${model}:streamGenerateContent?alt=sse`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(geminiRequest),\n }\n );\n\n if (!response.ok) {\n await this.handleError(response);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Streaming not supported');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const jsonStr = line.slice(6).trim();\n if (jsonStr === '[DONE]') {\n options.onChunk({ content: '', done: true });\n return;\n }\n\n try {\n const data = JSON.parse(jsonStr);\n const chunk = this.parseStreamChunk(data);\n options.onChunk(chunk);\n } catch {\n // Skip invalid JSON\n }\n }\n }\n }\n\n // Process remaining buffer\n if (buffer.startsWith('data: ')) {\n const jsonStr = buffer.slice(6).trim();\n if (jsonStr && jsonStr !== '[DONE]') {\n try {\n const data = JSON.parse(jsonStr);\n const chunk = this.parseStreamChunk(data);\n options.onChunk(chunk);\n } catch {\n // Skip invalid JSON\n }\n }\n }\n\n options.onChunk({ content: '', done: true });\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Stream text generation from a prompt.\n *\n * @example\n * await Nxcode.ai.generateStream({\n * prompt: 'Write a poem',\n * onChunk: (chunk) => console.log(chunk.content)\n * });\n */\n async generateStream(\n options: GenerateOptions & { onChunk: StreamCallback }\n ): Promise<void> {\n return this.chatStream({\n messages: [{ role: 'user', content: options.prompt }],\n model: options.model,\n onChunk: options.onChunk,\n });\n }\n\n // ==================== Private Methods ====================\n\n private getHeaders(token: string): HeadersInit {\n return {\n 'Content-Type': 'application/json',\n 'X-App-Id': this.appId,\n Authorization: `Bearer ${token}`,\n };\n }\n\n private getAnonymousHeaders(): HeadersInit {\n return {\n 'Content-Type': 'application/json',\n 'X-App-Id': this.appId,\n };\n }\n\n private convertMessagesToGemini(\n messages: ChatMessage[]\n ): Array<{ role: string; parts: Array<Record<string, unknown>> }> {\n return messages.map((msg) => ({\n role: msg.role === 'assistant' ? 'model' : 'user',\n parts: this.convertContentToParts(msg.content),\n }));\n }\n\n private convertContentToParts(\n content: string | ContentPart[]\n ): Array<Record<string, unknown>> {\n // Simple text content\n if (typeof content === 'string') {\n return [{ text: content }];\n }\n\n // Multimodal content\n return content.map((part) => {\n switch (part.type) {\n case 'text':\n return { text: part.text };\n\n case 'image':\n // Gemini format: inlineData with base64\n return {\n inlineData: {\n mimeType: part.mimeType,\n data: part.data,\n },\n };\n\n case 'image_url':\n // Gemini format: fileData with URL\n return {\n fileData: {\n fileUri: part.url,\n },\n };\n\n default:\n return { text: '' };\n }\n });\n }\n\n private parseGeminiResponse(data: Record<string, unknown>): ChatResponse {\n const candidates = data.candidates as Array<{\n content?: { parts?: Array<{ text?: string }> };\n }>;\n const content =\n candidates?.[0]?.content?.parts?.[0]?.text || '';\n\n const usageMetadata = data.usageMetadata as {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n };\n\n return {\n content,\n usage: usageMetadata\n ? {\n inputTokens: usageMetadata.promptTokenCount || 0,\n outputTokens: usageMetadata.candidatesTokenCount || 0,\n }\n : undefined,\n };\n }\n\n private parseStreamChunk(data: Record<string, unknown>): StreamChunk {\n const candidates = data.candidates as Array<{\n content?: { parts?: Array<{ text?: string }> };\n finishReason?: string;\n }>;\n\n const content = candidates?.[0]?.content?.parts?.[0]?.text || '';\n const finishReason = candidates?.[0]?.finishReason;\n const done = finishReason === 'STOP' || finishReason === 'END_TURN';\n\n const usageMetadata = data.usageMetadata as {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n };\n\n return {\n content,\n done,\n usage: usageMetadata\n ? {\n inputTokens: usageMetadata.promptTokenCount || 0,\n outputTokens: usageMetadata.candidatesTokenCount || 0,\n }\n : undefined,\n };\n }\n\n private async handleError(response: Response): Promise<never> {\n if (response.status === 401) {\n throw new Error('Session expired. Please login again.');\n }\n if (response.status === 402) {\n throw new Error('Insufficient balance. Please top up to continue.');\n }\n\n let message = 'AI request failed';\n try {\n const data = await response.json();\n message = data.detail || data.message || message;\n } catch {\n // Ignore parse errors\n }\n throw new Error(message);\n }\n}\n","/**\n * Nxcode SDK\n *\n * A lightweight SDK for integrating Nxcode authentication, billing,\n * and payment features into web applications.\n *\n * Usage:\n * <script src=\"https://sdk.nxcode.io/v1/nxcode.js\"></script>\n * <script>\n * const user = await Nxcode.auth.login();\n * console.log('Logged in:', user.email);\n * </script>\n */\n\nimport { NxcodeAuth } from './auth';\nimport { NxcodeBilling } from './billing';\nimport { NxcodePayment } from './payment';\nimport { NxcodeAI, type ChatOptions, type ChatResponse, type GenerateOptions, type GenerateResponse, type StreamChunk, type StreamCallback, type ChatMessage, type ContentPart, type TextPart, type ImagePart, type ImageUrlPart } from './ai';\nimport type {\n NxcodeUser,\n NxcodeConfig,\n ChargeOptions,\n ChargeResult,\n Transaction,\n AuthStateCallback,\n} from './types';\n\n// API endpoint - auto-detect or use default\nconst DEFAULT_API_ENDPOINT = 'https://studio-api.nxcode.io';\n\nclass NxcodeSDK {\n private config: NxcodeConfig | null = null;\n private _auth: NxcodeAuth | null = null;\n private _billing: NxcodeBilling | null = null;\n private _payment: NxcodePayment | null = null;\n private _ai: NxcodeAI | null = null;\n private initPromise: Promise<void> | null = null;\n private apiEndpoint: string;\n\n constructor() {\n this.apiEndpoint = this.detectApiEndpoint();\n this.autoInit();\n }\n\n /**\n * Auto-initialize SDK based on environment\n */\n private async autoInit(): Promise<void> {\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = this.init();\n return this.initPromise;\n }\n\n /**\n * Initialize SDK by fetching configuration\n */\n private async init(): Promise<void> {\n try {\n // Try to get config from server\n const response = await fetch(`${this.apiEndpoint}/api/sdk/config`, {\n credentials: 'include',\n });\n\n if (response.ok) {\n this.config = await response.json();\n this.config!.apiEndpoint = this.apiEndpoint;\n this.setupModules();\n }\n } catch (error) {\n console.warn('Nxcode SDK: Could not auto-detect app config. Call Nxcode.configure() manually.');\n }\n }\n\n /**\n * Manually configure SDK with app ID and optional endpoint\n */\n configure(appId: string, options?: { apiEndpoint?: string }): void {\n if (options?.apiEndpoint) {\n this.apiEndpoint = options.apiEndpoint;\n }\n this.config = {\n appId,\n name: '',\n billingMode: 'creator_pays',\n apiEndpoint: this.apiEndpoint,\n };\n this.setupModules();\n }\n\n /**\n * Set up SDK modules after configuration\n */\n private setupModules(): void {\n if (!this.config) return;\n\n this._auth = new NxcodeAuth(this.config.apiEndpoint, this.config.appId);\n this._billing = new NxcodeBilling(\n this.config.apiEndpoint,\n this.config.appId,\n () => this._auth?.getToken() || null\n );\n this._payment = new NxcodePayment(\n this.config.apiEndpoint,\n this.config.appId,\n () => this._auth?.getToken() || null\n );\n this._ai = new NxcodeAI(\n this.config.apiEndpoint,\n this.config.appId,\n () => this._auth?.getToken() || null\n );\n }\n\n /**\n * Detect API endpoint based on environment\n */\n private detectApiEndpoint(): string {\n if (typeof window !== 'undefined') {\n const hostname = window.location.hostname;\n\n // Development environment\n if (hostname === 'localhost' || hostname === '127.0.0.1') {\n return 'http://localhost:8001';\n }\n\n // Check for dev environment\n if (hostname.includes('.nxcode.dev') || hostname.includes('.nxcode.app')) {\n return 'https://studio-api.nxcode.io';\n }\n }\n\n return DEFAULT_API_ENDPOINT;\n }\n\n /**\n * Ensure SDK is initialized before operations\n */\n private async ensureInitialized(): Promise<void> {\n if (this.initPromise) {\n await this.initPromise;\n }\n\n if (!this.config) {\n throw new Error(\n 'Nxcode SDK not configured. Add X-App-Id header or call Nxcode.configure(appId).'\n );\n }\n }\n\n // ==================== Auth Module ====================\n\n get auth() {\n const self = this;\n\n return {\n /**\n * Login via OAuth popup\n */\n async login(provider: 'google' | 'github' = 'google'): Promise<NxcodeUser> {\n await self.ensureInitialized();\n return self._auth!.login(provider);\n },\n\n /**\n * Logout current user\n */\n async logout(): Promise<void> {\n await self.ensureInitialized();\n return self._auth!.logout();\n },\n\n /**\n * Get current user\n */\n getUser(): NxcodeUser | null {\n return self._auth?.getUser() || null;\n },\n\n /**\n * Get auth token for API calls\n */\n getToken(): string | null {\n return self._auth?.getToken() || null;\n },\n\n /**\n * Register auth state change callback\n */\n onAuthStateChange(callback: AuthStateCallback): () => void {\n if (!self._auth) {\n // Store the actual unsubscribe function when SDK initializes\n let actualUnsubscribe: (() => void) | null = null;\n let cancelled = false;\n\n // Queue callback until initialized\n self.ensureInitialized().then(() => {\n if (!cancelled && self._auth) {\n actualUnsubscribe = self._auth.onAuthStateChange(callback);\n }\n });\n\n // Return unsubscribe that handles both immediate and deferred cases\n return () => {\n cancelled = true;\n if (actualUnsubscribe) {\n actualUnsubscribe();\n }\n };\n }\n return self._auth.onAuthStateChange(callback);\n },\n\n /**\n * Check if user is logged in\n */\n isLoggedIn(): boolean {\n return self._auth?.isLoggedIn() || false;\n },\n };\n }\n\n // ==================== Billing Module ====================\n\n get billing() {\n const self = this;\n\n return {\n /**\n * Get user's current balance\n */\n async getBalance(): Promise<number> {\n await self.ensureInitialized();\n return self._billing!.getBalance();\n },\n\n /**\n * Open top-up page\n */\n topUp(): void {\n self._billing?.topUp();\n },\n };\n }\n\n // ==================== Payment Module ====================\n\n get payment() {\n const self = this;\n\n return {\n /**\n * Process in-app purchase\n */\n async charge(options: ChargeOptions): Promise<ChargeResult> {\n await self.ensureInitialized();\n return self._payment!.charge(options);\n },\n\n /**\n * Get transaction history\n */\n async getTransactions(limit?: number, offset?: number): Promise<Transaction[]> {\n await self.ensureInitialized();\n return self._payment!.getTransactions(limit, offset);\n },\n };\n }\n\n // ==================== AI Module ====================\n\n get ai() {\n const self = this;\n\n return {\n /**\n * Send a chat message and get a response\n *\n * @example\n * const response = await Nxcode.ai.chat({\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\n async chat(options: ChatOptions): Promise<ChatResponse> {\n await self.ensureInitialized();\n return self._ai!.chat(options);\n },\n\n /**\n * Generate text from a prompt\n *\n * @example\n * const response = await Nxcode.ai.generate({ prompt: 'Write a haiku' });\n */\n async generate(options: GenerateOptions): Promise<GenerateResponse> {\n await self.ensureInitialized();\n return self._ai!.generate(options);\n },\n\n /**\n * Stream a chat response in real-time\n *\n * @example\n * await Nxcode.ai.chatStream({\n * messages: [{ role: 'user', content: 'Tell me a story' }],\n * onChunk: (chunk) => {\n * document.body.innerText += chunk.content;\n * if (chunk.done) console.log('Done!');\n * }\n * });\n */\n async chatStream(options: ChatOptions & { onChunk: StreamCallback }): Promise<void> {\n await self.ensureInitialized();\n return self._ai!.chatStream(options);\n },\n\n /**\n * Stream text generation from a prompt\n *\n * @example\n * await Nxcode.ai.generateStream({\n * prompt: 'Write a poem',\n * onChunk: (chunk) => console.log(chunk.content)\n * });\n */\n async generateStream(options: GenerateOptions & { onChunk: StreamCallback }): Promise<void> {\n await self.ensureInitialized();\n return self._ai!.generateStream(options);\n },\n };\n }\n\n // ==================== Utility Methods ====================\n\n /**\n * Get current configuration\n */\n getConfig(): NxcodeConfig | null {\n return this.config;\n }\n\n /**\n * Check if SDK is ready\n */\n isReady(): boolean {\n return this.config !== null && this._auth !== null;\n }\n\n /**\n * Wait for SDK to be ready\n */\n async ready(): Promise<void> {\n await this.ensureInitialized();\n }\n}\n\n// Create singleton instance\nconst Nxcode = new NxcodeSDK();\n\n// Export for UMD (browser global)\nif (typeof window !== 'undefined') {\n (window as unknown as { Nxcode: typeof Nxcode }).Nxcode = Nxcode;\n}\n\n// Export for ESM\nexport default Nxcode;\nexport { Nxcode };\nexport type {\n NxcodeUser,\n NxcodeConfig,\n ChargeOptions,\n ChargeResult,\n Transaction,\n AuthStateCallback,\n ChatOptions,\n ChatResponse,\n ChatMessage,\n ContentPart,\n TextPart,\n ImagePart,\n ImageUrlPart,\n GenerateOptions,\n GenerateResponse,\n StreamChunk,\n StreamCallback,\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nxcode.js","sources":["../src/auth.ts","../src/billing.ts","../src/payment.ts","../src/ai.ts","../src/agent.ts","../src/index.ts"],"sourcesContent":["/**\n * Nxcode SDK - Authentication Module\n */\n\nimport type { NxcodeUser, AuthResult, AuthStateCallback } from './types';\n\nconst STORAGE_KEY = 'nxcode_sdk_auth';\n\ninterface StoredAuth {\n token: string;\n refreshToken: string;\n expiresAt: string;\n user: NxcodeUser;\n}\n\nexport class NxcodeAuth {\n private apiEndpoint: string;\n private appId: string;\n private user: NxcodeUser | null = null;\n private token: string | null = null;\n private refreshToken: string | null = null;\n private expiresAt: Date | null = null;\n private authCallbacks: AuthStateCallback[] = [];\n private popupWindow: Window | null = null;\n private messageHandler: ((event: MessageEvent) => void) | null = null;\n\n constructor(apiEndpoint: string, appId: string) {\n this.apiEndpoint = apiEndpoint;\n this.appId = appId;\n this.loadFromStorage();\n this.setupMessageListener();\n }\n\n /**\n * Initiate login flow via OAuth popup\n */\n async login(provider: 'google' | 'github' = 'google'): Promise<NxcodeUser> {\n return new Promise((resolve, reject) => {\n // Open popup\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n\n const loginUrl = `${this.apiEndpoint}/api/sdk/auth/login?app_id=${this.appId}&provider=${provider}`;\n\n this.popupWindow = window.open(\n loginUrl,\n 'nxcode_login',\n `width=${width},height=${height},left=${left},top=${top}`\n );\n\n if (!this.popupWindow) {\n reject(new Error('Failed to open login popup. Please allow popups for this site.'));\n return;\n }\n\n // Set up timeout\n const timeout = setTimeout(() => {\n this.popupWindow?.close();\n reject(new Error('Login timeout'));\n }, 120000); // 2 minute timeout\n\n // Wait for message from popup\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type !== 'NXCODE_SDK_AUTH') return;\n\n clearTimeout(timeout);\n window.removeEventListener('message', handleMessage);\n\n const result: AuthResult = event.data.payload;\n\n if (result.success && result.user && result.token) {\n this.setAuth(result);\n resolve(result.user);\n } else {\n reject(new Error(result.error || 'Login failed'));\n }\n };\n\n window.addEventListener('message', handleMessage);\n });\n }\n\n /**\n * Logout and clear session\n */\n async logout(): Promise<void> {\n try {\n if (this.token) {\n await fetch(`${this.apiEndpoint}/api/sdk/auth/logout`, {\n method: 'POST',\n headers: this.getHeaders(),\n });\n }\n } catch (error) {\n console.warn('Logout request failed:', error);\n }\n\n this.clearAuth();\n }\n\n /**\n * Get current user\n */\n getUser(): NxcodeUser | null {\n return this.user;\n }\n\n /**\n * Get current auth token\n */\n getToken(): string | null {\n // Check if token is expired\n if (this.expiresAt && new Date() > this.expiresAt) {\n // Token is expired, need to refresh\n // Start refresh in background but don't return the expired token\n this.refreshSession().catch(console.error);\n // Return null to force re-auth rather than using expired token\n return null;\n }\n return this.token;\n }\n\n /**\n * Get token, refreshing if needed (async version)\n */\n async getValidToken(): Promise<string | null> {\n if (this.expiresAt && new Date() > this.expiresAt) {\n await this.refreshSession();\n }\n return this.token;\n }\n\n /**\n * Register callback for auth state changes\n */\n onAuthStateChange(callback: AuthStateCallback): () => void {\n this.authCallbacks.push(callback);\n\n // Call immediately with current state\n callback(this.user);\n\n // Return unsubscribe function\n return () => {\n const index = this.authCallbacks.indexOf(callback);\n if (index > -1) {\n this.authCallbacks.splice(index, 1);\n }\n };\n }\n\n /**\n * Check if user is logged in\n */\n isLoggedIn(): boolean {\n return this.user !== null && this.token !== null;\n }\n\n /**\n * Refresh the current session\n */\n async refreshSession(): Promise<void> {\n if (!this.refreshToken) {\n this.clearAuth();\n return;\n }\n\n try {\n const response = await fetch(`${this.apiEndpoint}/api/sdk/auth/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-App-Id': this.appId,\n },\n body: JSON.stringify({ refreshToken: this.refreshToken }),\n });\n\n if (!response.ok) {\n throw new Error('Refresh failed');\n }\n\n const data = await response.json();\n this.setAuth({\n success: true,\n token: data.token,\n refreshToken: data.refreshToken,\n expiresAt: data.expiresAt,\n user: data.user,\n });\n } catch (error) {\n console.error('Session refresh failed:', error);\n this.clearAuth();\n }\n }\n\n /**\n * Fetch current user info from server\n */\n async fetchUser(): Promise<NxcodeUser | null> {\n if (!this.token) return null;\n\n try {\n const response = await fetch(`${this.apiEndpoint}/api/sdk/auth/me`, {\n headers: this.getHeaders(),\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n await this.refreshSession();\n return this.user;\n }\n throw new Error('Failed to fetch user');\n }\n\n const user = await response.json();\n this.user = user;\n this.notifyAuthChange();\n this.saveToStorage();\n\n return user;\n } catch (error) {\n console.error('Failed to fetch user:', error);\n return null;\n }\n }\n\n // ==================== Private Methods ====================\n\n private setAuth(result: AuthResult): void {\n if (result.success && result.user && result.token) {\n this.user = result.user;\n this.token = result.token;\n this.refreshToken = result.refreshToken || null;\n this.expiresAt = result.expiresAt ? new Date(result.expiresAt) : null;\n\n this.saveToStorage();\n this.notifyAuthChange();\n }\n }\n\n private clearAuth(): void {\n this.user = null;\n this.token = null;\n this.refreshToken = null;\n this.expiresAt = null;\n\n localStorage.removeItem(`${STORAGE_KEY}_${this.appId}`);\n this.notifyAuthChange();\n }\n\n private saveToStorage(): void {\n if (this.user && this.token) {\n const data: StoredAuth = {\n token: this.token,\n refreshToken: this.refreshToken || '',\n expiresAt: this.expiresAt?.toISOString() || '',\n user: this.user,\n };\n localStorage.setItem(`${STORAGE_KEY}_${this.appId}`, JSON.stringify(data));\n }\n }\n\n private loadFromStorage(): void {\n try {\n const stored = localStorage.getItem(`${STORAGE_KEY}_${this.appId}`);\n if (stored) {\n const data: StoredAuth = JSON.parse(stored);\n this.token = data.token;\n this.refreshToken = data.refreshToken;\n this.expiresAt = data.expiresAt ? new Date(data.expiresAt) : null;\n this.user = data.user;\n\n // Check if expired\n if (this.expiresAt && new Date() > this.expiresAt) {\n this.refreshSession().catch(() => this.clearAuth());\n }\n }\n } catch (error) {\n console.warn('Failed to load auth from storage:', error);\n }\n }\n\n private notifyAuthChange(): void {\n for (const callback of this.authCallbacks) {\n try {\n callback(this.user);\n } catch (error) {\n console.error('Auth callback error:', error);\n }\n }\n }\n\n private setupMessageListener(): void {\n // Already set up message handling in login()\n }\n\n private getHeaders(): HeadersInit {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-App-Id': this.appId,\n };\n\n if (this.token) {\n headers['Authorization'] = `Bearer ${this.token}`;\n }\n\n return headers;\n }\n}\n","/**\n * Nxcode SDK - Billing Module\n */\n\nexport class NxcodeBilling {\n private apiEndpoint: string;\n private appId: string;\n private getToken: () => string | null;\n\n constructor(\n apiEndpoint: string,\n appId: string,\n getToken: () => string | null\n ) {\n this.apiEndpoint = apiEndpoint;\n this.appId = appId;\n this.getToken = getToken;\n }\n\n /**\n * Get user's current balance\n */\n async getBalance(): Promise<number> {\n const token = this.getToken();\n if (!token) {\n throw new Error('Not authenticated. Please login first.');\n }\n\n const response = await fetch(`${this.apiEndpoint}/api/sdk/billing/balance`, {\n headers: this.getHeaders(token),\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Session expired. Please login again.');\n }\n throw new Error('Failed to fetch balance');\n }\n\n const data = await response.json();\n return data.balance;\n }\n\n /**\n * Open top-up page in new tab\n */\n topUp(): void {\n const topUpUrl = `${this.apiEndpoint}/api/sdk/billing/topup?app_id=${this.appId}`;\n window.open(topUpUrl, '_blank');\n }\n\n // ==================== Private Methods ====================\n\n private getHeaders(token: string): HeadersInit {\n return {\n 'Content-Type': 'application/json',\n 'X-App-Id': this.appId,\n 'Authorization': `Bearer ${token}`,\n };\n }\n}\n","/**\n * Nxcode SDK - Payment Module\n */\n\nimport type { ChargeOptions, ChargeResult, Transaction } from './types';\n\nexport class NxcodePayment {\n private apiEndpoint: string;\n private appId: string;\n private getToken: () => string | null;\n\n constructor(\n apiEndpoint: string,\n appId: string,\n getToken: () => string | null\n ) {\n this.apiEndpoint = apiEndpoint;\n this.appId = appId;\n this.getToken = getToken;\n }\n\n /**\n * Process an in-app purchase\n *\n * @param options - Charge options\n * @returns Charge result with transaction details\n */\n async charge(options: ChargeOptions): Promise<ChargeResult> {\n const token = this.getToken();\n if (!token) {\n return {\n success: false,\n error: 'Not authenticated. Please login first.',\n };\n }\n\n try {\n const response = await fetch(`${this.apiEndpoint}/api/sdk/payment/charge`, {\n method: 'POST',\n headers: this.getHeaders(token),\n body: JSON.stringify({\n amount: options.amount,\n description: options.description,\n metadata: options.metadata,\n }),\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n return {\n success: false,\n error: 'Session expired. Please login again.',\n };\n }\n if (response.status === 402) {\n return {\n success: false,\n error: 'Insufficient balance. Please top up.',\n };\n }\n\n const errorData = await response.json().catch(() => ({}));\n return {\n success: false,\n error: errorData.detail || 'Payment failed',\n };\n }\n\n const result = await response.json();\n return result;\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : 'Payment failed',\n };\n }\n }\n\n /**\n * Get user's transaction history\n *\n * @param limit - Maximum number of transactions to return\n * @param offset - Pagination offset\n * @returns Array of transactions\n */\n async getTransactions(limit = 50, offset = 0): Promise<Transaction[]> {\n const token = this.getToken();\n if (!token) {\n throw new Error('Not authenticated. Please login first.');\n }\n\n const response = await fetch(\n `${this.apiEndpoint}/api/sdk/payment/transactions?limit=${limit}&offset=${offset}`,\n {\n headers: this.getHeaders(token),\n }\n );\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new Error('Session expired. Please login again.');\n }\n throw new Error('Failed to fetch transactions');\n }\n\n const data = await response.json();\n return data.transactions;\n }\n\n // ==================== Private Methods ====================\n\n private getHeaders(token: string): HeadersInit {\n return {\n 'Content-Type': 'application/json',\n 'X-App-Id': this.appId,\n 'Authorization': `Bearer ${token}`,\n };\n }\n}\n","/**\n * Nxcode SDK - AI Module\n *\n * Provides access to AI capabilities through the Nxcode AI Gateway.\n * All AI calls require user authentication and are billed to the user's balance.\n */\n\n// ==================== Simplified Schema Types ====================\n\n/**\n * Simplified schema type for structured output.\n *\n * Use simple TypeScript-style notation:\n * - Primitives: 'string', 'number', 'boolean'\n * - Arrays: ['string'], ['number'], [{ nested: 'object' }]\n * - Objects: { key: 'type', nested: { ... } }\n *\n * @example\n * // Simple object\n * { name: 'string', age: 'number', active: 'boolean' }\n *\n * // With arrays\n * { tags: ['string'], scores: ['number'] }\n *\n * // Nested objects\n * { user: { name: 'string', profile: { bio: 'string' } } }\n */\nexport type SimpleSchema =\n | 'string'\n | 'number'\n | 'boolean'\n | SimpleSchema[]\n | { [key: string]: SimpleSchema };\n\n/**\n * JSON Schema type (Gemini API format)\n */\ninterface JsonSchema {\n type: 'STRING' | 'NUMBER' | 'INTEGER' | 'BOOLEAN' | 'ARRAY' | 'OBJECT';\n items?: JsonSchema;\n properties?: { [key: string]: JsonSchema };\n required?: string[];\n}\n\n/**\n * Convert simplified schema to JSON Schema (Gemini format)\n */\nfunction toJsonSchema(schema: SimpleSchema): JsonSchema {\n // Primitive types\n if (schema === 'string') {\n return { type: 'STRING' };\n }\n if (schema === 'number') {\n return { type: 'NUMBER' };\n }\n if (schema === 'boolean') {\n return { type: 'BOOLEAN' };\n }\n\n // Array type\n if (Array.isArray(schema)) {\n if (schema.length !== 1) {\n throw new Error('Array schema must have exactly one element type');\n }\n return {\n type: 'ARRAY',\n items: toJsonSchema(schema[0]),\n };\n }\n\n // Object type\n if (typeof schema === 'object' && schema !== null) {\n const properties: { [key: string]: JsonSchema } = {};\n const required: string[] = [];\n\n for (const [key, value] of Object.entries(schema)) {\n properties[key] = toJsonSchema(value);\n required.push(key); // All fields required by default\n }\n\n return {\n type: 'OBJECT',\n properties,\n required,\n };\n }\n\n throw new Error(`Invalid schema type: ${schema}`);\n}\n\n// ==================== Content Part Types ====================\n\n/**\n * Content part for multimodal messages\n */\nexport interface TextPart {\n type: 'text';\n text: string;\n}\n\nexport interface ImagePart {\n type: 'image';\n /** Base64 encoded image data */\n data: string;\n /** MIME type (e.g., 'image/png', 'image/jpeg') */\n mimeType: string;\n}\n\nexport interface ImageUrlPart {\n type: 'image_url';\n /** URL of the image */\n url: string;\n}\n\nexport type ContentPart = TextPart | ImagePart | ImageUrlPart;\n\nexport interface ChatMessage {\n role: 'user' | 'assistant' | 'system';\n /** Text content or array of content parts for multimodal */\n content: string | ContentPart[];\n}\n\nexport interface ChatOptions {\n messages: ChatMessage[];\n model?: string;\n /** Schema for structured output. AI will return JSON matching this schema. */\n responseSchema?: SimpleSchema;\n}\n\nexport interface ChatResponse {\n content: string;\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\nexport interface GenerateOptions {\n prompt: string;\n model?: string;\n /** Schema for structured output. AI will return JSON matching this schema. */\n responseSchema?: SimpleSchema;\n}\n\nexport interface GenerateResponse {\n text: string;\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\nexport interface StreamChunk {\n content: string;\n done: boolean;\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\nexport type StreamCallback = (chunk: StreamChunk) => void;\n\nexport class NxcodeAI {\n private apiEndpoint: string;\n private appId: string;\n private getToken: () => string | null;\n\n constructor(\n apiEndpoint: string,\n appId: string,\n getToken: () => string | null\n ) {\n this.apiEndpoint = apiEndpoint;\n this.appId = appId;\n this.getToken = getToken;\n }\n\n /**\n * Send a chat message and get a response.\n *\n * @example\n * const response = await Nxcode.ai.chat({\n * messages: [\n * { role: 'user', content: 'Hello!' }\n * ]\n * });\n * console.log(response.content);\n */\n async chat(options: ChatOptions): Promise<ChatResponse> {\n const token = this.getToken();\n // Allow anonymous requests for dev preview and apps with anonymous AI enabled\n const headers = token ? this.getHeaders(token) : this.getAnonymousHeaders();\n\n const model = options.model || 'fast';\n\n // Build Gemini API request\n const geminiRequest: Record<string, unknown> = {\n contents: this.convertMessagesToGemini(options.messages),\n };\n\n // Add structured output config if schema provided\n if (options.responseSchema) {\n geminiRequest.generationConfig = {\n responseMimeType: 'application/json',\n responseSchema: toJsonSchema(options.responseSchema),\n };\n }\n\n const response = await fetch(\n `${this.apiEndpoint}/api/ai-gateway/v1beta/models/${model}:generateContent`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(geminiRequest),\n }\n );\n\n if (!response.ok) {\n await this.handleError(response);\n }\n\n const data = await response.json();\n return this.parseGeminiResponse(data);\n }\n\n /**\n * Generate text from a prompt.\n *\n * @example\n * const response = await Nxcode.ai.generate({\n * prompt: 'Write a haiku about coding'\n * });\n * console.log(response.text);\n */\n async generate(options: GenerateOptions): Promise<GenerateResponse> {\n const result = await this.chat({\n messages: [{ role: 'user', content: options.prompt }],\n model: options.model,\n responseSchema: options.responseSchema,\n });\n\n return {\n text: result.content,\n usage: result.usage,\n };\n }\n\n /**\n * Stream a chat response in real-time.\n *\n * @example\n * await Nxcode.ai.chatStream({\n * messages: [{ role: 'user', content: 'Tell me a story' }],\n * onChunk: (chunk) => {\n * process.stdout.write(chunk.content);\n * if (chunk.done) console.log('\\n--- Done ---');\n * }\n * });\n */\n async chatStream(\n options: ChatOptions & { onChunk: StreamCallback }\n ): Promise<void> {\n const token = this.getToken();\n // Allow anonymous streaming if app permits\n const headers = token ? this.getHeaders(token) : this.getAnonymousHeaders();\n\n const model = options.model || 'fast';\n\n const geminiRequest = {\n contents: this.convertMessagesToGemini(options.messages),\n };\n\n const response = await fetch(\n `${this.apiEndpoint}/api/ai-gateway/v1beta/models/${model}:streamGenerateContent?alt=sse`,\n {\n method: 'POST',\n headers,\n body: JSON.stringify(geminiRequest),\n }\n );\n\n if (!response.ok) {\n await this.handleError(response);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new Error('Streaming not supported');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const jsonStr = line.slice(6).trim();\n if (jsonStr === '[DONE]') {\n options.onChunk({ content: '', done: true });\n return;\n }\n\n try {\n const data = JSON.parse(jsonStr);\n const chunk = this.parseStreamChunk(data);\n options.onChunk(chunk);\n } catch {\n // Skip invalid JSON\n }\n }\n }\n }\n\n // Process remaining buffer\n if (buffer.startsWith('data: ')) {\n const jsonStr = buffer.slice(6).trim();\n if (jsonStr && jsonStr !== '[DONE]') {\n try {\n const data = JSON.parse(jsonStr);\n const chunk = this.parseStreamChunk(data);\n options.onChunk(chunk);\n } catch {\n // Skip invalid JSON\n }\n }\n }\n\n options.onChunk({ content: '', done: true });\n } finally {\n reader.releaseLock();\n }\n }\n\n /**\n * Stream text generation from a prompt.\n *\n * @example\n * await Nxcode.ai.generateStream({\n * prompt: 'Write a poem',\n * onChunk: (chunk) => console.log(chunk.content)\n * });\n */\n async generateStream(\n options: GenerateOptions & { onChunk: StreamCallback }\n ): Promise<void> {\n return this.chatStream({\n messages: [{ role: 'user', content: options.prompt }],\n model: options.model,\n onChunk: options.onChunk,\n });\n }\n\n // ==================== Private Methods ====================\n\n private getHeaders(token: string): HeadersInit {\n return {\n 'Content-Type': 'application/json',\n 'X-App-Id': this.appId,\n Authorization: `Bearer ${token}`,\n };\n }\n\n private getAnonymousHeaders(): HeadersInit {\n return {\n 'Content-Type': 'application/json',\n 'X-App-Id': this.appId,\n };\n }\n\n private convertMessagesToGemini(\n messages: ChatMessage[]\n ): Array<{ role: string; parts: Array<Record<string, unknown>> }> {\n return messages.map((msg) => ({\n role: msg.role === 'assistant' ? 'model' : 'user',\n parts: this.convertContentToParts(msg.content),\n }));\n }\n\n private convertContentToParts(\n content: string | ContentPart[]\n ): Array<Record<string, unknown>> {\n // Simple text content\n if (typeof content === 'string') {\n return [{ text: content }];\n }\n\n // Multimodal content\n return content.map((part) => {\n switch (part.type) {\n case 'text':\n return { text: part.text };\n\n case 'image':\n // Gemini format: inlineData with base64\n return {\n inlineData: {\n mimeType: part.mimeType,\n data: part.data,\n },\n };\n\n case 'image_url':\n // Gemini format: fileData with URL\n return {\n fileData: {\n fileUri: part.url,\n },\n };\n\n default:\n return { text: '' };\n }\n });\n }\n\n private parseGeminiResponse(data: Record<string, unknown>): ChatResponse {\n const candidates = data.candidates as Array<{\n content?: { parts?: Array<{ text?: string }> };\n }>;\n const content =\n candidates?.[0]?.content?.parts?.[0]?.text || '';\n\n const usageMetadata = data.usageMetadata as {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n };\n\n return {\n content,\n usage: usageMetadata\n ? {\n inputTokens: usageMetadata.promptTokenCount || 0,\n outputTokens: usageMetadata.candidatesTokenCount || 0,\n }\n : undefined,\n };\n }\n\n private parseStreamChunk(data: Record<string, unknown>): StreamChunk {\n const candidates = data.candidates as Array<{\n content?: { parts?: Array<{ text?: string }> };\n finishReason?: string;\n }>;\n\n const content = candidates?.[0]?.content?.parts?.[0]?.text || '';\n const finishReason = candidates?.[0]?.finishReason;\n const done = finishReason === 'STOP' || finishReason === 'END_TURN';\n\n const usageMetadata = data.usageMetadata as {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n };\n\n return {\n content,\n done,\n usage: usageMetadata\n ? {\n inputTokens: usageMetadata.promptTokenCount || 0,\n outputTokens: usageMetadata.candidatesTokenCount || 0,\n }\n : undefined,\n };\n }\n\n private async handleError(response: Response): Promise<never> {\n let message = 'AI request failed';\n try {\n const data = await response.json();\n message = data.detail || data.message || message;\n } catch {\n // Ignore parse errors, use default message based on status\n if (response.status === 401) {\n message = 'Session expired. Please login again.';\n } else if (response.status === 402) {\n message = 'Insufficient balance. Please top up to continue.';\n }\n }\n throw new Error(message);\n }\n}\n","/**\n * Nxcode SDK - Agent Module\n *\n * Provides AI agents with tool calling capabilities.\n * Agents can call backend endpoints as tools and maintain conversation history.\n */\n\nimport { SimpleSchema } from './ai';\n\n// ==================== Types ====================\n\n/**\n * Tool definition for an agent\n */\nexport interface AgentTool {\n /** Unique name for the tool */\n name: string;\n /** Description of what the tool does (shown to AI) */\n description: string;\n /** Parameter schema using simplified syntax */\n parameters?: { [key: string]: SimpleSchema };\n /** Backend endpoint to call (POST request) */\n endpoint: string;\n}\n\n/**\n * Options for creating an agent\n */\nexport interface AgentOptions {\n /** System instructions for the agent */\n instructions: string;\n /** Available tools */\n tools: AgentTool[];\n /** Model to use (default: 'fast') */\n model?: string;\n /** Maximum tool call steps per run (default: 10) */\n maxSteps?: number;\n}\n\n/**\n * Callbacks for agent.run()\n */\nexport interface AgentRunCallbacks {\n /** Called when agent decides to call a tool */\n onToolCall?: (name: string, params: Record<string, unknown>) => void;\n /** Called when tool returns a result */\n onToolResult?: (name: string, result: unknown) => void;\n /** Called on each step with thinking/reasoning */\n onThinking?: (thought: string) => void;\n}\n\n/**\n * Result of agent.run()\n */\nexport interface AgentResult {\n /** Final output text from the agent */\n output: string;\n /** Tool calls made during this run */\n toolCalls: Array<{\n name: string;\n params: Record<string, unknown>;\n result: unknown;\n }>;\n /** Total token usage */\n usage?: {\n inputTokens: number;\n outputTokens: number;\n };\n}\n\n// ==================== Internal Types ====================\n\ninterface ChatMessage {\n role: 'user' | 'assistant' | 'system' | 'model';\n content: string;\n parts?: Array<{\n text?: string;\n functionCall?: { name: string; args: Record<string, unknown> };\n functionResponse?: { name: string; response: unknown };\n }>;\n}\n\ninterface GeminiTool {\n functionDeclarations: Array<{\n name: string;\n description: string;\n parameters?: {\n type: string;\n properties: Record<string, unknown>;\n required: string[];\n };\n }>;\n}\n\n// ==================== Helper Functions ====================\n\n/**\n * Convert simple schema to JSON Schema format for Gemini\n */\nfunction toJsonSchemaProperty(schema: SimpleSchema): Record<string, unknown> {\n if (schema === 'string') return { type: 'STRING' };\n if (schema === 'number') return { type: 'NUMBER' };\n if (schema === 'boolean') return { type: 'BOOLEAN' };\n\n if (Array.isArray(schema)) {\n return {\n type: 'ARRAY',\n items: toJsonSchemaProperty(schema[0]),\n };\n }\n\n if (typeof schema === 'object') {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n for (const [key, value] of Object.entries(schema)) {\n properties[key] = toJsonSchemaProperty(value);\n required.push(key);\n }\n return { type: 'OBJECT', properties, required };\n }\n\n return { type: 'STRING' };\n}\n\n/**\n * Convert AgentTool to Gemini function declaration\n */\nfunction toolToGeminiFunction(tool: AgentTool): GeminiTool['functionDeclarations'][0] {\n const declaration: GeminiTool['functionDeclarations'][0] = {\n name: tool.name,\n description: tool.description,\n };\n\n // Always include parameters object (even if empty) for Gemini compatibility\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n if (tool.parameters) {\n for (const [key, value] of Object.entries(tool.parameters)) {\n properties[key] = toJsonSchemaProperty(value);\n required.push(key);\n }\n }\n\n declaration.parameters = {\n type: 'OBJECT',\n properties,\n required,\n };\n\n return declaration;\n}\n\n// ==================== Agent Class ====================\n\nexport class Agent {\n private options: Required<AgentOptions>;\n private history: ChatMessage[] = [];\n private apiEndpoint: string;\n private appId: string;\n private getToken: () => string | null;\n\n constructor(\n options: AgentOptions,\n apiEndpoint: string,\n appId: string,\n getToken: () => string | null\n ) {\n this.options = {\n instructions: options.instructions,\n tools: options.tools,\n model: options.model || 'fast',\n maxSteps: options.maxSteps || 10,\n };\n this.apiEndpoint = apiEndpoint;\n this.appId = appId;\n this.getToken = getToken;\n }\n\n /**\n * Run the agent with user input\n */\n async run(input: string, callbacks?: AgentRunCallbacks): Promise<AgentResult> {\n const token = this.getToken();\n if (!token) {\n throw new Error('Not authenticated. Please login first.');\n }\n\n // Add user message to history\n this.history.push({ role: 'user', content: input });\n\n const toolCalls: AgentResult['toolCalls'] = [];\n let totalInputTokens = 0;\n let totalOutputTokens = 0;\n let steps = 0;\n\n // Agent loop\n while (steps < this.options.maxSteps) {\n steps++;\n\n // Call Gemini with tools\n const response = await this.callGemini(token);\n\n totalInputTokens += response.usage?.inputTokens || 0;\n totalOutputTokens += response.usage?.outputTokens || 0;\n\n // Check if AI wants to call a function\n const functionCall = response.functionCall;\n if (functionCall) {\n callbacks?.onToolCall?.(functionCall.name, functionCall.args);\n\n // Find the tool\n const tool = this.options.tools.find((t) => t.name === functionCall.name);\n if (!tool) {\n throw new Error(`Unknown tool: ${functionCall.name}`);\n }\n\n // Call the tool endpoint\n const result = await this.callTool(tool, functionCall.args, token);\n callbacks?.onToolResult?.(functionCall.name, result);\n\n // Record tool call\n toolCalls.push({\n name: functionCall.name,\n params: functionCall.args,\n result,\n });\n\n // Add function call and response to history using raw parts from Gemini\n this.history.push({\n role: 'model',\n content: '',\n parts: (response.rawParts as any) || [{ functionCall: { name: functionCall.name, args: functionCall.args } }],\n });\n this.history.push({\n role: 'user',\n content: '',\n parts: [{ functionResponse: { name: functionCall.name, response: result } }],\n });\n\n // Continue loop to let AI process the result\n continue;\n }\n\n // No function call - AI is done, return the text response\n const output = response.text || '';\n\n // Add assistant response to history\n this.history.push({ role: 'assistant', content: output });\n\n return {\n output,\n toolCalls,\n usage: {\n inputTokens: totalInputTokens,\n outputTokens: totalOutputTokens,\n },\n };\n }\n\n throw new Error(`Agent exceeded maximum steps (${this.options.maxSteps})`);\n }\n\n /**\n * Clear conversation history\n */\n reset(): void {\n this.history = [];\n }\n\n /**\n * Get current conversation history\n */\n getHistory(): ChatMessage[] {\n return [...this.history];\n }\n\n // ==================== Private Methods ====================\n\n private async callGemini(token: string): Promise<{\n text?: string;\n functionCall?: { name: string; args: Record<string, unknown> };\n rawParts?: unknown[];\n usage?: { inputTokens: number; outputTokens: number };\n }> {\n // Build contents from history\n const contents = this.history.map((msg) => {\n if (msg.parts) {\n return {\n role: msg.role === 'assistant' ? 'model' : msg.role,\n parts: msg.parts,\n };\n }\n return {\n role: msg.role === 'assistant' ? 'model' : 'user',\n parts: [{ text: msg.content }],\n };\n });\n\n // Build tools\n const tools: GeminiTool[] = [\n {\n functionDeclarations: this.options.tools.map(toolToGeminiFunction),\n },\n ];\n\n // Build request with tool config to encourage tool use\n const request = {\n contents,\n tools,\n toolConfig: {\n functionCallingConfig: {\n mode: 'AUTO', // Let model decide when to use tools\n },\n },\n systemInstruction: {\n parts: [{ text: this.options.instructions }],\n },\n };\n\n const response = await fetch(\n `${this.apiEndpoint}/api/ai-gateway/v1beta/models/${this.options.model}:generateContent`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-App-Id': this.appId,\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(request),\n }\n );\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({}));\n throw new Error(error.detail || error.message || 'Agent API call failed');\n }\n\n const data = await response.json();\n\n // Parse response\n const candidate = data.candidates?.[0];\n const parts = candidate?.content?.parts || [];\n\n // Check for function call (support both camelCase and snake_case)\n for (const part of parts) {\n const funcCall = part.functionCall || part.function_call;\n if (funcCall) {\n return {\n functionCall: {\n name: funcCall.name,\n args: funcCall.args || {},\n },\n rawParts: parts, // Save raw parts including thought_signature\n usage: {\n inputTokens: data.usageMetadata?.promptTokenCount || 0,\n outputTokens: data.usageMetadata?.candidatesTokenCount || 0,\n },\n };\n }\n }\n\n // Return text response\n const text = parts.find((p: { text?: string }) => p.text)?.text || '';\n return {\n text,\n usage: {\n inputTokens: data.usageMetadata?.promptTokenCount || 0,\n outputTokens: data.usageMetadata?.candidatesTokenCount || 0,\n },\n };\n }\n\n private async callTool(\n tool: AgentTool,\n params: Record<string, unknown>,\n token: string\n ): Promise<unknown> {\n // Build context to pass to tool\n const body = {\n ...params,\n _context: {\n agentId: this.options.instructions.slice(0, 20), // Simple ID\n stepIndex: this.history.length,\n previousTools: this.history\n .filter((m) => m.parts?.some((p) => p.functionResponse))\n .map((m) => {\n const fr = m.parts?.find((p) => p.functionResponse)?.functionResponse;\n return fr ? { name: fr.name, result: fr.response } : null;\n })\n .filter(Boolean),\n },\n };\n\n const response = await fetch(tool.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const error = await response.text();\n return { error: `Tool call failed: ${error}` };\n }\n\n return response.json();\n }\n}\n","/**\n * Nxcode SDK\n *\n * A lightweight SDK for integrating Nxcode authentication, billing,\n * and payment features into web applications.\n *\n * Usage:\n * <script src=\"https://sdk.nxcode.io/v1/nxcode.js\"></script>\n * <script>\n * const user = await Nxcode.auth.login();\n * console.log('Logged in:', user.email);\n * </script>\n */\n\nimport { NxcodeAuth } from './auth';\nimport { NxcodeBilling } from './billing';\nimport { NxcodePayment } from './payment';\nimport { NxcodeAI, type ChatOptions, type ChatResponse, type GenerateOptions, type GenerateResponse, type StreamChunk, type StreamCallback, type ChatMessage, type ContentPart, type TextPart, type ImagePart, type ImageUrlPart, type SimpleSchema } from './ai';\nimport { Agent, type AgentTool, type AgentOptions, type AgentRunCallbacks, type AgentResult } from './agent';\nimport type {\n NxcodeUser,\n NxcodeConfig,\n ChargeOptions,\n ChargeResult,\n Transaction,\n AuthStateCallback,\n} from './types';\n\n// API endpoint - auto-detect or use default\nconst DEFAULT_API_ENDPOINT = 'https://studio-api.nxcode.io';\n\nclass NxcodeSDK {\n private config: NxcodeConfig | null = null;\n private _auth: NxcodeAuth | null = null;\n private _billing: NxcodeBilling | null = null;\n private _payment: NxcodePayment | null = null;\n private _ai: NxcodeAI | null = null;\n private initPromise: Promise<void> | null = null;\n private apiEndpoint: string;\n\n constructor() {\n this.apiEndpoint = this.detectApiEndpoint();\n this.autoInit();\n }\n\n /**\n * Auto-initialize SDK based on environment\n */\n private async autoInit(): Promise<void> {\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = this.init();\n return this.initPromise;\n }\n\n /**\n * Initialize SDK by fetching configuration\n */\n private async init(): Promise<void> {\n try {\n // Try to get config from server\n const response = await fetch(`${this.apiEndpoint}/api/sdk/config`, {\n credentials: 'include',\n });\n\n if (response.ok) {\n this.config = await response.json();\n this.config!.apiEndpoint = this.apiEndpoint;\n this.setupModules();\n }\n } catch (error) {\n console.warn('Nxcode SDK: Could not auto-detect app config. Call Nxcode.configure() manually.');\n }\n }\n\n /**\n * Manually configure SDK with app ID and optional endpoint\n */\n configure(appId: string, options?: { apiEndpoint?: string }): void {\n if (options?.apiEndpoint) {\n this.apiEndpoint = options.apiEndpoint;\n }\n this.config = {\n appId,\n name: '',\n billingMode: 'creator_pays',\n apiEndpoint: this.apiEndpoint,\n };\n this.setupModules();\n }\n\n /**\n * Set up SDK modules after configuration\n */\n private setupModules(): void {\n if (!this.config) return;\n\n this._auth = new NxcodeAuth(this.config.apiEndpoint, this.config.appId);\n this._billing = new NxcodeBilling(\n this.config.apiEndpoint,\n this.config.appId,\n () => this._auth?.getToken() || null\n );\n this._payment = new NxcodePayment(\n this.config.apiEndpoint,\n this.config.appId,\n () => this._auth?.getToken() || null\n );\n this._ai = new NxcodeAI(\n this.config.apiEndpoint,\n this.config.appId,\n () => this._auth?.getToken() || null\n );\n }\n\n /**\n * Detect API endpoint based on environment\n */\n private detectApiEndpoint(): string {\n if (typeof window !== 'undefined') {\n const hostname = window.location.hostname;\n\n // Development environment\n if (hostname === 'localhost' || hostname === '127.0.0.1') {\n return 'http://localhost:8001';\n }\n\n // Check for dev environment\n if (hostname.includes('.nxcode.dev') || hostname.includes('.nxcode.app')) {\n return 'https://studio-api.nxcode.io';\n }\n }\n\n return DEFAULT_API_ENDPOINT;\n }\n\n /**\n * Ensure SDK is initialized before operations\n */\n private async ensureInitialized(): Promise<void> {\n if (this.initPromise) {\n await this.initPromise;\n }\n\n if (!this.config) {\n throw new Error(\n 'Nxcode SDK not configured. Add X-App-Id header or call Nxcode.configure(appId).'\n );\n }\n }\n\n // ==================== Auth Module ====================\n\n get auth() {\n const self = this;\n\n return {\n /**\n * Login via OAuth popup\n */\n async login(provider: 'google' | 'github' = 'google'): Promise<NxcodeUser> {\n await self.ensureInitialized();\n return self._auth!.login(provider);\n },\n\n /**\n * Logout current user\n */\n async logout(): Promise<void> {\n await self.ensureInitialized();\n return self._auth!.logout();\n },\n\n /**\n * Get current user\n */\n getUser(): NxcodeUser | null {\n return self._auth?.getUser() || null;\n },\n\n /**\n * Get auth token for API calls\n */\n getToken(): string | null {\n return self._auth?.getToken() || null;\n },\n\n /**\n * Register auth state change callback\n */\n onAuthStateChange(callback: AuthStateCallback): () => void {\n if (!self._auth) {\n // Store the actual unsubscribe function when SDK initializes\n let actualUnsubscribe: (() => void) | null = null;\n let cancelled = false;\n\n // Queue callback until initialized\n self.ensureInitialized().then(() => {\n if (!cancelled && self._auth) {\n actualUnsubscribe = self._auth.onAuthStateChange(callback);\n }\n });\n\n // Return unsubscribe that handles both immediate and deferred cases\n return () => {\n cancelled = true;\n if (actualUnsubscribe) {\n actualUnsubscribe();\n }\n };\n }\n return self._auth.onAuthStateChange(callback);\n },\n\n /**\n * Check if user is logged in\n */\n isLoggedIn(): boolean {\n return self._auth?.isLoggedIn() || false;\n },\n };\n }\n\n // ==================== Billing Module ====================\n\n get billing() {\n const self = this;\n\n return {\n /**\n * Get user's current balance\n */\n async getBalance(): Promise<number> {\n await self.ensureInitialized();\n return self._billing!.getBalance();\n },\n\n /**\n * Open top-up page\n */\n topUp(): void {\n self._billing?.topUp();\n },\n };\n }\n\n // ==================== Payment Module ====================\n\n get payment() {\n const self = this;\n\n return {\n /**\n * Process in-app purchase\n */\n async charge(options: ChargeOptions): Promise<ChargeResult> {\n await self.ensureInitialized();\n return self._payment!.charge(options);\n },\n\n /**\n * Get transaction history\n */\n async getTransactions(limit?: number, offset?: number): Promise<Transaction[]> {\n await self.ensureInitialized();\n return self._payment!.getTransactions(limit, offset);\n },\n };\n }\n\n // ==================== AI Module ====================\n\n get ai() {\n const self = this;\n\n return {\n /**\n * Send a chat message and get a response\n *\n * @example\n * const response = await Nxcode.ai.chat({\n * messages: [{ role: 'user', content: 'Hello!' }]\n * });\n */\n async chat(options: ChatOptions): Promise<ChatResponse> {\n await self.ensureInitialized();\n return self._ai!.chat(options);\n },\n\n /**\n * Generate text from a prompt\n *\n * @example\n * const response = await Nxcode.ai.generate({ prompt: 'Write a haiku' });\n */\n async generate(options: GenerateOptions): Promise<GenerateResponse> {\n await self.ensureInitialized();\n return self._ai!.generate(options);\n },\n\n /**\n * Stream a chat response in real-time\n *\n * @example\n * await Nxcode.ai.chatStream({\n * messages: [{ role: 'user', content: 'Tell me a story' }],\n * onChunk: (chunk) => {\n * document.body.innerText += chunk.content;\n * if (chunk.done) console.log('Done!');\n * }\n * });\n */\n async chatStream(options: ChatOptions & { onChunk: StreamCallback }): Promise<void> {\n await self.ensureInitialized();\n return self._ai!.chatStream(options);\n },\n\n /**\n * Stream text generation from a prompt\n *\n * @example\n * await Nxcode.ai.generateStream({\n * prompt: 'Write a poem',\n * onChunk: (chunk) => console.log(chunk.content)\n * });\n */\n async generateStream(options: GenerateOptions & { onChunk: StreamCallback }): Promise<void> {\n await self.ensureInitialized();\n return self._ai!.generateStream(options);\n },\n\n /**\n * Create an AI agent with tool calling capabilities\n *\n * @example\n * const agent = Nxcode.ai.createAgent({\n * instructions: 'You are a helpful assistant that can search and send emails.',\n * tools: [\n * {\n * name: 'search_emails',\n * description: 'Search user emails',\n * parameters: { query: 'string' },\n * endpoint: '/api/emails/search'\n * },\n * {\n * name: 'send_email',\n * description: 'Send an email',\n * parameters: { to: 'string', subject: 'string', body: 'string' },\n * endpoint: '/api/emails/send'\n * }\n * ]\n * });\n *\n * const result = await agent.run('Find emails from John and reply to him');\n * console.log(result.output);\n */\n createAgent(options: AgentOptions): Agent {\n if (!self.config) {\n throw new Error('Nxcode SDK not configured. Call Nxcode.configure(appId) first.');\n }\n return new Agent(\n options,\n self.apiEndpoint,\n self.config.appId,\n () => self._auth?.getToken() || null\n );\n },\n };\n }\n\n // ==================== Utility Methods ====================\n\n /**\n * Get current configuration\n */\n getConfig(): NxcodeConfig | null {\n return this.config;\n }\n\n /**\n * Check if SDK is ready\n */\n isReady(): boolean {\n return this.config !== null && this._auth !== null;\n }\n\n /**\n * Wait for SDK to be ready\n */\n async ready(): Promise<void> {\n await this.ensureInitialized();\n }\n}\n\n// Create singleton instance\nconst Nxcode = new NxcodeSDK();\n\n// Export for UMD (browser global)\nif (typeof window !== 'undefined') {\n (window as unknown as { Nxcode: typeof Nxcode }).Nxcode = Nxcode;\n}\n\n// Export for ESM\nexport default Nxcode;\nexport { Nxcode };\nexport type {\n NxcodeUser,\n NxcodeConfig,\n ChargeOptions,\n ChargeResult,\n Transaction,\n AuthStateCallback,\n ChatOptions,\n ChatResponse,\n ChatMessage,\n ContentPart,\n TextPart,\n ImagePart,\n ImageUrlPart,\n GenerateOptions,\n GenerateResponse,\n StreamChunk,\n StreamCallback,\n SimpleSchema,\n AgentTool,\n AgentOptions,\n AgentRunCallbacks,\n AgentResult,\n};\nexport { Agent };\n"],"names":[],"mappings":"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"}
|
package/dist/nxcode.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).Nxcode={})}(this,function(t){"use strict";const e="nxcode_sdk_auth";class n{constructor(t,e){this.user=null,this.token=null,this.refreshToken=null,this.expiresAt=null,this.authCallbacks=[],this.popupWindow=null,this.messageHandler=null,this.apiEndpoint=t,this.appId=e,this.loadFromStorage(),this.setupMessageListener()}async login(t="google"){return new Promise((e,n)=>{const s=window.screenX+(window.outerWidth-500)/2,i=window.screenY+(window.outerHeight-600)/2,a=`${this.apiEndpoint}/api/sdk/auth/login?app_id=${this.appId}&provider=${t}`;if(this.popupWindow=window.open(a,"nxcode_login",`width=500,height=600,left=${s},top=${i}`),!this.popupWindow)return void n(new Error("Failed to open login popup. Please allow popups for this site."));const o=setTimeout(()=>{this.popupWindow?.close(),n(new Error("Login timeout"))},12e4),r=t=>{if("NXCODE_SDK_AUTH"!==t.data?.type)return;clearTimeout(o),window.removeEventListener("message",r);const s=t.data.payload;s.success&&s.user&&s.token?(this.setAuth(s),e(s.user)):n(new Error(s.error||"Login failed"))};window.addEventListener("message",r)})}async logout(){try{this.token&&await fetch(`${this.apiEndpoint}/api/sdk/auth/logout`,{method:"POST",headers:this.getHeaders()})}catch(t){console.warn("Logout request failed:",t)}this.clearAuth()}getUser(){return this.user}getToken(){return this.expiresAt&&new Date>this.expiresAt?(this.refreshSession().catch(console.error),null):this.token}async getValidToken(){return this.expiresAt&&new Date>this.expiresAt&&await this.refreshSession(),this.token}onAuthStateChange(t){return this.authCallbacks.push(t),t(this.user),()=>{const e=this.authCallbacks.indexOf(t);e>-1&&this.authCallbacks.splice(e,1)}}isLoggedIn(){return null!==this.user&&null!==this.token}async refreshSession(){if(this.refreshToken)try{const t=await fetch(`${this.apiEndpoint}/api/sdk/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json","X-App-Id":this.appId},body:JSON.stringify({refreshToken:this.refreshToken})});if(!t.ok)throw new Error("Refresh failed");const e=await t.json();this.setAuth({success:!0,token:e.token,refreshToken:e.refreshToken,expiresAt:e.expiresAt,user:e.user})}catch(t){console.error("Session refresh failed:",t),this.clearAuth()}else this.clearAuth()}async fetchUser(){if(!this.token)return null;try{const t=await fetch(`${this.apiEndpoint}/api/sdk/auth/me`,{headers:this.getHeaders()});if(!t.ok){if(401===t.status)return await this.refreshSession(),this.user;throw new Error("Failed to fetch user")}const e=await t.json();return this.user=e,this.notifyAuthChange(),this.saveToStorage(),e}catch(t){return console.error("Failed to fetch user:",t),null}}setAuth(t){t.success&&t.user&&t.token&&(this.user=t.user,this.token=t.token,this.refreshToken=t.refreshToken||null,this.expiresAt=t.expiresAt?new Date(t.expiresAt):null,this.saveToStorage(),this.notifyAuthChange())}clearAuth(){this.user=null,this.token=null,this.refreshToken=null,this.expiresAt=null,localStorage.removeItem(`${e}_${this.appId}`),this.notifyAuthChange()}saveToStorage(){if(this.user&&this.token){const t={token:this.token,refreshToken:this.refreshToken||"",expiresAt:this.expiresAt?.toISOString()||"",user:this.user};localStorage.setItem(`${e}_${this.appId}`,JSON.stringify(t))}}loadFromStorage(){try{const t=localStorage.getItem(`${e}_${this.appId}`);if(t){const e=JSON.parse(t);this.token=e.token,this.refreshToken=e.refreshToken,this.expiresAt=e.expiresAt?new Date(e.expiresAt):null,this.user=e.user,this.expiresAt&&new Date>this.expiresAt&&this.refreshSession().catch(()=>this.clearAuth())}}catch(t){console.warn("Failed to load auth from storage:",t)}}notifyAuthChange(){for(const t of this.authCallbacks)try{t(this.user)}catch(t){console.error("Auth callback error:",t)}}setupMessageListener(){}getHeaders(){const t={"Content-Type":"application/json","X-App-Id":this.appId};return this.token&&(t.Authorization=`Bearer ${this.token}`),t}}class s{constructor(t,e,n){this.apiEndpoint=t,this.appId=e,this.getToken=n}async getBalance(){const t=this.getToken();if(!t)throw new Error("Not authenticated. Please login first.");const e=await fetch(`${this.apiEndpoint}/api/sdk/billing/balance`,{headers:this.getHeaders(t)});if(!e.ok){if(401===e.status)throw new Error("Session expired. Please login again.");throw new Error("Failed to fetch balance")}return(await e.json()).balance}topUp(){const t=`${this.apiEndpoint}/api/sdk/billing/topup?app_id=${this.appId}`;window.open(t,"_blank")}getHeaders(t){return{"Content-Type":"application/json","X-App-Id":this.appId,Authorization:`Bearer ${t}`}}}class i{constructor(t,e,n){this.apiEndpoint=t,this.appId=e,this.getToken=n}async charge(t){const e=this.getToken();if(!e)return{success:!1,error:"Not authenticated. Please login first."};try{const n=await fetch(`${this.apiEndpoint}/api/sdk/payment/charge`,{method:"POST",headers:this.getHeaders(e),body:JSON.stringify({amount:t.amount,description:t.description,metadata:t.metadata})});if(!n.ok){if(401===n.status)return{success:!1,error:"Session expired. Please login again."};if(402===n.status)return{success:!1,error:"Insufficient balance. Please top up."};return{success:!1,error:(await n.json().catch(()=>({}))).detail||"Payment failed"}}return await n.json()}catch(t){return{success:!1,error:t instanceof Error?t.message:"Payment failed"}}}async getTransactions(t=50,e=0){const n=this.getToken();if(!n)throw new Error("Not authenticated. Please login first.");const s=await fetch(`${this.apiEndpoint}/api/sdk/payment/transactions?limit=${t}&offset=${e}`,{headers:this.getHeaders(n)});if(!s.ok){if(401===s.status)throw new Error("Session expired. Please login again.");throw new Error("Failed to fetch transactions")}return(await s.json()).transactions}getHeaders(t){return{"Content-Type":"application/json","X-App-Id":this.appId,Authorization:`Bearer ${t}`}}}function a(t){if("string"===t)return{type:"STRING"};if("number"===t)return{type:"NUMBER"};if("boolean"===t)return{type:"BOOLEAN"};if(Array.isArray(t)){if(1!==t.length)throw new Error("Array schema must have exactly one element type");return{type:"ARRAY",items:a(t[0])}}if("object"==typeof t&&null!==t){const e={},n=[];for(const[s,i]of Object.entries(t))e[s]=a(i),n.push(s);return{type:"OBJECT",properties:e,required:n}}throw new Error(`Invalid schema type: ${t}`)}class o{constructor(t,e,n){this.apiEndpoint=t,this.appId=e,this.getToken=n}async chat(t){const e=this.getToken();if(!e)throw new Error("Not authenticated. Please login first.");const n=t.model||"fast",s={contents:this.convertMessagesToGemini(t.messages)};t.responseSchema&&(s.generationConfig={responseMimeType:"application/json",responseSchema:a(t.responseSchema)});const i=await fetch(`${this.apiEndpoint}/api/ai-gateway/v1beta/models/${n}:generateContent`,{method:"POST",headers:this.getHeaders(e),body:JSON.stringify(s)});i.ok||await this.handleError(i);const o=await i.json();return this.parseGeminiResponse(o)}async generate(t){const e=await this.chat({messages:[{role:"user",content:t.prompt}],model:t.model,responseSchema:t.responseSchema});return{text:e.content,usage:e.usage}}async chatStream(t){const e=this.getToken(),n=e?this.getHeaders(e):this.getAnonymousHeaders(),s=t.model||"fast",i={contents:this.convertMessagesToGemini(t.messages)},a=await fetch(`${this.apiEndpoint}/api/ai-gateway/v1beta/models/${s}:streamGenerateContent?alt=sse`,{method:"POST",headers:n,body:JSON.stringify(i)});a.ok||await this.handleError(a);const o=a.body?.getReader();if(!o)throw new Error("Streaming not supported");const r=new TextDecoder;let h="";try{for(;;){const{done:e,value:n}=await o.read();if(e)break;h+=r.decode(n,{stream:!0});const s=h.split("\n");h=s.pop()||"";for(const e of s)if(e.startsWith("data: ")){const n=e.slice(6).trim();if("[DONE]"===n)return void t.onChunk({content:"",done:!0});try{const e=JSON.parse(n),s=this.parseStreamChunk(e);t.onChunk(s)}catch{}}}if(h.startsWith("data: ")){const e=h.slice(6).trim();if(e&&"[DONE]"!==e)try{const n=JSON.parse(e),s=this.parseStreamChunk(n);t.onChunk(s)}catch{}}t.onChunk({content:"",done:!0})}finally{o.releaseLock()}}async generateStream(t){return this.chatStream({messages:[{role:"user",content:t.prompt}],model:t.model,onChunk:t.onChunk})}getHeaders(t){return{"Content-Type":"application/json","X-App-Id":this.appId,Authorization:`Bearer ${t}`}}getAnonymousHeaders(){return{"Content-Type":"application/json","X-App-Id":this.appId}}convertMessagesToGemini(t){return t.map(t=>({role:"assistant"===t.role?"model":"user",parts:this.convertContentToParts(t.content)}))}convertContentToParts(t){return"string"==typeof t?[{text:t}]:t.map(t=>{switch(t.type){case"text":return{text:t.text};case"image":return{inlineData:{mimeType:t.mimeType,data:t.data}};case"image_url":return{fileData:{fileUri:t.url}};default:return{text:""}}})}parseGeminiResponse(t){const e=t.candidates,n=e?.[0]?.content?.parts?.[0]?.text||"",s=t.usageMetadata;return{content:n,usage:s?{inputTokens:s.promptTokenCount||0,outputTokens:s.candidatesTokenCount||0}:void 0}}parseStreamChunk(t){const e=t.candidates,n=e?.[0]?.content?.parts?.[0]?.text||"",s=e?.[0]?.finishReason,i="STOP"===s||"END_TURN"===s,a=t.usageMetadata;return{content:n,done:i,usage:a?{inputTokens:a.promptTokenCount||0,outputTokens:a.candidatesTokenCount||0}:void 0}}async handleError(t){if(401===t.status)throw new Error("Session expired. Please login again.");if(402===t.status)throw new Error("Insufficient balance. Please top up to continue.");let e="AI request failed";try{const n=await t.json();e=n.detail||n.message||e}catch{}throw new Error(e)}}const r=new class{constructor(){this.config=null,this._auth=null,this._billing=null,this._payment=null,this._ai=null,this.initPromise=null,this.apiEndpoint=this.detectApiEndpoint(),this.autoInit()}async autoInit(){return this.initPromise||(this.initPromise=this.init()),this.initPromise}async init(){try{const t=await fetch(`${this.apiEndpoint}/api/sdk/config`,{credentials:"include"});t.ok&&(this.config=await t.json(),this.config.apiEndpoint=this.apiEndpoint,this.setupModules())}catch(t){console.warn("Nxcode SDK: Could not auto-detect app config. Call Nxcode.configure() manually.")}}configure(t,e){e?.apiEndpoint&&(this.apiEndpoint=e.apiEndpoint),this.config={appId:t,name:"",billingMode:"creator_pays",apiEndpoint:this.apiEndpoint},this.setupModules()}setupModules(){this.config&&(this._auth=new n(this.config.apiEndpoint,this.config.appId),this._billing=new s(this.config.apiEndpoint,this.config.appId,()=>this._auth?.getToken()||null),this._payment=new i(this.config.apiEndpoint,this.config.appId,()=>this._auth?.getToken()||null),this._ai=new o(this.config.apiEndpoint,this.config.appId,()=>this._auth?.getToken()||null))}detectApiEndpoint(){if("undefined"!=typeof window){const t=window.location.hostname;if("localhost"===t||"127.0.0.1"===t)return"http://localhost:8001";if(t.includes(".nxcode.dev")||t.includes(".nxcode.app"))return"https://studio-api.nxcode.io"}return"https://studio-api.nxcode.io"}async ensureInitialized(){if(this.initPromise&&await this.initPromise,!this.config)throw new Error("Nxcode SDK not configured. Add X-App-Id header or call Nxcode.configure(appId).")}get auth(){const t=this;return{login:async(e="google")=>(await t.ensureInitialized(),t._auth.login(e)),logout:async()=>(await t.ensureInitialized(),t._auth.logout()),getUser:()=>t._auth?.getUser()||null,getToken:()=>t._auth?.getToken()||null,onAuthStateChange(e){if(!t._auth){let n=null,s=!1;return t.ensureInitialized().then(()=>{!s&&t._auth&&(n=t._auth.onAuthStateChange(e))}),()=>{s=!0,n&&n()}}return t._auth.onAuthStateChange(e)},isLoggedIn:()=>t._auth?.isLoggedIn()||!1}}get billing(){const t=this;return{getBalance:async()=>(await t.ensureInitialized(),t._billing.getBalance()),topUp(){t._billing?.topUp()}}}get payment(){const t=this;return{charge:async e=>(await t.ensureInitialized(),t._payment.charge(e)),getTransactions:async(e,n)=>(await t.ensureInitialized(),t._payment.getTransactions(e,n))}}get ai(){const t=this;return{chat:async e=>(await t.ensureInitialized(),t._ai.chat(e)),generate:async e=>(await t.ensureInitialized(),t._ai.generate(e)),chatStream:async e=>(await t.ensureInitialized(),t._ai.chatStream(e)),generateStream:async e=>(await t.ensureInitialized(),t._ai.generateStream(e))}}getConfig(){return this.config}isReady(){return null!==this.config&&null!==this._auth}async ready(){await this.ensureInitialized()}};"undefined"!=typeof window&&(window.Nxcode=r),t.Nxcode=r,t.default=r,Object.defineProperty(t,"__esModule",{value:!0})});
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).Nxcode={})}(this,function(t){"use strict";const e="nxcode_sdk_auth";class n{constructor(t,e){this.user=null,this.token=null,this.refreshToken=null,this.expiresAt=null,this.authCallbacks=[],this.popupWindow=null,this.messageHandler=null,this.apiEndpoint=t,this.appId=e,this.loadFromStorage(),this.setupMessageListener()}async login(t="google"){return new Promise((e,n)=>{const s=window.screenX+(window.outerWidth-500)/2,i=window.screenY+(window.outerHeight-600)/2,o=`${this.apiEndpoint}/api/sdk/auth/login?app_id=${this.appId}&provider=${t}`;if(this.popupWindow=window.open(o,"nxcode_login",`width=500,height=600,left=${s},top=${i}`),!this.popupWindow)return void n(new Error("Failed to open login popup. Please allow popups for this site."));const a=setTimeout(()=>{this.popupWindow?.close(),n(new Error("Login timeout"))},12e4),r=t=>{if("NXCODE_SDK_AUTH"!==t.data?.type)return;clearTimeout(a),window.removeEventListener("message",r);const s=t.data.payload;s.success&&s.user&&s.token?(this.setAuth(s),e(s.user)):n(new Error(s.error||"Login failed"))};window.addEventListener("message",r)})}async logout(){try{this.token&&await fetch(`${this.apiEndpoint}/api/sdk/auth/logout`,{method:"POST",headers:this.getHeaders()})}catch(t){console.warn("Logout request failed:",t)}this.clearAuth()}getUser(){return this.user}getToken(){return this.expiresAt&&new Date>this.expiresAt?(this.refreshSession().catch(console.error),null):this.token}async getValidToken(){return this.expiresAt&&new Date>this.expiresAt&&await this.refreshSession(),this.token}onAuthStateChange(t){return this.authCallbacks.push(t),t(this.user),()=>{const e=this.authCallbacks.indexOf(t);e>-1&&this.authCallbacks.splice(e,1)}}isLoggedIn(){return null!==this.user&&null!==this.token}async refreshSession(){if(this.refreshToken)try{const t=await fetch(`${this.apiEndpoint}/api/sdk/auth/refresh`,{method:"POST",headers:{"Content-Type":"application/json","X-App-Id":this.appId},body:JSON.stringify({refreshToken:this.refreshToken})});if(!t.ok)throw new Error("Refresh failed");const e=await t.json();this.setAuth({success:!0,token:e.token,refreshToken:e.refreshToken,expiresAt:e.expiresAt,user:e.user})}catch(t){console.error("Session refresh failed:",t),this.clearAuth()}else this.clearAuth()}async fetchUser(){if(!this.token)return null;try{const t=await fetch(`${this.apiEndpoint}/api/sdk/auth/me`,{headers:this.getHeaders()});if(!t.ok){if(401===t.status)return await this.refreshSession(),this.user;throw new Error("Failed to fetch user")}const e=await t.json();return this.user=e,this.notifyAuthChange(),this.saveToStorage(),e}catch(t){return console.error("Failed to fetch user:",t),null}}setAuth(t){t.success&&t.user&&t.token&&(this.user=t.user,this.token=t.token,this.refreshToken=t.refreshToken||null,this.expiresAt=t.expiresAt?new Date(t.expiresAt):null,this.saveToStorage(),this.notifyAuthChange())}clearAuth(){this.user=null,this.token=null,this.refreshToken=null,this.expiresAt=null,localStorage.removeItem(`${e}_${this.appId}`),this.notifyAuthChange()}saveToStorage(){if(this.user&&this.token){const t={token:this.token,refreshToken:this.refreshToken||"",expiresAt:this.expiresAt?.toISOString()||"",user:this.user};localStorage.setItem(`${e}_${this.appId}`,JSON.stringify(t))}}loadFromStorage(){try{const t=localStorage.getItem(`${e}_${this.appId}`);if(t){const e=JSON.parse(t);this.token=e.token,this.refreshToken=e.refreshToken,this.expiresAt=e.expiresAt?new Date(e.expiresAt):null,this.user=e.user,this.expiresAt&&new Date>this.expiresAt&&this.refreshSession().catch(()=>this.clearAuth())}}catch(t){console.warn("Failed to load auth from storage:",t)}}notifyAuthChange(){for(const t of this.authCallbacks)try{t(this.user)}catch(t){console.error("Auth callback error:",t)}}setupMessageListener(){}getHeaders(){const t={"Content-Type":"application/json","X-App-Id":this.appId};return this.token&&(t.Authorization=`Bearer ${this.token}`),t}}class s{constructor(t,e,n){this.apiEndpoint=t,this.appId=e,this.getToken=n}async getBalance(){const t=this.getToken();if(!t)throw new Error("Not authenticated. Please login first.");const e=await fetch(`${this.apiEndpoint}/api/sdk/billing/balance`,{headers:this.getHeaders(t)});if(!e.ok){if(401===e.status)throw new Error("Session expired. Please login again.");throw new Error("Failed to fetch balance")}return(await e.json()).balance}topUp(){const t=`${this.apiEndpoint}/api/sdk/billing/topup?app_id=${this.appId}`;window.open(t,"_blank")}getHeaders(t){return{"Content-Type":"application/json","X-App-Id":this.appId,Authorization:`Bearer ${t}`}}}class i{constructor(t,e,n){this.apiEndpoint=t,this.appId=e,this.getToken=n}async charge(t){const e=this.getToken();if(!e)return{success:!1,error:"Not authenticated. Please login first."};try{const n=await fetch(`${this.apiEndpoint}/api/sdk/payment/charge`,{method:"POST",headers:this.getHeaders(e),body:JSON.stringify({amount:t.amount,description:t.description,metadata:t.metadata})});if(!n.ok){if(401===n.status)return{success:!1,error:"Session expired. Please login again."};if(402===n.status)return{success:!1,error:"Insufficient balance. Please top up."};return{success:!1,error:(await n.json().catch(()=>({}))).detail||"Payment failed"}}return await n.json()}catch(t){return{success:!1,error:t instanceof Error?t.message:"Payment failed"}}}async getTransactions(t=50,e=0){const n=this.getToken();if(!n)throw new Error("Not authenticated. Please login first.");const s=await fetch(`${this.apiEndpoint}/api/sdk/payment/transactions?limit=${t}&offset=${e}`,{headers:this.getHeaders(n)});if(!s.ok){if(401===s.status)throw new Error("Session expired. Please login again.");throw new Error("Failed to fetch transactions")}return(await s.json()).transactions}getHeaders(t){return{"Content-Type":"application/json","X-App-Id":this.appId,Authorization:`Bearer ${t}`}}}function o(t){if("string"===t)return{type:"STRING"};if("number"===t)return{type:"NUMBER"};if("boolean"===t)return{type:"BOOLEAN"};if(Array.isArray(t)){if(1!==t.length)throw new Error("Array schema must have exactly one element type");return{type:"ARRAY",items:o(t[0])}}if("object"==typeof t&&null!==t){const e={},n=[];for(const[s,i]of Object.entries(t))e[s]=o(i),n.push(s);return{type:"OBJECT",properties:e,required:n}}throw new Error(`Invalid schema type: ${t}`)}class a{constructor(t,e,n){this.apiEndpoint=t,this.appId=e,this.getToken=n}async chat(t){const e=this.getToken(),n=e?this.getHeaders(e):this.getAnonymousHeaders(),s=t.model||"fast",i={contents:this.convertMessagesToGemini(t.messages)};t.responseSchema&&(i.generationConfig={responseMimeType:"application/json",responseSchema:o(t.responseSchema)});const a=await fetch(`${this.apiEndpoint}/api/ai-gateway/v1beta/models/${s}:generateContent`,{method:"POST",headers:n,body:JSON.stringify(i)});a.ok||await this.handleError(a);const r=await a.json();return this.parseGeminiResponse(r)}async generate(t){const e=await this.chat({messages:[{role:"user",content:t.prompt}],model:t.model,responseSchema:t.responseSchema});return{text:e.content,usage:e.usage}}async chatStream(t){const e=this.getToken(),n=e?this.getHeaders(e):this.getAnonymousHeaders(),s=t.model||"fast",i={contents:this.convertMessagesToGemini(t.messages)},o=await fetch(`${this.apiEndpoint}/api/ai-gateway/v1beta/models/${s}:streamGenerateContent?alt=sse`,{method:"POST",headers:n,body:JSON.stringify(i)});o.ok||await this.handleError(o);const a=o.body?.getReader();if(!a)throw new Error("Streaming not supported");const r=new TextDecoder;let h="";try{for(;;){const{done:e,value:n}=await a.read();if(e)break;h+=r.decode(n,{stream:!0});const s=h.split("\n");h=s.pop()||"";for(const e of s)if(e.startsWith("data: ")){const n=e.slice(6).trim();if("[DONE]"===n)return void t.onChunk({content:"",done:!0});try{const e=JSON.parse(n),s=this.parseStreamChunk(e);t.onChunk(s)}catch{}}}if(h.startsWith("data: ")){const e=h.slice(6).trim();if(e&&"[DONE]"!==e)try{const n=JSON.parse(e),s=this.parseStreamChunk(n);t.onChunk(s)}catch{}}t.onChunk({content:"",done:!0})}finally{a.releaseLock()}}async generateStream(t){return this.chatStream({messages:[{role:"user",content:t.prompt}],model:t.model,onChunk:t.onChunk})}getHeaders(t){return{"Content-Type":"application/json","X-App-Id":this.appId,Authorization:`Bearer ${t}`}}getAnonymousHeaders(){return{"Content-Type":"application/json","X-App-Id":this.appId}}convertMessagesToGemini(t){return t.map(t=>({role:"assistant"===t.role?"model":"user",parts:this.convertContentToParts(t.content)}))}convertContentToParts(t){return"string"==typeof t?[{text:t}]:t.map(t=>{switch(t.type){case"text":return{text:t.text};case"image":return{inlineData:{mimeType:t.mimeType,data:t.data}};case"image_url":return{fileData:{fileUri:t.url}};default:return{text:""}}})}parseGeminiResponse(t){const e=t.candidates,n=e?.[0]?.content?.parts?.[0]?.text||"",s=t.usageMetadata;return{content:n,usage:s?{inputTokens:s.promptTokenCount||0,outputTokens:s.candidatesTokenCount||0}:void 0}}parseStreamChunk(t){const e=t.candidates,n=e?.[0]?.content?.parts?.[0]?.text||"",s=e?.[0]?.finishReason,i="STOP"===s||"END_TURN"===s,o=t.usageMetadata;return{content:n,done:i,usage:o?{inputTokens:o.promptTokenCount||0,outputTokens:o.candidatesTokenCount||0}:void 0}}async handleError(t){let e="AI request failed";try{const n=await t.json();e=n.detail||n.message||e}catch{401===t.status?e="Session expired. Please login again.":402===t.status&&(e="Insufficient balance. Please top up to continue.")}throw new Error(e)}}function r(t){if("string"===t)return{type:"STRING"};if("number"===t)return{type:"NUMBER"};if("boolean"===t)return{type:"BOOLEAN"};if(Array.isArray(t))return{type:"ARRAY",items:r(t[0])};if("object"==typeof t){const e={},n=[];for(const[s,i]of Object.entries(t))e[s]=r(i),n.push(s);return{type:"OBJECT",properties:e,required:n}}return{type:"STRING"}}function h(t){const e={name:t.name,description:t.description},n={},s=[];if(t.parameters)for(const[e,i]of Object.entries(t.parameters))n[e]=r(i),s.push(e);return e.parameters={type:"OBJECT",properties:n,required:s},e}class p{constructor(t,e,n,s){this.history=[],this.options={instructions:t.instructions,tools:t.tools,model:t.model||"fast",maxSteps:t.maxSteps||10},this.apiEndpoint=e,this.appId=n,this.getToken=s}async run(t,e){const n=this.getToken();if(!n)throw new Error("Not authenticated. Please login first.");this.history.push({role:"user",content:t});const s=[];let i=0,o=0,a=0;for(;a<this.options.maxSteps;){a++;const t=await this.callGemini(n);i+=t.usage?.inputTokens||0,o+=t.usage?.outputTokens||0;const r=t.functionCall;if(r){e?.onToolCall?.(r.name,r.args);const i=this.options.tools.find(t=>t.name===r.name);if(!i)throw new Error(`Unknown tool: ${r.name}`);const o=await this.callTool(i,r.args,n);e?.onToolResult?.(r.name,o),s.push({name:r.name,params:r.args,result:o}),this.history.push({role:"model",content:"",parts:t.rawParts||[{functionCall:{name:r.name,args:r.args}}]}),this.history.push({role:"user",content:"",parts:[{functionResponse:{name:r.name,response:o}}]});continue}const h=t.text||"";return this.history.push({role:"assistant",content:h}),{output:h,toolCalls:s,usage:{inputTokens:i,outputTokens:o}}}throw new Error(`Agent exceeded maximum steps (${this.options.maxSteps})`)}reset(){this.history=[]}getHistory(){return[...this.history]}async callGemini(t){const e={contents:this.history.map(t=>t.parts?{role:"assistant"===t.role?"model":t.role,parts:t.parts}:{role:"assistant"===t.role?"model":"user",parts:[{text:t.content}]}),tools:[{functionDeclarations:this.options.tools.map(h)}],toolConfig:{functionCallingConfig:{mode:"AUTO"}},systemInstruction:{parts:[{text:this.options.instructions}]}},n=await fetch(`${this.apiEndpoint}/api/ai-gateway/v1beta/models/${this.options.model}:generateContent`,{method:"POST",headers:{"Content-Type":"application/json","X-App-Id":this.appId,Authorization:`Bearer ${t}`},body:JSON.stringify(e)});if(!n.ok){const t=await n.json().catch(()=>({}));throw new Error(t.detail||t.message||"Agent API call failed")}const s=await n.json(),i=s.candidates?.[0],o=i?.content?.parts||[];for(const t of o){const e=t.functionCall||t.function_call;if(e)return{functionCall:{name:e.name,args:e.args||{}},rawParts:o,usage:{inputTokens:s.usageMetadata?.promptTokenCount||0,outputTokens:s.usageMetadata?.candidatesTokenCount||0}}}return{text:o.find(t=>t.text)?.text||"",usage:{inputTokens:s.usageMetadata?.promptTokenCount||0,outputTokens:s.usageMetadata?.candidatesTokenCount||0}}}async callTool(t,e,n){const s={...e,_context:{agentId:this.options.instructions.slice(0,20),stepIndex:this.history.length,previousTools:this.history.filter(t=>t.parts?.some(t=>t.functionResponse)).map(t=>{const e=t.parts?.find(t=>t.functionResponse)?.functionResponse;return e?{name:e.name,result:e.response}:null}).filter(Boolean)}},i=await fetch(t.endpoint,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${n}`},body:JSON.stringify(s)});if(!i.ok){return{error:`Tool call failed: ${await i.text()}`}}return i.json()}}const c=new class{constructor(){this.config=null,this._auth=null,this._billing=null,this._payment=null,this._ai=null,this.initPromise=null,this.apiEndpoint=this.detectApiEndpoint(),this.autoInit()}async autoInit(){return this.initPromise||(this.initPromise=this.init()),this.initPromise}async init(){try{const t=await fetch(`${this.apiEndpoint}/api/sdk/config`,{credentials:"include"});t.ok&&(this.config=await t.json(),this.config.apiEndpoint=this.apiEndpoint,this.setupModules())}catch(t){console.warn("Nxcode SDK: Could not auto-detect app config. Call Nxcode.configure() manually.")}}configure(t,e){e?.apiEndpoint&&(this.apiEndpoint=e.apiEndpoint),this.config={appId:t,name:"",billingMode:"creator_pays",apiEndpoint:this.apiEndpoint},this.setupModules()}setupModules(){this.config&&(this._auth=new n(this.config.apiEndpoint,this.config.appId),this._billing=new s(this.config.apiEndpoint,this.config.appId,()=>this._auth?.getToken()||null),this._payment=new i(this.config.apiEndpoint,this.config.appId,()=>this._auth?.getToken()||null),this._ai=new a(this.config.apiEndpoint,this.config.appId,()=>this._auth?.getToken()||null))}detectApiEndpoint(){if("undefined"!=typeof window){const t=window.location.hostname;if("localhost"===t||"127.0.0.1"===t)return"http://localhost:8001";if(t.includes(".nxcode.dev")||t.includes(".nxcode.app"))return"https://studio-api.nxcode.io"}return"https://studio-api.nxcode.io"}async ensureInitialized(){if(this.initPromise&&await this.initPromise,!this.config)throw new Error("Nxcode SDK not configured. Add X-App-Id header or call Nxcode.configure(appId).")}get auth(){const t=this;return{login:async(e="google")=>(await t.ensureInitialized(),t._auth.login(e)),logout:async()=>(await t.ensureInitialized(),t._auth.logout()),getUser:()=>t._auth?.getUser()||null,getToken:()=>t._auth?.getToken()||null,onAuthStateChange(e){if(!t._auth){let n=null,s=!1;return t.ensureInitialized().then(()=>{!s&&t._auth&&(n=t._auth.onAuthStateChange(e))}),()=>{s=!0,n&&n()}}return t._auth.onAuthStateChange(e)},isLoggedIn:()=>t._auth?.isLoggedIn()||!1}}get billing(){const t=this;return{getBalance:async()=>(await t.ensureInitialized(),t._billing.getBalance()),topUp(){t._billing?.topUp()}}}get payment(){const t=this;return{charge:async e=>(await t.ensureInitialized(),t._payment.charge(e)),getTransactions:async(e,n)=>(await t.ensureInitialized(),t._payment.getTransactions(e,n))}}get ai(){const t=this;return{chat:async e=>(await t.ensureInitialized(),t._ai.chat(e)),generate:async e=>(await t.ensureInitialized(),t._ai.generate(e)),chatStream:async e=>(await t.ensureInitialized(),t._ai.chatStream(e)),generateStream:async e=>(await t.ensureInitialized(),t._ai.generateStream(e)),createAgent(e){if(!t.config)throw new Error("Nxcode SDK not configured. Call Nxcode.configure(appId) first.");return new p(e,t.apiEndpoint,t.config.appId,()=>t._auth?.getToken()||null)}}}getConfig(){return this.config}isReady(){return null!==this.config&&null!==this._auth}async ready(){await this.ensureInitialized()}};"undefined"!=typeof window&&(window.Nxcode=c),t.Agent=p,t.Nxcode=c,t.default=c,Object.defineProperty(t,"__esModule",{value:!0})});
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nxcode SDK - Agent Module
|
|
3
|
+
*
|
|
4
|
+
* Provides AI agents with tool calling capabilities.
|
|
5
|
+
* Agents can call backend endpoints as tools and maintain conversation history.
|
|
6
|
+
*/
|
|
7
|
+
import { SimpleSchema } from './ai';
|
|
8
|
+
/**
|
|
9
|
+
* Tool definition for an agent
|
|
10
|
+
*/
|
|
11
|
+
export interface AgentTool {
|
|
12
|
+
/** Unique name for the tool */
|
|
13
|
+
name: string;
|
|
14
|
+
/** Description of what the tool does (shown to AI) */
|
|
15
|
+
description: string;
|
|
16
|
+
/** Parameter schema using simplified syntax */
|
|
17
|
+
parameters?: {
|
|
18
|
+
[key: string]: SimpleSchema;
|
|
19
|
+
};
|
|
20
|
+
/** Backend endpoint to call (POST request) */
|
|
21
|
+
endpoint: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Options for creating an agent
|
|
25
|
+
*/
|
|
26
|
+
export interface AgentOptions {
|
|
27
|
+
/** System instructions for the agent */
|
|
28
|
+
instructions: string;
|
|
29
|
+
/** Available tools */
|
|
30
|
+
tools: AgentTool[];
|
|
31
|
+
/** Model to use (default: 'fast') */
|
|
32
|
+
model?: string;
|
|
33
|
+
/** Maximum tool call steps per run (default: 10) */
|
|
34
|
+
maxSteps?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Callbacks for agent.run()
|
|
38
|
+
*/
|
|
39
|
+
export interface AgentRunCallbacks {
|
|
40
|
+
/** Called when agent decides to call a tool */
|
|
41
|
+
onToolCall?: (name: string, params: Record<string, unknown>) => void;
|
|
42
|
+
/** Called when tool returns a result */
|
|
43
|
+
onToolResult?: (name: string, result: unknown) => void;
|
|
44
|
+
/** Called on each step with thinking/reasoning */
|
|
45
|
+
onThinking?: (thought: string) => void;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Result of agent.run()
|
|
49
|
+
*/
|
|
50
|
+
export interface AgentResult {
|
|
51
|
+
/** Final output text from the agent */
|
|
52
|
+
output: string;
|
|
53
|
+
/** Tool calls made during this run */
|
|
54
|
+
toolCalls: Array<{
|
|
55
|
+
name: string;
|
|
56
|
+
params: Record<string, unknown>;
|
|
57
|
+
result: unknown;
|
|
58
|
+
}>;
|
|
59
|
+
/** Total token usage */
|
|
60
|
+
usage?: {
|
|
61
|
+
inputTokens: number;
|
|
62
|
+
outputTokens: number;
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
interface ChatMessage {
|
|
66
|
+
role: 'user' | 'assistant' | 'system' | 'model';
|
|
67
|
+
content: string;
|
|
68
|
+
parts?: Array<{
|
|
69
|
+
text?: string;
|
|
70
|
+
functionCall?: {
|
|
71
|
+
name: string;
|
|
72
|
+
args: Record<string, unknown>;
|
|
73
|
+
};
|
|
74
|
+
functionResponse?: {
|
|
75
|
+
name: string;
|
|
76
|
+
response: unknown;
|
|
77
|
+
};
|
|
78
|
+
}>;
|
|
79
|
+
}
|
|
80
|
+
export declare class Agent {
|
|
81
|
+
private options;
|
|
82
|
+
private history;
|
|
83
|
+
private apiEndpoint;
|
|
84
|
+
private appId;
|
|
85
|
+
private getToken;
|
|
86
|
+
constructor(options: AgentOptions, apiEndpoint: string, appId: string, getToken: () => string | null);
|
|
87
|
+
/**
|
|
88
|
+
* Run the agent with user input
|
|
89
|
+
*/
|
|
90
|
+
run(input: string, callbacks?: AgentRunCallbacks): Promise<AgentResult>;
|
|
91
|
+
/**
|
|
92
|
+
* Clear conversation history
|
|
93
|
+
*/
|
|
94
|
+
reset(): void;
|
|
95
|
+
/**
|
|
96
|
+
* Get current conversation history
|
|
97
|
+
*/
|
|
98
|
+
getHistory(): ChatMessage[];
|
|
99
|
+
private callGemini;
|
|
100
|
+
private callTool;
|
|
101
|
+
}
|
|
102
|
+
export {};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -11,7 +11,8 @@
|
|
|
11
11
|
* console.log('Logged in:', user.email);
|
|
12
12
|
* </script>
|
|
13
13
|
*/
|
|
14
|
-
import { type ChatOptions, type ChatResponse, type GenerateOptions, type GenerateResponse, type StreamChunk, type StreamCallback, type ChatMessage, type ContentPart, type TextPart, type ImagePart, type ImageUrlPart } from './ai';
|
|
14
|
+
import { type ChatOptions, type ChatResponse, type GenerateOptions, type GenerateResponse, type StreamChunk, type StreamCallback, type ChatMessage, type ContentPart, type TextPart, type ImagePart, type ImageUrlPart, type SimpleSchema } from './ai';
|
|
15
|
+
import { Agent, type AgentTool, type AgentOptions, type AgentRunCallbacks, type AgentResult } from './agent';
|
|
15
16
|
import type { NxcodeUser, NxcodeConfig, ChargeOptions, ChargeResult, Transaction, AuthStateCallback } from './types';
|
|
16
17
|
declare class NxcodeSDK {
|
|
17
18
|
private config;
|
|
@@ -138,6 +139,32 @@ declare class NxcodeSDK {
|
|
|
138
139
|
generateStream(options: GenerateOptions & {
|
|
139
140
|
onChunk: StreamCallback;
|
|
140
141
|
}): Promise<void>;
|
|
142
|
+
/**
|
|
143
|
+
* Create an AI agent with tool calling capabilities
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* const agent = Nxcode.ai.createAgent({
|
|
147
|
+
* instructions: 'You are a helpful assistant that can search and send emails.',
|
|
148
|
+
* tools: [
|
|
149
|
+
* {
|
|
150
|
+
* name: 'search_emails',
|
|
151
|
+
* description: 'Search user emails',
|
|
152
|
+
* parameters: { query: 'string' },
|
|
153
|
+
* endpoint: '/api/emails/search'
|
|
154
|
+
* },
|
|
155
|
+
* {
|
|
156
|
+
* name: 'send_email',
|
|
157
|
+
* description: 'Send an email',
|
|
158
|
+
* parameters: { to: 'string', subject: 'string', body: 'string' },
|
|
159
|
+
* endpoint: '/api/emails/send'
|
|
160
|
+
* }
|
|
161
|
+
* ]
|
|
162
|
+
* });
|
|
163
|
+
*
|
|
164
|
+
* const result = await agent.run('Find emails from John and reply to him');
|
|
165
|
+
* console.log(result.output);
|
|
166
|
+
*/
|
|
167
|
+
createAgent(options: AgentOptions): Agent;
|
|
141
168
|
};
|
|
142
169
|
/**
|
|
143
170
|
* Get current configuration
|
|
@@ -155,4 +182,5 @@ declare class NxcodeSDK {
|
|
|
155
182
|
declare const Nxcode: NxcodeSDK;
|
|
156
183
|
export default Nxcode;
|
|
157
184
|
export { Nxcode };
|
|
158
|
-
export type { NxcodeUser, NxcodeConfig, ChargeOptions, ChargeResult, Transaction, AuthStateCallback, ChatOptions, ChatResponse, ChatMessage, ContentPart, TextPart, ImagePart, ImageUrlPart, GenerateOptions, GenerateResponse, StreamChunk, StreamCallback, };
|
|
185
|
+
export type { NxcodeUser, NxcodeConfig, ChargeOptions, ChargeResult, Transaction, AuthStateCallback, ChatOptions, ChatResponse, ChatMessage, ContentPart, TextPart, ImagePart, ImageUrlPart, GenerateOptions, GenerateResponse, StreamChunk, StreamCallback, SimpleSchema, AgentTool, AgentOptions, AgentRunCallbacks, AgentResult, };
|
|
186
|
+
export { Agent };
|