@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,377 @@
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.MessageBubble = MessageBubble;
7
+ const react_1 = __importDefault(require("react"));
8
+ const react_native_1 = require("react-native");
9
+ const MarkdownText_1 = require("./MarkdownText");
10
+ const TemplateRenderer_1 = require("./TemplateRenderer");
11
+ /**
12
+ * MessageBubble Component
13
+ *
14
+ * Displays a chat message bubble with support for:
15
+ * - User and AI messages with different styles
16
+ * - Timestamps
17
+ * - Metadata badges (handled by, confidence, tokens)
18
+ * - Theming support
19
+ *
20
+ * @example
21
+ * ```tsx
22
+ * <MessageBubble
23
+ * message="Hello, how can I help?"
24
+ * role="assistant"
25
+ * timestamp={new Date()}
26
+ * theme={lightTheme}
27
+ * showTimestamp
28
+ * showMetadata
29
+ * metadata={{ handledBy: 'local', confidence: 0.95 }}
30
+ * />
31
+ * ```
32
+ */
33
+ function MessageBubble({ message, role, timestamp, theme, metadata, showTimestamp = true, showMetadata = false, actions, onActionPress, componentRegistry, toolDefinition, toolResultData, }) {
34
+ const isUser = role === 'user';
35
+ // 🆕 Render using template system
36
+ const renderWithTemplate = (template) => {
37
+ console.log('🎨 Rendering with template:', template.templateId);
38
+ // Extract data from response using dataPath
39
+ let dataToRender = toolResultData;
40
+ const response = toolDefinition?.response;
41
+ if (response?.dataPath) {
42
+ const pathParts = response.dataPath.split('.');
43
+ for (const part of pathParts) {
44
+ dataToRender = dataToRender?.[part];
45
+ }
46
+ }
47
+ console.log('🔍 Template data:', Array.isArray(dataToRender)
48
+ ? `Array(${dataToRender.length})`
49
+ : typeof dataToRender);
50
+ // Handle list type
51
+ if (response?.type === 'list' && Array.isArray(dataToRender)) {
52
+ const items = response.maxItems
53
+ ? dataToRender.slice(0, response.maxItems)
54
+ : dataToRender;
55
+ const layout = response.layout || 'vertical';
56
+ if (layout === 'horizontal') {
57
+ return (<react_native_1.View style={{ marginTop: theme.spacing.md }}>
58
+ <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} style={{ flexGrow: 0 }} contentContainerStyle={{ paddingRight: theme.spacing.md }}>
59
+ {items.map((item, index) => (<react_native_1.View key={index} style={{ marginRight: theme.spacing.sm, width: 280 }}>
60
+ <TemplateRenderer_1.TemplateRenderer template={template} data={item} theme={theme}/>
61
+ </react_native_1.View>))}
62
+ </react_native_1.ScrollView>
63
+ </react_native_1.View>);
64
+ }
65
+ // Vertical layout
66
+ return (<react_native_1.View style={{ marginTop: theme.spacing.md }}>
67
+ {items.map((item, index) => (<react_native_1.View key={index} style={{ marginBottom: theme.spacing.sm }}>
68
+ <TemplateRenderer_1.TemplateRenderer template={template} data={item} theme={theme}/>
69
+ </react_native_1.View>))}
70
+ </react_native_1.View>);
71
+ }
72
+ // Single item rendering
73
+ return (<react_native_1.View style={{ marginTop: theme.spacing.md }}>
74
+ <TemplateRenderer_1.TemplateRenderer template={template} data={dataToRender} theme={theme}/>
75
+ </react_native_1.View>);
76
+ };
77
+ // 🆕 Render tool result using custom component or template (Phase 2.6 + Templates)
78
+ const renderToolResult = () => {
79
+ const position = toolDefinition?.response?.position || 'after';
80
+ console.log('🔍 renderToolResult called:', {
81
+ hasToolDef: !!toolDefinition,
82
+ hasData: !!toolResultData,
83
+ hasRegistry: !!componentRegistry,
84
+ position: position,
85
+ calledFrom: new Error().stack?.split('\n')[2]?.trim(),
86
+ });
87
+ if (!toolDefinition || !toolResultData || !componentRegistry) {
88
+ console.log('❌ Tool render skipped: missing definition, data, or registry');
89
+ return null;
90
+ }
91
+ const { response } = toolDefinition;
92
+ if (!response) {
93
+ console.log('❌ Tool definition missing response config');
94
+ return null;
95
+ }
96
+ const componentName = response.itemComponent;
97
+ console.log('🔍 Tool render config:', {
98
+ type: response.type,
99
+ componentName,
100
+ dataPath: response.dataPath,
101
+ registeredComponents: Object.keys(componentRegistry),
102
+ hasTemplate: !!response.template,
103
+ });
104
+ // 🆕 Check if this is a template-based component
105
+ const isTemplate = componentName?.startsWith('TEMPLATE:');
106
+ if (isTemplate) {
107
+ console.log('🎨 Template-based component detected');
108
+ const template = response.template;
109
+ if (!template) {
110
+ console.log('❌ Template definition missing');
111
+ return null;
112
+ }
113
+ return renderWithTemplate(template);
114
+ }
115
+ // Standard component registry lookup
116
+ if (!componentName || !componentRegistry[componentName]) {
117
+ console.log(`❌ Component "${componentName}" not found in registry`);
118
+ return null;
119
+ }
120
+ const CustomComponent = componentRegistry[componentName];
121
+ console.log('✅ Component found, rendering...');
122
+ // Extract data from response using dataPath
123
+ let dataToRender = toolResultData;
124
+ console.log('🔍 Original data:', JSON.stringify(toolResultData).substring(0, 200));
125
+ if (response.dataPath) {
126
+ const pathParts = response.dataPath.split('.');
127
+ console.log('🔍 Extracting path:', pathParts);
128
+ for (const part of pathParts) {
129
+ dataToRender = dataToRender?.[part];
130
+ console.log(` → After "${part}":`, dataToRender ? 'found' : 'undefined');
131
+ }
132
+ }
133
+ console.log('🔍 Final dataToRender:', Array.isArray(dataToRender)
134
+ ? `Array(${dataToRender.length})`
135
+ : typeof dataToRender);
136
+ // Handle different response types
137
+ if (response.type === 'list' && Array.isArray(dataToRender)) {
138
+ // Limit items if maxItems is set
139
+ const items = response.maxItems
140
+ ? dataToRender.slice(0, response.maxItems)
141
+ : dataToRender;
142
+ console.log(`📋 Rendering ${items.length} items with ${componentName}`);
143
+ // Check layout preference (default: vertical)
144
+ const layout = response.layout || 'vertical';
145
+ // If custom layout, pass entire array to component
146
+ if (layout === 'custom') {
147
+ console.log(' → Using custom layout (full array to component)');
148
+ return (<react_native_1.View style={{ marginTop: theme.spacing.md }}>
149
+ <CustomComponent data={items} // Full array
150
+ tool={toolDefinition} theme={theme}/>
151
+ {response.maxItems && dataToRender.length > response.maxItems && (<react_native_1.Text style={{
152
+ fontSize: theme.typography.fontSize.xs,
153
+ color: theme.colors.textSecondary,
154
+ marginTop: theme.spacing.xs,
155
+ }}>
156
+ ...and {dataToRender.length - response.maxItems} more
157
+ </react_native_1.Text>)}
158
+ </react_native_1.View>);
159
+ }
160
+ // Horizontal scroll layout
161
+ if (layout === 'horizontal') {
162
+ console.log(' → Using horizontal scroll layout');
163
+ return (<react_native_1.View style={{ marginTop: theme.spacing.md, marginBottom: theme.spacing.md }}>
164
+ <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} style={{ flexGrow: 0, width: react_native_1.Dimensions.get("screen").width, marginLeft: -theme.spacing.md, }} contentContainerStyle={{ paddingRight: theme.spacing.md, paddingLeft: theme.spacing.md, gap: theme.spacing.md }}>
165
+ {items.map((item, index) => (<react_native_1.View key={index} style={{}}>
166
+ <CustomComponent data={item} tool={toolDefinition} theme={theme}/>
167
+ </react_native_1.View>))}
168
+ </react_native_1.ScrollView>
169
+ {response.maxItems && dataToRender.length > response.maxItems && (<react_native_1.Text style={{
170
+ fontSize: theme.typography.fontSize.xs,
171
+ color: theme.colors.textSecondary,
172
+ marginTop: theme.spacing.xs,
173
+ }}>
174
+ ...and {dataToRender.length - response.maxItems} more
175
+ </react_native_1.Text>)}
176
+ </react_native_1.View>);
177
+ }
178
+ // Default vertical layout
179
+ console.log(' → Using vertical layout');
180
+ return (<react_native_1.View style={{ marginTop: theme.spacing.md }}>
181
+ {items.map((item, index) => {
182
+ console.log(` → Rendering item ${index}:`, JSON.stringify(item).substring(0, 100));
183
+ return (<react_native_1.View key={index} style={{ marginBottom: theme.spacing.sm }}>
184
+ <CustomComponent data={item} tool={toolDefinition} theme={theme}/>
185
+ </react_native_1.View>);
186
+ })}
187
+ {response.maxItems && dataToRender.length > response.maxItems && (<react_native_1.Text style={{
188
+ fontSize: theme.typography.fontSize.xs,
189
+ color: theme.colors.textSecondary,
190
+ marginTop: theme.spacing.xs,
191
+ }}>
192
+ ...and {dataToRender.length - response.maxItems} more
193
+ </react_native_1.Text>)}
194
+ </react_native_1.View>);
195
+ }
196
+ else if (response.type === 'card' || response.type === 'detail') {
197
+ // Single item rendering
198
+ return (<react_native_1.View style={{ marginTop: theme.spacing.md }}>
199
+ <CustomComponent data={dataToRender} tool={toolDefinition} theme={theme}/>
200
+ </react_native_1.View>);
201
+ }
202
+ else if (response.type === 'table' && Array.isArray(dataToRender)) {
203
+ // Table rendering (simplified for now)
204
+ return (<react_native_1.View style={{ marginTop: theme.spacing.md }}>
205
+ <CustomComponent data={dataToRender} tool={toolDefinition} theme={theme}/>
206
+ </react_native_1.View>);
207
+ }
208
+ return null;
209
+ };
210
+ // Format timestamp
211
+ const formatTime = (date) => {
212
+ const hours = date.getHours().toString().padStart(2, '0');
213
+ const minutes = date.getMinutes().toString().padStart(2, '0');
214
+ return `${hours}:${minutes}`;
215
+ };
216
+ // Format confidence percentage
217
+ const formatConfidence = (confidence) => {
218
+ if (!confidence)
219
+ return '';
220
+ return `${Math.round(confidence * 100)}%`;
221
+ };
222
+ const containerStyle = {
223
+ alignSelf: isUser ? 'flex-end' : 'flex-start',
224
+ maxWidth: isUser
225
+ ? `${theme.messages?.user.maxWidth || 85}%`
226
+ : `${theme.messages?.ai.maxWidth || 85}%`,
227
+ marginBottom: theme.spacing.sm,
228
+ };
229
+ const bubbleStyle = {
230
+ backgroundColor: isUser ? theme.colors.userBubble : theme.colors.aiBubble,
231
+ borderRadius: theme.borderRadius.lg,
232
+ paddingHorizontal: isUser
233
+ ? (theme.messages?.user.padding || theme.spacing.md)
234
+ : (theme.messages?.ai.padding || theme.spacing.md),
235
+ paddingVertical: theme.spacing.sm + 2,
236
+ ...theme.shadows.small,
237
+ };
238
+ const messageTextStyle = {
239
+ color: isUser ? theme.colors.userBubbleText : theme.colors.aiBubbleText,
240
+ fontSize: theme.typography.fontSize.md,
241
+ lineHeight: theme.typography.fontSize.md * theme.typography.lineHeight.normal,
242
+ fontWeight: theme.typography.fontWeight.regular,
243
+ };
244
+ const timestampStyle = {
245
+ fontSize: theme.typography.fontSize.xs,
246
+ color: theme.colors.textSecondary,
247
+ marginTop: theme.spacing.xs,
248
+ alignSelf: isUser ? 'flex-end' : 'flex-start',
249
+ };
250
+ const metadataBadgeStyle = {
251
+ flexDirection: 'row',
252
+ alignItems: 'center',
253
+ marginTop: theme.spacing.xs,
254
+ paddingHorizontal: theme.spacing.sm,
255
+ paddingVertical: theme.spacing.xs / 2,
256
+ backgroundColor: theme.colors.surface,
257
+ borderRadius: theme.borderRadius.sm,
258
+ alignSelf: 'flex-start',
259
+ };
260
+ const metadataTextStyle = {
261
+ fontSize: theme.typography.fontSize.xs,
262
+ color: theme.colors.textSecondary,
263
+ marginLeft: theme.spacing.xs,
264
+ };
265
+ // Check if this is a tool response message (no text, only tool data)
266
+ const isToolResponseOnly = toolDefinition && toolResultData && !message.trim();
267
+ // 🆕 Check position preference for tool result (default: after)
268
+ const toolPosition = toolDefinition?.response?.position || 'after';
269
+ // 🔍 DEBUG: Log position info
270
+ if (toolDefinition && toolResultData) {
271
+ console.log('🎯 MessageBubble render:', {
272
+ toolKey: toolDefinition.key,
273
+ position: toolDefinition.response?.position,
274
+ toolPosition,
275
+ isUser,
276
+ role,
277
+ messageLength: message.length,
278
+ messagePreview: message.substring(0, 50),
279
+ isToolResponseOnly,
280
+ willRenderBefore: !isUser && toolPosition === 'before' && !isToolResponseOnly,
281
+ willRenderAfter: !isUser && (isToolResponseOnly || toolPosition === 'after'),
282
+ });
283
+ }
284
+ return (<react_native_1.View>
285
+ <react_native_1.View style={containerStyle}>
286
+ {/* 🆕 Tool Result BEFORE Message - if position is "before" AND there's a message */}
287
+ {!isUser &&
288
+ toolPosition === 'before' &&
289
+ !isToolResponseOnly &&
290
+ renderToolResult()}
291
+
292
+ {/* Only show bubble if there's actual message text OR actions */}
293
+ {(!isToolResponseOnly || (actions && actions.length > 0)) && (<react_native_1.View style={bubbleStyle}>
294
+ {message.trim() && (<MarkdownText_1.MarkdownText style={messageTextStyle} theme={theme} isUserMessage={isUser}>
295
+ {message}
296
+ </MarkdownText_1.MarkdownText>)}
297
+
298
+ {/* Metadata Badge (for AI messages) */}
299
+ {!isUser && showMetadata && metadata && (<react_native_1.View style={metadataBadgeStyle}>
300
+ {/* Handled by indicator */}
301
+ {metadata.handledBy && (<react_native_1.Text style={metadataTextStyle}>
302
+ {metadata.handledBy === 'local' ? '⚡ Local' : '☁️ Cloud'}
303
+ </react_native_1.Text>)}
304
+
305
+ {/* Confidence score */}
306
+ {metadata.confidence && (<react_native_1.Text style={metadataTextStyle}>
307
+ {' • '}
308
+ {formatConfidence(metadata.confidence)}
309
+ </react_native_1.Text>)}
310
+
311
+ {/* Tokens used */}
312
+ {metadata.tokensUsed && (<react_native_1.Text style={metadataTextStyle}>
313
+ {' • '}
314
+ {metadata.tokensUsed} tokens
315
+ </react_native_1.Text>)}
316
+ </react_native_1.View>)}
317
+
318
+ {/* Action Buttons - Inside bubble, after metadata */}
319
+ {!isUser && actions && actions.length > 0 && (<react_native_1.View style={{ marginTop: theme.spacing.md, gap: theme.spacing.xs }}>
320
+ {actions.map((action) => {
321
+ // Button colors based on style
322
+ const getButtonColor = () => {
323
+ switch (action.style) {
324
+ case 'primary':
325
+ return theme.colors.primary;
326
+ case 'success':
327
+ return '#10b981'; // green
328
+ case 'danger':
329
+ return '#ef4444'; // red
330
+ case 'warning':
331
+ return '#f59e0b'; // orange
332
+ case 'secondary':
333
+ default:
334
+ return theme.colors.textSecondary;
335
+ }
336
+ };
337
+ const actionButtonStyle = {
338
+ flexDirection: 'row',
339
+ alignItems: 'center',
340
+ justifyContent: 'center',
341
+ backgroundColor: getButtonColor(),
342
+ paddingHorizontal: theme.spacing.md,
343
+ paddingVertical: theme.spacing.sm,
344
+ borderRadius: theme.borderRadius.md,
345
+ marginTop: theme.spacing.xs,
346
+ ...theme.shadows.small,
347
+ };
348
+ const actionButtonTextStyle = {
349
+ color: '#ffffff',
350
+ fontSize: theme.typography.fontSize.sm,
351
+ fontWeight: theme.typography.fontWeight.medium,
352
+ marginLeft: action.icon ? theme.spacing.xs : 0,
353
+ };
354
+ return (<react_native_1.TouchableOpacity key={action.id} style={actionButtonStyle} onPress={() => onActionPress?.(action)} activeOpacity={0.7}>
355
+ {action.icon && (<react_native_1.Text style={{ fontSize: 16 }}>{action.icon}</react_native_1.Text>)}
356
+ <react_native_1.Text style={actionButtonTextStyle}>{action.label}</react_native_1.Text>
357
+ </react_native_1.TouchableOpacity>);
358
+ })}
359
+ </react_native_1.View>)}
360
+ </react_native_1.View>)}
361
+
362
+ {/* 🆕 Tool Result Rendering:
363
+ * - If tool response only (no message text): always show the tool
364
+ * - If there's a message: show tool AFTER message if position is "after" (default)
365
+ */}
366
+
367
+ </react_native_1.View>
368
+
369
+ {!isUser &&
370
+ (isToolResponseOnly || toolPosition === 'after') &&
371
+ renderToolResult()}
372
+
373
+ {/* Timestamp */}
374
+ {showTimestamp && (<react_native_1.Text style={timestampStyle}>{formatTime(timestamp)}</react_native_1.Text>)}
375
+ </react_native_1.View>);
376
+ }
377
+ //# sourceMappingURL=MessageBubble.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageBubble.js","sourceRoot":"","sources":["../../src/components/MessageBubble.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import type { Theme } from '../themes';
3
+ interface NavigationSuggestionCardProps {
4
+ screenName: string;
5
+ message?: string;
6
+ confidence?: number;
7
+ onAccept: () => void;
8
+ onDismiss: () => void;
9
+ theme: Theme;
10
+ }
11
+ export declare function NavigationSuggestionCard({ screenName, message, confidence, onAccept, onDismiss, theme, }: NavigationSuggestionCardProps): React.JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=NavigationSuggestion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavigationSuggestion.d.ts","sourceRoot":"","sources":["../../src/components/NavigationSuggestion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAO1B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAEvC,UAAU,6BAA6B;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,KAAK,EAAE,KAAK,CAAC;CACd;AAED,wBAAgB,wBAAwB,CAAC,EACvC,UAAU,EACV,OAAO,EACP,UAAU,EACV,QAAQ,EACR,SAAS,EACT,KAAK,GACN,EAAE,6BAA6B,qBAkE/B"}
@@ -0,0 +1,117 @@
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.NavigationSuggestionCard = NavigationSuggestionCard;
7
+ const react_1 = __importDefault(require("react"));
8
+ const react_native_1 = require("react-native");
9
+ function NavigationSuggestionCard({ screenName, message, confidence, onAccept, onDismiss, theme, }) {
10
+ return (<react_native_1.View style={[
11
+ styles.container,
12
+ {
13
+ backgroundColor: theme.colors.surface,
14
+ borderColor: theme.colors.primary,
15
+ },
16
+ ]}>
17
+ {/* Icon */}
18
+ <react_native_1.View style={styles.iconContainer}>
19
+ <react_native_1.Text style={styles.icon}>🧭</react_native_1.Text>
20
+ </react_native_1.View>
21
+
22
+ {/* Content */}
23
+ <react_native_1.View style={styles.content}>
24
+ <react_native_1.Text style={[styles.title, { color: theme.colors.text }]}>
25
+ Navigate to {screenName}
26
+ </react_native_1.Text>
27
+ {message && (<react_native_1.Text style={[styles.message, { color: theme.colors.textSecondary }]} numberOfLines={2}>
28
+ {message}
29
+ </react_native_1.Text>)}
30
+ {confidence !== undefined && (<react_native_1.Text style={[styles.confidence, { color: theme.colors.textSecondary }]}>
31
+ Confidence: {Math.round(confidence * 100)}%
32
+ </react_native_1.Text>)}
33
+ </react_native_1.View>
34
+
35
+ {/* Actions */}
36
+ <react_native_1.View style={styles.actions}>
37
+ <react_native_1.TouchableOpacity style={[
38
+ styles.button,
39
+ styles.dismissButton,
40
+ { borderColor: theme.colors.border || '#E0E0E0' },
41
+ ]} onPress={onDismiss} activeOpacity={0.7}>
42
+ <react_native_1.Text style={[styles.buttonText, { color: theme.colors.textSecondary }]}>
43
+ Dismiss
44
+ </react_native_1.Text>
45
+ </react_native_1.TouchableOpacity>
46
+
47
+ <react_native_1.TouchableOpacity style={[
48
+ styles.button,
49
+ styles.acceptButton,
50
+ { backgroundColor: theme.colors.primary },
51
+ ]} onPress={onAccept} activeOpacity={0.8}>
52
+ <react_native_1.Text style={[styles.buttonText, { color: '#FFFFFF' }]}>Go</react_native_1.Text>
53
+ </react_native_1.TouchableOpacity>
54
+ </react_native_1.View>
55
+ </react_native_1.View>);
56
+ }
57
+ const styles = react_native_1.StyleSheet.create({
58
+ container: {
59
+ flexDirection: 'row',
60
+ padding: 12,
61
+ borderRadius: 12,
62
+ borderWidth: 1,
63
+ marginHorizontal: 16,
64
+ marginVertical: 8,
65
+ alignItems: 'center',
66
+ },
67
+ iconContainer: {
68
+ width: 40,
69
+ height: 40,
70
+ borderRadius: 20,
71
+ justifyContent: 'center',
72
+ alignItems: 'center',
73
+ marginRight: 12,
74
+ },
75
+ icon: {
76
+ fontSize: 24,
77
+ },
78
+ content: {
79
+ flex: 1,
80
+ marginRight: 8,
81
+ },
82
+ title: {
83
+ fontSize: 15,
84
+ fontWeight: '600',
85
+ marginBottom: 4,
86
+ },
87
+ message: {
88
+ fontSize: 13,
89
+ marginBottom: 2,
90
+ },
91
+ confidence: {
92
+ fontSize: 11,
93
+ marginTop: 2,
94
+ },
95
+ actions: {
96
+ flexDirection: 'row',
97
+ gap: 8,
98
+ },
99
+ button: {
100
+ paddingHorizontal: 16,
101
+ paddingVertical: 8,
102
+ borderRadius: 16,
103
+ minWidth: 60,
104
+ alignItems: 'center',
105
+ },
106
+ dismissButton: {
107
+ borderWidth: 1,
108
+ },
109
+ acceptButton: {
110
+ // backgroundColor set from theme
111
+ },
112
+ buttonText: {
113
+ fontSize: 14,
114
+ fontWeight: '600',
115
+ },
116
+ });
117
+ //# sourceMappingURL=NavigationSuggestion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NavigationSuggestion.js","sourceRoot":"","sources":["../../src/components/NavigationSuggestion.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import type { Theme } from '../themes';
3
+ interface QuickReply {
4
+ id: string;
5
+ text: string;
6
+ payload?: string;
7
+ }
8
+ interface QuickRepliesProps {
9
+ replies: QuickReply[];
10
+ onSelect: (reply: QuickReply) => void;
11
+ theme: Theme;
12
+ }
13
+ export declare function QuickReplies({ replies, onSelect, theme }: QuickRepliesProps): React.JSX.Element | null;
14
+ export {};
15
+ //# sourceMappingURL=QuickReplies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuickReplies.d.ts","sourceRoot":"","sources":["../../src/components/QuickReplies.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAQ1B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAEvC,UAAU,UAAU;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,iBAAiB;IACzB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC,KAAK,EAAE,KAAK,CAAC;CACd;AAED,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,iBAAiB,4BAoC3E"}
@@ -0,0 +1,49 @@
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.QuickReplies = QuickReplies;
7
+ const react_1 = __importDefault(require("react"));
8
+ const react_native_1 = require("react-native");
9
+ function QuickReplies({ replies, onSelect, theme }) {
10
+ if (!replies || replies.length === 0) {
11
+ return null;
12
+ }
13
+ return (<react_native_1.View style={[styles.container, { backgroundColor: theme.colors.background }]}>
14
+ <react_native_1.ScrollView horizontal showsHorizontalScrollIndicator={false} contentContainerStyle={styles.scrollContent}>
15
+ {replies.map((reply) => (<react_native_1.TouchableOpacity key={reply.id} style={[
16
+ styles.button,
17
+ {
18
+ backgroundColor: theme.colors.surface,
19
+ borderColor: theme.colors.primary,
20
+ },
21
+ ]} onPress={() => onSelect(reply)} activeOpacity={0.7}>
22
+ <react_native_1.Text style={[styles.text, { color: theme.colors.primary }]} numberOfLines={1}>
23
+ {reply.text}
24
+ </react_native_1.Text>
25
+ </react_native_1.TouchableOpacity>))}
26
+ </react_native_1.ScrollView>
27
+ </react_native_1.View>);
28
+ }
29
+ const styles = react_native_1.StyleSheet.create({
30
+ container: {
31
+ paddingVertical: 8,
32
+ },
33
+ scrollContent: {
34
+ paddingHorizontal: 16,
35
+ gap: 8,
36
+ },
37
+ button: {
38
+ paddingHorizontal: 16,
39
+ paddingVertical: 10,
40
+ borderRadius: 20,
41
+ borderWidth: 1,
42
+ maxWidth: 200,
43
+ },
44
+ text: {
45
+ fontSize: 14,
46
+ fontWeight: '500',
47
+ },
48
+ });
49
+ //# sourceMappingURL=QuickReplies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuickReplies.js","sourceRoot":"","sources":["../../src/components/QuickReplies.tsx"],"names":[],"mappings":";;;;;AAsBA,oCAoCC;AA1DD,kDAA0B;AAC1B,+CAMsB;AAetB,SAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAqB;IAC1E,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CACL,CAAC,mBAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAC5E;MAAA,CAAC,yBAAU,CACT,UAAU,CACV,8BAA8B,CAAC,CAAC,KAAK,CAAC,CACtC,qBAAqB,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAE5C;QAAA,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACtB,CAAC,+BAAgB,CACf,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CACd,KAAK,CAAC,CAAC;gBACL,MAAM,CAAC,MAAM;gBACb;oBACE,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;oBACrC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO;iBAClC;aACF,CAAC,CACF,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAC/B,aAAa,CAAC,CAAC,GAAG,CAAC,CAEnB;YAAA,CAAC,mBAAI,CACH,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CACtD,aAAa,CAAC,CAAC,CAAC,CAAC,CAEjB;cAAA,CAAC,KAAK,CAAC,IAAI,CACb;YAAA,EAAE,mBAAI,CACR;UAAA,EAAE,+BAAgB,CAAC,CACpB,CAAC,CACJ;MAAA,EAAE,yBAAU,CACd;IAAA,EAAE,mBAAI,CAAC,CACR,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,yBAAU,CAAC,MAAM,CAAC;IAC/B,SAAS,EAAE;QACT,eAAe,EAAE,CAAC;KACnB;IACD,aAAa,EAAE;QACb,iBAAiB,EAAE,EAAE;QACrB,GAAG,EAAE,CAAC;KACP;IACD,MAAM,EAAE;QACN,iBAAiB,EAAE,EAAE;QACrB,eAAe,EAAE,EAAE;QACnB,YAAY,EAAE,EAAE;QAChB,WAAW,EAAE,CAAC;QACd,QAAQ,EAAE,GAAG;KACd;IACD,IAAI,EAAE;QACJ,QAAQ,EAAE,EAAE;QACZ,UAAU,EAAE,KAAK;KAClB;CACF,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { Theme } from '../themes/types';
3
+ import { ComponentTemplate } from '../types/template';
4
+ export interface TemplateRendererProps {
5
+ template: ComponentTemplate;
6
+ data: any;
7
+ theme: Theme;
8
+ onAction?: (action: any) => void;
9
+ }
10
+ /**
11
+ * TemplateRenderer
12
+ *
13
+ * Renders custom components from JSON templates without code execution.
14
+ * Supports various field types and base templates.
15
+ */
16
+ export declare const TemplateRenderer: React.FC<TemplateRendererProps>;
17
+ //# sourceMappingURL=TemplateRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateRenderer.d.ts","sourceRoot":"","sources":["../../src/components/TemplateRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EACL,iBAAiB,EAUlB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,IAAI,EAAE,GAAG,CAAC;IACV,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;CAClC;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CA0c5D,CAAC"}