@mobileai/react-native 0.9.17 → 0.9.19

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 (292) hide show
  1. package/LICENSE +28 -20
  2. package/MobileAIFloatingOverlay.podspec +25 -0
  3. package/android/build.gradle +61 -0
  4. package/android/src/main/AndroidManifest.xml +3 -0
  5. package/android/src/main/java/com/mobileai/overlay/FloatingOverlayView.kt +151 -0
  6. package/android/src/main/java/com/mobileai/overlay/MobileAIOverlayPackage.kt +23 -0
  7. package/android/src/newarch/com/mobileai/overlay/FloatingOverlayViewManager.kt +45 -0
  8. package/android/src/oldarch/com/mobileai/overlay/FloatingOverlayViewManager.kt +29 -0
  9. package/ios/MobileAIFloatingOverlayComponentView.mm +73 -0
  10. package/lib/module/components/AIAgent.js +902 -136
  11. package/lib/module/components/AIConsentDialog.js +439 -0
  12. package/lib/module/components/AgentChatBar.js +828 -134
  13. package/lib/module/components/AgentOverlay.js +2 -1
  14. package/lib/module/components/DiscoveryTooltip.js +21 -9
  15. package/lib/module/components/FloatingOverlayWrapper.js +108 -0
  16. package/lib/module/components/Icons.js +123 -0
  17. package/lib/module/config/endpoints.js +12 -2
  18. package/lib/module/core/AgentRuntime.js +373 -27
  19. package/lib/module/core/FiberAdapter.js +56 -0
  20. package/lib/module/core/FiberTreeWalker.js +186 -80
  21. package/lib/module/core/IdleDetector.js +19 -0
  22. package/lib/module/core/NativeAlertInterceptor.js +191 -0
  23. package/lib/module/core/systemPrompt.js +203 -45
  24. package/lib/module/index.js +3 -0
  25. package/lib/module/providers/GeminiProvider.js +72 -56
  26. package/lib/module/providers/ProviderFactory.js +6 -2
  27. package/lib/module/services/AudioInputService.js +3 -12
  28. package/lib/module/services/AudioOutputService.js +1 -13
  29. package/lib/module/services/ConversationService.js +166 -0
  30. package/lib/module/services/MobileAIKnowledgeRetriever.js +41 -0
  31. package/lib/module/services/VoiceService.js +29 -8
  32. package/lib/module/services/telemetry/MobileAI.js +44 -0
  33. package/lib/module/services/telemetry/TelemetryService.js +13 -1
  34. package/lib/module/services/telemetry/TouchAutoCapture.js +44 -18
  35. package/lib/module/specs/FloatingOverlayNativeComponent.ts +19 -0
  36. package/lib/module/support/CSATSurvey.js +95 -12
  37. package/lib/module/support/EscalationSocket.js +70 -1
  38. package/lib/module/support/ReportedIssueEventSource.js +148 -0
  39. package/lib/module/support/escalateTool.js +4 -2
  40. package/lib/module/support/index.js +1 -0
  41. package/lib/module/support/reportIssueTool.js +127 -0
  42. package/lib/module/support/supportPrompt.js +77 -9
  43. package/lib/module/tools/guideTool.js +2 -1
  44. package/lib/module/tools/longPressTool.js +4 -3
  45. package/lib/module/tools/pickerTool.js +6 -4
  46. package/lib/module/tools/tapTool.js +12 -3
  47. package/lib/module/tools/typeTool.js +19 -10
  48. package/lib/module/utils/logger.js +175 -6
  49. package/lib/typescript/react-native.config.d.ts +11 -0
  50. package/lib/typescript/src/components/AIAgent.d.ts +28 -2
  51. package/lib/typescript/src/components/AIConsentDialog.d.ts +153 -0
  52. package/lib/typescript/src/components/AgentChatBar.d.ts +15 -2
  53. package/lib/typescript/src/components/DiscoveryTooltip.d.ts +3 -1
  54. package/lib/typescript/src/components/FloatingOverlayWrapper.d.ts +51 -0
  55. package/lib/typescript/src/components/Icons.d.ts +8 -0
  56. package/lib/typescript/src/config/endpoints.d.ts +5 -3
  57. package/lib/typescript/src/core/AgentRuntime.d.ts +4 -0
  58. package/lib/typescript/src/core/FiberAdapter.d.ts +25 -0
  59. package/lib/typescript/src/core/FiberTreeWalker.d.ts +2 -0
  60. package/lib/typescript/src/core/IdleDetector.d.ts +11 -0
  61. package/lib/typescript/src/core/NativeAlertInterceptor.d.ts +55 -0
  62. package/lib/typescript/src/core/types.d.ts +106 -1
  63. package/lib/typescript/src/index.d.ts +9 -4
  64. package/lib/typescript/src/providers/GeminiProvider.d.ts +6 -5
  65. package/lib/typescript/src/services/ConversationService.d.ts +55 -0
  66. package/lib/typescript/src/services/MobileAIKnowledgeRetriever.d.ts +9 -0
  67. package/lib/typescript/src/services/telemetry/MobileAI.d.ts +7 -0
  68. package/lib/typescript/src/services/telemetry/TelemetryService.d.ts +1 -1
  69. package/lib/typescript/src/services/telemetry/TouchAutoCapture.d.ts +9 -6
  70. package/lib/typescript/src/services/telemetry/types.d.ts +3 -1
  71. package/lib/typescript/src/specs/FloatingOverlayNativeComponent.d.ts +17 -0
  72. package/lib/typescript/src/support/EscalationSocket.d.ts +17 -0
  73. package/lib/typescript/src/support/ReportedIssueEventSource.d.ts +24 -0
  74. package/lib/typescript/src/support/escalateTool.d.ts +5 -0
  75. package/lib/typescript/src/support/index.d.ts +2 -1
  76. package/lib/typescript/src/support/reportIssueTool.d.ts +20 -0
  77. package/lib/typescript/src/support/types.d.ts +56 -1
  78. package/lib/typescript/src/utils/logger.d.ts +15 -0
  79. package/package.json +20 -9
  80. package/react-native.config.js +12 -0
  81. package/lib/module/__cli_tmp__.js.map +0 -1
  82. package/lib/module/components/AIAgent.js.map +0 -1
  83. package/lib/module/components/AIZone.js.map +0 -1
  84. package/lib/module/components/AgentChatBar.js.map +0 -1
  85. package/lib/module/components/AgentErrorBoundary.js.map +0 -1
  86. package/lib/module/components/AgentOverlay.js.map +0 -1
  87. package/lib/module/components/DiscoveryTooltip.js.map +0 -1
  88. package/lib/module/components/HighlightOverlay.js.map +0 -1
  89. package/lib/module/components/Icons.js.map +0 -1
  90. package/lib/module/components/ProactiveHint.js.map +0 -1
  91. package/lib/module/components/cards/InfoCard.js.map +0 -1
  92. package/lib/module/components/cards/ReviewSummary.js.map +0 -1
  93. package/lib/module/config/endpoints.js.map +0 -1
  94. package/lib/module/core/ActionRegistry.js.map +0 -1
  95. package/lib/module/core/AgentRuntime.js.map +0 -1
  96. package/lib/module/core/FiberTreeWalker.js.map +0 -1
  97. package/lib/module/core/IdleDetector.js.map +0 -1
  98. package/lib/module/core/MCPBridge.js.map +0 -1
  99. package/lib/module/core/ScreenDehydrator.js.map +0 -1
  100. package/lib/module/core/ZoneRegistry.js.map +0 -1
  101. package/lib/module/core/systemPrompt.js.map +0 -1
  102. package/lib/module/core/types.js.map +0 -1
  103. package/lib/module/hooks/useAction.js.map +0 -1
  104. package/lib/module/index.js.map +0 -1
  105. package/lib/module/plugin/withAppIntents.js.map +0 -1
  106. package/lib/module/providers/GeminiProvider.js.map +0 -1
  107. package/lib/module/providers/OpenAIProvider.js.map +0 -1
  108. package/lib/module/providers/ProviderFactory.js.map +0 -1
  109. package/lib/module/services/AudioInputService.js.map +0 -1
  110. package/lib/module/services/AudioOutputService.js.map +0 -1
  111. package/lib/module/services/KnowledgeBaseService.js.map +0 -1
  112. package/lib/module/services/VoiceService.js.map +0 -1
  113. package/lib/module/services/flags/FlagService.js.map +0 -1
  114. package/lib/module/services/telemetry/MobileAI.js.map +0 -1
  115. package/lib/module/services/telemetry/PiiScrubber.js.map +0 -1
  116. package/lib/module/services/telemetry/TelemetryService.js.map +0 -1
  117. package/lib/module/services/telemetry/TouchAutoCapture.js.map +0 -1
  118. package/lib/module/services/telemetry/device.js.map +0 -1
  119. package/lib/module/services/telemetry/deviceMetadata.js.map +0 -1
  120. package/lib/module/services/telemetry/index.js.map +0 -1
  121. package/lib/module/services/telemetry/types.js.map +0 -1
  122. package/lib/module/support/CSATSurvey.js.map +0 -1
  123. package/lib/module/support/EscalationEventSource.js.map +0 -1
  124. package/lib/module/support/EscalationSocket.js.map +0 -1
  125. package/lib/module/support/SupportChatModal.js.map +0 -1
  126. package/lib/module/support/SupportGreeting.js.map +0 -1
  127. package/lib/module/support/TicketStore.js.map +0 -1
  128. package/lib/module/support/escalateTool.js.map +0 -1
  129. package/lib/module/support/index.js.map +0 -1
  130. package/lib/module/support/supportPrompt.js.map +0 -1
  131. package/lib/module/support/types.js.map +0 -1
  132. package/lib/module/tools/datePickerTool.js.map +0 -1
  133. package/lib/module/tools/guideTool.js.map +0 -1
  134. package/lib/module/tools/index.js.map +0 -1
  135. package/lib/module/tools/keyboardTool.js.map +0 -1
  136. package/lib/module/tools/longPressTool.js.map +0 -1
  137. package/lib/module/tools/pickerTool.js.map +0 -1
  138. package/lib/module/tools/restoreTool.js.map +0 -1
  139. package/lib/module/tools/scrollTool.js.map +0 -1
  140. package/lib/module/tools/simplifyTool.js.map +0 -1
  141. package/lib/module/tools/sliderTool.js.map +0 -1
  142. package/lib/module/tools/tapTool.js.map +0 -1
  143. package/lib/module/tools/typeTool.js.map +0 -1
  144. package/lib/module/tools/types.js.map +0 -1
  145. package/lib/module/types/jsx.d.js.map +0 -1
  146. package/lib/module/utils/audioUtils.js.map +0 -1
  147. package/lib/module/utils/logger.js.map +0 -1
  148. package/lib/typescript/babel.config.d.ts.map +0 -1
  149. package/lib/typescript/bin/generate-map.d.cts.map +0 -1
  150. package/lib/typescript/eslint.config.d.mts.map +0 -1
  151. package/lib/typescript/generate-map.d.ts.map +0 -1
  152. package/lib/typescript/src/__cli_tmp__.d.ts.map +0 -1
  153. package/lib/typescript/src/components/AIAgent.d.ts.map +0 -1
  154. package/lib/typescript/src/components/AIZone.d.ts.map +0 -1
  155. package/lib/typescript/src/components/AgentChatBar.d.ts.map +0 -1
  156. package/lib/typescript/src/components/AgentErrorBoundary.d.ts.map +0 -1
  157. package/lib/typescript/src/components/AgentOverlay.d.ts.map +0 -1
  158. package/lib/typescript/src/components/DiscoveryTooltip.d.ts.map +0 -1
  159. package/lib/typescript/src/components/HighlightOverlay.d.ts.map +0 -1
  160. package/lib/typescript/src/components/Icons.d.ts.map +0 -1
  161. package/lib/typescript/src/components/ProactiveHint.d.ts.map +0 -1
  162. package/lib/typescript/src/components/cards/InfoCard.d.ts.map +0 -1
  163. package/lib/typescript/src/components/cards/ReviewSummary.d.ts.map +0 -1
  164. package/lib/typescript/src/config/endpoints.d.ts.map +0 -1
  165. package/lib/typescript/src/core/ActionRegistry.d.ts.map +0 -1
  166. package/lib/typescript/src/core/AgentRuntime.d.ts.map +0 -1
  167. package/lib/typescript/src/core/FiberTreeWalker.d.ts.map +0 -1
  168. package/lib/typescript/src/core/IdleDetector.d.ts.map +0 -1
  169. package/lib/typescript/src/core/MCPBridge.d.ts.map +0 -1
  170. package/lib/typescript/src/core/ScreenDehydrator.d.ts.map +0 -1
  171. package/lib/typescript/src/core/ZoneRegistry.d.ts.map +0 -1
  172. package/lib/typescript/src/core/systemPrompt.d.ts.map +0 -1
  173. package/lib/typescript/src/core/types.d.ts.map +0 -1
  174. package/lib/typescript/src/hooks/useAction.d.ts.map +0 -1
  175. package/lib/typescript/src/index.d.ts.map +0 -1
  176. package/lib/typescript/src/plugin/withAppIntents.d.ts.map +0 -1
  177. package/lib/typescript/src/providers/GeminiProvider.d.ts.map +0 -1
  178. package/lib/typescript/src/providers/OpenAIProvider.d.ts.map +0 -1
  179. package/lib/typescript/src/providers/ProviderFactory.d.ts.map +0 -1
  180. package/lib/typescript/src/services/AudioInputService.d.ts.map +0 -1
  181. package/lib/typescript/src/services/AudioOutputService.d.ts.map +0 -1
  182. package/lib/typescript/src/services/KnowledgeBaseService.d.ts.map +0 -1
  183. package/lib/typescript/src/services/VoiceService.d.ts.map +0 -1
  184. package/lib/typescript/src/services/flags/FlagService.d.ts.map +0 -1
  185. package/lib/typescript/src/services/telemetry/MobileAI.d.ts.map +0 -1
  186. package/lib/typescript/src/services/telemetry/PiiScrubber.d.ts.map +0 -1
  187. package/lib/typescript/src/services/telemetry/TelemetryService.d.ts.map +0 -1
  188. package/lib/typescript/src/services/telemetry/TouchAutoCapture.d.ts.map +0 -1
  189. package/lib/typescript/src/services/telemetry/device.d.ts.map +0 -1
  190. package/lib/typescript/src/services/telemetry/deviceMetadata.d.ts.map +0 -1
  191. package/lib/typescript/src/services/telemetry/index.d.ts.map +0 -1
  192. package/lib/typescript/src/services/telemetry/types.d.ts.map +0 -1
  193. package/lib/typescript/src/support/CSATSurvey.d.ts.map +0 -1
  194. package/lib/typescript/src/support/EscalationEventSource.d.ts.map +0 -1
  195. package/lib/typescript/src/support/EscalationSocket.d.ts.map +0 -1
  196. package/lib/typescript/src/support/SupportChatModal.d.ts.map +0 -1
  197. package/lib/typescript/src/support/SupportGreeting.d.ts.map +0 -1
  198. package/lib/typescript/src/support/TicketStore.d.ts.map +0 -1
  199. package/lib/typescript/src/support/escalateTool.d.ts.map +0 -1
  200. package/lib/typescript/src/support/index.d.ts.map +0 -1
  201. package/lib/typescript/src/support/supportPrompt.d.ts.map +0 -1
  202. package/lib/typescript/src/support/types.d.ts.map +0 -1
  203. package/lib/typescript/src/tools/datePickerTool.d.ts.map +0 -1
  204. package/lib/typescript/src/tools/guideTool.d.ts.map +0 -1
  205. package/lib/typescript/src/tools/index.d.ts.map +0 -1
  206. package/lib/typescript/src/tools/keyboardTool.d.ts.map +0 -1
  207. package/lib/typescript/src/tools/longPressTool.d.ts.map +0 -1
  208. package/lib/typescript/src/tools/pickerTool.d.ts.map +0 -1
  209. package/lib/typescript/src/tools/restoreTool.d.ts.map +0 -1
  210. package/lib/typescript/src/tools/scrollTool.d.ts.map +0 -1
  211. package/lib/typescript/src/tools/simplifyTool.d.ts.map +0 -1
  212. package/lib/typescript/src/tools/sliderTool.d.ts.map +0 -1
  213. package/lib/typescript/src/tools/tapTool.d.ts.map +0 -1
  214. package/lib/typescript/src/tools/typeTool.d.ts.map +0 -1
  215. package/lib/typescript/src/tools/types.d.ts.map +0 -1
  216. package/lib/typescript/src/utils/audioUtils.d.ts.map +0 -1
  217. package/lib/typescript/src/utils/logger.d.ts.map +0 -1
  218. package/src/__cli_tmp__.tsx +0 -9
  219. package/src/cli/analyzers/chain-analyzer.ts +0 -183
  220. package/src/cli/extractors/ai-extractor.ts +0 -6
  221. package/src/cli/extractors/ast-extractor.ts +0 -551
  222. package/src/cli/generate-intents.ts +0 -140
  223. package/src/cli/generate-map.ts +0 -121
  224. package/src/cli/generate-swift.ts +0 -116
  225. package/src/cli/scanners/expo-scanner.ts +0 -203
  226. package/src/cli/scanners/rn-scanner.ts +0 -445
  227. package/src/components/AIAgent.tsx +0 -1716
  228. package/src/components/AIZone.tsx +0 -147
  229. package/src/components/AgentChatBar.tsx +0 -1143
  230. package/src/components/AgentErrorBoundary.tsx +0 -78
  231. package/src/components/AgentOverlay.tsx +0 -73
  232. package/src/components/DiscoveryTooltip.tsx +0 -148
  233. package/src/components/HighlightOverlay.tsx +0 -136
  234. package/src/components/Icons.tsx +0 -253
  235. package/src/components/ProactiveHint.tsx +0 -145
  236. package/src/components/cards/InfoCard.tsx +0 -58
  237. package/src/components/cards/ReviewSummary.tsx +0 -76
  238. package/src/config/endpoints.ts +0 -22
  239. package/src/core/ActionRegistry.ts +0 -105
  240. package/src/core/AgentRuntime.ts +0 -1471
  241. package/src/core/FiberTreeWalker.ts +0 -930
  242. package/src/core/IdleDetector.ts +0 -72
  243. package/src/core/MCPBridge.ts +0 -163
  244. package/src/core/ScreenDehydrator.ts +0 -53
  245. package/src/core/ZoneRegistry.ts +0 -44
  246. package/src/core/systemPrompt.ts +0 -431
  247. package/src/core/types.ts +0 -521
  248. package/src/hooks/useAction.ts +0 -182
  249. package/src/index.ts +0 -83
  250. package/src/plugin/withAppIntents.ts +0 -98
  251. package/src/providers/GeminiProvider.ts +0 -357
  252. package/src/providers/OpenAIProvider.ts +0 -379
  253. package/src/providers/ProviderFactory.ts +0 -36
  254. package/src/services/AudioInputService.ts +0 -226
  255. package/src/services/AudioOutputService.ts +0 -236
  256. package/src/services/KnowledgeBaseService.ts +0 -156
  257. package/src/services/VoiceService.ts +0 -451
  258. package/src/services/flags/FlagService.ts +0 -137
  259. package/src/services/telemetry/MobileAI.ts +0 -66
  260. package/src/services/telemetry/PiiScrubber.ts +0 -17
  261. package/src/services/telemetry/TelemetryService.ts +0 -323
  262. package/src/services/telemetry/TouchAutoCapture.ts +0 -165
  263. package/src/services/telemetry/device.ts +0 -93
  264. package/src/services/telemetry/deviceMetadata.ts +0 -13
  265. package/src/services/telemetry/index.ts +0 -13
  266. package/src/services/telemetry/types.ts +0 -75
  267. package/src/support/CSATSurvey.tsx +0 -304
  268. package/src/support/EscalationEventSource.ts +0 -190
  269. package/src/support/EscalationSocket.ts +0 -152
  270. package/src/support/SupportChatModal.tsx +0 -563
  271. package/src/support/SupportGreeting.tsx +0 -161
  272. package/src/support/TicketStore.ts +0 -100
  273. package/src/support/escalateTool.ts +0 -174
  274. package/src/support/index.ts +0 -29
  275. package/src/support/supportPrompt.ts +0 -55
  276. package/src/support/types.ts +0 -155
  277. package/src/tools/datePickerTool.ts +0 -60
  278. package/src/tools/guideTool.ts +0 -76
  279. package/src/tools/index.ts +0 -20
  280. package/src/tools/keyboardTool.ts +0 -30
  281. package/src/tools/longPressTool.ts +0 -61
  282. package/src/tools/pickerTool.ts +0 -115
  283. package/src/tools/restoreTool.ts +0 -33
  284. package/src/tools/scrollTool.ts +0 -156
  285. package/src/tools/simplifyTool.ts +0 -33
  286. package/src/tools/sliderTool.ts +0 -65
  287. package/src/tools/tapTool.ts +0 -93
  288. package/src/tools/typeTool.ts +0 -113
  289. package/src/tools/types.ts +0 -58
  290. package/src/types/jsx.d.ts +0 -20
  291. package/src/utils/audioUtils.ts +0 -54
  292. package/src/utils/logger.ts +0 -38
@@ -1,72 +0,0 @@
1
- export interface IdleDetectorConfig {
2
- /** Time in ms before the agent pulses subtly (e.g. 120_000 for 2m) */
3
- pulseAfterMs: number;
4
- /** Time in ms before the agent shows a badge (e.g. 240_000 for 4m) */
5
- badgeAfterMs: number;
6
- /** Callback fired when the user is idle enough for a subtle pulse */
7
- onPulse: () => void;
8
- /** Callback fired when the user is idle enough for a proactive badge. Receives the context suggestion. */
9
- onBadge: (suggestion: string) => void;
10
- /** Callback fired when the user interacts, cancelling idle states */
11
- onReset: () => void;
12
- /** Dynamic context suggestion generator based on current screen */
13
- generateSuggestion?: () => string;
14
- }
15
-
16
- export class IdleDetector {
17
- private pulseTimer: ReturnType<typeof setTimeout> | null = null;
18
- private badgeTimer: ReturnType<typeof setTimeout> | null = null;
19
- private dismissed = false;
20
- private config: IdleDetectorConfig | null = null;
21
-
22
- start(config: IdleDetectorConfig): void {
23
- this.config = config;
24
- this.dismissed = false;
25
- this.resetTimers();
26
- }
27
-
28
- reset(): void {
29
- if (!this.config || this.dismissed) return;
30
- this.config.onReset();
31
- this.resetTimers();
32
- }
33
-
34
- dismiss(): void {
35
- this.dismissed = true;
36
- this.clearTimers();
37
- if (this.config) {
38
- this.config.onReset();
39
- }
40
- }
41
-
42
- destroy(): void {
43
- this.clearTimers();
44
- this.config = null;
45
- }
46
-
47
- private resetTimers(): void {
48
- this.clearTimers();
49
-
50
- if (!this.config || this.dismissed) return;
51
-
52
- this.pulseTimer = setTimeout(() => {
53
- this.config?.onPulse();
54
- }, this.config.pulseAfterMs);
55
-
56
- this.badgeTimer = setTimeout(() => {
57
- const suggestion = this.config?.generateSuggestion?.() ?? "Need help with this screen?";
58
- this.config?.onBadge(suggestion);
59
- }, this.config.badgeAfterMs);
60
- }
61
-
62
- private clearTimers(): void {
63
- if (this.pulseTimer) {
64
- clearTimeout(this.pulseTimer);
65
- this.pulseTimer = null;
66
- }
67
- if (this.badgeTimer) {
68
- clearTimeout(this.badgeTimer);
69
- this.badgeTimer = null;
70
- }
71
- }
72
- }
@@ -1,163 +0,0 @@
1
- /**
2
- * MCPBridge — Connects the React Native app to the local MCP Server bridge.
3
- *
4
- * Flow:
5
- * - Connects via WebSocket to the Node.js MCP server
6
- * - Listens for 'request' messages containing an MCP command
7
- * - Forwards the command to AgentRuntime.execute()
8
- * - Sends the ExecutionResult back via WebSocket as a 'response'
9
- */
10
-
11
- import { logger } from '../utils/logger';
12
- import type { AgentRuntime } from './AgentRuntime';
13
-
14
- export class MCPBridge {
15
- private url: string;
16
- private ws: WebSocket | null = null;
17
- private runtime: AgentRuntime;
18
- private reconnectTimer: ReturnType<typeof setTimeout> | null = null;
19
- private isDestroyed = false;
20
-
21
- constructor(url: string, runtime: AgentRuntime) {
22
- this.url = url;
23
- this.runtime = runtime;
24
- this.connect();
25
- }
26
-
27
- private connect() {
28
- if (this.isDestroyed) return;
29
-
30
- logger.info('MCPBridge', `Connecting to MCP bridge at ${this.url}...`);
31
- this.ws = new WebSocket(this.url);
32
-
33
- this.ws.onopen = () => {
34
- logger.info('MCPBridge', '✅ Connected to MCP bridge.');
35
- if (this.reconnectTimer) {
36
- clearTimeout(this.reconnectTimer);
37
- this.reconnectTimer = null;
38
- }
39
- };
40
-
41
- this.ws.onmessage = async (event) => {
42
- try {
43
- const data = JSON.parse(event.data);
44
- const serverMode = this.runtime.getConfig().mcpServerMode ?? 'auto';
45
- const serverEnabled = serverMode === 'enabled' || (serverMode !== 'disabled' && __DEV__);
46
-
47
- switch (data.type) {
48
- case 'request': {
49
- if (!data.command || !data.requestId) return;
50
- logger.info('MCPBridge', `Received task from MCP: "${data.command}"`);
51
-
52
- if (this.runtime.getIsRunning()) {
53
- this.sendResponse(data.requestId, {
54
- success: false,
55
- message: 'Agent is already running a task. Please wait.',
56
- steps: [],
57
- });
58
- return;
59
- }
60
-
61
- // Execute the task using the SDK's existing runtime loop
62
- const result = await this.runtime.execute(data.command);
63
-
64
- // Send result back to MCP server
65
- this.sendResponse(data.requestId, result);
66
- break;
67
- }
68
-
69
- case 'tools/list': {
70
- if (!serverEnabled) {
71
- this.sendResponse(data.requestId, { error: 'MCP server mode is disabled.' });
72
- break;
73
- }
74
-
75
- const tools = this.runtime.getTools().map(t => ({
76
- name: t.name,
77
- description: t.description,
78
- inputSchema: {
79
- type: 'object',
80
- properties: t.parameters || {},
81
- required: Object.entries(t.parameters || {})
82
- .filter(([_, p]: [string, any]) => p.required !== false)
83
- .map(([k]) => k),
84
- }
85
- }));
86
-
87
- this.sendResponse(data.requestId, { tools });
88
- break;
89
- }
90
-
91
- case 'tools/call': {
92
- if (!serverEnabled) {
93
- this.sendResponse(data.requestId, { error: 'MCP server mode is disabled.' });
94
- break;
95
- }
96
- try {
97
- const result = await this.runtime.executeTool(data.name, data.arguments || {});
98
- this.sendResponse(data.requestId, { result });
99
- } catch (err: any) {
100
- this.sendResponse(data.requestId, { error: err.message });
101
- }
102
- break;
103
- }
104
-
105
- case 'screen/state': {
106
- if (!serverEnabled) {
107
- this.sendResponse(data.requestId, { error: 'MCP server mode is disabled.' });
108
- break;
109
- }
110
- const screen = this.runtime.getScreenContext();
111
- this.sendResponse(data.requestId, { screen });
112
- break;
113
- }
114
- }
115
- } catch (err) {
116
- logger.error('MCPBridge', 'Error handling message:', err);
117
- }
118
- };
119
-
120
- this.ws.onclose = () => {
121
- if (!this.isDestroyed) {
122
- logger.warn('MCPBridge', 'Disconnected from MCP bridge. Reconnecting in 5s...');
123
- this.ws = null;
124
- this.scheduleReconnect();
125
- }
126
- };
127
-
128
- this.ws.onerror = (e) => {
129
- logger.warn('MCPBridge', 'WebSocket error:', e);
130
- // onclose will handle reconnect
131
- };
132
- }
133
-
134
- private sendResponse(requestId: string, payload: any) {
135
- if (this.ws && this.ws.readyState === WebSocket.OPEN) {
136
- this.ws.send(JSON.stringify({
137
- type: 'response',
138
- requestId,
139
- payload,
140
- }));
141
- }
142
- }
143
-
144
- private scheduleReconnect() {
145
- if (!this.reconnectTimer) {
146
- this.reconnectTimer = setTimeout(() => {
147
- this.connect();
148
- }, 5000);
149
- }
150
- }
151
-
152
- public destroy() {
153
- this.isDestroyed = true;
154
- if (this.reconnectTimer) {
155
- clearTimeout(this.reconnectTimer);
156
- this.reconnectTimer = null;
157
- }
158
- if (this.ws) {
159
- this.ws.close();
160
- this.ws = null;
161
- }
162
- }
163
- }
@@ -1,53 +0,0 @@
1
- /**
2
- * ScreenDehydrator — Converts discovered interactive elements into
3
- * a text representation for the LLM.
4
- *
5
- * Output example:
6
- * ```
7
- * Screen: Home | Available screens: Home, Menu, Cart
8
- * Interactive elements:
9
- * [0]<pressable>🍕 Pizzas</>
10
- * [1]<pressable>🍔 Burgers</>
11
- * [2]<pressable>🥤 Drinks</>
12
- * [3]<pressable>🛒 View Cart</>
13
- * ```
14
- */
15
-
16
- import type { InteractiveElement, DehydratedScreen } from './types';
17
-
18
- /**
19
- * Dehydrate the current screen state into a text format for the LLM.
20
- */
21
- export function dehydrateScreen(
22
- screenName: string,
23
- availableScreens: string[],
24
- elementsText: string,
25
- elements: InteractiveElement[],
26
- ): DehydratedScreen {
27
- const lines: string[] = [];
28
-
29
- // Header
30
- lines.push(`Screen: ${screenName} | Available screens: ${availableScreens.join(', ')}`);
31
- lines.push('');
32
-
33
- if (!elementsText || elementsText.trim().length === 0) {
34
- if (elements.length === 0) {
35
- lines.push('No interactive elements or visible text detected on this screen.');
36
- } else {
37
- lines.push('Interactive elements:');
38
- lines.push(elementsText);
39
- }
40
- } else {
41
- lines.push('Screen Layout & Elements:');
42
- lines.push(elementsText);
43
- }
44
-
45
- const finalElementsText = lines.join('\n');
46
-
47
- return {
48
- screenName,
49
- availableScreens,
50
- elementsText: finalElementsText,
51
- elements,
52
- };
53
- }
@@ -1,44 +0,0 @@
1
- import React, { createContext } from 'react';
2
- import type { AIZoneConfig, RegisteredZone } from './types';
3
-
4
- export class ZoneRegistry {
5
- private zones = new Map<string, RegisteredZone>();
6
-
7
- register(config: AIZoneConfig, ref: React.RefObject<any>): void {
8
- if (this.zones.has(config.id)) {
9
- console.warn(`[MobileAI] Zone ID "${config.id}" is already registered on this screen. Overwriting.`);
10
- }
11
- this.zones.set(config.id, { ...config, ref });
12
- }
13
-
14
- unregister(id: string): void {
15
- this.zones.delete(id);
16
- }
17
-
18
- get(id: string): RegisteredZone | undefined {
19
- return this.zones.get(id);
20
- }
21
-
22
- getAll(): RegisteredZone[] {
23
- return Array.from(this.zones.values());
24
- }
25
-
26
- isActionAllowed(zoneId: string, action: 'highlight' | 'hint' | 'simplify' | 'card'): boolean {
27
- const zone = this.get(zoneId);
28
- if (!zone) return false;
29
-
30
- switch (action) {
31
- case 'highlight': return !!zone.allowHighlight;
32
- case 'hint': return !!zone.allowInjectHint;
33
- case 'simplify': return !!zone.allowSimplify;
34
- case 'card': return !!zone.allowInjectCard;
35
- default: return false;
36
- }
37
- }
38
- }
39
-
40
- // Global registry instance shared across the Agent session
41
- export const globalZoneRegistry = new ZoneRegistry();
42
-
43
- // Export context so AIZone components can register themselves
44
- export const ZoneRegistryContext = createContext<ZoneRegistry>(globalZoneRegistry);