@adminide-stack/yantra-mobile 12.0.69-alpha.10 → 12.0.69-alpha.12
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/lib/features/agent-chat/NativeAgentChat.js +2 -0
- package/lib/features/agent-chat/NativeAgentChat.js.map +1 -1
- package/lib/features/chat/ChatCodeBlock.js +7 -3
- package/lib/features/chat/ChatCodeBlock.js.map +1 -1
- package/lib/features/chat/ConnectorConnectCard.js +164 -0
- package/lib/features/chat/ConnectorConnectCard.js.map +1 -0
- package/lib/features/chat/ConnectorConnectPrompt.js +254 -0
- package/lib/features/chat/ConnectorConnectPrompt.js.map +1 -0
- package/lib/features/chat/MessageActionBar.js.map +1 -1
- package/lib/features/chat/connectorConnect.js +194 -0
- package/lib/features/chat/connectorConnect.js.map +1 -0
- package/lib/features/chat/connectorConnectHandbacks.js +55 -0
- package/lib/features/chat/connectorConnectHandbacks.js.map +1 -0
- package/lib/hooks/useCdecliChannel.js +2 -2
- package/lib/hooks/useCdecliChannel.js.map +1 -1
- package/lib/hooks/useChatApi.js +4 -2
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/useHostConnectorCard.js +24 -0
- package/lib/hooks/useHostConnectorCard.js.map +1 -0
- package/lib/screens/Chat/index.js +12 -2
- package/lib/screens/Chat/index.js.map +1 -1
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js +12 -6
- package/lib/screens/JobSearchNative/useJobSearchHostChat.js.map +1 -1
- package/lib/screens/ResumeNative/useResumeHostChat.js +12 -6
- package/lib/screens/ResumeNative/useResumeHostChat.js.map +1 -1
- package/lib/screens/ShoppingNative/useShoppingHostChat.js +12 -6
- package/lib/screens/ShoppingNative/useShoppingHostChat.js.map +1 -1
- package/lib/screens/TravelNative/useTravelHostChat.js +12 -6
- package/lib/screens/TravelNative/useTravelHostChat.js.map +1 -1
- package/lib/services/brainQuickReply.js.map +1 -1
- package/package.json +5 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {useState,useRef,useEffect,useMemo,useCallback}from'react';import {useRoute}from'@react-navigation/native';import {v4}from'uuid';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatMutations}from'../../hooks/useChatApi.js';import {useChatStream}from'../../hooks/useChatStream.js';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';const TESTING_PROJECT_UUID = "9a8ac704-1040-4836-9b72-48b771ca91b1";
|
|
1
|
+
import {useState,useRef,useEffect,useMemo,useCallback}from'react';import {useRoute}from'@react-navigation/native';import {v4}from'uuid';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatMutations}from'../../hooks/useChatApi.js';import {useChatStream}from'../../hooks/useChatStream.js';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';import {useHostConnectorCard}from'../../hooks/useHostConnectorCard.js';const TESTING_PROJECT_UUID = "9a8ac704-1040-4836-9b72-48b771ca91b1";
|
|
2
2
|
function useShoppingHostChat() {
|
|
3
3
|
var _a, _b;
|
|
4
4
|
const route = useRoute();
|
|
@@ -45,22 +45,28 @@ function useShoppingHostChat() {
|
|
|
45
45
|
recoverAgentAuth: cdecli.recoverAgentAuth
|
|
46
46
|
}), [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode]);
|
|
47
47
|
const chat = useChatStream(channelId, chatRouting);
|
|
48
|
-
const
|
|
48
|
+
const {
|
|
49
|
+
displayMessages,
|
|
50
|
+
displayStreaming,
|
|
51
|
+
renderConnectorCard
|
|
52
|
+
} = useHostConnectorCard(chat, channelId);
|
|
53
|
+
const messages = useMemo(() => displayMessages(chat.messages.map((m, index) => ({
|
|
49
54
|
id: `${m.role}-${index}`,
|
|
50
55
|
role: m.role,
|
|
51
56
|
content: m.content,
|
|
52
57
|
attachments: m.attachments
|
|
53
|
-
})), [chat.messages]);
|
|
58
|
+
}))), [chat.messages, displayMessages]);
|
|
54
59
|
const send = useCallback((text, attachments) => {
|
|
55
60
|
void chat.sendMessage(text, attachments, channelId);
|
|
56
61
|
}, [chat, channelId]);
|
|
57
62
|
return useMemo(() => ({
|
|
58
63
|
messages,
|
|
59
|
-
streaming: chat.response
|
|
64
|
+
streaming: displayStreaming(chat.response),
|
|
60
65
|
busy: chat.isLoading || chat.isStreaming,
|
|
61
66
|
error: chat.error,
|
|
62
67
|
connected: cdecli.channelConnected,
|
|
63
68
|
send,
|
|
64
|
-
clear: chat.clearMessages
|
|
65
|
-
|
|
69
|
+
clear: chat.clearMessages,
|
|
70
|
+
renderConnectorCard
|
|
71
|
+
}), [messages, chat.response, displayStreaming, chat.isLoading, chat.isStreaming, chat.error, cdecli.channelConnected, send, chat.clearMessages, renderConnectorCard]);
|
|
66
72
|
}export{useShoppingHostChat};//# sourceMappingURL=useShoppingHostChat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useShoppingHostChat.js","sources":["../../../src/screens/ShoppingNative/useShoppingHostChat.ts"],"sourcesContent":["/**\n * Host chat lane for native Shop Agent — same role as web `services.hostChat`.\n * Lives on the Shop screen (MF host), not in the shopping remote, so Apollo /\n * cdecli stay out of the federated bundle.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useRoute } from '@react-navigation/native';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { useChatStream, type MessageAttachment, type UseChatStreamRouting } from '../../hooks/useChatStream';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport type { AgentChatMessage } from '../../features/agent-chat';\nimport type { ShoppingHostChat } from '../../features/shopping/hostChat';\n\nconst TESTING_PROJECT_UUID = '9a8ac704-1040-4836-9b72-48b771ca91b1';\n\nexport function useShoppingHostChat(): ShoppingHostChat {\n const route = useRoute<any>();\n const routeOrg = typeof route?.params?.orgName === 'string' ? route.params.orgName.trim() : '';\n const { orgName, projectId } = usePrerequisiteIds();\n const effectiveOrg = routeOrg || orgName || '';\n const submitProjectId = projectId || TESTING_PROJECT_UUID;\n\n const [channelId] = useState(() => uuidv4());\n const createdRef = useRef(false);\n const { createChannel } = useChatMutations();\n\n const cdecli = useCdecliConnection();\n useEffect(() => {\n cdecli.setActiveChannelId(channelId);\n return undefined;\n }, [channelId, cdecli.setActiveChannelId]);\n\n useEffect(() => {\n if (createdRef.current || !effectiveOrg) return;\n createdRef.current = true;\n void createChannel({\n id: channelId,\n title: `chat-channel-${channelId}`,\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName: effectiveOrg,\n projectId: submitProjectId,\n } as never).catch((err) => {\n console.error('[ShoppingNative] createChannel failed:', err);\n });\n }, [channelId, createChannel, effectiveOrg, submitProjectId]);\n\n const persistenceMode = cdecli.persistenceMode ?? 'backend';\n const chatRouting: UseChatStreamRouting = useMemo(\n () => ({\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode,\n recoverAgentAuth: cdecli.recoverAgentAuth,\n }),\n [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode],\n );\n\n const chat = useChatStream(channelId, chatRouting);\n\n const messages: AgentChatMessage[] = useMemo(\n () =>\n chat.messages.map((m, index) => ({\n
|
|
1
|
+
{"version":3,"file":"useShoppingHostChat.js","sources":["../../../src/screens/ShoppingNative/useShoppingHostChat.ts"],"sourcesContent":["/**\n * Host chat lane for native Shop Agent — same role as web `services.hostChat`.\n * Lives on the Shop screen (MF host), not in the shopping remote, so Apollo /\n * cdecli stay out of the federated bundle.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useRoute } from '@react-navigation/native';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { useChatStream, type MessageAttachment, type UseChatStreamRouting } from '../../hooks/useChatStream';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { useHostConnectorCard } from '../../hooks/useHostConnectorCard';\nimport type { AgentChatMessage } from '../../features/agent-chat';\nimport type { ShoppingHostChat } from '../../features/shopping/hostChat';\n\nconst TESTING_PROJECT_UUID = '9a8ac704-1040-4836-9b72-48b771ca91b1';\n\nexport function useShoppingHostChat(): ShoppingHostChat {\n const route = useRoute<any>();\n const routeOrg = typeof route?.params?.orgName === 'string' ? route.params.orgName.trim() : '';\n const { orgName, projectId } = usePrerequisiteIds();\n const effectiveOrg = routeOrg || orgName || '';\n const submitProjectId = projectId || TESTING_PROJECT_UUID;\n\n const [channelId] = useState(() => uuidv4());\n const createdRef = useRef(false);\n const { createChannel } = useChatMutations();\n\n const cdecli = useCdecliConnection();\n useEffect(() => {\n cdecli.setActiveChannelId(channelId);\n return undefined;\n }, [channelId, cdecli.setActiveChannelId]);\n\n useEffect(() => {\n if (createdRef.current || !effectiveOrg) return;\n createdRef.current = true;\n void createChannel({\n id: channelId,\n title: `chat-channel-${channelId}`,\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName: effectiveOrg,\n projectId: submitProjectId,\n } as never).catch((err) => {\n console.error('[ShoppingNative] createChannel failed:', err);\n });\n }, [channelId, createChannel, effectiveOrg, submitProjectId]);\n\n const persistenceMode = cdecli.persistenceMode ?? 'backend';\n const chatRouting: UseChatStreamRouting = useMemo(\n () => ({\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode,\n recoverAgentAuth: cdecli.recoverAgentAuth,\n }),\n [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode],\n );\n\n const chat = useChatStream(channelId, chatRouting);\n\n // A `[CONNECTOR_CONNECT]` request is answered by a card the host renders; the\n // remote gets the thread without the markers and the card's replies.\n const { displayMessages, displayStreaming, renderConnectorCard } = useHostConnectorCard(chat, channelId);\n\n const messages: AgentChatMessage[] = useMemo(\n () =>\n displayMessages(\n chat.messages.map((m, index) => ({\n id: `${m.role}-${index}`,\n role: m.role,\n content: m.content,\n attachments: m.attachments,\n })),\n ),\n [chat.messages, displayMessages],\n );\n\n const send = useCallback(\n (text: string, attachments?: MessageAttachment[]) => {\n void chat.sendMessage(text, attachments, channelId);\n },\n [chat, channelId],\n );\n\n return useMemo(\n () => ({\n messages,\n streaming: displayStreaming(chat.response),\n busy: chat.isLoading || chat.isStreaming,\n error: chat.error,\n connected: cdecli.channelConnected,\n send,\n clear: chat.clearMessages,\n renderConnectorCard,\n }),\n [\n messages,\n chat.response,\n displayStreaming,\n chat.isLoading,\n chat.isStreaming,\n chat.error,\n cdecli.channelConnected,\n send,\n chat.clearMessages,\n renderConnectorCard,\n ],\n );\n}\n"],"names":["uuidv4"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {useState,useRef,useEffect,useMemo,useCallback}from'react';import {useRoute}from'@react-navigation/native';import {v4}from'uuid';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatMutations}from'../../hooks/useChatApi.js';import {useChatStream}from'../../hooks/useChatStream.js';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';const TESTING_PROJECT_UUID = "9a8ac704-1040-4836-9b72-48b771ca91b1";
|
|
1
|
+
import {useState,useRef,useEffect,useMemo,useCallback}from'react';import {useRoute}from'@react-navigation/native';import {v4}from'uuid';import {useCdecliConnection}from'../../contexts/CdecliConnectionContext.js';import {useChatMutations}from'../../hooks/useChatApi.js';import {useChatStream}from'../../hooks/useChatStream.js';import {usePrerequisiteIds}from'../../hooks/usePrerequisiteIds.js';import {useHostConnectorCard}from'../../hooks/useHostConnectorCard.js';const TESTING_PROJECT_UUID = "9a8ac704-1040-4836-9b72-48b771ca91b1";
|
|
2
2
|
function useTravelHostChat() {
|
|
3
3
|
var _a, _b;
|
|
4
4
|
const route = useRoute();
|
|
@@ -45,22 +45,28 @@ function useTravelHostChat() {
|
|
|
45
45
|
recoverAgentAuth: cdecli.recoverAgentAuth
|
|
46
46
|
}), [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode]);
|
|
47
47
|
const chat = useChatStream(channelId, chatRouting);
|
|
48
|
-
const
|
|
48
|
+
const {
|
|
49
|
+
displayMessages,
|
|
50
|
+
displayStreaming,
|
|
51
|
+
renderConnectorCard
|
|
52
|
+
} = useHostConnectorCard(chat, channelId);
|
|
53
|
+
const messages = useMemo(() => displayMessages(chat.messages.map((m, index) => ({
|
|
49
54
|
id: `${m.role}-${index}`,
|
|
50
55
|
role: m.role,
|
|
51
56
|
content: m.content,
|
|
52
57
|
attachments: m.attachments
|
|
53
|
-
})), [chat.messages]);
|
|
58
|
+
}))), [chat.messages, displayMessages]);
|
|
54
59
|
const send = useCallback((text, attachments) => {
|
|
55
60
|
void chat.sendMessage(text, attachments, channelId);
|
|
56
61
|
}, [chat, channelId]);
|
|
57
62
|
return useMemo(() => ({
|
|
58
63
|
messages,
|
|
59
|
-
streaming: chat.response
|
|
64
|
+
streaming: displayStreaming(chat.response),
|
|
60
65
|
busy: chat.isLoading || chat.isStreaming,
|
|
61
66
|
error: chat.error,
|
|
62
67
|
connected: cdecli.channelConnected,
|
|
63
68
|
send,
|
|
64
|
-
clear: chat.clearMessages
|
|
65
|
-
|
|
69
|
+
clear: chat.clearMessages,
|
|
70
|
+
renderConnectorCard
|
|
71
|
+
}), [messages, chat.response, displayStreaming, chat.isLoading, chat.isStreaming, chat.error, cdecli.channelConnected, send, chat.clearMessages, renderConnectorCard]);
|
|
66
72
|
}export{useTravelHostChat};//# sourceMappingURL=useTravelHostChat.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTravelHostChat.js","sources":["../../../src/screens/TravelNative/useTravelHostChat.ts"],"sourcesContent":["/**\n * Host chat lane for native Travel Agent — same role as web `services.hostChat`.\n * Lives on the Travel screen (MF host), not in the travel remote.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useRoute } from '@react-navigation/native';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { useChatStream, type MessageAttachment, type UseChatStreamRouting } from '../../hooks/useChatStream';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport type { AgentChatMessage } from '../../features/agent-chat';\nimport type { TravelHostChat } from '../../features/travel/hostChat';\n\nconst TESTING_PROJECT_UUID = '9a8ac704-1040-4836-9b72-48b771ca91b1';\n\nexport function useTravelHostChat(): TravelHostChat {\n const route = useRoute<any>();\n const routeOrg = typeof route?.params?.orgName === 'string' ? route.params.orgName.trim() : '';\n const { orgName, projectId } = usePrerequisiteIds();\n const effectiveOrg = routeOrg || orgName || '';\n const submitProjectId = projectId || TESTING_PROJECT_UUID;\n\n const [channelId] = useState(() => uuidv4());\n const createdRef = useRef(false);\n const { createChannel } = useChatMutations();\n\n const cdecli = useCdecliConnection();\n useEffect(() => {\n cdecli.setActiveChannelId(channelId);\n return undefined;\n }, [channelId, cdecli.setActiveChannelId]);\n\n useEffect(() => {\n if (createdRef.current || !effectiveOrg) return;\n createdRef.current = true;\n void createChannel({\n id: channelId,\n title: `chat-channel-${channelId}`,\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName: effectiveOrg,\n projectId: submitProjectId,\n } as never).catch((err) => {\n console.error('[TravelNative] createChannel failed:', err);\n });\n }, [channelId, createChannel, effectiveOrg, submitProjectId]);\n\n const persistenceMode = cdecli.persistenceMode ?? 'backend';\n const chatRouting: UseChatStreamRouting = useMemo(\n () => ({\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode,\n recoverAgentAuth: cdecli.recoverAgentAuth,\n }),\n [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode],\n );\n\n const chat = useChatStream(channelId, chatRouting);\n\n const messages: AgentChatMessage[] = useMemo(\n () =>\n chat.messages.map((m, index) => ({\n
|
|
1
|
+
{"version":3,"file":"useTravelHostChat.js","sources":["../../../src/screens/TravelNative/useTravelHostChat.ts"],"sourcesContent":["/**\n * Host chat lane for native Travel Agent — same role as web `services.hostChat`.\n * Lives on the Travel screen (MF host), not in the travel remote.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useRoute } from '@react-navigation/native';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useCdecliConnection } from '../../contexts/CdecliConnectionContext';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { useChatStream, type MessageAttachment, type UseChatStreamRouting } from '../../hooks/useChatStream';\nimport { usePrerequisiteIds } from '../../hooks/usePrerequisiteIds';\nimport { useHostConnectorCard } from '../../hooks/useHostConnectorCard';\nimport type { AgentChatMessage } from '../../features/agent-chat';\nimport type { TravelHostChat } from '../../features/travel/hostChat';\n\nconst TESTING_PROJECT_UUID = '9a8ac704-1040-4836-9b72-48b771ca91b1';\n\nexport function useTravelHostChat(): TravelHostChat {\n const route = useRoute<any>();\n const routeOrg = typeof route?.params?.orgName === 'string' ? route.params.orgName.trim() : '';\n const { orgName, projectId } = usePrerequisiteIds();\n const effectiveOrg = routeOrg || orgName || '';\n const submitProjectId = projectId || TESTING_PROJECT_UUID;\n\n const [channelId] = useState(() => uuidv4());\n const createdRef = useRef(false);\n const { createChannel } = useChatMutations();\n\n const cdecli = useCdecliConnection();\n useEffect(() => {\n cdecli.setActiveChannelId(channelId);\n return undefined;\n }, [channelId, cdecli.setActiveChannelId]);\n\n useEffect(() => {\n if (createdRef.current || !effectiveOrg) return;\n createdRef.current = true;\n void createChannel({\n id: channelId,\n title: `chat-channel-${channelId}`,\n isShared: false,\n sharedSlug: null,\n isArchived: false,\n isPinned: false,\n model: null,\n systemPrompt: null,\n orgName: effectiveOrg,\n projectId: submitProjectId,\n } as never).catch((err) => {\n console.error('[TravelNative] createChannel failed:', err);\n });\n }, [channelId, createChannel, effectiveOrg, submitProjectId]);\n\n const persistenceMode = cdecli.persistenceMode ?? 'backend';\n const chatRouting: UseChatStreamRouting = useMemo(\n () => ({\n channelConnected: cdecli.channelConnected,\n accountId: cdecli.accountId,\n persistenceMode,\n recoverAgentAuth: cdecli.recoverAgentAuth,\n }),\n [cdecli.channelConnected, cdecli.accountId, cdecli.recoverAgentAuth, persistenceMode],\n );\n\n const chat = useChatStream(channelId, chatRouting);\n\n // A `[CONNECTOR_CONNECT]` request is answered by a card the host renders; the\n // remote gets the thread without the markers and the card's replies.\n const { displayMessages, displayStreaming, renderConnectorCard } = useHostConnectorCard(chat, channelId);\n\n const messages: AgentChatMessage[] = useMemo(\n () =>\n displayMessages(\n chat.messages.map((m, index) => ({\n id: `${m.role}-${index}`,\n role: m.role,\n content: m.content,\n attachments: m.attachments,\n })),\n ),\n [chat.messages, displayMessages],\n );\n\n const send = useCallback(\n (text: string, attachments?: MessageAttachment[]) => {\n void chat.sendMessage(text, attachments, channelId);\n },\n [chat, channelId],\n );\n\n return useMemo(\n () => ({\n messages,\n streaming: displayStreaming(chat.response),\n busy: chat.isLoading || chat.isStreaming,\n error: chat.error,\n connected: cdecli.channelConnected,\n send,\n clear: chat.clearMessages,\n renderConnectorCard,\n }),\n [\n messages,\n chat.response,\n displayStreaming,\n chat.isLoading,\n chat.isStreaming,\n chat.error,\n cdecli.channelConnected,\n send,\n chat.clearMessages,\n renderConnectorCard,\n ],\n );\n}\n"],"names":["uuidv4"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brainQuickReply.js","sources":["../../src/services/brainQuickReply.ts"],"sourcesContent":["/**\n * brainQuickReply - a fast first answer from `yantra-brain` while the real agent works.\n *\n * On mobile the first turn of a session is the slow one: the agent session has to\n * bootstrap (sandbox, connectors, memory) before a single delta arrives, and on a\n * cold pod that can run to minutes. The web client only reaches for the brain after\n * the full 300s stall budget expires; mobile did not reach for it at all, so a user\n * saw nothing, then an error. This asks the brain the SAME question in parallel and\n * paints its answer as a provisional reply the moment it lands. When the agent's\n * stream starts, that provisional text is replaced in place - the brain fills the\n * silence, it never wins over the real answer.\n *\n * The brain proxy is the web app's same-origin Remix resource route\n * (`/resources/yantra-brain-classify`, `task: 'assist'`). Mobile has no same\n * origin, so it targets the web app's public URL (CLIENT_URL) explicitly. The\n * route holds the model, prompt and secret server-side - the phone still never\n * sees a provider key.\n *\n * Best-effort and never throws: null on timeout, network error or empty answer.\n */\nimport { config } from '../config/env-config';\n\nconst BRAIN_PATH = '/resources/yantra-brain-classify';\n\n// Server-side upstream cap is ASSIST_TIMEOUT_MS (12s); give the phone headroom\n// past it so a slow-but-successful answer is not aborted at the same instant.\nconst DEFAULT_TIMEOUT_MS = 15000;\n\n/** The web app origin that serves the brain proxy, or '' when unconfigured. */\nexport function brainEndpoint(): string {\n const base = (config.CLIENT_URL || '').trim().replace(/\\/+$/, '');\n return base ? `${base}${BRAIN_PATH}` : '';\n}\n\nexport async function quickReplyViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<string | null> {\n const trimmed = (text || '').trim();\n const endpoint = brainEndpoint();\n if (!trimmed || !endpoint) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), opts.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n if (opts.signal) {\n if (opts.signal.aborted) controller.abort();\n else opts.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text: trimmed.slice(0, 4000), task: 'assist' }),\n signal: controller.signal,\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { answer?: string | null };\n const answer = typeof data?.answer === 'string' ? data.answer.trim() : '';\n return answer || null;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport interface BrainIntent {\n intent: string;\n confidence?: number;\n}\n\nconst CLASSIFY_TIMEOUT_MS = 2000;\n\nasync function postBrainJson(\n text: string,\n extra: Record<string, unknown>,\n timeoutMs: number,\n signal?: AbortSignal,\n): Promise<Record<string, unknown> | null> {\n const trimmed = (text || '').trim();\n const endpoint = brainEndpoint();\n if (!trimmed || !endpoint) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n if (signal) {\n if (signal.aborted) controller.abort();\n else signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text: trimmed.slice(0, 4000), ...extra }),\n signal: controller.signal,\n });\n if (!res.ok) return null;\n return (await res.json()) as Record<string, unknown>;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/** cdecli yantra-brain classify — same default task as web intentRouter. */\nexport async function classifyIntentViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<BrainIntent | null> {\n const data = await postBrainJson(text, {}, opts.timeoutMs ?? CLASSIFY_TIMEOUT_MS, opts.signal);\n const intent = typeof data?.intent === 'string' ? data.intent.trim().toLowerCase() : '';\n if (!intent) return null;\n return {\n intent,\n confidence: typeof data?.confidence === 'number' ? data.confidence : undefined,\n };\n}\n\n/** cdecli shopping parse — `task: 'shopping'`. */\nexport type ShoppingBrainVerdict =\n | { status: 'unreachable' }\n | { status: 'declined' }\n | {\n status: 'ok';\n query: string;\n productType?: string;\n synonyms?: string[];\n excludes?: string[];\n monitor?: 'watch' | 'stop';\n targetPrice?: number;\n budget?: number;\n departmentId?: string;\n };\n\nexport async function classifyShoppingViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<ShoppingBrainVerdict> {\n const data = await postBrainJson(text, { task: 'shopping' }, opts.timeoutMs ?? CLASSIFY_TIMEOUT_MS, opts.signal);\n if (!data) return { status: 'unreachable' };\n if (data.intent === null || data.intent === undefined) return { status: 'declined' };\n const payload = data.intent;\n if (!payload || typeof payload !== 'object') return { status: 'declined' };\n const row = payload as Record<string, unknown>;\n const query = typeof row.query === 'string' ? row.query.trim() : '';\n const monitorRaw = typeof row.monitor === 'string' ? row.monitor.trim().toLowerCase() : '';\n const monitor = monitorRaw === 'watch' || monitorRaw === 'stop' ? monitorRaw : undefined;\n if (!query && !monitor) return { status: 'declined' };\n return {\n status: 'ok',\n query,\n ...(typeof row.productType === 'string' && row.productType.trim()\n ? { productType: row.productType.trim().toLowerCase() }\n : {}),\n ...(Array.isArray(row.synonyms)\n ? {\n synonyms: row.synonyms\n .filter((s): s is string => typeof s === 'string')\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean),\n }\n : {}),\n ...(Array.isArray(row.excludes)\n ? {\n excludes: row.excludes\n .filter((s): s is string => typeof s === 'string')\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean),\n }\n : {}),\n ...(monitor ? { monitor } : {}),\n ...(typeof row.targetPrice === 'number' && row.targetPrice > 0 ? { targetPrice: row.targetPrice } : {}),\n ...(typeof row.budget === 'number' && row.budget > 0 ? { budget: Math.round(row.budget) } : {}),\n ...(typeof row.departmentId === 'string' && row.departmentId.trim()\n ? { departmentId: row.departmentId.trim().toLowerCase() }\n : {}),\n };\n}\n\nexport async function parseShoppingViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<{\n query: string;\n productType?: string;\n synonyms?: string[];\n excludes?: string[];\n monitor?: 'watch' | 'stop';\n targetPrice?: number;\n budget?: number;\n departmentId?: string;\n} | null> {\n const verdict = await classifyShoppingViaBrain(text, opts);\n if (verdict.status !== 'ok') return null;\n const { status: _status, ...rest } = verdict;\n return rest;\n}\n\nconst BRAIN_COMPLETE_PATH = '/resources/yantra-brain-complete';\n\n/** Keyless chat completion via the same web origin as the classify proxy. */\nexport async function brainCompleteViaBrain(\n messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>,\n opts: { maxTokens?: number; timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<string | null> {\n const base = (config.CLIENT_URL || '').trim().replace(/\\/+$/, '');\n const endpoint = base ? `${base}${BRAIN_COMPLETE_PATH}` : '';\n if (!endpoint || messages.length === 0) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), opts.timeoutMs ?? 15000);\n if (opts.signal) {\n if (opts.signal.aborted) controller.abort();\n else opts.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n messages,\n model: 'yantra-brain/fast',\n max_tokens: opts.maxTokens ?? 220,\n }),\n signal: controller.signal,\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { content?: string | null };\n const content = typeof data?.content === 'string' ? data.content.trim() : '';\n return content || null;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"brainQuickReply.js","sources":["../../src/services/brainQuickReply.ts"],"sourcesContent":["/**\n * brainQuickReply - a fast first answer from `yantra-brain` while the real agent works.\n *\n * On mobile the first turn of a session is the slow one: the agent session has to\n * bootstrap (sandbox, connectors, memory) before a single delta arrives, and on a\n * cold pod that can run to minutes. The web client only reaches for the brain after\n * the full 300s stall budget expires; mobile did not reach for it at all, so a user\n * saw nothing, then an error. This asks the brain the SAME question in parallel and\n * paints its answer as a provisional reply the moment it lands. When the agent's\n * stream starts, that provisional text is replaced in place - the brain fills the\n * silence, it never wins over the real answer.\n *\n * The brain proxy is the web app's same-origin Remix resource route\n * (`/resources/yantra-brain-classify`, `task: 'assist'`). Mobile has no same\n * origin, so it targets the web app's public URL (CLIENT_URL) explicitly. The\n * route holds the model, prompt and secret server-side - the phone still never\n * sees a provider key.\n *\n * Best-effort and never throws: null on timeout, network error or empty answer.\n */\nimport { config } from '../config/env-config';\n\nconst BRAIN_PATH = '/resources/yantra-brain-classify';\n\n// Server-side upstream cap is ASSIST_TIMEOUT_MS (12s); give the phone headroom\n// past it so a slow-but-successful answer is not aborted at the same instant.\nconst DEFAULT_TIMEOUT_MS = 15000;\n\n/** The web app origin that serves the brain proxy, or '' when unconfigured. */\nexport function brainEndpoint(): string {\n const base = (config.CLIENT_URL || '').trim().replace(/\\/+$/, '');\n return base ? `${base}${BRAIN_PATH}` : '';\n}\n\nexport async function quickReplyViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<string | null> {\n const trimmed = (text || '').trim();\n const endpoint = brainEndpoint();\n if (!trimmed || !endpoint) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), opts.timeoutMs ?? DEFAULT_TIMEOUT_MS);\n if (opts.signal) {\n if (opts.signal.aborted) controller.abort();\n else opts.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text: trimmed.slice(0, 4000), task: 'assist' }),\n signal: controller.signal,\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { answer?: string | null };\n const answer = typeof data?.answer === 'string' ? data.answer.trim() : '';\n return answer || null;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\nexport interface BrainIntent {\n intent: string;\n confidence?: number;\n}\n\nconst CLASSIFY_TIMEOUT_MS = 2000;\n\nasync function postBrainJson(\n text: string,\n extra: Record<string, unknown>,\n timeoutMs: number,\n signal?: AbortSignal,\n): Promise<Record<string, unknown> | null> {\n const trimmed = (text || '').trim();\n const endpoint = brainEndpoint();\n if (!trimmed || !endpoint) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n if (signal) {\n if (signal.aborted) controller.abort();\n else signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ text: trimmed.slice(0, 4000), ...extra }),\n signal: controller.signal,\n });\n if (!res.ok) return null;\n return (await res.json()) as Record<string, unknown>;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/** cdecli yantra-brain classify — same default task as web intentRouter. */\nexport async function classifyIntentViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<BrainIntent | null> {\n const data = await postBrainJson(text, {}, opts.timeoutMs ?? CLASSIFY_TIMEOUT_MS, opts.signal);\n const intent = typeof data?.intent === 'string' ? data.intent.trim().toLowerCase() : '';\n if (!intent) return null;\n return {\n intent,\n confidence: typeof data?.confidence === 'number' ? data.confidence : undefined,\n };\n}\n\n/** cdecli shopping parse — `task: 'shopping'`. */\nexport type ShoppingBrainVerdict =\n | { status: 'unreachable' }\n | { status: 'declined' }\n | {\n status: 'ok';\n query: string;\n productType?: string;\n synonyms?: string[];\n excludes?: string[];\n monitor?: 'watch' | 'stop';\n targetPrice?: number;\n budget?: number;\n departmentId?: string;\n };\n\nexport async function classifyShoppingViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<ShoppingBrainVerdict> {\n const data = await postBrainJson(text, { task: 'shopping' }, opts.timeoutMs ?? CLASSIFY_TIMEOUT_MS, opts.signal);\n if (!data) return { status: 'unreachable' };\n if (data.intent === null || data.intent === undefined) return { status: 'declined' };\n const payload = data.intent;\n if (!payload || typeof payload !== 'object') return { status: 'declined' };\n const row = payload as Record<string, unknown>;\n const query = typeof row.query === 'string' ? row.query.trim() : '';\n const monitorRaw = typeof row.monitor === 'string' ? row.monitor.trim().toLowerCase() : '';\n const monitor = monitorRaw === 'watch' || monitorRaw === 'stop' ? monitorRaw : undefined;\n if (!query && !monitor) return { status: 'declined' };\n return {\n status: 'ok',\n query,\n ...(typeof row.productType === 'string' && row.productType.trim()\n ? { productType: row.productType.trim().toLowerCase() }\n : {}),\n ...(Array.isArray(row.synonyms)\n ? {\n synonyms: row.synonyms\n .filter((s): s is string => typeof s === 'string')\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean),\n }\n : {}),\n ...(Array.isArray(row.excludes)\n ? {\n excludes: row.excludes\n .filter((s): s is string => typeof s === 'string')\n .map((s) => s.trim().toLowerCase())\n .filter(Boolean),\n }\n : {}),\n ...(monitor ? { monitor } : {}),\n ...(typeof row.targetPrice === 'number' && row.targetPrice > 0 ? { targetPrice: row.targetPrice } : {}),\n ...(typeof row.budget === 'number' && row.budget > 0 ? { budget: Math.round(row.budget) } : {}),\n ...(typeof row.departmentId === 'string' && row.departmentId.trim()\n ? { departmentId: row.departmentId.trim().toLowerCase() }\n : {}),\n };\n}\n\nexport async function parseShoppingViaBrain(\n text: string,\n opts: { timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<{\n query: string;\n productType?: string;\n synonyms?: string[];\n excludes?: string[];\n monitor?: 'watch' | 'stop';\n targetPrice?: number;\n budget?: number;\n departmentId?: string;\n} | null> {\n const verdict = await classifyShoppingViaBrain(text, opts);\n if (verdict.status !== 'ok') return null;\n // Destructured only to leave `status` out of what is returned.\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { status: _status, ...rest } = verdict;\n return rest;\n}\n\nconst BRAIN_COMPLETE_PATH = '/resources/yantra-brain-complete';\n\n/** Keyless chat completion via the same web origin as the classify proxy. */\nexport async function brainCompleteViaBrain(\n messages: Array<{ role: 'system' | 'user' | 'assistant'; content: string }>,\n opts: { maxTokens?: number; timeoutMs?: number; signal?: AbortSignal } = {},\n): Promise<string | null> {\n const base = (config.CLIENT_URL || '').trim().replace(/\\/+$/, '');\n const endpoint = base ? `${base}${BRAIN_COMPLETE_PATH}` : '';\n if (!endpoint || messages.length === 0) return null;\n\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), opts.timeoutMs ?? 15000);\n if (opts.signal) {\n if (opts.signal.aborted) controller.abort();\n else opts.signal.addEventListener('abort', () => controller.abort(), { once: true });\n }\n\n try {\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n messages,\n model: 'yantra-brain/fast',\n max_tokens: opts.maxTokens ?? 220,\n }),\n signal: controller.signal,\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { content?: string | null };\n const content = typeof data?.content === 'string' ? data.content.trim() : '';\n return content || null;\n } catch {\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adminide-stack/yantra-mobile",
|
|
3
|
-
"version": "12.0.69-alpha.
|
|
3
|
+
"version": "12.0.69-alpha.12",
|
|
4
4
|
"description": "Sample core for higher packages to depend on",
|
|
5
5
|
"license": "ISC",
|
|
6
6
|
"author": "CDMBase LLC",
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"uuid": "^9.0.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"common": "12.0.69-alpha.
|
|
28
|
+
"common": "12.0.69-alpha.12"
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {
|
|
31
31
|
"@admin-layout/gluestack-ui-mobile": "*",
|
|
@@ -41,9 +41,10 @@
|
|
|
41
41
|
"@messenger-box/platform-mobile": "*",
|
|
42
42
|
"@react-native-async-storage/async-storage": "*",
|
|
43
43
|
"@react-navigation/native": "*",
|
|
44
|
-
"common": "12.0.69-alpha.
|
|
44
|
+
"common": "12.0.69-alpha.11",
|
|
45
45
|
"expo-constants": "*",
|
|
46
46
|
"expo-secure-store": "*",
|
|
47
|
+
"expo-web-browser": "*",
|
|
47
48
|
"lodash": "*",
|
|
48
49
|
"react-native": "*",
|
|
49
50
|
"react-native-keyboard-controller": "*",
|
|
@@ -57,5 +58,5 @@
|
|
|
57
58
|
"typescript": {
|
|
58
59
|
"definition": "lib/index.d.ts"
|
|
59
60
|
},
|
|
60
|
-
"gitHead": "
|
|
61
|
+
"gitHead": "403fb48c8af0c810ff5d3b4c54eb13137fbc619d"
|
|
61
62
|
}
|