@mobileai/react-native 0.9.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +121 -0
- package/lib/module/components/AIAgent.js +248 -53
- package/lib/module/components/AIAgent.js.map +1 -1
- package/lib/module/components/AIZone.js +140 -0
- package/lib/module/components/AIZone.js.map +1 -0
- package/lib/module/components/AgentErrorBoundary.js +9 -0
- package/lib/module/components/AgentErrorBoundary.js.map +1 -1
- package/lib/module/components/HighlightOverlay.js +138 -0
- package/lib/module/components/HighlightOverlay.js.map +1 -0
- package/lib/module/components/ProactiveHint.js +138 -0
- package/lib/module/components/ProactiveHint.js.map +1 -0
- package/lib/module/components/cards/InfoCard.js +65 -0
- package/lib/module/components/cards/InfoCard.js.map +1 -0
- package/lib/module/components/cards/ReviewSummary.js +74 -0
- package/lib/module/components/cards/ReviewSummary.js.map +1 -0
- package/lib/module/core/AgentRuntime.js +16 -3
- package/lib/module/core/AgentRuntime.js.map +1 -1
- package/lib/module/core/FiberTreeWalker.js +62 -85
- package/lib/module/core/FiberTreeWalker.js.map +1 -1
- package/lib/module/core/IdleDetector.js +51 -0
- package/lib/module/core/IdleDetector.js.map +1 -0
- package/lib/module/core/ZoneRegistry.js +47 -0
- package/lib/module/core/ZoneRegistry.js.map +1 -0
- package/lib/module/core/systemPrompt.js +2 -0
- package/lib/module/core/systemPrompt.js.map +1 -1
- package/lib/module/index.js +21 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/services/AudioOutputService.js +10 -0
- package/lib/module/services/AudioOutputService.js.map +1 -1
- package/lib/module/services/flags/FlagService.js +117 -0
- package/lib/module/services/flags/FlagService.js.map +1 -0
- package/lib/module/services/telemetry/MobileAI.js +66 -0
- package/lib/module/services/telemetry/MobileAI.js.map +1 -0
- package/lib/module/services/telemetry/PiiScrubber.js +17 -0
- package/lib/module/services/telemetry/PiiScrubber.js.map +1 -0
- package/lib/module/services/telemetry/TelemetryService.js +260 -0
- package/lib/module/services/telemetry/TelemetryService.js.map +1 -0
- package/lib/module/services/telemetry/TouchAutoCapture.js +159 -0
- package/lib/module/services/telemetry/TouchAutoCapture.js.map +1 -0
- package/lib/module/services/telemetry/device.js +19 -0
- package/lib/module/services/telemetry/device.js.map +1 -0
- package/lib/module/services/telemetry/index.js +9 -0
- package/lib/module/services/telemetry/index.js.map +1 -0
- package/lib/module/services/telemetry/types.js +2 -0
- package/lib/module/services/telemetry/types.js.map +1 -0
- package/lib/module/support/CSATSurvey.js +273 -0
- package/lib/module/support/CSATSurvey.js.map +1 -0
- package/lib/module/support/EscalationSocket.js +92 -0
- package/lib/module/support/EscalationSocket.js.map +1 -0
- package/lib/module/support/SupportGreeting.js +142 -0
- package/lib/module/support/SupportGreeting.js.map +1 -0
- package/lib/module/support/escalateTool.js +120 -0
- package/lib/module/support/escalateTool.js.map +1 -0
- package/lib/module/support/index.js +18 -0
- package/lib/module/support/index.js.map +1 -0
- package/lib/module/support/supportPrompt.js +47 -0
- package/lib/module/support/supportPrompt.js.map +1 -0
- package/lib/module/support/types.js +2 -0
- package/lib/module/support/types.js.map +1 -0
- package/lib/module/tools/guideTool.js +61 -0
- package/lib/module/tools/guideTool.js.map +1 -0
- package/lib/module/tools/index.js +3 -0
- package/lib/module/tools/index.js.map +1 -1
- package/lib/module/tools/restoreTool.js +31 -0
- package/lib/module/tools/restoreTool.js.map +1 -0
- package/lib/module/tools/simplifyTool.js +31 -0
- package/lib/module/tools/simplifyTool.js.map +1 -0
- package/lib/module/types/jsx.d.js +4 -0
- package/lib/module/types/jsx.d.js.map +1 -0
- package/lib/typescript/src/components/AIAgent.d.ts +21 -2
- package/lib/typescript/src/components/AIAgent.d.ts.map +1 -1
- package/lib/typescript/src/components/AIZone.d.ts +16 -0
- package/lib/typescript/src/components/AIZone.d.ts.map +1 -0
- package/lib/typescript/src/components/AgentErrorBoundary.d.ts +1 -0
- package/lib/typescript/src/components/AgentErrorBoundary.d.ts.map +1 -1
- package/lib/typescript/src/components/HighlightOverlay.d.ts +10 -0
- package/lib/typescript/src/components/HighlightOverlay.d.ts.map +1 -0
- package/lib/typescript/src/components/ProactiveHint.d.ts +10 -0
- package/lib/typescript/src/components/ProactiveHint.d.ts.map +1 -0
- package/lib/typescript/src/components/cards/InfoCard.d.ts +19 -0
- package/lib/typescript/src/components/cards/InfoCard.d.ts.map +1 -0
- package/lib/typescript/src/components/cards/ReviewSummary.d.ts +19 -0
- package/lib/typescript/src/components/cards/ReviewSummary.d.ts.map +1 -0
- package/lib/typescript/src/core/AgentRuntime.d.ts +1 -0
- package/lib/typescript/src/core/AgentRuntime.d.ts.map +1 -1
- package/lib/typescript/src/core/FiberTreeWalker.d.ts.map +1 -1
- package/lib/typescript/src/core/IdleDetector.d.ts +27 -0
- package/lib/typescript/src/core/IdleDetector.d.ts.map +1 -0
- package/lib/typescript/src/core/ZoneRegistry.d.ts +13 -0
- package/lib/typescript/src/core/ZoneRegistry.d.ts.map +1 -0
- package/lib/typescript/src/core/systemPrompt.d.ts.map +1 -1
- package/lib/typescript/src/core/types.d.ts +54 -0
- package/lib/typescript/src/core/types.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +5 -0
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/services/AudioOutputService.d.ts.map +1 -1
- package/lib/typescript/src/services/flags/FlagService.d.ts +25 -0
- package/lib/typescript/src/services/flags/FlagService.d.ts.map +1 -0
- package/lib/typescript/src/services/telemetry/MobileAI.d.ts +38 -0
- package/lib/typescript/src/services/telemetry/MobileAI.d.ts.map +1 -0
- package/lib/typescript/src/services/telemetry/PiiScrubber.d.ts +6 -0
- package/lib/typescript/src/services/telemetry/PiiScrubber.d.ts.map +1 -0
- package/lib/typescript/src/services/telemetry/TelemetryService.d.ts +49 -0
- package/lib/typescript/src/services/telemetry/TelemetryService.d.ts.map +1 -0
- package/lib/typescript/src/services/telemetry/TouchAutoCapture.d.ts +28 -0
- package/lib/typescript/src/services/telemetry/TouchAutoCapture.d.ts.map +1 -0
- package/lib/typescript/src/services/telemetry/device.d.ts +7 -0
- package/lib/typescript/src/services/telemetry/device.d.ts.map +1 -0
- package/lib/typescript/src/services/telemetry/index.d.ts +7 -0
- package/lib/typescript/src/services/telemetry/index.d.ts.map +1 -0
- package/lib/typescript/src/services/telemetry/types.d.ts +50 -0
- package/lib/typescript/src/services/telemetry/types.d.ts.map +1 -0
- package/lib/typescript/src/support/CSATSurvey.d.ts +20 -0
- package/lib/typescript/src/support/CSATSurvey.d.ts.map +1 -0
- package/lib/typescript/src/support/EscalationSocket.d.ts +38 -0
- package/lib/typescript/src/support/EscalationSocket.d.ts.map +1 -0
- package/lib/typescript/src/support/SupportGreeting.d.ts +19 -0
- package/lib/typescript/src/support/SupportGreeting.d.ts.map +1 -0
- package/lib/typescript/src/support/escalateTool.d.ts +25 -0
- package/lib/typescript/src/support/escalateTool.d.ts.map +1 -0
- package/lib/typescript/src/support/index.d.ts +11 -0
- package/lib/typescript/src/support/index.d.ts.map +1 -0
- package/lib/typescript/src/support/supportPrompt.d.ts +12 -0
- package/lib/typescript/src/support/supportPrompt.d.ts.map +1 -0
- package/lib/typescript/src/support/types.d.ts +114 -0
- package/lib/typescript/src/support/types.d.ts.map +1 -0
- package/lib/typescript/src/tools/guideTool.d.ts +4 -0
- package/lib/typescript/src/tools/guideTool.d.ts.map +1 -0
- package/lib/typescript/src/tools/index.d.ts +3 -0
- package/lib/typescript/src/tools/index.d.ts.map +1 -1
- package/lib/typescript/src/tools/restoreTool.d.ts +3 -0
- package/lib/typescript/src/tools/restoreTool.d.ts.map +1 -0
- package/lib/typescript/src/tools/simplifyTool.d.ts +3 -0
- package/lib/typescript/src/tools/simplifyTool.d.ts.map +1 -0
- package/lib/typescript/src/tools/types.d.ts +2 -0
- package/lib/typescript/src/tools/types.d.ts.map +1 -1
- package/package.json +5 -1
- package/src/components/AIAgent.tsx +253 -15
- package/src/components/AIZone.tsx +147 -0
- package/src/components/AgentErrorBoundary.tsx +10 -0
- package/src/components/HighlightOverlay.tsx +136 -0
- package/src/components/ProactiveHint.tsx +145 -0
- package/src/components/cards/InfoCard.tsx +58 -0
- package/src/components/cards/ReviewSummary.tsx +76 -0
- package/src/core/AgentRuntime.ts +18 -0
- package/src/core/FiberTreeWalker.ts +71 -93
- package/src/core/IdleDetector.ts +72 -0
- package/src/core/ZoneRegistry.ts +44 -0
- package/src/core/systemPrompt.ts +2 -0
- package/src/core/types.ts +60 -0
- package/src/index.ts +31 -0
- package/src/services/AudioOutputService.ts +13 -0
- package/src/services/flags/FlagService.ts +137 -0
- package/src/services/telemetry/MobileAI.ts +66 -0
- package/src/services/telemetry/PiiScrubber.ts +17 -0
- package/src/services/telemetry/TelemetryService.ts +291 -0
- package/src/services/telemetry/TouchAutoCapture.ts +165 -0
- package/src/services/telemetry/device.ts +16 -0
- package/src/services/telemetry/index.ts +13 -0
- package/src/services/telemetry/types.ts +75 -0
- package/src/support/CSATSurvey.tsx +304 -0
- package/src/support/EscalationSocket.ts +113 -0
- package/src/support/SupportGreeting.tsx +161 -0
- package/src/support/escalateTool.ts +134 -0
- package/src/support/index.ts +27 -0
- package/src/support/supportPrompt.ts +55 -0
- package/src/support/types.ts +141 -0
- package/src/tools/guideTool.ts +67 -0
- package/src/tools/index.ts +3 -0
- package/src/tools/restoreTool.ts +33 -0
- package/src/tools/simplifyTool.ts +33 -0
- package/src/tools/types.ts +2 -0
- package/src/types/jsx.d.ts +20 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
export class IdleDetector {
|
|
4
|
+
pulseTimer = null;
|
|
5
|
+
badgeTimer = null;
|
|
6
|
+
dismissed = false;
|
|
7
|
+
config = null;
|
|
8
|
+
start(config) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
this.dismissed = false;
|
|
11
|
+
this.resetTimers();
|
|
12
|
+
}
|
|
13
|
+
reset() {
|
|
14
|
+
if (!this.config || this.dismissed) return;
|
|
15
|
+
this.config.onReset();
|
|
16
|
+
this.resetTimers();
|
|
17
|
+
}
|
|
18
|
+
dismiss() {
|
|
19
|
+
this.dismissed = true;
|
|
20
|
+
this.clearTimers();
|
|
21
|
+
if (this.config) {
|
|
22
|
+
this.config.onReset();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
destroy() {
|
|
26
|
+
this.clearTimers();
|
|
27
|
+
this.config = null;
|
|
28
|
+
}
|
|
29
|
+
resetTimers() {
|
|
30
|
+
this.clearTimers();
|
|
31
|
+
if (!this.config || this.dismissed) return;
|
|
32
|
+
this.pulseTimer = setTimeout(() => {
|
|
33
|
+
this.config?.onPulse();
|
|
34
|
+
}, this.config.pulseAfterMs);
|
|
35
|
+
this.badgeTimer = setTimeout(() => {
|
|
36
|
+
const suggestion = this.config?.generateSuggestion?.() ?? "Need help with this screen?";
|
|
37
|
+
this.config?.onBadge(suggestion);
|
|
38
|
+
}, this.config.badgeAfterMs);
|
|
39
|
+
}
|
|
40
|
+
clearTimers() {
|
|
41
|
+
if (this.pulseTimer) {
|
|
42
|
+
clearTimeout(this.pulseTimer);
|
|
43
|
+
this.pulseTimer = null;
|
|
44
|
+
}
|
|
45
|
+
if (this.badgeTimer) {
|
|
46
|
+
clearTimeout(this.badgeTimer);
|
|
47
|
+
this.badgeTimer = null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=IdleDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["IdleDetector","pulseTimer","badgeTimer","dismissed","config","start","resetTimers","reset","onReset","dismiss","clearTimers","destroy","setTimeout","onPulse","pulseAfterMs","suggestion","generateSuggestion","onBadge","badgeAfterMs","clearTimeout"],"sourceRoot":"../../../src","sources":["core/IdleDetector.ts"],"mappings":";;AAeA,OAAO,MAAMA,YAAY,CAAC;EAChBC,UAAU,GAAyC,IAAI;EACvDC,UAAU,GAAyC,IAAI;EACvDC,SAAS,GAAG,KAAK;EACjBC,MAAM,GAA8B,IAAI;EAEhDC,KAAKA,CAACD,MAA0B,EAAQ;IACtC,IAAI,CAACA,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACD,SAAS,GAAG,KAAK;IACtB,IAAI,CAACG,WAAW,CAAC,CAAC;EACpB;EAEAC,KAAKA,CAAA,EAAS;IACZ,IAAI,CAAC,IAAI,CAACH,MAAM,IAAI,IAAI,CAACD,SAAS,EAAE;IACpC,IAAI,CAACC,MAAM,CAACI,OAAO,CAAC,CAAC;IACrB,IAAI,CAACF,WAAW,CAAC,CAAC;EACpB;EAEAG,OAAOA,CAAA,EAAS;IACd,IAAI,CAACN,SAAS,GAAG,IAAI;IACrB,IAAI,CAACO,WAAW,CAAC,CAAC;IAClB,IAAI,IAAI,CAACN,MAAM,EAAE;MACf,IAAI,CAACA,MAAM,CAACI,OAAO,CAAC,CAAC;IACvB;EACF;EAEAG,OAAOA,CAAA,EAAS;IACd,IAAI,CAACD,WAAW,CAAC,CAAC;IAClB,IAAI,CAACN,MAAM,GAAG,IAAI;EACpB;EAEQE,WAAWA,CAAA,EAAS;IAC1B,IAAI,CAACI,WAAW,CAAC,CAAC;IAElB,IAAI,CAAC,IAAI,CAACN,MAAM,IAAI,IAAI,CAACD,SAAS,EAAE;IAEpC,IAAI,CAACF,UAAU,GAAGW,UAAU,CAAC,MAAM;MACjC,IAAI,CAACR,MAAM,EAAES,OAAO,CAAC,CAAC;IACxB,CAAC,EAAE,IAAI,CAACT,MAAM,CAACU,YAAY,CAAC;IAE5B,IAAI,CAACZ,UAAU,GAAGU,UAAU,CAAC,MAAM;MACjC,MAAMG,UAAU,GAAG,IAAI,CAACX,MAAM,EAAEY,kBAAkB,GAAG,CAAC,IAAI,6BAA6B;MACvF,IAAI,CAACZ,MAAM,EAAEa,OAAO,CAACF,UAAU,CAAC;IAClC,CAAC,EAAE,IAAI,CAACX,MAAM,CAACc,YAAY,CAAC;EAC9B;EAEQR,WAAWA,CAAA,EAAS;IAC1B,IAAI,IAAI,CAACT,UAAU,EAAE;MACnBkB,YAAY,CAAC,IAAI,CAAClB,UAAU,CAAC;MAC7B,IAAI,CAACA,UAAU,GAAG,IAAI;IACxB;IACA,IAAI,IAAI,CAACC,UAAU,EAAE;MACnBiB,YAAY,CAAC,IAAI,CAACjB,UAAU,CAAC;MAC7B,IAAI,CAACA,UAAU,GAAG,IAAI;IACxB;EACF;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { createContext } from 'react';
|
|
4
|
+
export class ZoneRegistry {
|
|
5
|
+
zones = new Map();
|
|
6
|
+
register(config, ref) {
|
|
7
|
+
if (this.zones.has(config.id)) {
|
|
8
|
+
console.warn(`[MobileAI] Zone ID "${config.id}" is already registered on this screen. Overwriting.`);
|
|
9
|
+
}
|
|
10
|
+
this.zones.set(config.id, {
|
|
11
|
+
...config,
|
|
12
|
+
ref
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
unregister(id) {
|
|
16
|
+
this.zones.delete(id);
|
|
17
|
+
}
|
|
18
|
+
get(id) {
|
|
19
|
+
return this.zones.get(id);
|
|
20
|
+
}
|
|
21
|
+
getAll() {
|
|
22
|
+
return Array.from(this.zones.values());
|
|
23
|
+
}
|
|
24
|
+
isActionAllowed(zoneId, action) {
|
|
25
|
+
const zone = this.get(zoneId);
|
|
26
|
+
if (!zone) return false;
|
|
27
|
+
switch (action) {
|
|
28
|
+
case 'highlight':
|
|
29
|
+
return !!zone.allowHighlight;
|
|
30
|
+
case 'hint':
|
|
31
|
+
return !!zone.allowInjectHint;
|
|
32
|
+
case 'simplify':
|
|
33
|
+
return !!zone.allowSimplify;
|
|
34
|
+
case 'card':
|
|
35
|
+
return !!zone.allowInjectCard;
|
|
36
|
+
default:
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Global registry instance shared across the Agent session
|
|
43
|
+
export const globalZoneRegistry = new ZoneRegistry();
|
|
44
|
+
|
|
45
|
+
// Export context so AIZone components can register themselves
|
|
46
|
+
export const ZoneRegistryContext = /*#__PURE__*/createContext(globalZoneRegistry);
|
|
47
|
+
//# sourceMappingURL=ZoneRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createContext","ZoneRegistry","zones","Map","register","config","ref","has","id","console","warn","set","unregister","delete","get","getAll","Array","from","values","isActionAllowed","zoneId","action","zone","allowHighlight","allowInjectHint","allowSimplify","allowInjectCard","globalZoneRegistry","ZoneRegistryContext"],"sourceRoot":"../../../src","sources":["core/ZoneRegistry.ts"],"mappings":";;AAAA,SAAgBA,aAAa,QAAQ,OAAO;AAG5C,OAAO,MAAMC,YAAY,CAAC;EAChBC,KAAK,GAAG,IAAIC,GAAG,CAAyB,CAAC;EAEjDC,QAAQA,CAACC,MAAoB,EAAEC,GAAyB,EAAQ;IAC9D,IAAI,IAAI,CAACJ,KAAK,CAACK,GAAG,CAACF,MAAM,CAACG,EAAE,CAAC,EAAE;MAC7BC,OAAO,CAACC,IAAI,CAAC,uBAAuBL,MAAM,CAACG,EAAE,sDAAsD,CAAC;IACtG;IACA,IAAI,CAACN,KAAK,CAACS,GAAG,CAACN,MAAM,CAACG,EAAE,EAAE;MAAE,GAAGH,MAAM;MAAEC;IAAI,CAAC,CAAC;EAC/C;EAEAM,UAAUA,CAACJ,EAAU,EAAQ;IAC3B,IAAI,CAACN,KAAK,CAACW,MAAM,CAACL,EAAE,CAAC;EACvB;EAEAM,GAAGA,CAACN,EAAU,EAA8B;IAC1C,OAAO,IAAI,CAACN,KAAK,CAACY,GAAG,CAACN,EAAE,CAAC;EAC3B;EAEAO,MAAMA,CAAA,EAAqB;IACzB,OAAOC,KAAK,CAACC,IAAI,CAAC,IAAI,CAACf,KAAK,CAACgB,MAAM,CAAC,CAAC,CAAC;EACxC;EAEAC,eAAeA,CAACC,MAAc,EAAEC,MAAkD,EAAW;IAC3F,MAAMC,IAAI,GAAG,IAAI,CAACR,GAAG,CAACM,MAAM,CAAC;IAC7B,IAAI,CAACE,IAAI,EAAE,OAAO,KAAK;IAEvB,QAAQD,MAAM;MACZ,KAAK,WAAW;QAAE,OAAO,CAAC,CAACC,IAAI,CAACC,cAAc;MAC9C,KAAK,MAAM;QAAE,OAAO,CAAC,CAACD,IAAI,CAACE,eAAe;MAC1C,KAAK,UAAU;QAAE,OAAO,CAAC,CAACF,IAAI,CAACG,aAAa;MAC5C,KAAK,MAAM;QAAE,OAAO,CAAC,CAACH,IAAI,CAACI,eAAe;MAC1C;QAAS,OAAO,KAAK;IACvB;EACF;AACF;;AAEA;AACA,OAAO,MAAMC,kBAAkB,GAAG,IAAI1B,YAAY,CAAC,CAAC;;AAEpD;AACA,OAAO,MAAM2B,mBAAmB,gBAAG5B,aAAa,CAAe2B,kBAAkB,CAAC","ignoreList":[]}
|
|
@@ -103,6 +103,7 @@ If a UI element is hidden (aiIgnore) but a matching custom action exists, use th
|
|
|
103
103
|
- Trying too hard can be harmful. If stuck, call done() with partial results rather than repeating failed actions.
|
|
104
104
|
- If you do not know how to proceed with the current screen, use ask_user to request specific instructions from the user.
|
|
105
105
|
- NAVIGATION: Always use tap actions to move between screens — tap tab bar buttons, back buttons, and navigation links. This ensures all required route params (like item IDs) are passed automatically by the app. The navigate() tool is ONLY for top-level screens that require no params (e.g. Login, Settings, Cart). NEVER call navigate() on screens that require a selection or ID (e.g. DishDetail, SelectCategory, ProfileDetail) — this will crash the app. For those screens, always tap the relevant item in the parent screen.
|
|
106
|
+
- UI SIMPLIFICATION: If you see elements labeled \`aiPriority="low"\` inside a specific \`zoneId=...\`, and the screen looks cluttered or overwhelming to the user's immediate goal, use the \`simplify_zone(zoneId)\` tool to hide those elements. Use \`restore_zone(zoneId)\` to bring them back if needed later!
|
|
106
107
|
</rules>
|
|
107
108
|
|
|
108
109
|
<task_completion_rules>
|
|
@@ -267,6 +268,7 @@ If a UI element is hidden but a matching custom action exists, use the action.
|
|
|
267
268
|
- Do NOT ask for confirmation of actions the user explicitly requested. If they said "place my order", just do it.
|
|
268
269
|
- If the user's intent is ambiguous — it could mean multiple things or lead to different screens — ask the user to clarify before navigating to the wrong place.
|
|
269
270
|
- NAVIGATION: Always use tap actions to move between screens — tap tab bar buttons, back buttons, and navigation links. This ensures all required route params are passed automatically by the app. The navigate() tool is ONLY for top-level screens that require no params (e.g. Login, Settings, Cart). NEVER call navigate() on screens that require a selection or ID (e.g. DishDetail, SelectCategory, ProfileDetail) — this will crash the app. For those screens, always tap the relevant item in the parent screen.
|
|
271
|
+
- UI SIMPLIFICATION: If you see elements labeled \`aiPriority="low"\` inside a specific \`zoneId=...\`, and the screen looks cluttered relative to the user's immediate goal, use the \`simplify_zone(zoneId)\` tool to hide those low-priority elements. Use \`restore_zone(zoneId)\` to bring them back if needed. The user does NOT need to explicitly ask for this — use your judgment based on their request.
|
|
270
272
|
</rules>
|
|
271
273
|
|
|
272
274
|
<capability>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["buildSystemPrompt","language","hasKnowledge","isArabic","buildVoiceSystemPrompt","userInstructions","prompt","trim","buildKnowledgeOnlyPrompt"],"sourceRoot":"../../../src","sources":["core/systemPrompt.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,SAASA,iBAAiBA,CAACC,QAAgB,EAAEC,YAAY,GAAG,KAAK,EAAU;EAChF,MAAMC,QAAQ,GAAGF,QAAQ,KAAK,IAAI;EAElC,OAAO;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAEE,QAAQ,GAAG,oDAAoD,GAAG,sDAAsD;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0GD,YAAY,GAAG;AACzH,sQAAsQ,GAAG,EAAE;AAC3Q;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+DA,YAAY,GAAG,uDAAuD,GAAG,EAAE,8CAA8CA,YAAY,GAAG,kBAAkB,GAAG,EAAE;AAC9N;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoFA,YAAY,GAAG;AACnG,qJAAqJ,GAAG,EAAE;AAC1J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,sBAAsBA,CACpCH,QAAgB,EAChBI,gBAAyB,EACzBH,YAAY,GAAG,KAAK,EACZ;EACR,MAAMC,QAAQ,GAAGF,QAAQ,KAAK,IAAI;EAElC,IAAIK,MAAM,GAAG;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+DJ,YAAY,GAAG;AAC9E,2OAA2O,GAAG,EAAE;AAChP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsDA,YAAY,GAAG,uDAAuD,GAAG,EAAE,8CAA8CA,YAAY,GAAG,kBAAkB,GAAG,EAAE;AACrN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iFAAiFA,YAAY,GAAG;AAChG,qJAAqJ,GAAG,EAAE;AAC1J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAEC,QAAQ,GAAG,oDAAoD,GAAG,sDAAsD;AAC1H;AACA,qBAAqB;;EAEnB;EACA,IAAIE,gBAAgB,EAAEE,IAAI,CAAC,CAAC,EAAE;IAC5BD,MAAM,IAAI,2BAA2BD,gBAAgB,CAACE,IAAI,CAAC,CAAC,uBAAuB;EACrF;EAEA,OAAOD,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,wBAAwBA,CACtCP,QAAgB,EAChBC,YAAqB,EACrBG,gBAAyB,EACjB;EACR,MAAMF,QAAQ,GAAGF,QAAQ,KAAK,IAAI;EAElC,IAAIK,MAAM,GAAG;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2GAA2GJ,YAAY,GAAG;AAC1H,2OAA2O,GAAG,EAAE;AAChP;AACA;AACA;AACA,kEAAkEA,YAAY,GAAG;AACjF,0IAA0I,GAAG,EAAE;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA,EAAEC,QAAQ,GAAG,oDAAoD,GAAG,sDAAsD;AAC1H;AACA,qBAAqB;EAEnB,IAAIE,gBAAgB,EAAEE,IAAI,CAAC,CAAC,EAAE;IAC5BD,MAAM,IAAI,2BAA2BD,gBAAgB,CAACE,IAAI,CAAC,CAAC,uBAAuB;EACrF;EAEA,OAAOD,MAAM;AACf","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["buildSystemPrompt","language","hasKnowledge","isArabic","buildVoiceSystemPrompt","userInstructions","prompt","trim","buildKnowledgeOnlyPrompt"],"sourceRoot":"../../../src","sources":["core/systemPrompt.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,SAASA,iBAAiBA,CAACC,QAAgB,EAAEC,YAAY,GAAG,KAAK,EAAU;EAChF,MAAMC,QAAQ,GAAGF,QAAQ,KAAK,IAAI;EAElC,OAAO;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAEE,QAAQ,GAAG,oDAAoD,GAAG,sDAAsD;AAC1H;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,0GAA0GD,YAAY,GAAG;AACzH,sQAAsQ,GAAG,EAAE;AAC3Q;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+DA,YAAY,GAAG,uDAAuD,GAAG,EAAE,8CAA8CA,YAAY,GAAG,kBAAkB,GAAG,EAAE;AAC9N;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oFAAoFA,YAAY,GAAG;AACnG,qJAAqJ,GAAG,EAAE;AAC1J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,UAAU;AACV;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,sBAAsBA,CACpCH,QAAgB,EAChBI,gBAAyB,EACzBH,YAAY,GAAG,KAAK,EACZ;EACR,MAAMC,QAAQ,GAAGF,QAAQ,KAAK,IAAI;EAElC,IAAIK,MAAM,GAAG;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+DJ,YAAY,GAAG;AAC9E,2OAA2O,GAAG,EAAE;AAChP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sDAAsDA,YAAY,GAAG,uDAAuD,GAAG,EAAE,8CAA8CA,YAAY,GAAG,kBAAkB,GAAG,EAAE;AACrN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iFAAiFA,YAAY,GAAG;AAChG,qJAAqJ,GAAG,EAAE;AAC1J;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAEC,QAAQ,GAAG,oDAAoD,GAAG,sDAAsD;AAC1H;AACA,qBAAqB;;EAEnB;EACA,IAAIE,gBAAgB,EAAEE,IAAI,CAAC,CAAC,EAAE;IAC5BD,MAAM,IAAI,2BAA2BD,gBAAgB,CAACE,IAAI,CAAC,CAAC,uBAAuB;EACrF;EAEA,OAAOD,MAAM;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,wBAAwBA,CACtCP,QAAgB,EAChBC,YAAqB,EACrBG,gBAAyB,EACjB;EACR,MAAMF,QAAQ,GAAGF,QAAQ,KAAK,IAAI;EAElC,IAAIK,MAAM,GAAG;AACf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2GAA2GJ,YAAY,GAAG;AAC1H,2OAA2O,GAAG,EAAE;AAChP;AACA;AACA;AACA,kEAAkEA,YAAY,GAAG;AACjF,0IAA0I,GAAG,EAAE;AAC/I;AACA;AACA;AACA;AACA;AACA;AACA,EAAEC,QAAQ,GAAG,oDAAoD,GAAG,sDAAsD;AAC1H;AACA,qBAAqB;EAEnB,IAAIE,gBAAgB,EAAEE,IAAI,CAAC,CAAC,EAAE;IAC5BD,MAAM,IAAI,2BAA2BD,gBAAgB,CAACE,IAAI,CAAC,CAAC,uBAAuB;EACrF;EAEA,OAAOD,MAAM;AACf","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -9,6 +9,11 @@
|
|
|
9
9
|
|
|
10
10
|
// ─── Components ──────────────────────────────────────────────
|
|
11
11
|
export { AIAgent } from "./components/AIAgent.js";
|
|
12
|
+
export { AIZone } from "./components/AIZone.js";
|
|
13
|
+
// Built-in card templates for AIZone injection
|
|
14
|
+
// Note: displayName is set explicitly on each — required for minification-safe template lookup.
|
|
15
|
+
export { InfoCard } from "./components/cards/InfoCard.js";
|
|
16
|
+
export { ReviewSummary } from "./components/cards/ReviewSummary.js";
|
|
12
17
|
|
|
13
18
|
// ─── Providers ───────────────────────────────────────────────
|
|
14
19
|
export { GeminiProvider } from "./providers/GeminiProvider.js";
|
|
@@ -24,8 +29,24 @@ export { AudioInputService } from "./services/AudioInputService.js";
|
|
|
24
29
|
export { AudioOutputService } from "./services/AudioOutputService.js";
|
|
25
30
|
export { KnowledgeBaseService } from "./services/KnowledgeBaseService.js";
|
|
26
31
|
|
|
32
|
+
// ─── Analytics ───────────────────────────────────────────────
|
|
33
|
+
// Requires api.mobileai.dev — hidden until backend is live
|
|
34
|
+
// export { MobileAI } from './services/telemetry';
|
|
35
|
+
|
|
27
36
|
// ─── Utilities ───────────────────────────────────────────────
|
|
28
37
|
export { logger } from "./utils/logger.js";
|
|
29
38
|
|
|
30
39
|
// ─── Types ───────────────────────────────────────────────────
|
|
40
|
+
|
|
41
|
+
// Requires api.mobileai.dev — hidden until backend is live
|
|
42
|
+
// export type {
|
|
43
|
+
// TelemetryConfig,
|
|
44
|
+
// TelemetryEvent,
|
|
45
|
+
// } from './services/telemetry';
|
|
46
|
+
|
|
47
|
+
// ─── Support Mode ────────────────────────────────────────────
|
|
48
|
+
// SupportGreeting, CSATSurvey, buildSupportPrompt work standalone (no backend)
|
|
49
|
+
// createEscalateTool works with provider='custom' (no backend)
|
|
50
|
+
// EscalationSocket and provider='mobileai' require api.mobileai.dev — hidden
|
|
51
|
+
export { SupportGreeting, CSATSurvey, buildSupportPrompt, createEscalateTool } from "./support/index.js";
|
|
31
52
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["AIAgent","GeminiProvider","OpenAIProvider","createProvider","useAction","useAI","VoiceService","AudioInputService","AudioOutputService","KnowledgeBaseService","logger"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAASA,OAAO,QAAQ,yBAAsB;;
|
|
1
|
+
{"version":3,"names":["AIAgent","AIZone","InfoCard","ReviewSummary","GeminiProvider","OpenAIProvider","createProvider","useAction","useAI","VoiceService","AudioInputService","AudioOutputService","KnowledgeBaseService","logger","SupportGreeting","CSATSurvey","buildSupportPrompt","createEscalateTool"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,SAASA,OAAO,QAAQ,yBAAsB;AAC9C,SAASC,MAAM,QAAQ,wBAAqB;AAC5C;AACA;AACA,SAASC,QAAQ,QAAQ,gCAA6B;AACtD,SAASC,aAAa,QAAQ,qCAAkC;;AAEhE;AACA,SAASC,cAAc,QAAQ,+BAA4B;AAC3D,SAASC,cAAc,QAAQ,+BAA4B;AAC3D,SAASC,cAAc,QAAQ,gCAA6B;;AAE5D;AACA,SAASC,SAAS,EAAEC,KAAK,QAAQ,sBAAmB;;AAEpD;AACA,SAASC,YAAY,QAAQ,4BAAyB;AACtD,SAASC,iBAAiB,QAAQ,iCAA8B;AAChE,SAASC,kBAAkB,QAAQ,kCAA+B;AAClE,SAASC,oBAAoB,QAAQ,oCAAiC;;AAEtE;AACA;AACA;;AAEA;AACA,SAASC,MAAM,QAAQ,mBAAgB;;AAEvC;;AA0BA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,SAASC,eAAe,EAAEC,UAAU,EAAEC,kBAAkB,EAAEC,kBAAkB,QAAQ,oBAAW","ignoreList":[]}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
import { logger } from "../utils/logger.js";
|
|
14
14
|
import { base64ToFloat32 } from "../utils/audioUtils.js";
|
|
15
|
+
import { NativeModules } from 'react-native';
|
|
15
16
|
|
|
16
17
|
// ─── Types ─────────────────────────────────────────────────────
|
|
17
18
|
|
|
@@ -36,6 +37,15 @@ export class AudioOutputService {
|
|
|
36
37
|
try {
|
|
37
38
|
let audioApi;
|
|
38
39
|
try {
|
|
40
|
+
// Guard: NativeModules.AudioApiModule is only present in dev/prod builds.
|
|
41
|
+
// In Expo Go it is undefined, and require() throws a native bridge error
|
|
42
|
+
// that cannot be caught by a standard try/catch.
|
|
43
|
+
if (!NativeModules.AudioApiModule) {
|
|
44
|
+
const msg = '[mobileai] react-native-audio-api native module not found. ' + 'Voice audio output requires a development build (not Expo Go). ' + 'Run: npx expo run:ios';
|
|
45
|
+
logger.warn('AudioOutput', msg);
|
|
46
|
+
this.config.onError?.(msg);
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
39
49
|
const audioApiModule = ['react-native', 'audio-api'].join('-');
|
|
40
50
|
audioApi = require(audioApiModule);
|
|
41
51
|
} catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["logger","base64ToFloat32","GEMINI_OUTPUT_SAMPLE_RATE","AudioOutputService","audioContext","queueSourceNode","gainNode","muted","isStarted","chunkCount","constructor","config","initialize","audioApi","
|
|
1
|
+
{"version":3,"names":["logger","base64ToFloat32","NativeModules","GEMINI_OUTPUT_SAMPLE_RATE","AudioOutputService","audioContext","queueSourceNode","gainNode","muted","isStarted","chunkCount","constructor","config","initialize","audioApi","AudioApiModule","msg","warn","onError","audioApiModule","join","require","error","sampleRate","AudioManager","setAudioSessionOptions","iosCategory","iosMode","iosOptions","info","sessionErr","message","AudioContext","createGain","gain","value","connect","destination","createBufferQueueSource","state","resume","enqueue","base64Audio","length","float32Data","peakAmp","i","abs","Math","toFixed","audioBuffer","createBuffer","copyToChannel","enqueueBuffer","start","onPlaybackStart","stack","substring","mute","unmute","isMuted","stop","clearBuffers","onPlaybackEnd","cleanup","close"],"sourceRoot":"../../../src","sources":["services/AudioOutputService.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { logger } from "../../utils/logger.js";
|
|
4
|
+
import { getDeviceId } from "../telemetry/device.js";
|
|
5
|
+
const LOG_TAG = 'FlagService';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* MurmurHash3 (32-bit) implementation
|
|
9
|
+
*/
|
|
10
|
+
function murmurhash3_32_gc(key, seed = 0) {
|
|
11
|
+
let remainder, bytes, h1, h1b, c1, c2, k1, i;
|
|
12
|
+
remainder = key.length & 3; // key.length % 4
|
|
13
|
+
bytes = key.length - remainder;
|
|
14
|
+
h1 = seed;
|
|
15
|
+
c1 = 0xcc9e2d51;
|
|
16
|
+
c2 = 0x1b873593;
|
|
17
|
+
i = 0;
|
|
18
|
+
while (i < bytes) {
|
|
19
|
+
k1 = key.charCodeAt(i) & 0xff | (key.charCodeAt(++i) & 0xff) << 8 | (key.charCodeAt(++i) & 0xff) << 16 | (key.charCodeAt(++i) & 0xff) << 24;
|
|
20
|
+
++i;
|
|
21
|
+
k1 = (k1 & 0xffff) * c1 + (((k1 >>> 16) * c1 & 0xffff) << 16) & 0xffffffff;
|
|
22
|
+
k1 = k1 << 15 | k1 >>> 17;
|
|
23
|
+
k1 = (k1 & 0xffff) * c2 + (((k1 >>> 16) * c2 & 0xffff) << 16) & 0xffffffff;
|
|
24
|
+
h1 ^= k1;
|
|
25
|
+
h1 = h1 << 13 | h1 >>> 19;
|
|
26
|
+
h1b = (h1 & 0xffff) * 5 + (((h1 >>> 16) * 5 & 0xffff) << 16) & 0xffffffff;
|
|
27
|
+
h1 = (h1b & 0xffff) + 0x6b64 + (((h1b >>> 16) + 0xe654 & 0xffff) << 16);
|
|
28
|
+
}
|
|
29
|
+
if (remainder >= 1) {
|
|
30
|
+
k1 = 0;
|
|
31
|
+
if (remainder >= 3) k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;
|
|
32
|
+
if (remainder >= 2) k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;
|
|
33
|
+
k1 ^= key.charCodeAt(i) & 0xff;
|
|
34
|
+
k1 = (k1 & 0xffff) * c1 + (((k1 >>> 16) * c1 & 0xffff) << 16) & 0xffffffff;
|
|
35
|
+
k1 = k1 << 15 | k1 >>> 17;
|
|
36
|
+
k1 = (k1 & 0xffff) * c2 + (((k1 >>> 16) * c2 & 0xffff) << 16) & 0xffffffff;
|
|
37
|
+
h1 ^= k1;
|
|
38
|
+
}
|
|
39
|
+
h1 ^= key.length;
|
|
40
|
+
h1 ^= h1 >>> 16;
|
|
41
|
+
h1 = (h1 & 0xffff) * 0x85ebca6b + (((h1 >>> 16) * 0x85ebca6b & 0xffff) << 16) & 0xffffffff;
|
|
42
|
+
h1 ^= h1 >>> 13;
|
|
43
|
+
h1 = (h1 & 0xffff) * 0xc2b2ae35 + (((h1 >>> 16) * 0xc2b2ae35 & 0xffff) << 16) & 0xffffffff;
|
|
44
|
+
h1 ^= h1 >>> 16;
|
|
45
|
+
return h1 >>> 0;
|
|
46
|
+
}
|
|
47
|
+
export class FlagService {
|
|
48
|
+
assignments = {};
|
|
49
|
+
fetched = false;
|
|
50
|
+
constructor(hostUrl) {
|
|
51
|
+
this.hostUrl = hostUrl;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Fetch feature flags from the dashboard backend
|
|
56
|
+
*/
|
|
57
|
+
async fetch(analyticsKey, userId) {
|
|
58
|
+
try {
|
|
59
|
+
// Avoid fetching if already loaded, unless explicitly forced?
|
|
60
|
+
// For now, allow refetching just in case.
|
|
61
|
+
const res = await fetch(`${this.hostUrl}/api/v1/flags/sync?key=${analyticsKey}`);
|
|
62
|
+
if (!res.ok) {
|
|
63
|
+
throw new Error(`Failed to fetch flags: ${res.status}`);
|
|
64
|
+
}
|
|
65
|
+
const data = await res.json();
|
|
66
|
+
const flags = data.flags || [];
|
|
67
|
+
this.assignAll(flags, userId);
|
|
68
|
+
this.fetched = true;
|
|
69
|
+
logger.info(LOG_TAG, `Fetched ${flags.length} flags`);
|
|
70
|
+
} catch (err) {
|
|
71
|
+
logger.warn(LOG_TAG, `Could not sync feature flags: ${err.message}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Deterministically assign a variant using murmurhash.
|
|
77
|
+
*/
|
|
78
|
+
assignVariant(userIdentifier, flagKey, variants, rollout) {
|
|
79
|
+
const hash = murmurhash3_32_gc(`${userIdentifier}_${flagKey}`) % 100;
|
|
80
|
+
let cumulative = 0;
|
|
81
|
+
for (let i = 0; i < rollout.length; i++) {
|
|
82
|
+
cumulative += rollout[i];
|
|
83
|
+
if (hash < cumulative) {
|
|
84
|
+
return variants[i];
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Fallback if rollout doesn't equal exactly 100 or edge case
|
|
89
|
+
return variants[0];
|
|
90
|
+
}
|
|
91
|
+
assignAll(flags, userId) {
|
|
92
|
+
const identifier = userId || getDeviceId();
|
|
93
|
+
const newAssignments = {};
|
|
94
|
+
for (const flag of flags) {
|
|
95
|
+
if (flag.variants.length > 0 && flag.rollout.length === flag.variants.length) {
|
|
96
|
+
newAssignments[flag.key] = this.assignVariant(identifier, flag.key, flag.variants, flag.rollout);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
this.assignments = newAssignments;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Get a specific flag value */
|
|
103
|
+
getFlag(key, defaultValue) {
|
|
104
|
+
if (!this.fetched) {
|
|
105
|
+
logger.debug(LOG_TAG, `getFlag("${key}") called before flags were fetched. Returning default.`);
|
|
106
|
+
}
|
|
107
|
+
return this.assignments[key] ?? defaultValue ?? '';
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** Get all active assignments for telemetry */
|
|
111
|
+
getAllFlags() {
|
|
112
|
+
return {
|
|
113
|
+
...this.assignments
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=FlagService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["logger","getDeviceId","LOG_TAG","murmurhash3_32_gc","key","seed","remainder","bytes","h1","h1b","c1","c2","k1","i","length","charCodeAt","FlagService","assignments","fetched","constructor","hostUrl","fetch","analyticsKey","userId","res","ok","Error","status","data","json","flags","assignAll","info","err","warn","message","assignVariant","userIdentifier","flagKey","variants","rollout","hash","cumulative","identifier","newAssignments","flag","getFlag","defaultValue","debug","getAllFlags"],"sourceRoot":"../../../../src","sources":["services/flags/FlagService.ts"],"mappings":";;AAAA,SAASA,MAAM,QAAQ,uBAAoB;AAC3C,SAASC,WAAW,QAAQ,wBAAqB;AAEjD,MAAMC,OAAO,GAAG,aAAa;;AAE7B;AACA;AACA;AACA,SAASC,iBAAiBA,CAACC,GAAW,EAAEC,IAAY,GAAG,CAAC,EAAU;EAChE,IAAIC,SAAS,EAAEC,KAAK,EAAEC,EAAE,EAAEC,GAAG,EAAEC,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAEC,CAAC;EAE5CP,SAAS,GAAGF,GAAG,CAACU,MAAM,GAAG,CAAC,CAAC,CAAC;EAC5BP,KAAK,GAAGH,GAAG,CAACU,MAAM,GAAGR,SAAS;EAC9BE,EAAE,GAAGH,IAAI;EACTK,EAAE,GAAG,UAAU;EACfC,EAAE,GAAG,UAAU;EACfE,CAAC,GAAG,CAAC;EAEL,OAAOA,CAAC,GAAGN,KAAK,EAAE;IACfK,EAAE,GACCR,GAAG,CAACW,UAAU,CAACF,CAAC,CAAC,GAAG,IAAI,GACzB,CAACT,GAAG,CAACW,UAAU,CAAC,EAAEF,CAAC,CAAC,GAAG,IAAI,KAAK,CAAE,GAClC,CAACT,GAAG,CAACW,UAAU,CAAC,EAAEF,CAAC,CAAC,GAAG,IAAI,KAAK,EAAG,GACnC,CAACT,GAAG,CAACW,UAAU,CAAC,EAAEF,CAAC,CAAC,GAAG,IAAI,KAAK,EAAG;IACrC,EAAEA,CAAC;IAEHD,EAAE,GAAM,CAACA,EAAE,GAAG,MAAM,IAAIF,EAAE,IAAK,CAAE,CAACE,EAAE,KAAK,EAAE,IAAIF,EAAE,GAAI,MAAM,KAAK,EAAE,CAAC,GAAK,UAAU;IAClFE,EAAE,GAAIA,EAAE,IAAI,EAAE,GAAKA,EAAE,KAAK,EAAG;IAC7BA,EAAE,GAAM,CAACA,EAAE,GAAG,MAAM,IAAID,EAAE,IAAK,CAAE,CAACC,EAAE,KAAK,EAAE,IAAID,EAAE,GAAI,MAAM,KAAK,EAAE,CAAC,GAAK,UAAU;IAElFH,EAAE,IAAII,EAAE;IACPJ,EAAE,GAAIA,EAAE,IAAI,EAAE,GAAKA,EAAE,KAAK,EAAG;IAC9BC,GAAG,GAAM,CAACD,EAAE,GAAG,MAAM,IAAI,CAAC,IAAK,CAAE,CAACA,EAAE,KAAK,EAAE,IAAI,CAAC,GAAI,MAAM,KAAK,EAAE,CAAC,GAAK,UAAU;IACjFA,EAAE,GAAK,CAACC,GAAG,GAAG,MAAM,IAAI,MAAM,IAAK,CAAE,CAACA,GAAG,KAAK,EAAE,IAAI,MAAM,GAAI,MAAM,KAAK,EAAE,CAAE;EAChF;EAEA,IAAIH,SAAS,IAAI,CAAC,EAAE;IAClBM,EAAE,GAAG,CAAC;IACN,IAAIN,SAAS,IAAI,CAAC,EAAEM,EAAE,IAAI,CAACR,GAAG,CAACW,UAAU,CAACF,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,KAAK,EAAE;IAC9D,IAAIP,SAAS,IAAI,CAAC,EAAEM,EAAE,IAAI,CAACR,GAAG,CAACW,UAAU,CAACF,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC;IAC7DD,EAAE,IAAKR,GAAG,CAACW,UAAU,CAACF,CAAC,CAAC,GAAG,IAAK;IAChCD,EAAE,GAAK,CAACA,EAAE,GAAG,MAAM,IAAIF,EAAE,IAAK,CAAE,CAACE,EAAE,KAAK,EAAE,IAAIF,EAAE,GAAI,MAAM,KAAK,EAAE,CAAC,GAAI,UAAU;IAChFE,EAAE,GAAIA,EAAE,IAAI,EAAE,GAAKA,EAAE,KAAK,EAAG;IAC7BA,EAAE,GAAK,CAACA,EAAE,GAAG,MAAM,IAAID,EAAE,IAAK,CAAE,CAACC,EAAE,KAAK,EAAE,IAAID,EAAE,GAAI,MAAM,KAAK,EAAE,CAAC,GAAI,UAAU;IAChFH,EAAE,IAAII,EAAE;EACV;EAEAJ,EAAE,IAAIJ,GAAG,CAACU,MAAM;EAEhBN,EAAE,IAAIA,EAAE,KAAK,EAAE;EACfA,EAAE,GAAK,CAACA,EAAE,GAAG,MAAM,IAAI,UAAU,IAAK,CAAE,CAACA,EAAE,KAAK,EAAE,IAAI,UAAU,GAAI,MAAM,KAAK,EAAE,CAAC,GAAI,UAAU;EAChGA,EAAE,IAAIA,EAAE,KAAK,EAAE;EACfA,EAAE,GAAM,CAACA,EAAE,GAAG,MAAM,IAAI,UAAU,IAAK,CAAE,CAACA,EAAE,KAAK,EAAE,IAAI,UAAU,GAAI,MAAM,KAAK,EAAE,CAAC,GAAK,UAAU;EAClGA,EAAE,IAAIA,EAAE,KAAK,EAAE;EAEf,OAAOA,EAAE,KAAK,CAAC;AACjB;AAQA,OAAO,MAAMQ,WAAW,CAAC;EACfC,WAAW,GAA2B,CAAC,CAAC;EACxCC,OAAO,GAAY,KAAK;EAEhCC,WAAWA,CAASC,OAAe,EAAE;IAAA,KAAjBA,OAAe,GAAfA,OAAe;EAAG;;EAEtC;AACF;AACA;EACE,MAAMC,KAAKA,CAACC,YAAoB,EAAEC,MAAe,EAAiB;IAChE,IAAI;MACF;MACA;MACA,MAAMC,GAAG,GAAG,MAAMH,KAAK,CAAC,GAAG,IAAI,CAACD,OAAO,0BAA0BE,YAAY,EAAE,CAAC;MAChF,IAAI,CAACE,GAAG,CAACC,EAAE,EAAE;QACX,MAAM,IAAIC,KAAK,CAAC,0BAA0BF,GAAG,CAACG,MAAM,EAAE,CAAC;MACzD;MAEA,MAAMC,IAAI,GAAG,MAAMJ,GAAG,CAACK,IAAI,CAAC,CAAC;MAC7B,MAAMC,KAA2B,GAAGF,IAAI,CAACE,KAAK,IAAI,EAAE;MAEpD,IAAI,CAACC,SAAS,CAACD,KAAK,EAAEP,MAAM,CAAC;MAC7B,IAAI,CAACL,OAAO,GAAG,IAAI;MACnBlB,MAAM,CAACgC,IAAI,CAAC9B,OAAO,EAAE,WAAW4B,KAAK,CAAChB,MAAM,QAAQ,CAAC;IACvD,CAAC,CAAC,OAAOmB,GAAQ,EAAE;MACjBjC,MAAM,CAACkC,IAAI,CAAChC,OAAO,EAAE,iCAAiC+B,GAAG,CAACE,OAAO,EAAE,CAAC;IACtE;EACF;;EAEA;AACF;AACA;EACUC,aAAaA,CAACC,cAAsB,EAAEC,OAAe,EAAEC,QAAkB,EAAEC,OAAiB,EAAU;IAC5G,MAAMC,IAAI,GAAGtC,iBAAiB,CAAC,GAAGkC,cAAc,IAAIC,OAAO,EAAE,CAAC,GAAG,GAAG;IACpE,IAAII,UAAU,GAAG,CAAC;IAElB,KAAK,IAAI7B,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG2B,OAAO,CAAC1B,MAAM,EAAED,CAAC,EAAE,EAAE;MACvC6B,UAAU,IAAIF,OAAO,CAAC3B,CAAC,CAAE;MACzB,IAAI4B,IAAI,GAAGC,UAAU,EAAE;QACrB,OAAOH,QAAQ,CAAC1B,CAAC,CAAC;MACpB;IACF;;IAEA;IACA,OAAO0B,QAAQ,CAAC,CAAC,CAAC;EACpB;EAEQR,SAASA,CAACD,KAA2B,EAAEP,MAAe,EAAE;IAC9D,MAAMoB,UAAU,GAAGpB,MAAM,IAAItB,WAAW,CAAC,CAAC;IAE1C,MAAM2C,cAAsC,GAAG,CAAC,CAAC;IACjD,KAAK,MAAMC,IAAI,IAAIf,KAAK,EAAE;MACxB,IAAIe,IAAI,CAACN,QAAQ,CAACzB,MAAM,GAAG,CAAC,IAAI+B,IAAI,CAACL,OAAO,CAAC1B,MAAM,KAAK+B,IAAI,CAACN,QAAQ,CAACzB,MAAM,EAAE;QAC5E8B,cAAc,CAACC,IAAI,CAACzC,GAAG,CAAC,GAAG,IAAI,CAACgC,aAAa,CAACO,UAAU,EAAEE,IAAI,CAACzC,GAAG,EAAEyC,IAAI,CAACN,QAAQ,EAAEM,IAAI,CAACL,OAAO,CAAC;MAClG;IACF;IAEA,IAAI,CAACvB,WAAW,GAAG2B,cAAc;EACnC;;EAEA;EACAE,OAAOA,CAAC1C,GAAW,EAAE2C,YAAqB,EAAU;IAClD,IAAI,CAAC,IAAI,CAAC7B,OAAO,EAAE;MACjBlB,MAAM,CAACgD,KAAK,CAAC9C,OAAO,EAAE,YAAYE,GAAG,yDAAyD,CAAC;IACjG;IACA,OAAO,IAAI,CAACa,WAAW,CAACb,GAAG,CAAC,IAAI2C,YAAY,IAAI,EAAE;EACpD;;EAEA;EACAE,WAAWA,CAAA,EAA2B;IACpC,OAAO;MAAE,GAAG,IAAI,CAAChC;IAAY,CAAC;EAChC;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* MobileAI — Public static API for consumer event tracking.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* import { MobileAI } from '@mobileai/react-native';
|
|
8
|
+
* MobileAI.track('purchase_complete', { total: 29.99 });
|
|
9
|
+
*
|
|
10
|
+
* The TelemetryService instance is injected by the <AIAgent> component.
|
|
11
|
+
* If no analyticsKey is configured, all calls are no-ops.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { logger } from "../../utils/logger.js";
|
|
15
|
+
const LOG_TAG = 'MobileAI';
|
|
16
|
+
let service = null;
|
|
17
|
+
export const MobileAI = {
|
|
18
|
+
/**
|
|
19
|
+
* Track a custom business event.
|
|
20
|
+
* @param eventName - Name of the event (e.g., 'purchase_complete')
|
|
21
|
+
* @param data - Event-specific key-value data
|
|
22
|
+
*/
|
|
23
|
+
track(eventName, data = {}) {
|
|
24
|
+
if (!service) {
|
|
25
|
+
logger.debug(LOG_TAG, `track('${eventName}') ignored — no analyticsKey configured`);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
service.track(eventName, data);
|
|
29
|
+
},
|
|
30
|
+
/**
|
|
31
|
+
* Identify the current user (optional, for user-level analytics).
|
|
32
|
+
* @param userId - Unique user identifier (hashed by consumer)
|
|
33
|
+
* @param traits - Optional user traits (plan, role, etc.)
|
|
34
|
+
*/
|
|
35
|
+
identify(userId, traits = {}) {
|
|
36
|
+
if (!service) {
|
|
37
|
+
logger.debug(LOG_TAG, 'identify() ignored — no analyticsKey configured');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
service.track('identify', {
|
|
41
|
+
user_id: userId,
|
|
42
|
+
...traits
|
|
43
|
+
});
|
|
44
|
+
},
|
|
45
|
+
/**
|
|
46
|
+
* Get an assigned feature flag variation for the current device.
|
|
47
|
+
* Deterministic via murmurhash. Call after MobileAI has initialized.
|
|
48
|
+
* @param key Flag key
|
|
49
|
+
* @param defaultValue Fallback if not assigned
|
|
50
|
+
*/
|
|
51
|
+
getFlag(key, defaultValue) {
|
|
52
|
+
if (!service) {
|
|
53
|
+
return defaultValue ?? '';
|
|
54
|
+
}
|
|
55
|
+
return service.flags.getFlag(key, defaultValue);
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Internal: Bind the TelemetryService instance (called by AIAgent on mount).
|
|
61
|
+
* Not exported to consumers.
|
|
62
|
+
*/
|
|
63
|
+
export function bindTelemetryService(instance) {
|
|
64
|
+
service = instance;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=MobileAI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["logger","LOG_TAG","service","MobileAI","track","eventName","data","debug","identify","userId","traits","user_id","getFlag","key","defaultValue","flags","bindTelemetryService","instance"],"sourceRoot":"../../../../src","sources":["services/telemetry/MobileAI.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAGA,SAASA,MAAM,QAAQ,uBAAoB;AAE3C,MAAMC,OAAO,GAAG,UAAU;AAE1B,IAAIC,OAAgC,GAAG,IAAI;AAE3C,OAAO,MAAMC,QAAQ,GAAG;EACtB;AACF;AACA;AACA;AACA;EACEC,KAAKA,CAACC,SAAiB,EAAEC,IAA6B,GAAG,CAAC,CAAC,EAAQ;IACjE,IAAI,CAACJ,OAAO,EAAE;MACZF,MAAM,CAACO,KAAK,CAACN,OAAO,EAAE,UAAUI,SAAS,yCAAyC,CAAC;MACnF;IACF;IACAH,OAAO,CAACE,KAAK,CAACC,SAAS,EAAEC,IAAI,CAAC;EAChC,CAAC;EAED;AACF;AACA;AACA;AACA;EACEE,QAAQA,CAACC,MAAc,EAAEC,MAA+B,GAAG,CAAC,CAAC,EAAQ;IACnE,IAAI,CAACR,OAAO,EAAE;MACZF,MAAM,CAACO,KAAK,CAACN,OAAO,EAAE,iDAAiD,CAAC;MACxE;IACF;IACAC,OAAO,CAACE,KAAK,CAAC,UAAU,EAAE;MAAEO,OAAO,EAAEF,MAAM;MAAE,GAAGC;IAAO,CAAC,CAAC;EAC3D,CAAC;EAED;AACF;AACA;AACA;AACA;AACA;EACEE,OAAOA,CAACC,GAAW,EAAEC,YAAqB,EAAU;IAClD,IAAI,CAACZ,OAAO,EAAE;MACZ,OAAOY,YAAY,IAAI,EAAE;IAC3B;IACA,OAAOZ,OAAO,CAACa,KAAK,CAACH,OAAO,CAACC,GAAG,EAAEC,YAAY,CAAC;EACjD;AACF,CAAC;;AAED;AACA;AACA;AACA;AACA,OAAO,SAASE,oBAAoBA,CAACC,QAAiC,EAAQ;EAC5Ef,OAAO,GAAGe,QAAQ;AACpB","ignoreList":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const EMAIL_RE = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
|
|
4
|
+
const PHONE_RE = /(\+?\d[\d\s\-().]{7,}\d)/g;
|
|
5
|
+
const CARD_RE = /\b\d{4}[\s\-]?\d{4}[\s\-]?\d{4}[\s\-]?\d{4}\b/g;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Scrubs common PII patterns from strings.
|
|
9
|
+
* Used by TelemetryService to sanitize auto-captured touch labels.
|
|
10
|
+
*/
|
|
11
|
+
export function scrubPII(value) {
|
|
12
|
+
if (typeof value !== 'string') return value;
|
|
13
|
+
return value.replace(EMAIL_RE, '[email]').replace(CARD_RE, '[card]')
|
|
14
|
+
// Phone numbers are tricky, we rely on the 7+ digit regex
|
|
15
|
+
.replace(PHONE_RE, '[phone]');
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=PiiScrubber.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["EMAIL_RE","PHONE_RE","CARD_RE","scrubPII","value","replace"],"sourceRoot":"../../../../src","sources":["services/telemetry/PiiScrubber.ts"],"mappings":";;AAAA,MAAMA,QAAQ,GAAG,iDAAiD;AAClE,MAAMC,QAAQ,GAAG,2BAA2B;AAC5C,MAAMC,OAAO,GAAG,gDAAgD;;AAEhE;AACA;AACA;AACA;AACA,OAAO,SAASC,QAAQA,CAACC,KAAa,EAAU;EAC9C,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAOA,KAAK;EAE3C,OAAOA,KAAK,CACTC,OAAO,CAACL,QAAQ,EAAE,SAAS,CAAC,CAC5BK,OAAO,CAACH,OAAO,EAAE,QAAQ;EAC1B;EAAA,CACCG,OAAO,CAACJ,QAAQ,EAAE,SAAS,CAAC;AACjC","ignoreList":[]}
|