@mobileai/react-native 0.9.4 → 0.9.9

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 (69) hide show
  1. package/README.md +73 -131
  2. package/ios/MobileAIPilotIntents.swift +51 -0
  3. package/lib/module/__cli_tmp__.js +21 -0
  4. package/lib/module/__cli_tmp__.js.map +1 -0
  5. package/lib/module/components/AIAgent.js.map +1 -1
  6. package/lib/module/components/AgentChatBar.js +2 -3
  7. package/lib/module/components/AgentChatBar.js.map +1 -1
  8. package/lib/module/components/HighlightOverlay.js +1 -0
  9. package/lib/module/components/HighlightOverlay.js.map +1 -1
  10. package/lib/module/core/ActionRegistry.js +102 -0
  11. package/lib/module/core/ActionRegistry.js.map +1 -0
  12. package/lib/module/core/AgentRuntime.js +25 -22
  13. package/lib/module/core/AgentRuntime.js.map +1 -1
  14. package/lib/module/core/MCPBridge.js +77 -14
  15. package/lib/module/core/MCPBridge.js.map +1 -1
  16. package/lib/module/hooks/useAction.js +47 -11
  17. package/lib/module/hooks/useAction.js.map +1 -1
  18. package/lib/module/index.js +3 -10
  19. package/lib/module/index.js.map +1 -1
  20. package/lib/module/plugin/withAppIntents.js +71 -0
  21. package/lib/module/plugin/withAppIntents.js.map +1 -0
  22. package/lib/module/services/AudioInputService.js +2 -2
  23. package/lib/module/services/AudioInputService.js.map +1 -1
  24. package/lib/module/services/AudioOutputService.js +3 -2
  25. package/lib/module/services/AudioOutputService.js.map +1 -1
  26. package/lib/module/tools/guideTool.js +11 -2
  27. package/lib/module/tools/guideTool.js.map +1 -1
  28. package/lib/module/tools/typeTool.js +53 -63
  29. package/lib/module/tools/typeTool.js.map +1 -1
  30. package/lib/typescript/src/__cli_tmp__.d.ts +2 -0
  31. package/lib/typescript/src/__cli_tmp__.d.ts.map +1 -0
  32. package/lib/typescript/src/components/AIAgent.d.ts +0 -3
  33. package/lib/typescript/src/components/AIAgent.d.ts.map +1 -1
  34. package/lib/typescript/src/components/AgentChatBar.d.ts.map +1 -1
  35. package/lib/typescript/src/core/ActionRegistry.d.ts +43 -0
  36. package/lib/typescript/src/core/ActionRegistry.d.ts.map +1 -0
  37. package/lib/typescript/src/core/AgentRuntime.d.ts +2 -4
  38. package/lib/typescript/src/core/AgentRuntime.d.ts.map +1 -1
  39. package/lib/typescript/src/core/MCPBridge.d.ts.map +1 -1
  40. package/lib/typescript/src/core/types.d.ts +20 -2
  41. package/lib/typescript/src/core/types.d.ts.map +1 -1
  42. package/lib/typescript/src/hooks/useAction.d.ts +34 -2
  43. package/lib/typescript/src/hooks/useAction.d.ts.map +1 -1
  44. package/lib/typescript/src/index.d.ts +3 -1
  45. package/lib/typescript/src/index.d.ts.map +1 -1
  46. package/lib/typescript/src/plugin/withAppIntents.d.ts +10 -0
  47. package/lib/typescript/src/plugin/withAppIntents.d.ts.map +1 -0
  48. package/lib/typescript/src/services/AudioOutputService.d.ts.map +1 -1
  49. package/lib/typescript/src/tools/guideTool.d.ts.map +1 -1
  50. package/lib/typescript/src/tools/typeTool.d.ts +9 -18
  51. package/lib/typescript/src/tools/typeTool.d.ts.map +1 -1
  52. package/package.json +4 -1
  53. package/src/__cli_tmp__.tsx +9 -0
  54. package/src/cli/generate-intents.ts +140 -0
  55. package/src/cli/generate-swift.ts +116 -0
  56. package/src/components/AIAgent.tsx +1 -4
  57. package/src/components/AgentChatBar.tsx +2 -3
  58. package/src/components/HighlightOverlay.tsx +1 -1
  59. package/src/core/ActionRegistry.ts +105 -0
  60. package/src/core/AgentRuntime.ts +23 -25
  61. package/src/core/MCPBridge.ts +68 -15
  62. package/src/core/types.ts +23 -2
  63. package/src/hooks/useAction.ts +51 -10
  64. package/src/index.ts +7 -9
  65. package/src/plugin/withAppIntents.ts +82 -0
  66. package/src/services/AudioInputService.ts +2 -2
  67. package/src/services/AudioOutputService.ts +3 -2
  68. package/src/tools/guideTool.ts +11 -2
  69. package/src/tools/typeTool.ts +55 -67
@@ -86,8 +86,16 @@ export interface AgentConfig {
86
86
  * Optional specific headers for voiceProxyUrl.
87
87
  */
88
88
  voiceProxyHeaders?: Record<string, string>;
89
- model?: string; /** Maximum steps per task */
89
+ model?: string;
90
+ /** Maximum steps per task */
90
91
  maxSteps?: number;
92
+ /**
93
+ * MCP server mode — controls whether external agents can discover and invoke actions.
94
+ * 'auto' (default): enabled in __DEV__, disabled in production
95
+ * 'enabled': always on (opt-in for production)
96
+ * 'disabled': always off
97
+ */
98
+ mcpServerMode?: 'auto' | 'enabled' | 'disabled';
91
99
  /**
92
100
  * React refs of elements the AI must NOT interact with.
93
101
  * Refs of elements the AI must NOT interact with.
@@ -228,10 +236,20 @@ export interface ToolParam {
228
236
  required?: boolean;
229
237
  enum?: string[];
230
238
  }
239
+ export interface ActionParameterDef {
240
+ /** The primitive type of the parameter. Maps to MCP schemas and native iOS/Android types. */
241
+ type: 'string' | 'number' | 'boolean';
242
+ /** A clear description of what the parameter is for (read by the AI). */
243
+ description: string;
244
+ /** Whether the AI must provide this parameter. Defaults to true. */
245
+ required?: boolean;
246
+ /** If provided, the AI is restricted to these specific string values. */
247
+ enum?: string[];
248
+ }
231
249
  export interface ActionDefinition {
232
250
  name: string;
233
251
  description: string;
234
- parameters: Record<string, string>;
252
+ parameters: Record<string, string | ActionParameterDef>;
235
253
  handler: (args: Record<string, any>) => any;
236
254
  }
237
255
  /** A single knowledge entry the AI can retrieve. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@
4
4
  *
5
5
  * Both hooks consume AgentContext, which is provided by <AIAgent>.
6
6
  */
7
+ import React from 'react';
7
8
  import type { AgentRuntime } from '../core/AgentRuntime';
8
9
  import type { ExecutionResult, AIMessage } from '../core/types';
9
10
  export interface AgentContextValue {
@@ -25,8 +26,39 @@ export interface AgentContextValue {
25
26
  /** Cancel the currently running task. */
26
27
  cancel: () => void;
27
28
  }
28
- export declare const AgentContext: import("react").Context<AgentContextValue>;
29
- export declare function useAction(name: string, description: string, parameters: Record<string, string>, handler: (args: Record<string, any>) => any): void;
29
+ export declare const AgentContext: React.Context<AgentContextValue>;
30
+ import type { ActionParameterDef } from '../core/types';
31
+ /**
32
+ * Register a non-UI action that the AI agent can call by name.
33
+ *
34
+ * The handler is always kept fresh via an internal ref — no stale closure bugs,
35
+ * even when it captures mutable state like cart contents or form values.
36
+ *
37
+ * The optional `deps` array controls when the action is *re-registered* (i.e. when
38
+ * `name`, `description`, or `parameters` need to change at runtime). You rarely
39
+ * need this — the handler is always up-to-date regardless.
40
+ *
41
+ * @example Basic (handler always fresh — no deps needed)
42
+ * ```tsx
43
+ * const { cart } = useCart();
44
+ * useAction('checkout', 'Place the order', {}, async () => {
45
+ * if (cart.length === 0) return { success: false, message: 'Cart is empty' };
46
+ * // cart is always current — no stale closure
47
+ * });
48
+ * ```
49
+ *
50
+ * @example Dynamic description (re-register when item count changes)
51
+ * ```tsx
52
+ * useAction(
53
+ * 'checkout',
54
+ * `Place the order (${cart.length} items in cart)`,
55
+ * {},
56
+ * handler,
57
+ * [cart.length], // re-register so the AI sees the updated description
58
+ * );
59
+ * ```
60
+ */
61
+ export declare function useAction(name: string, description: string, parameters: Record<string, string | ActionParameterDef>, handler: (args: Record<string, any>) => any, deps?: React.DependencyList): void;
30
62
  /**
31
63
  * Bridge hook — reads the parent <AIAgent>'s state.
32
64
  *
@@ -1 +1 @@
1
- {"version":3,"file":"useAction.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useAction.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAIhE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7B,yEAAyE;IACzE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5F,kFAAkF;IAClF,SAAS,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,yDAAyD;IACzD,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,sCAAsC;IACtC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,yCAAyC;IACzC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAaD,eAAO,MAAM,YAAY,4CAAoD,CAAC;AAI9E,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,GAAG,GAC1C,IAAI,CAkBN;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,KAAK,CAAC,OAAO,CAAC,EAAE;IAC9B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;CAC9C;IA2BG,sCAAsC;oBALL,MAAM;IAOvC,gDAAgD;;IAEhD,0DAA0D;;IAE1D,8CAA8C;;IAE9C,qCAAqC;;IAErC,sCAAsC;yBA7GnB,IAAI;IA+GvB,yFAAyF;kBA7G7E,IAAI;EAgHnB"}
1
+ {"version":3,"file":"useAction.d.ts","sourceRoot":"","sources":["../../../../src/hooks/useAction.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAoE,MAAM,OAAO,CAAC;AACzF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAIhE,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7B,yEAAyE;IACzE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;IAC5F,kFAAkF;IAClF,SAAS,EAAE,OAAO,CAAC;IACnB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,UAAU,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,yDAAyD;IACzD,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,sCAAsC;IACtC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,yCAAyC;IACzC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAaD,eAAO,MAAM,YAAY,kCAAoD,CAAC;AAG9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAAC,EACvD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,GAAG,EAC3C,IAAI,CAAC,EAAE,KAAK,CAAC,cAAc,GAC1B,IAAI,CA0BN;AAKD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,KAAK,CAAC,OAAO,CAAC,EAAE;IAC9B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;CAC9C;IA2BG,sCAAsC;oBALL,MAAM;IAOvC,gDAAgD;;IAEhD,0DAA0D;;IAE1D,8CAA8C;;IAE9C,qCAAqC;;IAErC,sCAAsC;yBAtJnB,IAAI;IAwJvB,yFAAyF;kBAtJ7E,IAAI;EAyJnB"}
@@ -16,9 +16,11 @@ export { VoiceService } from './services/VoiceService';
16
16
  export { AudioInputService } from './services/AudioInputService';
17
17
  export { AudioOutputService } from './services/AudioOutputService';
18
18
  export { KnowledgeBaseService } from './services/KnowledgeBaseService';
19
+ export { MobileAI } from './services/telemetry';
19
20
  export { logger } from './utils/logger';
20
21
  export type { AgentConfig, AgentMode, ExecutionResult, InteractiveElement, DehydratedScreen, ToolDefinition, ActionDefinition, TokenUsage, KnowledgeEntry, KnowledgeRetriever, KnowledgeBaseConfig, ChatBarTheme, AIMessage, AIProviderName, ScreenMap, ScreenMapEntry, } from './core/types';
21
22
  export type { VoiceServiceConfig, VoiceServiceCallbacks, VoiceStatus, } from './services/VoiceService';
22
- export { SupportGreeting, CSATSurvey, buildSupportPrompt, createEscalateTool } from './support';
23
+ export type { TelemetryConfig, TelemetryEvent, } from './services/telemetry';
24
+ export { SupportGreeting, CSATSurvey, buildSupportPrompt, createEscalateTool, EscalationSocket } from './support';
23
25
  export type { SupportModeConfig, QuickReply, EscalationConfig, EscalationContext, CSATConfig, CSATRating, BusinessHoursConfig, } from './support';
24
26
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAGjE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG7D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAOvE,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGxC,YAAY,EACV,WAAW,EACX,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,SAAS,EACT,cAAc,EACd,SAAS,EACT,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,GACZ,MAAM,yBAAyB,CAAC;AAYjC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAEhG,YAAY,EACV,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,mBAAmB,GACpB,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAG7C,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAGjE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG7D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAGvE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAGxC,YAAY,EACV,WAAW,EACX,SAAS,EACT,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,SAAS,EACT,cAAc,EACd,SAAS,EACT,cAAc,GACf,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,kBAAkB,EAClB,qBAAqB,EACrB,WAAW,GACZ,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EACV,eAAe,EACf,cAAc,GACf,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAElH,YAAY,EACV,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,mBAAmB,GACpB,MAAM,WAAW,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ConfigPlugin } from 'expo/config-plugins';
2
+ interface PluginOptions {
3
+ /** The source directory to scan for useAction calls. Defaults to 'src' */
4
+ scanDirectory?: string;
5
+ /** App scheme for deep links. Defaults to the scheme in app.json */
6
+ appScheme?: string;
7
+ }
8
+ declare const withAppIntents: ConfigPlugin<PluginOptions | void>;
9
+ export default withAppIntents;
10
+ //# sourceMappingURL=withAppIntents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withAppIntents.d.ts","sourceRoot":"","sources":["../../../../src/plugin/withAppIntents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAOxD,UAAU,aAAa;IACrB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oEAAoE;IACpE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,cAAc,EAAE,YAAY,CAAC,aAAa,GAAG,IAAI,CAiEtD,CAAC;AAEF,eAAe,cAAc,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"AudioOutputService.d.ts","sourceRoot":"","sources":["../../../../src/services/AudioOutputService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAID,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAK;gBAEX,MAAM,GAAE,iBAAsB;IAMpC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IA0EpC,uEAAuE;IACvE,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAwDlC,IAAI,IAAI,IAAI;IAQZ,MAAM,IAAI,IAAI;IAQd,IAAI,OAAO,IAAI,OAAO,CAErB;IAIK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAa/B"}
1
+ {"version":3,"file":"AudioOutputService.d.ts","sourceRoot":"","sources":["../../../../src/services/AudioOutputService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAWH,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAID,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAK;gBAEX,MAAM,GAAE,iBAAsB;IAMpC,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IA2EpC,uEAAuE;IACvE,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAwDlC,IAAI,IAAI,IAAI;IAQZ,MAAM,IAAI,IAAI;IAQd,IAAI,OAAO,IAAI,OAAO,CAErB;IAIK,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAa/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"guideTool.d.ts","sourceRoot":"","sources":["../../../../src/tools/guideTool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CA6DpE"}
1
+ {"version":3,"file":"guideTool.d.ts","sourceRoot":"","sources":["../../../../src/tools/guideTool.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C,wBAAgB,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAsEpE"}
@@ -1,26 +1,17 @@
1
1
  /**
2
2
  * Type Tool — Reliable multi-strategy text input.
3
3
  *
4
- * Strategy chain (tried in order, first success wins):
4
+ * For uncontrolled TextInputs (defaultValue, no onChangeText):
5
+ * 1. Walk fiber subtree (BFS) to find the native host view whose
6
+ * memoizedProps has `onChange` — this is RN's internal `_onChange`.
7
+ * 2. ALSO walk to find the native stateNode with `setNativeProps` to
8
+ * update the VISUAL text in the native view.
5
9
  *
6
- * 1. onChangeText developer's controlled component wired React state.
7
- * calls element.props.onChangeText(text) directly.
10
+ * Both steps are needed:
11
+ * - `onChange` updates React's internal lastNativeText state
12
+ * - `setNativeProps` → updates what the user sees on screen
8
13
  *
9
- * 2. Fiber subtree walk for uncontrolled TextInputs (defaultValue only).
10
- * React Native's TextInput.js always creates an internal `_onChange` handler
11
- * and passes it as `onChange` to the native host view (RCTTextInputView /
12
- * AndroidTextInput). That `_onChange` internally calls `props.onChangeText`
13
- * and updates native text state.
14
- *
15
- * We walk the fiber subtree (behavior-based, no tag numbers) to find any
16
- * descendant node whose memoizedProps.onChange is a function. Then we call
17
- * it with a synthetic TextInputChangeEvent. This triggers RN's internal
18
- * `_onChange` which calls `setLastNativeText` and updates the native view.
19
- *
20
- * Why this is robust:
21
- * - No hardcoded fiber tag numbers (host component tags can change across versions)
22
- * - No dependency on setNativeProps (deprecated in New Architecture / Fabric)
23
- * - Uses the same code path as a real user typing — RN's own _onChange handler
14
+ * No hardcoded fiber tag numbers. Detection is purely behavior-based.
24
15
  */
25
16
  import type { AgentTool, ToolContext } from './types';
26
17
  export declare function createTypeTool(context: ToolContext): AgentTool;
@@ -1 +1 @@
1
- {"version":3,"file":"typeTool.d.ts","sourceRoot":"","sources":["../../../../src/tools/typeTool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAkCtD,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CAgE9D"}
1
+ {"version":3,"file":"typeTool.d.ts","sourceRoot":"","sources":["../../../../src/tools/typeTool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAgBtD,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,CA+E9D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mobileai/react-native",
3
- "version": "0.9.4",
3
+ "version": "0.9.9",
4
4
  "description": "Build autonomous AI agents for React Native and Expo apps. Provides AI-native UI traversal, tool calling, and structured reasoning.",
5
5
  "main": "./lib/module/index.js",
6
6
  "source": "./src/index.ts",
@@ -169,6 +169,9 @@
169
169
  },
170
170
  "jest": {
171
171
  "preset": "react-native",
172
+ "setupFilesAfterEnv": [
173
+ "<rootDir>/src/__tests__/setup.ts"
174
+ ],
172
175
  "testMatch": [
173
176
  "**/?(*.)+(spec|test).[jt]s?(x)"
174
177
  ],
@@ -0,0 +1,9 @@
1
+ import { useAction } from './hooks/useAction';
2
+
3
+ export function CheckoutScreen() {
4
+ useAction('checkout_cart', 'Process checkout', {
5
+ amount: { type: 'number', description: 'Total amount' },
6
+ currency: { type: 'string', description: 'Currency code', enum: ['USD', 'EUR'] },
7
+ isExpress: { type: 'boolean', description: 'Express checkout' }
8
+ }, async () => {});
9
+ }
@@ -0,0 +1,140 @@
1
+ #!/usr/bin/env node
2
+
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ import { parse } from '@babel/parser';
6
+ import traverse from '@babel/traverse';
7
+ // @ts-ignore - no types installed
8
+ import glob from 'glob';
9
+
10
+ // Define the schema format for our extracted intents
11
+ export interface ExtractedIntent {
12
+ name: string;
13
+ description: string;
14
+ parameters: Record<string, any>;
15
+ sourceFile: string;
16
+ }
17
+
18
+ /**
19
+ * Validates and statically extracts `useAction` and `registerAction` definitions
20
+ * from a target directory by parsing the AST of all TS/JS files.
21
+ */
22
+ export function extractIntentsFromAST(sourceDir: string): ExtractedIntent[] {
23
+ const files = glob.sync(`${sourceDir}/**/*.{ts,tsx,js,jsx}`, {
24
+ ignore: ['**/node_modules/**', '**/*.d.ts', '**/__tests__/**']
25
+ });
26
+
27
+ const intents: ExtractedIntent[] = [];
28
+
29
+ for (const file of files) {
30
+ const code = fs.readFileSync(file, 'utf-8');
31
+
32
+ // Quick heuristic: ignore files that don't even talk about useAction
33
+ if (!code.includes('useAction') && !code.includes('registerAction')) {
34
+ continue;
35
+ }
36
+
37
+ try {
38
+ const ast = parse(code, {
39
+ sourceType: 'module',
40
+ plugins: ['jsx', 'typescript'],
41
+ });
42
+
43
+ traverse(ast, {
44
+ CallExpression(pathNode: any) {
45
+ const callee = pathNode.node.callee;
46
+ if (
47
+ callee.type === 'Identifier' &&
48
+ (callee.name === 'useAction' || callee.name === 'registerAction')
49
+ ) {
50
+ const args = pathNode.node.arguments;
51
+ if (args.length >= 2) {
52
+ const nameArg = args[0];
53
+ const descArg = args[1];
54
+ const schemaArg = args[2];
55
+
56
+ // We only process if name and desc are static string literals
57
+ if (nameArg.type === 'StringLiteral' && descArg.type === 'StringLiteral') {
58
+ const name = nameArg.value;
59
+ const description = descArg.value;
60
+ let parameters: Record<string, any> = {};
61
+
62
+ // Parse schema object if provided
63
+ if (schemaArg && schemaArg.type === 'ObjectExpression') {
64
+ parameters = parseObjectExpression(schemaArg);
65
+ }
66
+
67
+ intents.push({
68
+ name,
69
+ description,
70
+ parameters,
71
+ sourceFile: path.relative(process.cwd(), file)
72
+ });
73
+ }
74
+ }
75
+ }
76
+ }
77
+ });
78
+ } catch (error: any) {
79
+ console.warn(`[WARN] Skipping file ${file} due to parse error: ${error.message}`);
80
+ }
81
+ }
82
+
83
+ return intents;
84
+ }
85
+
86
+ /**
87
+ * Naively converts an AST ObjectExpression back to a JS Runtime object.
88
+ * Assumes the schema is statically defined (no variables/computed keys).
89
+ */
90
+ function parseObjectExpression(node: any): any {
91
+ const result: any = {};
92
+ for (const prop of node.properties) {
93
+ if (prop.type === 'ObjectProperty' && prop.key.type === 'Identifier') {
94
+ const key = prop.key.name;
95
+
96
+ if (prop.value.type === 'StringLiteral') {
97
+ result[key] = prop.value.value;
98
+ } else if (prop.value.type === 'NumericLiteral') {
99
+ result[key] = prop.value.value;
100
+ } else if (prop.value.type === 'BooleanLiteral') {
101
+ result[key] = prop.value.value;
102
+ } else if (prop.value.type === 'ObjectExpression') {
103
+ result[key] = parseObjectExpression(prop.value);
104
+ } else if (prop.value.type === 'ArrayExpression') {
105
+ result[key] = prop.value.elements.map((el: any) => {
106
+ if (el.type === 'StringLiteral') return el.value;
107
+ if (el.type === 'NumericLiteral') return el.value;
108
+ return null;
109
+ }).filter(Boolean);
110
+ }
111
+ }
112
+ }
113
+ return result;
114
+ }
115
+
116
+ async function main() {
117
+ const sourceDir = process.argv[2] || 'src';
118
+ const outPath = process.argv[3] || 'intent-manifest.json';
119
+
120
+ const absoluteSource = path.resolve(process.cwd(), sourceDir);
121
+ const absoluteOut = path.resolve(process.cwd(), outPath);
122
+
123
+ console.log(`Scanning ${absoluteSource} for AI Actions...`);
124
+
125
+ const intents = extractIntentsFromAST(absoluteSource);
126
+
127
+ console.log(`Found ${intents.length} actions.`);
128
+ intents.forEach(i => console.log(` - ${i.name} (from ${i.sourceFile})`));
129
+
130
+ fs.writeFileSync(absoluteOut, JSON.stringify(intents, null, 2));
131
+ console.log(`\n✅ Wrote intent manifest to ${outPath}`);
132
+ }
133
+
134
+ // Run if called directly
135
+ if (require.main === module) {
136
+ main().catch(err => {
137
+ console.error(err);
138
+ process.exit(1);
139
+ });
140
+ }
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env node
2
+
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+
6
+ export function generateSwiftCode(manifestPath: string, appScheme: string): string {
7
+ const manifests = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
8
+
9
+ let swiftCode = `import AppIntents
10
+ import UIKit
11
+
12
+ // Auto-generated by react-native-ai-agent
13
+ // Do not edit manually.
14
+
15
+ `;
16
+
17
+ for (const intent of manifests) {
18
+ // Convert snake_case to CamelCaseIntent
19
+ const structName = intent.name
20
+ .split('_')
21
+ .map((w: string) => w.charAt(0).toUpperCase() + w.slice(1))
22
+ .join('') + 'Intent';
23
+
24
+ swiftCode += `@available(iOS 16.0, *)\n`;
25
+ swiftCode += `struct ${structName}: AppIntent {\n`;
26
+ swiftCode += ` static var title: LocalizedStringResource = "${intent.name}"\n`;
27
+ swiftCode += ` static var description = IntentDescription("${intent.description.replace(/"/g, '\\"')}")\n`;
28
+ swiftCode += ` static var openAppWhenRun: Bool = true\n\n`;
29
+
30
+ // Parameters
31
+ const params = intent.parameters || {};
32
+ for (const [key, param] of Object.entries<any>(params)) {
33
+ let swiftType = 'String';
34
+ if (param.type === 'number') swiftType = 'Double';
35
+ if (param.type === 'boolean') swiftType = 'Bool';
36
+
37
+ swiftCode += ` @Parameter(title: "${param.description || key}")\n`;
38
+ swiftCode += ` var ${key}: ${swiftType}?\n\n`;
39
+ }
40
+
41
+ // Perform function
42
+ swiftCode += ` @MainActor\n`;
43
+ swiftCode += ` func perform() async throws -> some IntentResult {\n`;
44
+ swiftCode += ` var components = URLComponents()\n`;
45
+ swiftCode += ` components.scheme = "${appScheme}"\n`;
46
+ swiftCode += ` components.host = "ai-action"\n`;
47
+ swiftCode += ` components.path = "/${intent.name}"\n`;
48
+
49
+ if (Object.keys(params).length > 0) {
50
+ swiftCode += ` var queryItems: [URLQueryItem] = []\n`;
51
+ for (const [key, _param] of Object.entries<any>(params)) {
52
+ swiftCode += ` if let val = ${key} {\n`;
53
+ swiftCode += ` queryItems.append(URLQueryItem(name: "${key}", value: String(describing: val)))\n`;
54
+ swiftCode += ` }\n`;
55
+ }
56
+ swiftCode += ` components.queryItems = queryItems\n`;
57
+ }
58
+
59
+ swiftCode += ` if let url = components.url {\n`;
60
+ swiftCode += ` await UIApplication.shared.open(url)\n`;
61
+ swiftCode += ` }\n`;
62
+ swiftCode += ` return .result()\n`;
63
+ swiftCode += ` }\n`;
64
+ swiftCode += `}\n\n`;
65
+ }
66
+
67
+ // AppShortcuts provider (exposes intents to Siri automatically)
68
+ if (manifests.length > 0) {
69
+ swiftCode += `@available(iOS 16.0, *)\n`;
70
+ swiftCode += `struct MobileAIAppShortcuts: AppShortcutsProvider {\n`;
71
+ swiftCode += ` static var appShortcuts: [AppShortcut] {\n`;
72
+ for (const intent of manifests) {
73
+ const structName = intent.name.split('_').map((w: string) => w.charAt(0).toUpperCase() + w.slice(1)).join('') + 'Intent';
74
+ // Generate a basic short phrase mapping
75
+ swiftCode += ` AppShortcut(intent: ${structName}(), phrases: ["\\\\(.applicationName) ${intent.name.replace(/_/g, ' ')}"])\n`;
76
+ }
77
+ swiftCode += ` }\n`;
78
+ swiftCode += `}\n`;
79
+ }
80
+
81
+ return swiftCode;
82
+ }
83
+
84
+ async function main() {
85
+ const manifestPath = process.argv[2] || 'intent-manifest.json';
86
+ const appScheme = process.argv[3] || 'mobileai';
87
+ const outPath = process.argv[4] || 'ios/MobileAIPilotIntents.swift';
88
+
89
+ const absoluteManifest = path.resolve(process.cwd(), manifestPath);
90
+ const absoluteOut = path.resolve(process.cwd(), outPath);
91
+
92
+ if (!fs.existsSync(absoluteManifest)) {
93
+ console.error(`❌ Manifest file not found at ${absoluteManifest}`);
94
+ process.exit(1);
95
+ }
96
+
97
+ console.log(`Generating Swift code for schema ${appScheme}...`);
98
+ const swiftCode = generateSwiftCode(absoluteManifest, appScheme);
99
+
100
+ // Ensure dir exists
101
+ const targetDir = path.dirname(absoluteOut);
102
+ if (!fs.existsSync(targetDir)) {
103
+ fs.mkdirSync(targetDir, { recursive: true });
104
+ }
105
+
106
+ fs.writeFileSync(absoluteOut, swiftCode);
107
+ console.log(`✅ Wrote Swift AppIntents to ${outPath}`);
108
+ }
109
+
110
+ // Run if called directly
111
+ if (require.main === module) {
112
+ main().catch(err => {
113
+ console.error(err);
114
+ process.exit(1);
115
+ });
116
+ }
@@ -171,20 +171,17 @@ interface AIAgentProps {
171
171
  */
172
172
  useScreenMap?: boolean;
173
173
 
174
- // ── Analytics (opt-in) ── @internal — requires api.mobileai.dev ──
174
+ // ── Analytics (opt-in) ──
175
175
 
176
176
  /**
177
- * @internal Requires api.mobileai.dev — not yet available.
178
177
  * Publishable analytics key (mobileai_pub_xxx).
179
178
  */
180
179
  analyticsKey?: string;
181
180
  /**
182
- * @internal Requires api.mobileai.dev — not yet available.
183
181
  * Proxy URL for enterprise customers — routes events through your backend.
184
182
  */
185
183
  analyticsProxyUrl?: string;
186
184
  /**
187
- * @internal Requires api.mobileai.dev — not yet available.
188
185
  * Custom headers for analyticsProxyUrl (e.g., auth tokens).
189
186
  */
190
187
  analyticsProxyHeaders?: Record<string, string>;
@@ -150,9 +150,8 @@ function AudioControlButton({
150
150
  */
151
151
  let SpeechModule: any = null;
152
152
  try {
153
- // Dynamic require prevents Metro from statically resolving this optional dep
154
- const speechModuleName = ['expo', 'speech', 'recognition'].join('-');
155
- SpeechModule = require(speechModuleName);
153
+ // Static require Metro needs a literal string for bundling.
154
+ SpeechModule = require('expo-speech-recognition');
156
155
  } catch {
157
156
  // Not installed — dictation button won't appear
158
157
  }
@@ -53,7 +53,7 @@ export function HighlightOverlay() {
53
53
  return (
54
54
  <View style={StyleSheet.absoluteFill} pointerEvents="box-none">
55
55
  {/* Invisible pressable to dismiss on tap anywhere */}
56
- <Pressable style={StyleSheet.absoluteFill} onPress={() => setHighlight(null)} />
56
+ <Pressable testID="highlight-close-zone" style={StyleSheet.absoluteFill} onPress={() => setHighlight(null)} />
57
57
 
58
58
  {/* The Animated Ring */}
59
59
  <Animated.View