@mobileai/react-native 0.9.11 → 0.9.13
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 +480 -61
- package/lib/module/components/AIAgent.js +202 -25
- package/lib/module/components/AIAgent.js.map +1 -1
- package/lib/module/components/AgentChatBar.js +15 -16
- package/lib/module/components/AgentChatBar.js.map +1 -1
- package/lib/module/components/DiscoveryTooltip.js +128 -0
- package/lib/module/components/DiscoveryTooltip.js.map +1 -0
- package/lib/module/core/AgentRuntime.js +77 -1
- package/lib/module/core/AgentRuntime.js.map +1 -1
- package/lib/module/core/FiberTreeWalker.js +5 -1
- package/lib/module/core/FiberTreeWalker.js.map +1 -1
- package/lib/module/core/systemPrompt.js +41 -3
- package/lib/module/core/systemPrompt.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/services/telemetry/TelemetryService.js +5 -2
- package/lib/module/services/telemetry/TelemetryService.js.map +1 -1
- package/lib/module/services/telemetry/deviceMetadata.js +10 -0
- package/lib/module/services/telemetry/deviceMetadata.js.map +1 -0
- package/lib/module/support/EscalationEventSource.js +168 -0
- package/lib/module/support/EscalationEventSource.js.map +1 -0
- package/lib/module/support/SupportChatModal.js +32 -4
- package/lib/module/support/SupportChatModal.js.map +1 -1
- package/lib/module/support/escalateTool.js +8 -2
- package/lib/module/support/escalateTool.js.map +1 -1
- package/lib/module/support/index.js +2 -0
- package/lib/module/support/index.js.map +1 -1
- package/lib/typescript/src/components/AIAgent.d.ts +18 -2
- package/lib/typescript/src/components/AIAgent.d.ts.map +1 -1
- package/lib/typescript/src/components/AgentChatBar.d.ts +5 -1
- package/lib/typescript/src/components/AgentChatBar.d.ts.map +1 -1
- package/lib/typescript/src/components/DiscoveryTooltip.d.ts +15 -0
- package/lib/typescript/src/components/DiscoveryTooltip.d.ts.map +1 -0
- package/lib/typescript/src/core/AgentRuntime.d.ts +7 -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/systemPrompt.d.ts +1 -1
- package/lib/typescript/src/core/systemPrompt.d.ts.map +1 -1
- package/lib/typescript/src/core/types.d.ts +19 -0
- package/lib/typescript/src/core/types.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +1 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/services/telemetry/TelemetryService.d.ts +2 -1
- package/lib/typescript/src/services/telemetry/TelemetryService.d.ts.map +1 -1
- package/lib/typescript/src/services/telemetry/deviceMetadata.d.ts +6 -0
- package/lib/typescript/src/services/telemetry/deviceMetadata.d.ts.map +1 -0
- package/lib/typescript/src/support/EscalationEventSource.d.ts +38 -0
- package/lib/typescript/src/support/EscalationEventSource.d.ts.map +1 -0
- package/lib/typescript/src/support/SupportChatModal.d.ts +3 -1
- package/lib/typescript/src/support/SupportChatModal.d.ts.map +1 -1
- package/lib/typescript/src/support/escalateTool.d.ts +1 -0
- package/lib/typescript/src/support/escalateTool.d.ts.map +1 -1
- package/lib/typescript/src/support/index.d.ts +1 -0
- package/lib/typescript/src/support/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/AIAgent.tsx +209 -22
- package/src/components/AgentChatBar.tsx +21 -10
- package/src/components/DiscoveryTooltip.tsx +148 -0
- package/src/core/AgentRuntime.ts +87 -1
- package/src/core/FiberTreeWalker.ts +5 -0
- package/src/core/systemPrompt.ts +41 -3
- package/src/core/types.ts +21 -0
- package/src/index.ts +1 -0
- package/src/services/telemetry/TelemetryService.ts +6 -1
- package/src/services/telemetry/deviceMetadata.ts +13 -0
- package/src/support/EscalationEventSource.ts +190 -0
- package/src/support/SupportChatModal.tsx +58 -22
- package/src/support/escalateTool.ts +8 -2
- package/src/support/index.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;AAEnD;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,WAAW,CAAC;AAItD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAIjD,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,YAAY,GAC1E,QAAQ,GAAG,QAAQ,GAAG,aAAa,CAAC;AAExC,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,mBAAmB;IACnB,IAAI,EAAE,WAAW,CAAC;IAClB,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC5B,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,SAAS,EAAE,GAAG,CAAC;IACf;;;;;;;;OAQG;IACH,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAID,MAAM,WAAW,gBAAgB;IAC/B,kDAAkD;IAClD,UAAU,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,yBAAyB;IACzB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAID,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,aAAa,GAAG,kBAAkB,CAAC;IAC9C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;CACrB;AAID,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,cAAc,CAAC;IAC3B,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,cAAc,CAAC;IAE1B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE3C,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,eAAe,CAAC,EAAE,eAAe,CAAC;IAElC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;IAIhD;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IAE9C;;;OAGG;IACH,oBAAoB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;IAI9C,qCAAqC;IACrC,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAE3D,sDAAsD;IACtD,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAE7D,2CAA2C;IAC3C,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAE1C,wDAAwD;IACxD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAIhE;;;;OAIG;IACH,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAIvE;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC,CAAC;IAIpD,kDAAkD;IAClD,YAAY,CAAC,EAAE;QACb,8DAA8D;QAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB;;;;WAIG;QACH,qBAAqB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;KAC3E,CAAC;IAEF;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IAInB;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC;IAItB;;;OAGG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAE1C;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IAE3C;;;;;OAKG;IACH,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAElD;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAI1C;;;OAGG;IACH,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAC7B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAChC,IAAI,EAAE,MAAM,IAAI,CAAC;KAClB,CAAC;IAEF;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAIlB;;;;OAIG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAEpC,qFAAqF;IACrF,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAI5B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAIpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,kDAAkD;IAClD,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAID,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAID,MAAM,WAAW,kBAAkB;IACjC,6FAA6F;IAC7F,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;IACtC,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yEAAyE;IACzE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC;IACxD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC;CAC7C;AAID,oDAAoD;AACpD,MAAM,WAAW,cAAc;IAC7B,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,4EAA4E;AAC5E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAC5E;AAED;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,cAAc,EAAE,GAAG,kBAAkB,CAAC;AAIxE,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACxB,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,4BAA4B;IAC5B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,MAAM,CAAC,EAAE,eAAe,CAAC;CAC1B;AAID,6DAA6D;AAC7D,MAAM,WAAW,YAAY;IAC3B;6BACyB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAID,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,qEAAqE;IACrE,gBAAgB,EAAE,MAAM,CAAC;IACzB,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;CACd;AAID,6CAA6C;AAC7C,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,0DAA0D;AAC1D,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAAE,CAAC,CAAC;IAC9D,2EAA2E;IAC3E,SAAS,EAAE,cAAc,CAAC;IAC1B,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,eAAe,CACb,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,EAAE,SAAS,EAAE;IACpB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,cAAc,CAAC,CAAC;CAC5B;AAID;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4DAA4D;IAC5D,EAAE,EAAE,MAAM,CAAC;IACX,+EAA+E;IAC/E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6DAA6D;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,4DAA4D;IAC5D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;OAKG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,YAAY;IAClD,6CAA6C;IAC7C,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,4CAA4C;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wGAAwG;IACxG,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,mEAAmE;IACnE,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;CACrD"}
|
|
@@ -18,7 +18,7 @@ export { AudioOutputService } from './services/AudioOutputService';
|
|
|
18
18
|
export { KnowledgeBaseService } from './services/KnowledgeBaseService';
|
|
19
19
|
export { MobileAI } from './services/telemetry';
|
|
20
20
|
export { logger } from './utils/logger';
|
|
21
|
-
export type { AgentConfig, AgentMode, ExecutionResult, InteractiveElement, DehydratedScreen, ToolDefinition, ActionDefinition, TokenUsage, KnowledgeEntry, KnowledgeRetriever, KnowledgeBaseConfig, ChatBarTheme, AIMessage, AIProviderName, ScreenMap, ScreenMapEntry, } from './core/types';
|
|
21
|
+
export type { AgentConfig, AgentMode, ExecutionResult, InteractiveElement, DehydratedScreen, ToolDefinition, ActionDefinition, TokenUsage, KnowledgeEntry, KnowledgeRetriever, KnowledgeBaseConfig, ChatBarTheme, AIMessage, AIProviderName, ScreenMap, ScreenMapEntry, InteractionMode, } from './core/types';
|
|
22
22
|
export type { VoiceServiceConfig, VoiceServiceCallbacks, VoiceStatus, } from './services/VoiceService';
|
|
23
23
|
export type { TelemetryConfig, TelemetryEvent, } from './services/telemetry';
|
|
24
24
|
export { SupportGreeting, CSATSurvey, buildSupportPrompt, createEscalateTool, EscalationSocket } from './support';
|
|
@@ -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;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,
|
|
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,EACd,eAAe,GAChB,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,EACnB,aAAa,GACd,MAAM,WAAW,CAAC"}
|
|
@@ -14,11 +14,12 @@ export declare class TelemetryService {
|
|
|
14
14
|
private config;
|
|
15
15
|
private sessionId;
|
|
16
16
|
private currentScreen;
|
|
17
|
+
private screenFlow;
|
|
17
18
|
private flushTimer;
|
|
18
19
|
private isFlushing;
|
|
19
20
|
private appStateSubscription;
|
|
20
|
-
/** Public getter for the current screen, used by auto-capture utilities */
|
|
21
21
|
get screen(): string;
|
|
22
|
+
getScreenFlow(): string[];
|
|
22
23
|
/**
|
|
23
24
|
* True while the AI agent is executing a tool (tap, type, navigate, etc.).
|
|
24
25
|
* The touch interceptor checks this flag to avoid double-counting AI actions
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TelemetryService.d.ts","sourceRoot":"","sources":["../../../../../src/services/telemetry/TelemetryService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAGV,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAsDnD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,oBAAoB,CAA6D;IAEzF,
|
|
1
|
+
{"version":3,"file":"TelemetryService.d.ts","sourceRoot":"","sources":["../../../../../src/services/telemetry/TelemetryService.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAGV,eAAe,EAChB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAsDnD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,UAAU,CAAgB;IAClC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,oBAAoB,CAA6D;IAEzF,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,aAAa,IAAI,MAAM,EAAE;IAIzB;;;;OAIG;IACH,aAAa,UAAS;IAEf,KAAK,EAAE,WAAW,CAAC;IAE1B,4DAA4D;IAC5D,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;gBAIzB,MAAM,EAAE,eAAe;IAgBnC,kDAAkD;IAC5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwC5B,mDAAmD;IAC7C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B3B,sCAAsC;IACtC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,IAAI;IAmC7D,8DAA8D;IAC9D,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAenC,0CAA0C;IACpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8C5B,oEAAoE;YACtD,YAAY;IAU1B,kDAAkD;YACpC,YAAY;IAkB1B,uCAAuC;IACvC,OAAO,CAAC,SAAS;CAGlB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deviceMetadata.d.ts","sourceRoot":"","sources":["../../../../../src/services/telemetry/deviceMetadata.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EscalationEventSource — SSE client using fetch + ReadableStream.
|
|
3
|
+
*
|
|
4
|
+
* Uses only the fetch API (available in all React Native runtimes)
|
|
5
|
+
* to consume Server-Sent Events — no EventSource polyfill needed.
|
|
6
|
+
* Provides a reliable, auto-reconnecting channel for server-push
|
|
7
|
+
* events like `ticket_closed` that complements the bidirectional
|
|
8
|
+
* WebSocket used for chat.
|
|
9
|
+
*
|
|
10
|
+
* Lifecycle:
|
|
11
|
+
* 1. SDK calls connect() → fetch with streaming response
|
|
12
|
+
* 2. Server holds connection open, pushes `ticket_closed` when agent resolves
|
|
13
|
+
* 3. On disconnect, auto-reconnects with exponential backoff (max 5 attempts)
|
|
14
|
+
* 4. If ticket is already closed, server responds immediately with the event
|
|
15
|
+
*/
|
|
16
|
+
export interface EscalationEventSourceOptions {
|
|
17
|
+
url: string;
|
|
18
|
+
onTicketClosed?: (ticketId: string) => void;
|
|
19
|
+
onConnected?: (ticketId: string) => void;
|
|
20
|
+
onError?: (error: Error) => void;
|
|
21
|
+
}
|
|
22
|
+
export declare class EscalationEventSource {
|
|
23
|
+
private abortController;
|
|
24
|
+
private intentionalClose;
|
|
25
|
+
private reconnectAttempts;
|
|
26
|
+
private reconnectTimer;
|
|
27
|
+
private readonly maxReconnectAttempts;
|
|
28
|
+
private readonly options;
|
|
29
|
+
constructor(options: EscalationEventSourceOptions);
|
|
30
|
+
connect(): void;
|
|
31
|
+
disconnect(): void;
|
|
32
|
+
private openConnection;
|
|
33
|
+
private readStream;
|
|
34
|
+
private readFullResponse;
|
|
35
|
+
private handleEvent;
|
|
36
|
+
private scheduleReconnect;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=EscalationEventSource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EscalationEventSource.d.ts","sourceRoot":"","sources":["../../../../src/support/EscalationEventSource.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,MAAM,WAAW,4BAA4B;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAK;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;gBAE3C,OAAO,EAAE,4BAA4B;IAIjD,OAAO,IAAI,IAAI;IAMf,UAAU,IAAI,IAAI;YAYJ,cAAc;YAkCd,UAAU;YAwCV,gBAAgB;IA2B9B,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,iBAAiB;CAe1B"}
|
|
@@ -13,7 +13,9 @@ interface SupportChatModalProps {
|
|
|
13
13
|
isThinking?: boolean;
|
|
14
14
|
/** Optional: externally controlled scroll trigger. Pass when messages update externally. */
|
|
15
15
|
scrollToEndTrigger?: number;
|
|
16
|
+
/** Ticket status — when 'closed' or 'resolved', input is hidden and a banner is shown. */
|
|
17
|
+
ticketStatus?: string;
|
|
16
18
|
}
|
|
17
|
-
export declare function SupportChatModal({ visible, messages, onSend, onClose, isAgentTyping, isThinking, scrollToEndTrigger, }: SupportChatModalProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export declare function SupportChatModal({ visible, messages, onSend, onClose, isAgentTyping, isThinking, scrollToEndTrigger, ticketStatus, }: SupportChatModalProps): import("react/jsx-runtime").JSX.Element;
|
|
18
20
|
export {};
|
|
19
21
|
//# sourceMappingURL=SupportChatModal.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SupportChatModal.d.ts","sourceRoot":"","sources":["../../../../src/support/SupportChatModal.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAK/C,UAAU,qBAAqB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4FAA4F;IAC5F,kBAAkB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"SupportChatModal.d.ts","sourceRoot":"","sources":["../../../../src/support/SupportChatModal.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAK/C,UAAU,qBAAqB;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,4FAA4F;IAC5F,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,0FAA0F;IAC1F,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA4CD,wBAAgB,gBAAgB,CAAC,EAC/B,OAAO,EACP,QAAQ,EACR,MAAM,EACN,OAAO,EACP,aAAqB,EACrB,UAAkB,EAClB,kBAAsB,EACtB,YAAY,GACb,EAAE,qBAAqB,2CAoLvB"}
|
|
@@ -18,6 +18,7 @@ export interface EscalationToolDeps {
|
|
|
18
18
|
role: string;
|
|
19
19
|
content: string;
|
|
20
20
|
}>;
|
|
21
|
+
getScreenFlow?: () => string[];
|
|
21
22
|
onHumanReply?: (reply: string, ticketId?: string) => void;
|
|
22
23
|
onEscalationStarted?: (ticketId: string, socket: EscalationSocket) => void;
|
|
23
24
|
onTypingChange?: (isTyping: boolean) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"escalateTool.d.ts","sourceRoot":"","sources":["../../../../src/support/escalateTool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"escalateTool.d.ts","sourceRoot":"","sources":["../../../../src/support/escalateTool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAStD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,gBAAgB,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;IACjE,UAAU,EAAE,MAAM,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,aAAa,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;IAC/B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC3E,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,cAAc,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,WAAW,CAAC,EAAE;QACZ,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;KACpD,CAAC;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;CACzC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,GAAG,cAAc,CAAC;AAC7E,2FAA2F;AAC3F,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,GAC/D,cAAc,CAAC"}
|
|
@@ -6,6 +6,7 @@ export { buildSupportPrompt } from './supportPrompt';
|
|
|
6
6
|
export { createEscalateTool } from './escalateTool';
|
|
7
7
|
export { EscalationSocket } from './EscalationSocket';
|
|
8
8
|
export type { SocketReplyHandler } from './EscalationSocket';
|
|
9
|
+
export { EscalationEventSource } from './EscalationEventSource';
|
|
9
10
|
export { SupportGreeting } from './SupportGreeting';
|
|
10
11
|
export { CSATSurvey } from './CSATSurvey';
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/support/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EACV,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,aAAa,GACd,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/support/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EACV,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,aAAa,GACd,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAGrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAGhE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mobileai/react-native",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.13",
|
|
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",
|
|
@@ -30,18 +30,43 @@ import { AudioOutputService } from '../services/AudioOutputService';
|
|
|
30
30
|
import { TelemetryService, bindTelemetryService } from '../services/telemetry';
|
|
31
31
|
import { extractTouchLabel, checkRageClick } from '../services/telemetry/TouchAutoCapture';
|
|
32
32
|
import { initDeviceId, getDeviceId } from '../services/telemetry/device';
|
|
33
|
-
import type { AgentConfig, AgentMode, ExecutionResult, ToolDefinition, AgentStep, TokenUsage, KnowledgeBaseConfig, ChatBarTheme, AIMessage, AIProviderName, ScreenMap, ProactiveHelpConfig } from '../core/types';
|
|
33
|
+
import type { AgentConfig, AgentMode, ExecutionResult, ToolDefinition, AgentStep, TokenUsage, KnowledgeBaseConfig, ChatBarTheme, AIMessage, AIProviderName, ScreenMap, ProactiveHelpConfig, InteractionMode } from '../core/types';
|
|
34
34
|
import { AgentErrorBoundary } from './AgentErrorBoundary';
|
|
35
35
|
import { HighlightOverlay } from './HighlightOverlay';
|
|
36
36
|
import { IdleDetector } from '../core/IdleDetector';
|
|
37
37
|
import { ProactiveHint } from './ProactiveHint';
|
|
38
38
|
import { createEscalateTool } from '../support/escalateTool';
|
|
39
39
|
import { EscalationSocket } from '../support/EscalationSocket';
|
|
40
|
+
import { EscalationEventSource } from '../support/EscalationEventSource';
|
|
40
41
|
import { SupportChatModal } from '../support/SupportChatModal';
|
|
41
42
|
import { ENDPOINTS } from '../config/endpoints';
|
|
42
43
|
|
|
43
44
|
// ─── Context ───────────────────────────────────────────────────
|
|
44
45
|
|
|
46
|
+
// ─── AsyncStorage Helper (same pattern as TicketStore) ─────────
|
|
47
|
+
|
|
48
|
+
/** Try to load AsyncStorage for tooltip persistence. Optional peer dep. */
|
|
49
|
+
function getTooltipStorage(): any | null {
|
|
50
|
+
try {
|
|
51
|
+
const origError = console.error;
|
|
52
|
+
console.error = (...args: unknown[]) => {
|
|
53
|
+
const msg = args[0];
|
|
54
|
+
if (typeof msg === 'string' && msg.includes('AsyncStorage')) return;
|
|
55
|
+
origError.apply(console, args);
|
|
56
|
+
};
|
|
57
|
+
try {
|
|
58
|
+
const mod = require('@react-native-async-storage/async-storage');
|
|
59
|
+
const candidate = mod?.default ?? mod?.AsyncStorage ?? null;
|
|
60
|
+
if (candidate && typeof candidate.getItem === 'function') return candidate;
|
|
61
|
+
return null;
|
|
62
|
+
} finally {
|
|
63
|
+
console.error = origError;
|
|
64
|
+
}
|
|
65
|
+
} catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
45
70
|
// ─── Props ─────────────────────────────────────────────────────
|
|
46
71
|
|
|
47
72
|
interface AIAgentProps {
|
|
@@ -222,6 +247,24 @@ interface AIAgentProps {
|
|
|
222
247
|
* "fcm" is recommended for universal bare/Expo support.
|
|
223
248
|
*/
|
|
224
249
|
pushTokenType?: 'fcm' | 'expo' | 'apns';
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Controls how the agent handles irreversible UI actions.
|
|
253
|
+
* 'copilot' (default): AI pauses before final commit actions (place order, delete, submit).
|
|
254
|
+
* 'autopilot': Full autonomy — all actions execute without confirmation.
|
|
255
|
+
*
|
|
256
|
+
* In copilot mode, the AI works silently (navigates, fills forms, scrolls) and
|
|
257
|
+
* pauses ONCE before the final irreversible action. Elements with aiConfirm={true}
|
|
258
|
+
* also trigger a code-level confirmation gate as a safety net.
|
|
259
|
+
*/
|
|
260
|
+
interactionMode?: InteractionMode;
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Show a one-time discovery tooltip above the chat FAB.
|
|
264
|
+
* Tells new users the AI can navigate and interact with the app.
|
|
265
|
+
* Default: true (shows once, then remembered via AsyncStorage)
|
|
266
|
+
*/
|
|
267
|
+
showDiscoveryTooltip?: boolean;
|
|
225
268
|
}
|
|
226
269
|
|
|
227
270
|
|
|
@@ -274,6 +317,8 @@ export function AIAgent({
|
|
|
274
317
|
userContext,
|
|
275
318
|
pushToken,
|
|
276
319
|
pushTokenType,
|
|
320
|
+
interactionMode,
|
|
321
|
+
showDiscoveryTooltip: showDiscoveryTooltipProp = true,
|
|
277
322
|
}: AIAgentProps) {
|
|
278
323
|
// Configure logger based on debug prop
|
|
279
324
|
React.useEffect(() => {
|
|
@@ -312,42 +357,127 @@ export function AIAgent({
|
|
|
312
357
|
// Cache of live sockets by ticketId — keeps sockets alive even when user
|
|
313
358
|
// navigates back to the ticket list, so new messages still trigger badge updates.
|
|
314
359
|
const pendingSocketsRef = useRef<Map<string, EscalationSocket>>(new Map());
|
|
360
|
+
// SSE connections per ticket — reliable fallback for ticket_closed events
|
|
361
|
+
// when the WebSocket is disconnected. EventSource auto-reconnects.
|
|
362
|
+
const sseRef = useRef<Map<string, EscalationEventSource>>(new Map());
|
|
315
363
|
|
|
316
364
|
const totalUnread = Object.values(unreadCounts).reduce((sum, count) => sum + count, 0);
|
|
317
365
|
|
|
366
|
+
// ── Discovery Tooltip (one-time) ──────────────────────────
|
|
367
|
+
const [tooltipVisible, setTooltipVisible] = useState(false);
|
|
368
|
+
|
|
369
|
+
useEffect(() => {
|
|
370
|
+
if (!showDiscoveryTooltipProp) return;
|
|
371
|
+
void (async () => {
|
|
372
|
+
try {
|
|
373
|
+
const AS = getTooltipStorage();
|
|
374
|
+
if (!AS) { setTooltipVisible(true); return; }
|
|
375
|
+
const seen = await AS.getItem('@mobileai_tooltip_seen');
|
|
376
|
+
if (!seen) setTooltipVisible(true);
|
|
377
|
+
} catch {
|
|
378
|
+
setTooltipVisible(true);
|
|
379
|
+
}
|
|
380
|
+
})();
|
|
381
|
+
}, [showDiscoveryTooltipProp]);
|
|
382
|
+
|
|
383
|
+
const handleTooltipDismiss = useCallback(() => {
|
|
384
|
+
setTooltipVisible(false);
|
|
385
|
+
void (async () => {
|
|
386
|
+
try {
|
|
387
|
+
const AS = getTooltipStorage();
|
|
388
|
+
await AS?.setItem('@mobileai_tooltip_seen', 'true');
|
|
389
|
+
} catch { /* graceful */ }
|
|
390
|
+
})();
|
|
391
|
+
}, []);
|
|
392
|
+
|
|
393
|
+
// CRITICAL: clearSupport uses REFS and functional setters — never closure values.
|
|
394
|
+
// This function is captured by long-lived callbacks (escalation sockets, restored
|
|
395
|
+
// sockets) that may hold stale references. Using refs guarantees the current
|
|
396
|
+
// selectedTicketId and supportSocket are always read, not snapshot values.
|
|
318
397
|
const clearSupport = useCallback((ticketId?: string) => {
|
|
319
398
|
if (ticketId) {
|
|
320
|
-
// Remove specific ticket + its cached socket
|
|
399
|
+
// Remove specific ticket + its cached socket and SSE
|
|
321
400
|
const cached = pendingSocketsRef.current.get(ticketId);
|
|
322
401
|
if (cached) { cached.disconnect(); pendingSocketsRef.current.delete(ticketId); }
|
|
402
|
+
const sse = sseRef.current.get(ticketId);
|
|
403
|
+
if (sse) { sse.disconnect(); sseRef.current.delete(ticketId); }
|
|
323
404
|
setTickets(prev => prev.filter(t => t.id !== ticketId));
|
|
324
405
|
setUnreadCounts(prev => { const n = { ...prev }; delete n[ticketId]; return n; });
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
406
|
+
|
|
407
|
+
// If user was viewing this ticket, close the support modal + switch to ticket list
|
|
408
|
+
if (selectedTicketIdRef.current === ticketId) {
|
|
409
|
+
setSupportSocket(prev => { prev?.disconnect(); return null; });
|
|
328
410
|
setSelectedTicketId(null);
|
|
329
411
|
setIsLiveAgentTyping(false);
|
|
330
412
|
setMessages([]);
|
|
331
413
|
}
|
|
414
|
+
|
|
415
|
+
// If no tickets remain, switch back to text mode
|
|
416
|
+
setTickets(prev => {
|
|
417
|
+
if (prev.length === 0) {
|
|
418
|
+
setMode('text');
|
|
419
|
+
}
|
|
420
|
+
return prev;
|
|
421
|
+
});
|
|
332
422
|
} else {
|
|
333
|
-
// Clear all — disconnect every cached socket
|
|
423
|
+
// Clear all — disconnect every cached socket and SSE
|
|
334
424
|
pendingSocketsRef.current.forEach(s => s.disconnect());
|
|
335
425
|
pendingSocketsRef.current.clear();
|
|
336
|
-
|
|
337
|
-
|
|
426
|
+
sseRef.current.forEach(s => s.disconnect());
|
|
427
|
+
sseRef.current.clear();
|
|
428
|
+
setSupportSocket(prev => { prev?.disconnect(); return null; });
|
|
338
429
|
setSelectedTicketId(null);
|
|
339
430
|
setTickets([]);
|
|
340
431
|
setUnreadCounts({});
|
|
341
432
|
setIsLiveAgentTyping(false);
|
|
342
433
|
setMode('text');
|
|
343
434
|
}
|
|
344
|
-
}, [
|
|
435
|
+
}, []);
|
|
436
|
+
|
|
437
|
+
const openSSE = useCallback((ticketId: string) => {
|
|
438
|
+
if (sseRef.current.has(ticketId)) return;
|
|
439
|
+
if (!analyticsKey) return;
|
|
440
|
+
|
|
441
|
+
const sseUrl = `${ENDPOINTS.escalation}/api/v1/escalations/events?analyticsKey=${encodeURIComponent(analyticsKey)}&ticketId=${encodeURIComponent(ticketId)}`;
|
|
442
|
+
const sse = new EscalationEventSource({
|
|
443
|
+
url: sseUrl,
|
|
444
|
+
onTicketClosed: (tid) => {
|
|
445
|
+
logger.info('AIAgent', 'SSE: ticket_closed received for', tid);
|
|
446
|
+
setUnreadCounts(prev => {
|
|
447
|
+
const next = { ...prev };
|
|
448
|
+
delete next[tid];
|
|
449
|
+
return next;
|
|
450
|
+
});
|
|
451
|
+
clearSupport(tid);
|
|
452
|
+
},
|
|
453
|
+
onConnected: (tid) => {
|
|
454
|
+
logger.info('AIAgent', 'SSE: connected for ticket', tid);
|
|
455
|
+
},
|
|
456
|
+
});
|
|
457
|
+
sse.connect();
|
|
458
|
+
sseRef.current.set(ticketId, sse);
|
|
459
|
+
logger.info('AIAgent', 'SSE opened for ticket:', ticketId);
|
|
460
|
+
}, [analyticsKey, clearSupport]);
|
|
345
461
|
|
|
346
462
|
const clearMessages = useCallback(() => {
|
|
347
463
|
setMessages([]);
|
|
348
464
|
setLastResult(null);
|
|
349
465
|
}, []);
|
|
350
466
|
|
|
467
|
+
const getResolvedScreenName = useCallback(() => {
|
|
468
|
+
const routeName = (navRef as any)?.getCurrentRoute?.()?.name;
|
|
469
|
+
if (typeof routeName === 'string' && routeName.trim().length > 0) {
|
|
470
|
+
return routeName;
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
const telemetryScreen = telemetryRef.current?.screen;
|
|
474
|
+
if (typeof telemetryScreen === 'string' && telemetryScreen !== 'Unknown') {
|
|
475
|
+
return telemetryScreen;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
return 'unknown';
|
|
479
|
+
}, [navRef]);
|
|
480
|
+
|
|
351
481
|
// ─── Auto-create MobileAI escalation tool ─────────────────────
|
|
352
482
|
// When analyticsKey is present and consumer hasn't provided their own
|
|
353
483
|
// escalate_to_human tool, auto-wire the MobileAI platform provider.
|
|
@@ -359,12 +489,13 @@ export function AIAgent({
|
|
|
359
489
|
config: { provider: 'mobileai' },
|
|
360
490
|
analyticsKey,
|
|
361
491
|
getContext: () => ({
|
|
362
|
-
currentScreen: (
|
|
492
|
+
currentScreen: getResolvedScreenName(),
|
|
363
493
|
originalQuery: '',
|
|
364
494
|
stepsBeforeEscalation: 0,
|
|
365
495
|
}),
|
|
366
496
|
getHistory: () =>
|
|
367
497
|
messages.map((m) => ({ role: m.role, content: m.content })),
|
|
498
|
+
getScreenFlow: () => telemetryRef.current?.getScreenFlow() ?? [],
|
|
368
499
|
userContext,
|
|
369
500
|
pushToken,
|
|
370
501
|
pushTokenType,
|
|
@@ -372,15 +503,42 @@ export function AIAgent({
|
|
|
372
503
|
logger.info('AIAgent', '★★★ onEscalationStarted FIRED — ticketId:', tid);
|
|
373
504
|
// Cache the live socket so handleTicketSelect can reuse it without reconnecting
|
|
374
505
|
pendingSocketsRef.current.set(tid, socket);
|
|
506
|
+
// Open SSE for reliable ticket_closed delivery
|
|
507
|
+
openSSE(tid);
|
|
508
|
+
|
|
509
|
+
const currentScreen = getResolvedScreenName();
|
|
375
510
|
setTickets(prev => {
|
|
376
511
|
if (prev.find(t => t.id === tid)) {
|
|
377
512
|
logger.info('AIAgent', '★★★ Ticket already in list, skipping add');
|
|
378
513
|
return prev;
|
|
379
514
|
}
|
|
380
|
-
const newList = [{ id: tid, reason: '
|
|
515
|
+
const newList = [{ id: tid, reason: 'Connecting to agent...', screen: currentScreen, status: 'open', history: [], createdAt: new Date().toISOString(), wsUrl: '' }, ...prev];
|
|
381
516
|
logger.info('AIAgent', '★★★ Tickets updated, new length:', newList.length);
|
|
382
517
|
return newList;
|
|
383
518
|
});
|
|
519
|
+
|
|
520
|
+
// Fetch real ticket data from backend to replace the placeholder
|
|
521
|
+
void (async () => {
|
|
522
|
+
try {
|
|
523
|
+
const res = await fetch(`${ENDPOINTS.escalation}/api/v1/escalations/${tid}?analyticsKey=${encodeURIComponent(analyticsKey!)}`);
|
|
524
|
+
if (res.ok) {
|
|
525
|
+
const data = await res.json();
|
|
526
|
+
setTickets(prev => prev.map(t => {
|
|
527
|
+
if (t.id !== tid) return t;
|
|
528
|
+
return {
|
|
529
|
+
...t,
|
|
530
|
+
reason: data.reason || t.reason,
|
|
531
|
+
screen: data.screen || t.screen,
|
|
532
|
+
status: data.status || t.status,
|
|
533
|
+
history: Array.isArray(data.history) ? data.history : t.history,
|
|
534
|
+
};
|
|
535
|
+
}));
|
|
536
|
+
}
|
|
537
|
+
} catch {
|
|
538
|
+
// Best-effort — placeholder is still usable
|
|
539
|
+
}
|
|
540
|
+
})();
|
|
541
|
+
|
|
384
542
|
// Switch to human mode so the ticket LIST is visible — do NOT auto-select
|
|
385
543
|
setMode('human');
|
|
386
544
|
setAutoExpandTrigger(prev => {
|
|
@@ -432,11 +590,11 @@ export function AIAgent({
|
|
|
432
590
|
return next;
|
|
433
591
|
});
|
|
434
592
|
}
|
|
435
|
-
clearSupport(
|
|
593
|
+
clearSupport(ticketId);
|
|
436
594
|
},
|
|
437
595
|
});
|
|
438
596
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
439
|
-
}, [analyticsKey, navRef,
|
|
597
|
+
}, [analyticsKey, customTools, getResolvedScreenName, navRef, openSSE, userContext, pushToken, pushTokenType, messages, clearSupport]);
|
|
440
598
|
|
|
441
599
|
// ─── Restore pending tickets on app start ──────────────────────
|
|
442
600
|
useEffect(() => {
|
|
@@ -487,6 +645,11 @@ export function AIAgent({
|
|
|
487
645
|
setMode('human');
|
|
488
646
|
setAutoExpandTrigger(prev => prev + 1);
|
|
489
647
|
|
|
648
|
+
// Open SSE for every restored ticket — reliable ticket_closed delivery
|
|
649
|
+
for (const t of fetchedTickets) {
|
|
650
|
+
openSSE(t.id);
|
|
651
|
+
}
|
|
652
|
+
|
|
490
653
|
// If there is exactly one ticket, pre-wire its WebSocket so it is ready
|
|
491
654
|
// the moment the user taps the card (no extra connect delay).
|
|
492
655
|
if (fetchedTickets.length === 1) {
|
|
@@ -701,15 +864,19 @@ export function AIAgent({
|
|
|
701
864
|
const handleBackToTickets = useCallback(() => {
|
|
702
865
|
// Cache socket in pendingSocketsRef instead of disconnecting —
|
|
703
866
|
// keeps the WS alive so new messages update unreadCounts in real time.
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
867
|
+
const currentTicketId = selectedTicketIdRef.current;
|
|
868
|
+
// Use functional setter to read + cache the current socket without closure dependency
|
|
869
|
+
setSupportSocket(prev => {
|
|
870
|
+
if (prev && currentTicketId) {
|
|
871
|
+
pendingSocketsRef.current.set(currentTicketId, prev);
|
|
872
|
+
logger.info('AIAgent', '★ Socket cached for ticket:', currentTicketId, '— stays alive for badge updates');
|
|
873
|
+
}
|
|
874
|
+
return null;
|
|
875
|
+
});
|
|
709
876
|
setSelectedTicketId(null);
|
|
710
877
|
setMessages([]);
|
|
711
878
|
setIsLiveAgentTyping(false);
|
|
712
|
-
}, [
|
|
879
|
+
}, []); // No dependencies — uses refs/functional setters
|
|
713
880
|
|
|
714
881
|
const mergedCustomTools = useMemo(() => {
|
|
715
882
|
if (!autoEscalateTool) return customTools;
|
|
@@ -774,6 +941,7 @@ export function AIAgent({
|
|
|
774
941
|
screenMap: useScreenMap ? screenMap : undefined,
|
|
775
942
|
maxTokenBudget,
|
|
776
943
|
maxCostUSD,
|
|
944
|
+
interactionMode,
|
|
777
945
|
// Block the agent loop until user responds
|
|
778
946
|
onAskUser: mode === 'voice' ? undefined : ((question: string) => {
|
|
779
947
|
return new Promise<string>((resolve) => {
|
|
@@ -837,8 +1005,13 @@ export function AIAgent({
|
|
|
837
1005
|
telemetryRef.current = telemetry;
|
|
838
1006
|
bindTelemetryService(telemetry);
|
|
839
1007
|
telemetry.start();
|
|
1008
|
+
|
|
1009
|
+
const initialRoute = navRef?.getCurrentRoute?.();
|
|
1010
|
+
if (initialRoute?.name) {
|
|
1011
|
+
telemetry.setScreen(initialRoute.name);
|
|
1012
|
+
}
|
|
840
1013
|
}); // initDeviceId
|
|
841
|
-
}, [analyticsKey, analyticsProxyUrl, analyticsProxyHeaders, debug]);
|
|
1014
|
+
}, [analyticsKey, analyticsProxyUrl, analyticsProxyHeaders, bindTelemetryService, debug, navRef]);
|
|
842
1015
|
|
|
843
1016
|
// ─── Security warnings ──────────────────────────────────────
|
|
844
1017
|
|
|
@@ -1221,15 +1394,26 @@ export function AIAgent({
|
|
|
1221
1394
|
logger.info('AIAgent', `User message: "${message}"`);
|
|
1222
1395
|
setLastUserMessage(message.trim());
|
|
1223
1396
|
|
|
1224
|
-
// Intercom-style transparent intercept:
|
|
1397
|
+
// Intercom-style transparent intercept:
|
|
1225
1398
|
// If we're connected to a human agent, all text input goes directly to them.
|
|
1226
1399
|
if (selectedTicketId && supportSocket) {
|
|
1400
|
+
// Gate: do not allow sending if the ticket is closed/resolved.
|
|
1401
|
+
const activeTicket = tickets.find(t => t.id === selectedTicketId);
|
|
1402
|
+
const CLOSED_STATUSES = ['closed', 'resolved'];
|
|
1403
|
+
if (activeTicket && CLOSED_STATUSES.includes(activeTicket.status)) {
|
|
1404
|
+
setLastResult({
|
|
1405
|
+
success: false,
|
|
1406
|
+
message: 'This conversation is closed. Please start a new request.',
|
|
1407
|
+
steps: [],
|
|
1408
|
+
});
|
|
1409
|
+
return;
|
|
1410
|
+
}
|
|
1411
|
+
|
|
1227
1412
|
if (supportSocket.sendText(message)) {
|
|
1228
1413
|
setMessages((prev) => [
|
|
1229
1414
|
...prev,
|
|
1230
1415
|
{ id: `user-${Date.now()}`, role: 'user', content: message.trim(), timestamp: Date.now() },
|
|
1231
1416
|
]);
|
|
1232
|
-
|
|
1233
1417
|
setIsThinking(true);
|
|
1234
1418
|
setStatusText('Sending to agent...');
|
|
1235
1419
|
setTimeout(() => {
|
|
@@ -1493,6 +1677,8 @@ export function AIAgent({
|
|
|
1493
1677
|
autoExpandTrigger={autoExpandTrigger}
|
|
1494
1678
|
unreadCounts={unreadCounts}
|
|
1495
1679
|
totalUnread={totalUnread}
|
|
1680
|
+
showDiscoveryTooltip={tooltipVisible}
|
|
1681
|
+
onTooltipDismiss={handleTooltipDismiss}
|
|
1496
1682
|
/>
|
|
1497
1683
|
</ProactiveHint>
|
|
1498
1684
|
)}
|
|
@@ -1506,6 +1692,7 @@ export function AIAgent({
|
|
|
1506
1692
|
isAgentTyping={isLiveAgentTyping}
|
|
1507
1693
|
isThinking={isThinking}
|
|
1508
1694
|
scrollToEndTrigger={chatScrollTrigger}
|
|
1695
|
+
ticketStatus={tickets.find(t => t.id === selectedTicketId)?.status}
|
|
1509
1696
|
/>
|
|
1510
1697
|
</View>
|
|
1511
1698
|
</View>
|