@volkansuner/aichat-react-native 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +528 -0
  3. package/dist/AIChatSDK.d.ts +75 -0
  4. package/dist/AIChatSDK.d.ts.map +1 -0
  5. package/dist/AIChatSDK.js +357 -0
  6. package/dist/AIChatSDK.js.map +1 -0
  7. package/dist/components/AIChatProvider.d.ts +25 -0
  8. package/dist/components/AIChatProvider.d.ts.map +1 -0
  9. package/dist/components/AIChatProvider.js +93 -0
  10. package/dist/components/AIChatProvider.js.map +1 -0
  11. package/dist/components/AIChatWidget.d.ts +62 -0
  12. package/dist/components/AIChatWidget.d.ts.map +1 -0
  13. package/dist/components/AIChatWidget.handlers.d.ts +15 -0
  14. package/dist/components/AIChatWidget.handlers.d.ts.map +1 -0
  15. package/dist/components/AIChatWidget.handlers.js +180 -0
  16. package/dist/components/AIChatWidget.handlers.js.map +1 -0
  17. package/dist/components/AIChatWidget.js +403 -0
  18. package/dist/components/AIChatWidget.js.map +1 -0
  19. package/dist/components/AIChatWidget.styles.d.ts +17 -0
  20. package/dist/components/AIChatWidget.styles.d.ts.map +1 -0
  21. package/dist/components/AIChatWidget.styles.js +68 -0
  22. package/dist/components/AIChatWidget.styles.js.map +1 -0
  23. package/dist/components/AIChatWidget.types.d.ts +250 -0
  24. package/dist/components/AIChatWidget.types.d.ts.map +1 -0
  25. package/dist/components/AIChatWidget.types.js +3 -0
  26. package/dist/components/AIChatWidget.types.js.map +1 -0
  27. package/dist/components/AIChatWidget.utils.d.ts +12 -0
  28. package/dist/components/AIChatWidget.utils.d.ts.map +1 -0
  29. package/dist/components/AIChatWidget.utils.js +109 -0
  30. package/dist/components/AIChatWidget.utils.js.map +1 -0
  31. package/dist/components/ConfigError.d.ts +33 -0
  32. package/dist/components/ConfigError.d.ts.map +1 -0
  33. package/dist/components/ConfigError.js +195 -0
  34. package/dist/components/ConfigError.js.map +1 -0
  35. package/dist/components/FloatingButton.d.ts +12 -0
  36. package/dist/components/FloatingButton.d.ts.map +1 -0
  37. package/dist/components/FloatingButton.js +163 -0
  38. package/dist/components/FloatingButton.js.map +1 -0
  39. package/dist/components/InputArea.d.ts +58 -0
  40. package/dist/components/InputArea.d.ts.map +1 -0
  41. package/dist/components/InputArea.js +135 -0
  42. package/dist/components/InputArea.js.map +1 -0
  43. package/dist/components/MarkdownText.d.ts +16 -0
  44. package/dist/components/MarkdownText.d.ts.map +1 -0
  45. package/dist/components/MarkdownText.js +263 -0
  46. package/dist/components/MarkdownText.js.map +1 -0
  47. package/dist/components/MessageBubble.d.ts +101 -0
  48. package/dist/components/MessageBubble.d.ts.map +1 -0
  49. package/dist/components/MessageBubble.js +377 -0
  50. package/dist/components/MessageBubble.js.map +1 -0
  51. package/dist/components/NavigationSuggestion.d.ts +13 -0
  52. package/dist/components/NavigationSuggestion.d.ts.map +1 -0
  53. package/dist/components/NavigationSuggestion.js +117 -0
  54. package/dist/components/NavigationSuggestion.js.map +1 -0
  55. package/dist/components/QuickReplies.d.ts +15 -0
  56. package/dist/components/QuickReplies.d.ts.map +1 -0
  57. package/dist/components/QuickReplies.js +49 -0
  58. package/dist/components/QuickReplies.js.map +1 -0
  59. package/dist/components/TemplateRenderer.d.ts +17 -0
  60. package/dist/components/TemplateRenderer.d.ts.map +1 -0
  61. package/dist/components/TemplateRenderer.js +397 -0
  62. package/dist/components/TemplateRenderer.js.map +1 -0
  63. package/dist/components/TypingIndicator.d.ts +29 -0
  64. package/dist/components/TypingIndicator.d.ts.map +1 -0
  65. package/dist/components/TypingIndicator.js +110 -0
  66. package/dist/components/TypingIndicator.js.map +1 -0
  67. package/dist/components/defaults/DefaultCard.d.ts +15 -0
  68. package/dist/components/defaults/DefaultCard.d.ts.map +1 -0
  69. package/dist/components/defaults/DefaultCard.js +157 -0
  70. package/dist/components/defaults/DefaultCard.js.map +1 -0
  71. package/dist/components/defaults/DefaultDetail.d.ts +15 -0
  72. package/dist/components/defaults/DefaultDetail.d.ts.map +1 -0
  73. package/dist/components/defaults/DefaultDetail.js +139 -0
  74. package/dist/components/defaults/DefaultDetail.js.map +1 -0
  75. package/dist/components/defaults/DefaultList.d.ts +13 -0
  76. package/dist/components/defaults/DefaultList.d.ts.map +1 -0
  77. package/dist/components/defaults/DefaultList.js +99 -0
  78. package/dist/components/defaults/DefaultList.js.map +1 -0
  79. package/dist/components/defaults/DefaultTable.d.ts +15 -0
  80. package/dist/components/defaults/DefaultTable.d.ts.map +1 -0
  81. package/dist/components/defaults/DefaultTable.js +205 -0
  82. package/dist/components/defaults/DefaultTable.js.map +1 -0
  83. package/dist/components/defaults/index.d.ts +15 -0
  84. package/dist/components/defaults/index.d.ts.map +1 -0
  85. package/dist/components/defaults/index.js +26 -0
  86. package/dist/components/defaults/index.js.map +1 -0
  87. package/dist/components/index.d.ts +17 -0
  88. package/dist/components/index.d.ts.map +1 -0
  89. package/dist/components/index.js +33 -0
  90. package/dist/components/index.js.map +1 -0
  91. package/dist/constants.d.ts +41 -0
  92. package/dist/constants.d.ts.map +1 -0
  93. package/dist/constants.js +52 -0
  94. package/dist/constants.js.map +1 -0
  95. package/dist/hooks/useAIChatConfig.d.ts +61 -0
  96. package/dist/hooks/useAIChatConfig.d.ts.map +1 -0
  97. package/dist/hooks/useAIChatConfig.js +95 -0
  98. package/dist/hooks/useAIChatConfig.js.map +1 -0
  99. package/dist/hooks/useChatMessages.d.ts +27 -0
  100. package/dist/hooks/useChatMessages.d.ts.map +1 -0
  101. package/dist/hooks/useChatMessages.js +255 -0
  102. package/dist/hooks/useChatMessages.js.map +1 -0
  103. package/dist/hooks/useContextManager.d.ts +13 -0
  104. package/dist/hooks/useContextManager.d.ts.map +1 -0
  105. package/dist/hooks/useContextManager.js +42 -0
  106. package/dist/hooks/useContextManager.js.map +1 -0
  107. package/dist/hooks/useSDK.d.ts +18 -0
  108. package/dist/hooks/useSDK.d.ts.map +1 -0
  109. package/dist/hooks/useSDK.js +64 -0
  110. package/dist/hooks/useSDK.js.map +1 -0
  111. package/dist/index.d.ts +15 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +46 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/registry/TemplateRegistry.d.ts +48 -0
  116. package/dist/registry/TemplateRegistry.d.ts.map +1 -0
  117. package/dist/registry/TemplateRegistry.js +77 -0
  118. package/dist/registry/TemplateRegistry.js.map +1 -0
  119. package/dist/registry/index.d.ts +5 -0
  120. package/dist/registry/index.d.ts.map +1 -0
  121. package/dist/registry/index.js +9 -0
  122. package/dist/registry/index.js.map +1 -0
  123. package/dist/services/BackendService.d.ts +47 -0
  124. package/dist/services/BackendService.d.ts.map +1 -0
  125. package/dist/services/BackendService.js +362 -0
  126. package/dist/services/BackendService.js.map +1 -0
  127. package/dist/services/ConversationManager.d.ts +40 -0
  128. package/dist/services/ConversationManager.d.ts.map +1 -0
  129. package/dist/services/ConversationManager.js +95 -0
  130. package/dist/services/ConversationManager.js.map +1 -0
  131. package/dist/services/LocalAIClassifier.d.ts +32 -0
  132. package/dist/services/LocalAIClassifier.d.ts.map +1 -0
  133. package/dist/services/LocalAIClassifier.js +149 -0
  134. package/dist/services/LocalAIClassifier.js.map +1 -0
  135. package/dist/services/NavigationHandler.d.ts +30 -0
  136. package/dist/services/NavigationHandler.d.ts.map +1 -0
  137. package/dist/services/NavigationHandler.js +74 -0
  138. package/dist/services/NavigationHandler.js.map +1 -0
  139. package/dist/themes/dark.d.ts +6 -0
  140. package/dist/themes/dark.d.ts.map +1 -0
  141. package/dist/themes/dark.js +130 -0
  142. package/dist/themes/dark.js.map +1 -0
  143. package/dist/themes/index.d.ts +13 -0
  144. package/dist/themes/index.d.ts.map +1 -0
  145. package/dist/themes/index.js +34 -0
  146. package/dist/themes/index.js.map +1 -0
  147. package/dist/themes/light.d.ts +6 -0
  148. package/dist/themes/light.d.ts.map +1 -0
  149. package/dist/themes/light.js +130 -0
  150. package/dist/themes/light.js.map +1 -0
  151. package/dist/themes/types.d.ts +143 -0
  152. package/dist/themes/types.d.ts.map +1 -0
  153. package/dist/themes/types.js +6 -0
  154. package/dist/themes/types.js.map +1 -0
  155. package/dist/types/api.d.ts +118 -0
  156. package/dist/types/api.d.ts.map +1 -0
  157. package/dist/types/api.js +6 -0
  158. package/dist/types/api.js.map +1 -0
  159. package/dist/types/chat.d.ts +154 -0
  160. package/dist/types/chat.d.ts.map +1 -0
  161. package/dist/types/chat.js +6 -0
  162. package/dist/types/chat.js.map +1 -0
  163. package/dist/types/components.d.ts +69 -0
  164. package/dist/types/components.d.ts.map +1 -0
  165. package/dist/types/components.js +17 -0
  166. package/dist/types/components.js.map +1 -0
  167. package/dist/types/config.d.ts +122 -0
  168. package/dist/types/config.d.ts.map +1 -0
  169. package/dist/types/config.js +18 -0
  170. package/dist/types/config.js.map +1 -0
  171. package/dist/types/document.d.ts +108 -0
  172. package/dist/types/document.d.ts.map +1 -0
  173. package/dist/types/document.js +7 -0
  174. package/dist/types/document.js.map +1 -0
  175. package/dist/types/index.d.ts +14 -0
  176. package/dist/types/index.d.ts.map +1 -0
  177. package/dist/types/index.js +31 -0
  178. package/dist/types/index.js.map +1 -0
  179. package/dist/types/local-ai.d.ts +48 -0
  180. package/dist/types/local-ai.d.ts.map +1 -0
  181. package/dist/types/local-ai.js +17 -0
  182. package/dist/types/local-ai.js.map +1 -0
  183. package/dist/types/navigation.d.ts +89 -0
  184. package/dist/types/navigation.d.ts.map +1 -0
  185. package/dist/types/navigation.js +6 -0
  186. package/dist/types/navigation.js.map +1 -0
  187. package/dist/types/sdk.d.ts +47 -0
  188. package/dist/types/sdk.d.ts.map +1 -0
  189. package/dist/types/sdk.js +6 -0
  190. package/dist/types/sdk.js.map +1 -0
  191. package/dist/types/template.d.ts +220 -0
  192. package/dist/types/template.d.ts.map +1 -0
  193. package/dist/types/template.js +8 -0
  194. package/dist/types/template.js.map +1 -0
  195. package/dist/utils/configLoader.d.ts +69 -0
  196. package/dist/utils/configLoader.d.ts.map +1 -0
  197. package/dist/utils/configLoader.js +278 -0
  198. package/dist/utils/configLoader.js.map +1 -0
  199. package/dist/utils/deepMerge.d.ts +47 -0
  200. package/dist/utils/deepMerge.d.ts.map +1 -0
  201. package/dist/utils/deepMerge.js +71 -0
  202. package/dist/utils/deepMerge.js.map +1 -0
  203. package/package.json +65 -0
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ /**
3
+ * Registry exports
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TemplateRegistry = void 0;
7
+ var TemplateRegistry_1 = require("./TemplateRegistry");
8
+ Object.defineProperty(exports, "TemplateRegistry", { enumerable: true, get: function () { return TemplateRegistry_1.TemplateRegistry; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/registry/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,uDAAsD;AAA7C,oHAAA,gBAAgB,OAAA"}
@@ -0,0 +1,47 @@
1
+ import { ChatResponse } from '../types';
2
+ /**
3
+ * Backend API Service using native fetch
4
+ */
5
+ export declare class BackendService {
6
+ private baseURL;
7
+ private apiKey;
8
+ private timeout;
9
+ private bundleId;
10
+ private appVersion;
11
+ private deviceModel;
12
+ constructor(apiKey: string, apiUrl?: string);
13
+ /**
14
+ * Initialize device information for security headers
15
+ */
16
+ private initDeviceInfo;
17
+ /**
18
+ * Get security headers for API requests
19
+ */
20
+ private getSecurityHeaders;
21
+ /**
22
+ * Make HTTP request with timeout
23
+ */
24
+ private fetchWithTimeout;
25
+ /**
26
+ * Handle response errors with detailed messages
27
+ */
28
+ private handleResponse;
29
+ /**
30
+ * Send chat message to backend
31
+ */
32
+ sendMessage(message: string, sessionId: string, context?: Record<string, any>, contextDescription?: string): Promise<ChatResponse>;
33
+ /**
34
+ * Get conversation history
35
+ */
36
+ getHistory(sessionId: string, limit?: number): Promise<any>;
37
+ /**
38
+ * Delete conversation
39
+ */
40
+ deleteConversation(sessionId: string): Promise<void>;
41
+ /**
42
+ * 🆕 Send message with streaming response
43
+ * React Native compatible version using XMLHttpRequest
44
+ */
45
+ sendMessageStream(message: string, sessionId: string, onChunk: (chunk: string) => void, onComplete: (response: ChatResponse) => void, onError: (error: Error) => void, context?: Record<string, any>, contextDescription?: string, onToolSuggestions?: (tools: any[]) => void): Promise<void>;
46
+ }
47
+ //# sourceMappingURL=BackendService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackendService.d.ts","sourceRoot":"","sources":["../../src/services/BackendService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,YAAY,EAAE,MAAM,UAAU,CAAC;AAWrD;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,WAAW,CAAuB;gBAE9B,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAsB3C;;OAEG;YACW,cAAc;IAsB5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAyB1B;;OAEG;YACW,gBAAgB;IA4B9B;;OAEG;YACW,cAAc;IAuE5B;;OAEG;IACG,WAAW,CACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,YAAY,CAAC;IA0BxB;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,GAAG,CAAC;IAkBrE;;OAEG;IACG,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB1D;;;OAGG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAChC,UAAU,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,EAC5C,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,EAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,kBAAkB,CAAC,EAAE,MAAM,EAC3B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,GACzC,OAAO,CAAC,IAAI,CAAC;CA0IjB"}
@@ -0,0 +1,362 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BackendService = void 0;
4
+ const react_native_1 = require("react-native");
5
+ // Lazy import DeviceInfo to avoid NativeEventEmitter warning on module load
6
+ let DeviceInfo = null;
7
+ try {
8
+ DeviceInfo = require('react-native-device-info').default;
9
+ }
10
+ catch (error) {
11
+ console.warn('[AIChatSDK] react-native-device-info not available. Some features may be limited.');
12
+ }
13
+ /**
14
+ * Backend API Service using native fetch
15
+ */
16
+ class BackendService {
17
+ baseURL;
18
+ apiKey;
19
+ timeout;
20
+ bundleId = null;
21
+ appVersion = null;
22
+ deviceModel = null;
23
+ constructor(apiKey, apiUrl) {
24
+ // If custom apiUrl provided, ensure it has /api/v1 prefix
25
+ if (apiUrl) {
26
+ // Remove trailing slash if exists
27
+ const cleanUrl = apiUrl.replace(/\/$/, '');
28
+ // Add /api/v1 if not already present
29
+ this.baseURL = cleanUrl.includes('/api/v1') ? cleanUrl : `${cleanUrl}/api/v1`;
30
+ }
31
+ else {
32
+ this.baseURL = 'https://api.aichatsdk.com/v1';
33
+ }
34
+ this.apiKey = apiKey;
35
+ this.timeout = 60000; // 60 seconds for AI responses with RAG
36
+ // Initialize device info asynchronously
37
+ this.initDeviceInfo();
38
+ console.log('[AIChatSDK] BackendService initialized with URL:', this.baseURL);
39
+ console.log('[AIChatSDK] API Key: ', this.apiKey);
40
+ console.log('[AIChatSDK] SDK Version: 0.1.0');
41
+ console.log('[AIChatSDK] Platform: ', react_native_1.Platform.OS);
42
+ console.log('[AIChatSDK] Bundle ID: ', this.bundleId);
43
+ }
44
+ /**
45
+ * Initialize device information for security headers
46
+ */
47
+ async initDeviceInfo() {
48
+ try {
49
+ if (!DeviceInfo) {
50
+ console.warn('[AIChatSDK] DeviceInfo not available, using fallback values');
51
+ this.bundleId = 'com.esas.burda2';
52
+ this.appVersion = '1.0.0';
53
+ this.deviceModel = react_native_1.Platform.OS;
54
+ return;
55
+ }
56
+ this.bundleId = DeviceInfo.getBundleId();
57
+ this.appVersion = DeviceInfo.getVersion();
58
+ this.deviceModel = await DeviceInfo.getDeviceName();
59
+ }
60
+ catch (error) {
61
+ console.warn('[AIChatSDK] Failed to initialize device info:', error);
62
+ // Fallback values
63
+ this.bundleId = 'com.esas.burda2';
64
+ this.appVersion = '1.0.0';
65
+ this.deviceModel = react_native_1.Platform.OS;
66
+ }
67
+ }
68
+ /**
69
+ * Get security headers for API requests
70
+ */
71
+ getSecurityHeaders() {
72
+ const headers = {
73
+ 'x-api-key': this.apiKey,
74
+ 'x-platform': react_native_1.Platform.OS, // 'ios' or 'android'
75
+ 'x-sdk-version': '0.1.0', // SDK version
76
+ };
77
+ // Add bundle ID (required for bundle ID restrictions)
78
+ if (this.bundleId) {
79
+ headers['x-bundle-id'] = this.bundleId;
80
+ }
81
+ // Add app version
82
+ if (this.appVersion) {
83
+ headers['x-app-version'] = this.appVersion;
84
+ }
85
+ // Add device model
86
+ if (this.deviceModel) {
87
+ headers['x-device-model'] = this.deviceModel;
88
+ }
89
+ return headers;
90
+ }
91
+ /**
92
+ * Make HTTP request with timeout
93
+ */
94
+ async fetchWithTimeout(url, options) {
95
+ const controller = new AbortController();
96
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
97
+ try {
98
+ const response = await fetch(url, {
99
+ ...options,
100
+ signal: controller.signal,
101
+ headers: {
102
+ 'Content-Type': 'application/json',
103
+ ...this.getSecurityHeaders(),
104
+ ...options.headers,
105
+ },
106
+ });
107
+ clearTimeout(timeoutId);
108
+ return response;
109
+ }
110
+ catch (error) {
111
+ clearTimeout(timeoutId);
112
+ if (error.name === 'AbortError') {
113
+ throw new Error('Request timeout');
114
+ }
115
+ throw error;
116
+ }
117
+ }
118
+ /**
119
+ * Handle response errors with detailed messages
120
+ */
121
+ async handleResponse(response) {
122
+ if (!response.ok) {
123
+ const errorData = await response.json().catch(() => ({}));
124
+ const errorCode = errorData.error || 'UNKNOWN_ERROR';
125
+ const errorMessage = errorData.message || response.statusText;
126
+ const hint = errorData.hint || '';
127
+ // 401: Unauthorized (Invalid/Missing API Key)
128
+ if (response.status === 401) {
129
+ if (errorCode === 'MISSING_API_KEY') {
130
+ throw new Error('❌ API key is required. Please check your configuration.');
131
+ }
132
+ if (errorCode === 'INVALID_API_KEY') {
133
+ throw new Error('❌ Invalid API key. Please check your Dashboard for the correct key.');
134
+ }
135
+ throw new Error(`❌ Unauthorized: ${errorMessage}`);
136
+ }
137
+ // 403: Forbidden (Bundle ID, Platform, Permission issues)
138
+ if (response.status === 403) {
139
+ if (errorCode === 'INVALID_BUNDLE_ID') {
140
+ const bundleIdMsg = this.bundleId
141
+ ? `Your bundle ID: ${this.bundleId}`
142
+ : 'Bundle ID could not be detected';
143
+ throw new Error(`🔒 Access Denied: ${errorMessage}\n${bundleIdMsg}\n💡 ${hint || 'Add your bundle ID to API key restrictions in the Dashboard'}`);
144
+ }
145
+ if (errorCode === 'INVALID_PLATFORM') {
146
+ throw new Error(`🔒 Access Denied: ${errorMessage}\n💡 Add '${react_native_1.Platform.OS}' to allowed platforms in the Dashboard`);
147
+ }
148
+ if (errorCode === 'INACTIVE_API_KEY') {
149
+ throw new Error('🔒 API key is inactive. Please activate it in the Dashboard.');
150
+ }
151
+ if (errorCode === 'EXPIRED_API_KEY') {
152
+ throw new Error('🔒 API key has expired. Please generate a new key in the Dashboard.');
153
+ }
154
+ if (errorCode.startsWith('PERMISSION_DENIED')) {
155
+ const feature = errorCode.replace('PERMISSION_DENIED_', '').toLowerCase();
156
+ throw new Error(`🔒 Permission Denied: ${feature} access is not enabled for this API key.\n💡 Enable it in the Dashboard`);
157
+ }
158
+ throw new Error(`🔒 Access Denied: ${errorMessage}\n💡 ${hint}`);
159
+ }
160
+ // 429: Rate Limit Exceeded
161
+ if (response.status === 429) {
162
+ const retryAfter = response.headers.get('Retry-After');
163
+ const rateLimitReset = response.headers.get('X-RateLimit-Reset');
164
+ const retryMsg = retryAfter
165
+ ? `Try again in ${retryAfter} seconds`
166
+ : rateLimitReset
167
+ ? `Try again at ${new Date(parseInt(rateLimitReset) * 1000).toLocaleTimeString()}`
168
+ : 'Try again later';
169
+ throw new Error(`⚠️ Rate Limit Exceeded: ${errorMessage}\n💡 ${retryMsg}\n📊 Increase rate limits in the Dashboard`);
170
+ }
171
+ // Other errors
172
+ throw new Error(errorData.message || `❌ HTTP Error ${response.status}: ${response.statusText}`);
173
+ }
174
+ return response.json();
175
+ }
176
+ /**
177
+ * Send chat message to backend
178
+ */
179
+ async sendMessage(message, sessionId, context, contextDescription) {
180
+ try {
181
+ const request = {
182
+ message,
183
+ sessionId,
184
+ context: context ? {
185
+ metadata: {
186
+ ...context,
187
+ contextDescription,
188
+ },
189
+ } : undefined,
190
+ };
191
+ console.log('🚀 Sending message to backend:', request);
192
+ const response = await this.fetchWithTimeout(`${this.baseURL}/chat`, {
193
+ method: 'POST',
194
+ body: JSON.stringify(request),
195
+ });
196
+ return this.handleResponse(response);
197
+ }
198
+ catch (error) {
199
+ throw new Error(error.message || 'Failed to send message');
200
+ }
201
+ }
202
+ /**
203
+ * Get conversation history
204
+ */
205
+ async getHistory(sessionId, limit = 50) {
206
+ try {
207
+ const params = new URLSearchParams({
208
+ sessionId,
209
+ limit: limit.toString(),
210
+ });
211
+ const response = await this.fetchWithTimeout(`${this.baseURL}/chat/history?${params}`, { method: 'GET' });
212
+ return this.handleResponse(response);
213
+ }
214
+ catch (error) {
215
+ throw new Error('Failed to fetch conversation history');
216
+ }
217
+ }
218
+ /**
219
+ * Delete conversation
220
+ */
221
+ async deleteConversation(sessionId) {
222
+ try {
223
+ const params = new URLSearchParams({ sessionId });
224
+ const response = await this.fetchWithTimeout(`${this.baseURL}/chat/conversation?${params}`, { method: 'DELETE' });
225
+ if (!response.ok) {
226
+ throw new Error(`Failed to delete: ${response.statusText}`);
227
+ }
228
+ }
229
+ catch (error) {
230
+ throw new Error('Failed to delete conversation');
231
+ }
232
+ }
233
+ /**
234
+ * 🆕 Send message with streaming response
235
+ * React Native compatible version using XMLHttpRequest
236
+ */
237
+ async sendMessageStream(message, sessionId, onChunk, onComplete, onError, context, contextDescription, onToolSuggestions // 🆕 Tool suggestions callback
238
+ ) {
239
+ try {
240
+ const request = {
241
+ message,
242
+ sessionId,
243
+ context: context ? {
244
+ metadata: {
245
+ ...context,
246
+ contextDescription,
247
+ },
248
+ } : undefined,
249
+ };
250
+ // Use XMLHttpRequest for React Native streaming support
251
+ const xhr = new XMLHttpRequest();
252
+ let fullResponse = '';
253
+ let messageId = '';
254
+ let tokensUsed = 0;
255
+ let navigationSuggestion = undefined;
256
+ let apiSuggestions = [];
257
+ let lastProcessedIndex = 0;
258
+ let firstChunkReceived = false; // ⏱️ Track first chunk
259
+ xhr.onprogress = () => {
260
+ // Get new data since last update
261
+ const currentText = xhr.responseText;
262
+ const newText = currentText.substring(lastProcessedIndex);
263
+ lastProcessedIndex = currentText.length;
264
+ if (!newText)
265
+ return;
266
+ // ⏱️ Log first chunk arrival at network level
267
+ if (!firstChunkReceived) {
268
+ console.log('📡 First network chunk received from backend');
269
+ firstChunkReceived = true;
270
+ }
271
+ console.log('🌊 Streaming chunk received:', newText.substring(0, 50) + '...');
272
+ // Parse SSE events (format: "data: {...}\n\n")
273
+ const lines = newText.split('\n');
274
+ for (const line of lines) {
275
+ if (line.startsWith('data: ')) {
276
+ const jsonStr = line.slice(6).trim(); // Remove "data: " prefix
277
+ if (!jsonStr)
278
+ continue;
279
+ try {
280
+ const event = JSON.parse(jsonStr);
281
+ switch (event.type) {
282
+ case 'content':
283
+ // Stream content chunk
284
+ console.log('✅ Content chunk:', event.content);
285
+ fullResponse += event.content;
286
+ onChunk(event.content);
287
+ break;
288
+ case 'navigation':
289
+ navigationSuggestion = event.navigation;
290
+ break;
291
+ case 'api_suggestions':
292
+ console.log('🔌 API suggestions received:', event.suggestions);
293
+ apiSuggestions = event.suggestions || [];
294
+ break;
295
+ case 'tool_suggestions':
296
+ // 🆕 Tool Registry suggestions
297
+ console.log('🛠️ Tool suggestions received:', event.tools);
298
+ if (onToolSuggestions && event.tools) {
299
+ onToolSuggestions(event.tools);
300
+ }
301
+ break;
302
+ case 'done':
303
+ // Stream complete
304
+ messageId = event.messageId;
305
+ tokensUsed = event.tokensUsed;
306
+ break;
307
+ case 'error':
308
+ onError(new Error(event.error));
309
+ return;
310
+ }
311
+ }
312
+ catch (e) {
313
+ // Skip malformed JSON
314
+ console.warn('Failed to parse SSE event:', jsonStr, e);
315
+ }
316
+ }
317
+ }
318
+ };
319
+ xhr.onload = () => {
320
+ if (xhr.status === 200) {
321
+ // Call onComplete with full response
322
+ onComplete({
323
+ id: messageId || `msg-${Date.now()}`,
324
+ message: fullResponse,
325
+ text: fullResponse,
326
+ timestamp: new Date(),
327
+ handledBy: 'backend',
328
+ handled: 'backend',
329
+ tokensUsed,
330
+ navigationSuggestion,
331
+ apiSuggestions: apiSuggestions.length > 0 ? apiSuggestions : undefined,
332
+ });
333
+ }
334
+ else {
335
+ try {
336
+ const errorData = JSON.parse(xhr.responseText);
337
+ onError(new Error(errorData.message || `HTTP Error: ${xhr.status}`));
338
+ }
339
+ catch {
340
+ onError(new Error(`HTTP Error: ${xhr.status}`));
341
+ }
342
+ }
343
+ };
344
+ xhr.onerror = () => {
345
+ onError(new Error('Network error occurred'));
346
+ };
347
+ xhr.ontimeout = () => {
348
+ onError(new Error('Request timeout'));
349
+ };
350
+ xhr.open('POST', `${this.baseURL}/chat/stream`);
351
+ xhr.setRequestHeader('Content-Type', 'application/json');
352
+ xhr.setRequestHeader('x-api-key', this.apiKey);
353
+ xhr.timeout = this.timeout;
354
+ xhr.send(JSON.stringify(request));
355
+ }
356
+ catch (error) {
357
+ onError(error instanceof Error ? error : new Error(error.message || 'Stream failed'));
358
+ }
359
+ }
360
+ }
361
+ exports.BackendService = BackendService;
362
+ //# sourceMappingURL=BackendService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackendService.js","sourceRoot":"","sources":["../../src/services/BackendService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { ChatMessage } from '../types/chat';
2
+ /**
3
+ * Conversation Manager
4
+ * Handles conversation history and session management
5
+ */
6
+ export declare class ConversationManager {
7
+ private sessionId;
8
+ private messages;
9
+ private maxMessages;
10
+ constructor(sessionId?: string);
11
+ /**
12
+ * Add message to conversation
13
+ */
14
+ addMessage(message: ChatMessage): void;
15
+ /**
16
+ * Get conversation history
17
+ */
18
+ getHistory(limit?: number): ChatMessage[];
19
+ /**
20
+ * Get session ID
21
+ */
22
+ getSessionId(): string;
23
+ /**
24
+ * Clear conversation
25
+ */
26
+ clear(): Promise<void>;
27
+ /**
28
+ * Load from storage
29
+ */
30
+ private loadFromStorage;
31
+ /**
32
+ * Save to storage
33
+ */
34
+ private saveToStorage;
35
+ /**
36
+ * Generate session ID
37
+ */
38
+ private generateSessionId;
39
+ }
40
+ //# sourceMappingURL=ConversationManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationManager.d.ts","sourceRoot":"","sources":["../../src/services/ConversationManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,WAAW,CAAc;gBAErB,SAAS,CAAC,EAAE,MAAM;IAK9B;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAWtC;;OAEG;IACH,UAAU,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,EAAE;IAOzC;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B;;OAEG;YACW,eAAe;IAa7B;;OAEG;YACW,aAAa;IAgB3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAG1B"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ConversationManager = void 0;
7
+ const async_storage_1 = __importDefault(require("@react-native-async-storage/async-storage"));
8
+ const constants_1 = require("../constants");
9
+ /**
10
+ * Conversation Manager
11
+ * Handles conversation history and session management
12
+ */
13
+ class ConversationManager {
14
+ sessionId;
15
+ messages = [];
16
+ maxMessages = 50;
17
+ constructor(sessionId) {
18
+ this.sessionId = sessionId || this.generateSessionId();
19
+ this.loadFromStorage();
20
+ }
21
+ /**
22
+ * Add message to conversation
23
+ */
24
+ addMessage(message) {
25
+ this.messages.push(message);
26
+ // Keep only last N messages
27
+ if (this.messages.length > this.maxMessages) {
28
+ this.messages = this.messages.slice(-this.maxMessages);
29
+ }
30
+ this.saveToStorage();
31
+ }
32
+ /**
33
+ * Get conversation history
34
+ */
35
+ getHistory(limit) {
36
+ if (limit) {
37
+ return this.messages.slice(-limit);
38
+ }
39
+ return [...this.messages];
40
+ }
41
+ /**
42
+ * Get session ID
43
+ */
44
+ getSessionId() {
45
+ return this.sessionId;
46
+ }
47
+ /**
48
+ * Clear conversation
49
+ */
50
+ async clear() {
51
+ this.messages = [];
52
+ this.sessionId = this.generateSessionId();
53
+ await async_storage_1.default.removeItem(constants_1.STORAGE_KEYS.CONVERSATION_HISTORY);
54
+ }
55
+ /**
56
+ * Load from storage
57
+ */
58
+ async loadFromStorage() {
59
+ try {
60
+ const stored = await async_storage_1.default.getItem(constants_1.STORAGE_KEYS.CONVERSATION_HISTORY);
61
+ if (stored) {
62
+ const data = JSON.parse(stored);
63
+ this.messages = data.messages || [];
64
+ this.sessionId = data.sessionId || this.sessionId;
65
+ }
66
+ }
67
+ catch (error) {
68
+ console.warn('Failed to load conversation history:', error);
69
+ }
70
+ }
71
+ /**
72
+ * Save to storage
73
+ */
74
+ async saveToStorage() {
75
+ try {
76
+ const data = {
77
+ sessionId: this.sessionId,
78
+ messages: this.messages,
79
+ updatedAt: new Date().toISOString(),
80
+ };
81
+ await async_storage_1.default.setItem(constants_1.STORAGE_KEYS.CONVERSATION_HISTORY, JSON.stringify(data));
82
+ }
83
+ catch (error) {
84
+ console.warn('Failed to save conversation history:', error);
85
+ }
86
+ }
87
+ /**
88
+ * Generate session ID
89
+ */
90
+ generateSessionId() {
91
+ return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
92
+ }
93
+ }
94
+ exports.ConversationManager = ConversationManager;
95
+ //# sourceMappingURL=ConversationManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConversationManager.js","sourceRoot":"","sources":["../../src/services/ConversationManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { LocalAIConfig, ClassificationResult } from '../types';
2
+ /**
3
+ * Local AI Classifier using ONNX Runtime
4
+ * Phase 1: Simple rule-based classifier
5
+ * Phase 2: Will use DistilBERT ONNX model
6
+ */
7
+ export declare class LocalAIClassifier {
8
+ private isInitialized;
9
+ constructor(_config?: LocalAIConfig);
10
+ /**
11
+ * Initialize the classifier
12
+ */
13
+ initialize(): Promise<void>;
14
+ /**
15
+ * Classify user message intent
16
+ */
17
+ classify(message: string): Promise<ClassificationResult>;
18
+ /**
19
+ * Rule-based classifier (Phase 1)
20
+ * Phase 2: This will be replaced with ONNX model inference
21
+ */
22
+ private ruleBasedClassify;
23
+ /**
24
+ * Extract potential screen name from message
25
+ */
26
+ private extractScreenName;
27
+ /**
28
+ * Destroy classifier
29
+ */
30
+ destroy(): Promise<void>;
31
+ }
32
+ //# sourceMappingURL=LocalAIClassifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalAIClassifier.d.ts","sourceRoot":"","sources":["../../src/services/LocalAIClassifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAe,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE5E;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,aAAa,CAAkB;gBAE3B,OAAO,CAAC,EAAE,aAAa;IAInC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAajC;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAoB9D;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAqEzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA8BzB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAI/B"}