@adminide-stack/yantra-mobile 12.0.21-alpha.84 → 12.0.22
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/api/chatApi.js +4 -6
- package/lib/api/chatApi.js.map +1 -1
- package/lib/compute.js.map +1 -1
- package/lib/config/env-config.js +2 -0
- package/lib/config/env-config.js.map +1 -1
- package/lib/hooks/useChatApi.js +3 -6
- package/lib/hooks/useChatApi.js.map +1 -1
- package/lib/hooks/useChatStream.js +3 -6
- package/lib/hooks/useChatStream.js.map +1 -1
- package/lib/module.js +1 -0
- package/lib/module.js.map +1 -1
- package/lib/screens/Home/HomeScreen.js +2 -4
- package/lib/screens/Home/HomeScreen.js.map +1 -1
- package/package.json +3 -3
package/lib/api/chatApi.js
CHANGED
|
@@ -75,8 +75,7 @@ async function streamChatResponse(messages, apiKey, signal, options) {
|
|
|
75
75
|
done,
|
|
76
76
|
value
|
|
77
77
|
} = await reader.read();
|
|
78
|
-
if (done)
|
|
79
|
-
break;
|
|
78
|
+
if (done) break;
|
|
80
79
|
buffer += decoder.decode(value, {
|
|
81
80
|
stream: true
|
|
82
81
|
});
|
|
@@ -85,13 +84,11 @@ async function streamChatResponse(messages, apiKey, signal, options) {
|
|
|
85
84
|
for (const line of lines) {
|
|
86
85
|
if (line.startsWith("data: ")) {
|
|
87
86
|
const data = line.slice(6);
|
|
88
|
-
if (data === "[DONE]")
|
|
89
|
-
continue;
|
|
87
|
+
if (data === "[DONE]") continue;
|
|
90
88
|
try {
|
|
91
89
|
const parsed = JSON.parse(data);
|
|
92
90
|
const delta = (_c = (_b = (_a = parsed.choices) == null ? void 0 : _a[0]) == null ? void 0 : _b.delta) == null ? void 0 : _c.content;
|
|
93
|
-
if (delta)
|
|
94
|
-
fullContent += delta;
|
|
91
|
+
if (delta) fullContent += delta;
|
|
95
92
|
} catch (e) {
|
|
96
93
|
}
|
|
97
94
|
}
|
|
@@ -100,5 +97,6 @@ async function streamChatResponse(messages, apiKey, signal, options) {
|
|
|
100
97
|
return {
|
|
101
98
|
content: fullContent,
|
|
102
99
|
tokenUsage: void 0
|
|
100
|
+
// Groq streaming doesn't always return usage in stream
|
|
103
101
|
};
|
|
104
102
|
}export{streamChatResponse};//# sourceMappingURL=chatApi.js.map
|
package/lib/api/chatApi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chatApi.js","sources":["../../src/api/chatApi.ts"],"sourcesContent":["/**\n * Minimal Groq API client for mobile chat.\n * Uses GROQ_API_KEY from config (packages-modules/account/mobile/src/config/env-config.ts).\n */\n\nimport { config } from '../config';\n\nconst GROQ_ENDPOINT = 'https://api.groq.com/openai/v1/chat/completions';\nconst DEFAULT_MODEL = 'meta-llama/llama-4-scout-17b-16e-instruct';\n\nfunction getApiKey(): string {\n const key = config.GROQ_API_KEY || '';\n if (!key) {\n throw new Error('GROQ_API_KEY is not configured. Add it to your .env file (e.g. config/development/dev.env).');\n }\n return key;\n}\n\nexport interface ChatMessage {\n role: 'user' | 'assistant' | 'system';\n content: string;\n}\n\nexport interface StreamResult {\n content: string;\n tokenUsage?: {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n };\n}\n\n/**\n * Perform a non-streaming request (used when response.body/ReadableStream is not available, e.g. React Native).\n */\nasync function fetchNonStreaming(messages: ChatMessage[], key: string, signal?: AbortSignal): Promise<StreamResult> {\n const response = await fetch(GROQ_ENDPOINT, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${key}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: DEFAULT_MODEL,\n messages,\n stream: false,\n temperature: 1,\n }),\n signal,\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new Error(`Groq API error (${response.status}): ${err}`);\n }\n\n const data = await response.json();\n const content = data.choices?.[0]?.message?.content ?? '';\n const usage = data.usage;\n\n return {\n content,\n tokenUsage: usage\n ? {\n inputTokens: usage.prompt_tokens ?? 0,\n outputTokens: usage.completion_tokens ?? 0,\n totalTokens: usage.total_tokens ?? 0,\n }\n : undefined,\n };\n}\n\nexport interface StreamChatOptions {\n /** Set to true when response.body/ReadableStream is not available (e.g. React Native) to use a single non-streaming request. */\n preferNonStreaming?: boolean;\n}\n\nexport async function streamChatResponse(\n messages: ChatMessage[],\n apiKey?: string,\n signal?: AbortSignal,\n options?: StreamChatOptions,\n): Promise<StreamResult> {\n const key = apiKey || getApiKey();\n\n if (options?.preferNonStreaming) {\n return fetchNonStreaming(messages, key, signal);\n }\n\n const response = await fetch(GROQ_ENDPOINT, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${key}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: DEFAULT_MODEL,\n messages,\n stream: true,\n temperature: 1,\n }),\n signal,\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new Error(`Groq API error (${response.status}): ${err}`);\n }\n\n // React Native's fetch often does not expose response.body (ReadableStream).\n // Fall back to a non-streaming request so we can read the full response.\n if (!response.body || typeof response.body.getReader !== 'function') {\n return fetchNonStreaming(messages, key, signal);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let fullContent = '';\n let buffer = '';\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n // eslint-disable-next-line no-continue\n if (data === '[DONE]') continue;\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta?.content;\n if (delta) fullContent += delta;\n } catch {\n // ignore parse errors\n }\n }\n }\n }\n\n return {\n content: fullContent,\n tokenUsage: undefined, // Groq streaming doesn't always return usage in stream\n };\n}\n"],"names":[],"mappings":"6CAMA,MAAM,aAAgB,GAAA,iDAAA;AACtB,MAAM,aAAgB,GAAA,2CAAA;AACtB,SAAS,SAAoB,GAAA;AAC3B,EAAM,MAAA,GAAA,GAAM,OAAO,YAAgB,IAAA,EAAA;AACnC,EAAA,IAAI,CAAC,GAAK,EAAA;AACR,IAAM,MAAA,IAAI,MAAM,6FAA6F,CAAA;AAAA;AAE/G,EAAO,OAAA,GAAA;AACT;AAiBA,eAAe,iBAAA,CAAkB,QAAyB,EAAA,GAAA,EAAa,MAA6C,EAAA;AA/BpH,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAgCE,EAAM,MAAA,QAAA,GAAW,MAAM,KAAA,CAAM,aAAe,EAAA;AAAA,IAC1C,MAAQ,EAAA,MAAA;AAAA,IACR,OAAS,EAAA;AAAA,MACP,
|
|
1
|
+
{"version":3,"file":"chatApi.js","sources":["../../src/api/chatApi.ts"],"sourcesContent":["/**\n * Minimal Groq API client for mobile chat.\n * Uses GROQ_API_KEY from config (packages-modules/account/mobile/src/config/env-config.ts).\n */\n\nimport { config } from '../config';\n\nconst GROQ_ENDPOINT = 'https://api.groq.com/openai/v1/chat/completions';\nconst DEFAULT_MODEL = 'meta-llama/llama-4-scout-17b-16e-instruct';\n\nfunction getApiKey(): string {\n const key = config.GROQ_API_KEY || '';\n if (!key) {\n throw new Error('GROQ_API_KEY is not configured. Add it to your .env file (e.g. config/development/dev.env).');\n }\n return key;\n}\n\nexport interface ChatMessage {\n role: 'user' | 'assistant' | 'system';\n content: string;\n}\n\nexport interface StreamResult {\n content: string;\n tokenUsage?: {\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n };\n}\n\n/**\n * Perform a non-streaming request (used when response.body/ReadableStream is not available, e.g. React Native).\n */\nasync function fetchNonStreaming(messages: ChatMessage[], key: string, signal?: AbortSignal): Promise<StreamResult> {\n const response = await fetch(GROQ_ENDPOINT, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${key}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: DEFAULT_MODEL,\n messages,\n stream: false,\n temperature: 1,\n }),\n signal,\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new Error(`Groq API error (${response.status}): ${err}`);\n }\n\n const data = await response.json();\n const content = data.choices?.[0]?.message?.content ?? '';\n const usage = data.usage;\n\n return {\n content,\n tokenUsage: usage\n ? {\n inputTokens: usage.prompt_tokens ?? 0,\n outputTokens: usage.completion_tokens ?? 0,\n totalTokens: usage.total_tokens ?? 0,\n }\n : undefined,\n };\n}\n\nexport interface StreamChatOptions {\n /** Set to true when response.body/ReadableStream is not available (e.g. React Native) to use a single non-streaming request. */\n preferNonStreaming?: boolean;\n}\n\nexport async function streamChatResponse(\n messages: ChatMessage[],\n apiKey?: string,\n signal?: AbortSignal,\n options?: StreamChatOptions,\n): Promise<StreamResult> {\n const key = apiKey || getApiKey();\n\n if (options?.preferNonStreaming) {\n return fetchNonStreaming(messages, key, signal);\n }\n\n const response = await fetch(GROQ_ENDPOINT, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${key}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: DEFAULT_MODEL,\n messages,\n stream: true,\n temperature: 1,\n }),\n signal,\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new Error(`Groq API error (${response.status}): ${err}`);\n }\n\n // React Native's fetch often does not expose response.body (ReadableStream).\n // Fall back to a non-streaming request so we can read the full response.\n if (!response.body || typeof response.body.getReader !== 'function') {\n return fetchNonStreaming(messages, key, signal);\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let fullContent = '';\n let buffer = '';\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() || '';\n\n for (const line of lines) {\n if (line.startsWith('data: ')) {\n const data = line.slice(6);\n // eslint-disable-next-line no-continue\n if (data === '[DONE]') continue;\n\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta?.content;\n if (delta) fullContent += delta;\n } catch {\n // ignore parse errors\n }\n }\n }\n }\n\n return {\n content: fullContent,\n tokenUsage: undefined, // Groq streaming doesn't always return usage in stream\n };\n}\n"],"names":[],"mappings":"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"}
|
package/lib/compute.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute.js","sources":["../src/compute.ts"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { getFilteredRoutes } from '@common-stack/client-react/lib/utils/filteredRoutes.js';\nimport type { IRouteModule } from '@common-stack/core';\n\nexport const yantraMobilePageStore: IRouteModule[] = [\n {\n key: 'home',\n path: '/l/home',\n name: 'Home',\n exact: true,\n index: true,\n priority: 1,\n hideInMenu: true,\n auth: true,\n menu_position: 'side',\n component: () => import('./screens/Home'),\n props: {\n initialParams: { initialSessionId: null },\n options: {\n title: 'Yantra',\n headerTintColor: 'black',\n headerTitleStyle: {\n fontWeight: 'bold',\n },\n drawerLabel: 'Home',\n headerTitleAlign: 'left',\n gestureEnabled: false,\n swipeEnabled: false,\n },\n },\n },\n];\n\nconst selectedRoutes = ['home'];\n\nconst filteredRoutes = getFilteredRoutes(yantraMobilePageStore, selectedRoutes);\n\nexport { filteredRoutes };\n"],"names":[],"mappings":"uFAGO,MAAM,wBAAwC,CAAC;AAAA,EACpD,GAAK,EAAA,MAAA;AAAA,EACL,IAAM,EAAA,SAAA;AAAA,EACN,IAAM,EAAA,MAAA;AAAA,EACN,KAAO,EAAA,IAAA;AAAA,EACP,KAAO,EAAA,IAAA;AAAA,EACP,QAAU,EAAA,CAAA;AAAA,EACV,UAAY,EAAA,IAAA;AAAA,EACZ,IAAM,EAAA,IAAA;AAAA,EACN,aAAe,EAAA,MAAA;AAAA,EACf,SAAA,EAAW,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"compute.js","sources":["../src/compute.ts"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { getFilteredRoutes } from '@common-stack/client-react/lib/utils/filteredRoutes.js';\nimport type { IRouteModule } from '@common-stack/core';\n\nexport const yantraMobilePageStore: IRouteModule[] = [\n {\n key: 'home',\n path: '/l/home',\n name: 'Home',\n exact: true,\n index: true,\n priority: 1,\n hideInMenu: true,\n auth: true,\n menu_position: 'side',\n component: () => import('./screens/Home'),\n props: {\n initialParams: { initialSessionId: null },\n options: {\n title: 'Yantra',\n headerTintColor: 'black',\n headerTitleStyle: {\n fontWeight: 'bold',\n },\n drawerLabel: 'Home',\n headerTitleAlign: 'left',\n gestureEnabled: false,\n swipeEnabled: false,\n },\n },\n },\n];\n\nconst selectedRoutes = ['home'];\n\nconst filteredRoutes = getFilteredRoutes(yantraMobilePageStore, selectedRoutes);\n\nexport { filteredRoutes };\n"],"names":[],"mappings":"uFAGO,MAAM,wBAAwC,CAAC;AAAA,EACpD,GAAK,EAAA,MAAA;AAAA,EACL,IAAM,EAAA,SAAA;AAAA,EACN,IAAM,EAAA,MAAA;AAAA,EACN,KAAO,EAAA,IAAA;AAAA,EACP,KAAO,EAAA,IAAA;AAAA,EACP,QAAU,EAAA,CAAA;AAAA,EACV,UAAY,EAAA,IAAA;AAAA,EACZ,IAAM,EAAA,IAAA;AAAA,EACN,aAAe,EAAA,MAAA;AAAA,EACf,SAAA,EAAW,MAAM,OAAO,yBAAgB,CAAA;AAAA,EACxC,KAAO,EAAA;AAAA,IACL,aAAe,EAAA;AAAA,MACb,gBAAkB,EAAA;AAAA,KACpB;AAAA,IACA,OAAS,EAAA;AAAA,MACP,KAAO,EAAA,QAAA;AAAA,MACP,eAAiB,EAAA,OAAA;AAAA,MACjB,gBAAkB,EAAA;AAAA,QAChB,UAAY,EAAA;AAAA,OACd;AAAA,MACA,WAAa,EAAA,MAAA;AAAA,MACb,gBAAkB,EAAA,MAAA;AAAA,MAClB,cAAgB,EAAA,KAAA;AAAA,MAChB,YAAc,EAAA;AAAA;AAChB;AAEJ,CAAC;AACD,MAAM,cAAA,GAAiB,CAAC,MAAM,CAAA;AACxB,MAAA,cAAA,GAAiB,iBAAkB,CAAA,qBAAA,EAAuB,cAAc"}
|
package/lib/config/env-config.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {cleanEnv,str}from'envalid';const env = process.APP_ENV || process.env;
|
|
2
2
|
const config = cleanEnv(
|
|
3
3
|
env,
|
|
4
|
+
/* start */
|
|
4
5
|
{
|
|
5
6
|
GRAPHQL_URL: str({
|
|
6
7
|
default: "http://localhost:8080/graphql"
|
|
@@ -15,4 +16,5 @@ const config = cleanEnv(
|
|
|
15
16
|
default: ""
|
|
16
17
|
})
|
|
17
18
|
}
|
|
19
|
+
/* end */
|
|
18
20
|
);export{config};//# sourceMappingURL=env-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-config.js","sources":["../../src/config/env-config.ts"],"sourcesContent":["import { str, cleanEnv } from 'envalid';\n\nconst env = (process as any).APP_ENV || process.env;\n\nexport const config = cleanEnv(\n env,\n /* start */\n {\n GRAPHQL_URL: str({ default: 'http://localhost:8080/graphql' }),\n CLIENT_URL: str({ default: 'http://localhost:3000' }),\n APP_NAME: str({ default: 'CDMBASE' }),\n GROQ_API_KEY: str({ default: '' }),\n } /* end */,\n);\n"],"names":[],"mappings":"mCACA,MAAM,GAAA,GAAO,OAAgB,CAAA,OAAA,IAAW,OAAQ,CAAA,GAAA;AACzC,MAAM,MAAS,GAAA,QAAA;AAAA,EAAS,GAAA;AAAA,EAC/B;AAAA,IACE,aAAa,GAAI,CAAA;AAAA,MACf,OAAS,EAAA;AAAA,KACV,CAAA;AAAA,IACD,YAAY,GAAI,CAAA;AAAA,MACd,OAAS,EAAA;AAAA,KACV,CAAA;AAAA,IACD,UAAU,GAAI,CAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACV,CAAA;AAAA,IACD,cAAc,GAAI,CAAA;AAAA,MAChB,OAAS,EAAA;AAAA,KACV;AAAA;
|
|
1
|
+
{"version":3,"file":"env-config.js","sources":["../../src/config/env-config.ts"],"sourcesContent":["import { str, cleanEnv } from 'envalid';\n\nconst env = (process as any).APP_ENV || process.env;\n\nexport const config = cleanEnv(\n env,\n /* start */\n {\n GRAPHQL_URL: str({ default: 'http://localhost:8080/graphql' }),\n CLIENT_URL: str({ default: 'http://localhost:3000' }),\n APP_NAME: str({ default: 'CDMBASE' }),\n GROQ_API_KEY: str({ default: '' }),\n } /* end */,\n);\n"],"names":[],"mappings":"mCACA,MAAM,GAAA,GAAO,OAAgB,CAAA,OAAA,IAAW,OAAQ,CAAA,GAAA;AACzC,MAAM,MAAS,GAAA,QAAA;AAAA,EAAS,GAAA;AAAA;AAAA,EAC/B;AAAA,IACE,aAAa,GAAI,CAAA;AAAA,MACf,OAAS,EAAA;AAAA,KACV,CAAA;AAAA,IACD,YAAY,GAAI,CAAA;AAAA,MACd,OAAS,EAAA;AAAA,KACV,CAAA;AAAA,IACD,UAAU,GAAI,CAAA;AAAA,MACZ,OAAS,EAAA;AAAA,KACV,CAAA;AAAA,IACD,cAAc,GAAI,CAAA;AAAA,MAChB,OAAS,EAAA;AAAA,KACV;AAAA;AACH;AAAW"}
|
package/lib/hooks/useChatApi.js
CHANGED
|
@@ -78,8 +78,7 @@ function useChatMessages(sessionId, options) {
|
|
|
78
78
|
});
|
|
79
79
|
const messages = useMemo(() => {
|
|
80
80
|
var _a;
|
|
81
|
-
if (!((_a = data == null ? void 0 : data.getAccountChatMessages) == null ? void 0 : _a.edges))
|
|
82
|
-
return [];
|
|
81
|
+
if (!((_a = data == null ? void 0 : data.getAccountChatMessages) == null ? void 0 : _a.edges)) return [];
|
|
83
82
|
return data.getAccountChatMessages.edges.map((edge) => {
|
|
84
83
|
var _a2, _b;
|
|
85
84
|
const n = edge.node;
|
|
@@ -130,8 +129,7 @@ function useChatMutations() {
|
|
|
130
129
|
data: result
|
|
131
130
|
}) => {
|
|
132
131
|
var _a2;
|
|
133
|
-
if (!(result == null ? void 0 : result.createAccountChatSession))
|
|
134
|
-
return;
|
|
132
|
+
if (!(result == null ? void 0 : result.createAccountChatSession)) return;
|
|
135
133
|
try {
|
|
136
134
|
const existing = readSessionsCache(cache);
|
|
137
135
|
if (existing == null ? void 0 : existing.getAccountChatSessions) {
|
|
@@ -174,8 +172,7 @@ function useChatMutations() {
|
|
|
174
172
|
data: result
|
|
175
173
|
}) => {
|
|
176
174
|
var _a;
|
|
177
|
-
if (!(result == null ? void 0 : result.saveAccountChatMessages))
|
|
178
|
-
return;
|
|
175
|
+
if (!(result == null ? void 0 : result.saveAccountChatMessages)) return;
|
|
179
176
|
const res = result.saveAccountChatMessages;
|
|
180
177
|
try {
|
|
181
178
|
const existingMessages = readMessagesCache(cache, input.sessionId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChatApi.js","sources":["../../src/hooks/useChatApi.ts"],"sourcesContent":["import type { ApolloCache } from '@apollo/client';\nimport {\n GetAccountChatMessagesDocument,\n GetAccountChatSessionsDocument,\n useCreateAccountChatSessionMutation,\n useGetAccountChatMessagesQuery,\n useGetAccountChatSessionsQuery,\n useSaveAccountChatMessagesMutation,\n} from 'common/graphql';\nimport type { IAccountCreateChatSessionInput, IAccountSaveChatMessagesInput } from 'common/server';\nimport { useCallback, useMemo } from 'react';\n\nconst SESSIONS_QUERY_VARS = { first: 25, includeArchived: false };\n\nfunction readSessionsCache(cache: ApolloCache<unknown>) {\n try {\n return cache.readQuery({\n query: GetAccountChatSessionsDocument,\n variables: SESSIONS_QUERY_VARS,\n }) as { getAccountChatSessions?: { edges: unknown[]; totalCount?: number } } | null;\n } catch {\n return null;\n }\n}\n\nfunction readMessagesCache(cache: ApolloCache<unknown>, sessionId: string) {\n try {\n return cache.readQuery({\n query: GetAccountChatMessagesDocument,\n variables: { sessionId, first: 100 },\n }) as { getAccountChatMessages?: { edges: unknown[]; totalCount?: number } } | null;\n } catch {\n return null;\n }\n}\n\nfunction buildSessionEdge(node: Record<string, unknown>) {\n return {\n __typename: 'AccountChatSessionEdge',\n cursor: '',\n node: {\n __typename: 'AccountChatSession',\n ...node,\n },\n };\n}\n\nfunction buildMessageEdge(node: Record<string, unknown>) {\n return {\n __typename: 'AccountChatMessageEdge',\n cursor: '',\n node: {\n __typename: 'AccountChatMessage',\n ...node,\n },\n };\n}\n\nexport interface ChatSessionUI {\n id: string;\n title: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport function useChatSessions(options?: { includeArchived?: boolean; skip?: boolean }) {\n const { data, loading, error, refetch } = useGetAccountChatSessionsQuery({\n variables: {\n first: 25,\n includeArchived: options?.includeArchived ?? false,\n },\n skip: options?.skip,\n fetchPolicy: 'cache-first',\n });\n\n const sessions: ChatSessionUI[] = useMemo(() => {\n if (!data?.getAccountChatSessions?.edges) return [];\n return data.getAccountChatSessions.edges.map((edge: { node: Record<string, unknown> }) => ({\n id: edge.node.id as string,\n title: (edge.node.title as string) ?? 'New Chat',\n createdAt: new Date(edge.node.createdAt as string),\n updatedAt: new Date(edge.node.updatedAt as string),\n }));\n }, [data]);\n\n return { sessions, loading, error, refetch };\n}\n\nexport interface ChatMessageUI {\n id: string;\n sessionId: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n attachments?: Array<{ id: string; name: string; type: string; mimeType?: string; size?: number; url?: string }>;\n tokenCount?: number;\n model?: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport function useChatMessages(sessionId: string | null, options?: { skip?: boolean }) {\n const { data, loading, error, refetch } = useGetAccountChatMessagesQuery({\n variables: { sessionId: sessionId!, first: 100 },\n skip: !sessionId || options?.skip,\n fetchPolicy: 'cache-first',\n });\n\n const messages: ChatMessageUI[] = useMemo(() => {\n if (!data?.getAccountChatMessages?.edges) return [];\n return data.getAccountChatMessages.edges.map((edge: { node: Record<string, unknown> }) => {\n const n = edge.node;\n return {\n id: n.id as string,\n sessionId: n.sessionId as string,\n role: n.role as 'user' | 'assistant' | 'system',\n content: (n.content as string) ?? '',\n attachments: (n.attachments as ChatMessageUI['attachments']) ?? undefined,\n tokenCount: n.tokenCount as number | undefined,\n model: n.model as string | undefined,\n createdAt: new Date(n.createdAt as string),\n updatedAt: new Date(n.updatedAt as string),\n };\n });\n }, [data]);\n\n return { messages, loading, error, refetch };\n}\n\nexport function useChatMutations() {\n const [createSessionMutation, { loading: createLoading }] = useCreateAccountChatSessionMutation();\n const [saveMessagesMutation, { loading: saveMessagesLoading }] = useSaveAccountChatMessagesMutation();\n\n const createSession = useCallback(\n async (input?: IAccountCreateChatSessionInput): Promise<ChatSessionUI> => {\n const inputWithId = {\n id: input?.id,\n title: input?.title ?? 'New Chat',\n ...(input?.model && { model: input.model }),\n ...(input?.systemPrompt && { systemPrompt: input.systemPrompt }),\n };\n\n const { data } = await createSessionMutation({\n variables: { input: inputWithId },\n update: (cache, { data: result }) => {\n if (!result?.createAccountChatSession) return;\n try {\n const existing = readSessionsCache(cache);\n if (existing?.getAccountChatSessions) {\n const newEdge = buildSessionEdge(result.createAccountChatSession);\n cache.writeQuery({\n query: GetAccountChatSessionsDocument,\n variables: SESSIONS_QUERY_VARS,\n data: {\n getAccountChatSessions: {\n ...existing.getAccountChatSessions,\n edges: [newEdge, ...existing.getAccountChatSessions.edges],\n totalCount: (existing.getAccountChatSessions.totalCount ?? 0) + 1,\n },\n },\n });\n }\n } catch (err) {\n console.warn('[useChatApi] createSession cache update failed:', err);\n }\n },\n });\n\n if (!data?.createAccountChatSession) {\n throw new Error('Failed to create session');\n }\n\n const s = data.createAccountChatSession;\n return {\n id: s.id,\n title: s.title ?? 'New Chat',\n createdAt: new Date(s.createdAt),\n updatedAt: new Date(s.updatedAt),\n };\n },\n [createSessionMutation],\n );\n\n const saveMessages = useCallback(\n async (input: IAccountSaveChatMessagesInput): Promise<void> => {\n const { data } = await saveMessagesMutation({\n variables: { input },\n update: (cache, { data: result }) => {\n if (!result?.saveAccountChatMessages) return;\n const res = result.saveAccountChatMessages;\n try {\n const existingMessages = readMessagesCache(cache, input.sessionId);\n if (existingMessages?.getAccountChatMessages) {\n const userEdge = buildMessageEdge(res.userMessage);\n const assistantEdge = buildMessageEdge(res.assistantMessage);\n cache.writeQuery({\n query: GetAccountChatMessagesDocument,\n variables: { sessionId: input.sessionId, first: 100 },\n data: {\n getAccountChatMessages: {\n ...existingMessages.getAccountChatMessages,\n edges: [\n ...existingMessages.getAccountChatMessages.edges,\n userEdge,\n assistantEdge,\n ],\n totalCount: (existingMessages.getAccountChatMessages.totalCount ?? 0) + 2,\n },\n },\n });\n }\n } catch (err) {\n console.warn('[useChatApi] saveMessages cache update failed:', err);\n }\n try {\n const existingSessions = readSessionsCache(cache);\n if (existingSessions?.getAccountChatSessions) {\n const sessionData = res.session;\n const updatedEdges = existingSessions.getAccountChatSessions.edges.map((edge: any) =>\n edge.node.id === sessionData.id\n ? { ...edge, node: { ...edge.node, ...sessionData } }\n : edge,\n );\n cache.writeQuery({\n query: GetAccountChatSessionsDocument,\n variables: SESSIONS_QUERY_VARS,\n data: {\n getAccountChatSessions: {\n ...existingSessions.getAccountChatSessions,\n edges: updatedEdges,\n },\n },\n });\n }\n } catch (err) {\n console.warn('[useChatApi] saveMessages session cache update failed:', err);\n }\n },\n });\n if (!data?.saveAccountChatMessages) {\n throw new Error('Failed to save messages');\n }\n },\n [saveMessagesMutation],\n );\n\n return {\n createSession,\n saveMessages,\n loading: { create: createLoading, saveMessages: saveMessagesLoading },\n };\n}\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useChatApi.js","sources":["../../src/hooks/useChatApi.ts"],"sourcesContent":["import type { ApolloCache } from '@apollo/client';\nimport {\n GetAccountChatMessagesDocument,\n GetAccountChatSessionsDocument,\n useCreateAccountChatSessionMutation,\n useGetAccountChatMessagesQuery,\n useGetAccountChatSessionsQuery,\n useSaveAccountChatMessagesMutation,\n} from 'common/graphql';\nimport type { IAccountCreateChatSessionInput, IAccountSaveChatMessagesInput } from 'common/server';\nimport { useCallback, useMemo } from 'react';\n\nconst SESSIONS_QUERY_VARS = { first: 25, includeArchived: false };\n\nfunction readSessionsCache(cache: ApolloCache<unknown>) {\n try {\n return cache.readQuery({\n query: GetAccountChatSessionsDocument,\n variables: SESSIONS_QUERY_VARS,\n }) as { getAccountChatSessions?: { edges: unknown[]; totalCount?: number } } | null;\n } catch {\n return null;\n }\n}\n\nfunction readMessagesCache(cache: ApolloCache<unknown>, sessionId: string) {\n try {\n return cache.readQuery({\n query: GetAccountChatMessagesDocument,\n variables: { sessionId, first: 100 },\n }) as { getAccountChatMessages?: { edges: unknown[]; totalCount?: number } } | null;\n } catch {\n return null;\n }\n}\n\nfunction buildSessionEdge(node: Record<string, unknown>) {\n return {\n __typename: 'AccountChatSessionEdge',\n cursor: '',\n node: {\n __typename: 'AccountChatSession',\n ...node,\n },\n };\n}\n\nfunction buildMessageEdge(node: Record<string, unknown>) {\n return {\n __typename: 'AccountChatMessageEdge',\n cursor: '',\n node: {\n __typename: 'AccountChatMessage',\n ...node,\n },\n };\n}\n\nexport interface ChatSessionUI {\n id: string;\n title: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport function useChatSessions(options?: { includeArchived?: boolean; skip?: boolean }) {\n const { data, loading, error, refetch } = useGetAccountChatSessionsQuery({\n variables: {\n first: 25,\n includeArchived: options?.includeArchived ?? false,\n },\n skip: options?.skip,\n fetchPolicy: 'cache-first',\n });\n\n const sessions: ChatSessionUI[] = useMemo(() => {\n if (!data?.getAccountChatSessions?.edges) return [];\n return data.getAccountChatSessions.edges.map((edge: { node: Record<string, unknown> }) => ({\n id: edge.node.id as string,\n title: (edge.node.title as string) ?? 'New Chat',\n createdAt: new Date(edge.node.createdAt as string),\n updatedAt: new Date(edge.node.updatedAt as string),\n }));\n }, [data]);\n\n return { sessions, loading, error, refetch };\n}\n\nexport interface ChatMessageUI {\n id: string;\n sessionId: string;\n role: 'user' | 'assistant' | 'system';\n content: string;\n attachments?: Array<{ id: string; name: string; type: string; mimeType?: string; size?: number; url?: string }>;\n tokenCount?: number;\n model?: string;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport function useChatMessages(sessionId: string | null, options?: { skip?: boolean }) {\n const { data, loading, error, refetch } = useGetAccountChatMessagesQuery({\n variables: { sessionId: sessionId!, first: 100 },\n skip: !sessionId || options?.skip,\n fetchPolicy: 'cache-first',\n });\n\n const messages: ChatMessageUI[] = useMemo(() => {\n if (!data?.getAccountChatMessages?.edges) return [];\n return data.getAccountChatMessages.edges.map((edge: { node: Record<string, unknown> }) => {\n const n = edge.node;\n return {\n id: n.id as string,\n sessionId: n.sessionId as string,\n role: n.role as 'user' | 'assistant' | 'system',\n content: (n.content as string) ?? '',\n attachments: (n.attachments as ChatMessageUI['attachments']) ?? undefined,\n tokenCount: n.tokenCount as number | undefined,\n model: n.model as string | undefined,\n createdAt: new Date(n.createdAt as string),\n updatedAt: new Date(n.updatedAt as string),\n };\n });\n }, [data]);\n\n return { messages, loading, error, refetch };\n}\n\nexport function useChatMutations() {\n const [createSessionMutation, { loading: createLoading }] = useCreateAccountChatSessionMutation();\n const [saveMessagesMutation, { loading: saveMessagesLoading }] = useSaveAccountChatMessagesMutation();\n\n const createSession = useCallback(\n async (input?: IAccountCreateChatSessionInput): Promise<ChatSessionUI> => {\n const inputWithId = {\n id: input?.id,\n title: input?.title ?? 'New Chat',\n ...(input?.model && { model: input.model }),\n ...(input?.systemPrompt && { systemPrompt: input.systemPrompt }),\n };\n\n const { data } = await createSessionMutation({\n variables: { input: inputWithId },\n update: (cache, { data: result }) => {\n if (!result?.createAccountChatSession) return;\n try {\n const existing = readSessionsCache(cache);\n if (existing?.getAccountChatSessions) {\n const newEdge = buildSessionEdge(result.createAccountChatSession);\n cache.writeQuery({\n query: GetAccountChatSessionsDocument,\n variables: SESSIONS_QUERY_VARS,\n data: {\n getAccountChatSessions: {\n ...existing.getAccountChatSessions,\n edges: [newEdge, ...existing.getAccountChatSessions.edges],\n totalCount: (existing.getAccountChatSessions.totalCount ?? 0) + 1,\n },\n },\n });\n }\n } catch (err) {\n console.warn('[useChatApi] createSession cache update failed:', err);\n }\n },\n });\n\n if (!data?.createAccountChatSession) {\n throw new Error('Failed to create session');\n }\n\n const s = data.createAccountChatSession;\n return {\n id: s.id,\n title: s.title ?? 'New Chat',\n createdAt: new Date(s.createdAt),\n updatedAt: new Date(s.updatedAt),\n };\n },\n [createSessionMutation],\n );\n\n const saveMessages = useCallback(\n async (input: IAccountSaveChatMessagesInput): Promise<void> => {\n const { data } = await saveMessagesMutation({\n variables: { input },\n update: (cache, { data: result }) => {\n if (!result?.saveAccountChatMessages) return;\n const res = result.saveAccountChatMessages;\n try {\n const existingMessages = readMessagesCache(cache, input.sessionId);\n if (existingMessages?.getAccountChatMessages) {\n const userEdge = buildMessageEdge(res.userMessage);\n const assistantEdge = buildMessageEdge(res.assistantMessage);\n cache.writeQuery({\n query: GetAccountChatMessagesDocument,\n variables: { sessionId: input.sessionId, first: 100 },\n data: {\n getAccountChatMessages: {\n ...existingMessages.getAccountChatMessages,\n edges: [\n ...existingMessages.getAccountChatMessages.edges,\n userEdge,\n assistantEdge,\n ],\n totalCount: (existingMessages.getAccountChatMessages.totalCount ?? 0) + 2,\n },\n },\n });\n }\n } catch (err) {\n console.warn('[useChatApi] saveMessages cache update failed:', err);\n }\n try {\n const existingSessions = readSessionsCache(cache);\n if (existingSessions?.getAccountChatSessions) {\n const sessionData = res.session;\n const updatedEdges = existingSessions.getAccountChatSessions.edges.map((edge: any) =>\n edge.node.id === sessionData.id\n ? { ...edge, node: { ...edge.node, ...sessionData } }\n : edge,\n );\n cache.writeQuery({\n query: GetAccountChatSessionsDocument,\n variables: SESSIONS_QUERY_VARS,\n data: {\n getAccountChatSessions: {\n ...existingSessions.getAccountChatSessions,\n edges: updatedEdges,\n },\n },\n });\n }\n } catch (err) {\n console.warn('[useChatApi] saveMessages session cache update failed:', err);\n }\n },\n });\n if (!data?.saveAccountChatMessages) {\n throw new Error('Failed to save messages');\n }\n },\n [saveMessagesMutation],\n );\n\n return {\n createSession,\n saveMessages,\n loading: { create: createLoading, saveMessages: saveMessagesLoading },\n };\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -22,8 +22,7 @@ function useChatStream(sessionId) {
|
|
|
22
22
|
}
|
|
23
23
|
}, []);
|
|
24
24
|
useEffect(() => {
|
|
25
|
-
if (isSendingRef.current)
|
|
26
|
-
return;
|
|
25
|
+
if (isSendingRef.current) return;
|
|
27
26
|
if (!sessionId) {
|
|
28
27
|
setMessages([]);
|
|
29
28
|
setResponse("");
|
|
@@ -51,8 +50,7 @@ function useChatStream(sessionId) {
|
|
|
51
50
|
}, [sessionId, backendMessages]);
|
|
52
51
|
const sendMessage = useCallback(async (content, attachments, sessionIdOverride) => {
|
|
53
52
|
var _a, _b;
|
|
54
|
-
if (!content.trim())
|
|
55
|
-
return;
|
|
53
|
+
if (!content.trim()) return;
|
|
56
54
|
const effectiveSessionId = sessionIdOverride !== void 0 ? sessionIdOverride : sessionId;
|
|
57
55
|
const userMessage = {
|
|
58
56
|
role: "user",
|
|
@@ -175,8 +173,7 @@ function useChatStream(sessionId) {
|
|
|
175
173
|
}
|
|
176
174
|
} catch (err) {
|
|
177
175
|
const msg = err instanceof Error ? err.message : String(err);
|
|
178
|
-
if (msg.includes("abort"))
|
|
179
|
-
return;
|
|
176
|
+
if (msg.includes("abort")) return;
|
|
180
177
|
setError(msg);
|
|
181
178
|
setResponse("");
|
|
182
179
|
} finally {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useChatStream.js","sources":["../../src/hooks/useChatStream.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useChatMutations, useChatMessages } from './useChatApi';\nimport { streamChatResponse } from '../api/chatApi';\n\n/** Chunk size for simulated streaming reveal (Kimi-style step-by-step) */\nconst REVEAL_CHUNK_SIZE = 6;\n/** Delay in ms between chunks */\nconst REVEAL_INTERVAL_MS = 20;\n\nexport interface MessageAttachment {\n id: string;\n name: string;\n type: 'file' | 'screenshot';\n dataUrl?: string;\n mimeType?: string;\n size?: number;\n url?: string;\n}\n\nexport interface ChatMessage {\n role: 'user' | 'assistant';\n content: string;\n attachments?: MessageAttachment[];\n metadata?: {\n tokenUsage?: { inputTokens: number; outputTokens: number; totalTokens: number };\n model?: string;\n };\n}\n\nexport function useChatStream(sessionId: string | null) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [response, setResponse] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const isSendingRef = useRef(false);\n const revealIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const { saveMessages } = useChatMutations();\n const { messages: backendMessages } = useChatMessages(sessionId);\n\n useEffect(\n () => () => {\n if (revealIntervalRef.current) {\n clearInterval(revealIntervalRef.current);\n revealIntervalRef.current = null;\n }\n },\n [],\n );\n\n // Load messages from backend when session changes (skip if we're actively sending)\n useEffect(() => {\n if (isSendingRef.current) return;\n\n if (!sessionId) {\n setMessages([]);\n setResponse('');\n return;\n }\n // Only sync from backend when we have data - never clear when backend is empty\n // (we may have local messages from a send that just completed)\n if (backendMessages && backendMessages.length > 0) {\n const formatted: ChatMessage[] = backendMessages.map((msg) => ({\n role: msg.role as 'user' | 'assistant',\n content: msg.content ?? '',\n metadata: msg.tokenCount\n ? {\n tokenUsage: {\n inputTokens: 0,\n outputTokens: msg.tokenCount,\n totalTokens: msg.tokenCount,\n },\n model: msg.model,\n }\n : undefined,\n }));\n setMessages(formatted);\n setResponse('');\n }\n }, [sessionId, backendMessages]);\n\n const sendMessage = useCallback(\n async (content: string, attachments?: MessageAttachment[], sessionIdOverride?: string | null) => {\n if (!content.trim()) return;\n\n const effectiveSessionId = sessionIdOverride !== undefined ? sessionIdOverride : sessionId;\n\n const userMessage: ChatMessage = {\n role: 'user',\n content: content.trim(),\n attachments,\n };\n\n isSendingRef.current = true;\n setMessages((prev) => [...prev, userMessage]);\n setResponse('');\n setIsLoading(true);\n setIsStreaming(true);\n setError(null);\n\n abortRef.current = new AbortController();\n\n const chatMessages = [\n ...messages.map((m) => ({ role: m.role, content: m.content })),\n { role: 'user' as const, content: content.trim() },\n ];\n\n let doingChunkedReveal = false;\n try {\n const g = global as Record<string, unknown>;\n const preferNonStreaming =\n typeof g?.nativeCallSyncHook === 'function' || typeof g?.__fbBatchedBridge !== 'undefined';\n const result = await streamChatResponse(chatMessages, undefined, abortRef.current.signal, {\n preferNonStreaming,\n });\n const fullContent = result.content;\n\n if (preferNonStreaming && fullContent.length > 0) {\n doingChunkedReveal = true;\n if (revealIntervalRef.current) {\n clearInterval(revealIntervalRef.current);\n revealIntervalRef.current = null;\n }\n let revealedLen = 0;\n revealIntervalRef.current = setInterval(() => {\n revealedLen = Math.min(revealedLen + REVEAL_CHUNK_SIZE, fullContent.length);\n setResponse(fullContent.slice(0, revealedLen));\n if (revealedLen >= fullContent.length) {\n if (revealIntervalRef.current) {\n clearInterval(revealIntervalRef.current);\n revealIntervalRef.current = null;\n }\n const assistantMessage: ChatMessage = {\n role: 'assistant',\n content: fullContent,\n metadata: result.tokenUsage\n ? {\n tokenUsage: {\n inputTokens: result.tokenUsage.inputTokens,\n outputTokens: result.tokenUsage.outputTokens,\n totalTokens: result.tokenUsage.totalTokens,\n },\n }\n : undefined,\n };\n setMessages((prev) => [...prev, assistantMessage]);\n setResponse('');\n if (effectiveSessionId) {\n saveMessages({\n sessionId: effectiveSessionId,\n userMessage: {\n content: userMessage.content,\n attachments: userMessage.attachments?.map((a) => ({\n id: a.id,\n name: a.name,\n type: a.type,\n mimeType: a.mimeType,\n size: a.size,\n url: a.url,\n })),\n },\n assistantMessage: {\n content: fullContent,\n tokenCount: result.tokenUsage?.totalTokens,\n model: undefined,\n },\n }).catch((e) => console.error('[useChatStream] saveMessages:', e));\n }\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n abortRef.current = null;\n }\n }, REVEAL_INTERVAL_MS);\n return;\n }\n\n const assistantMessage: ChatMessage = {\n role: 'assistant',\n content: fullContent,\n metadata: result.tokenUsage\n ? {\n tokenUsage: {\n inputTokens: result.tokenUsage.inputTokens,\n outputTokens: result.tokenUsage.outputTokens,\n totalTokens: result.tokenUsage.totalTokens,\n },\n }\n : undefined,\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n setResponse('');\n\n if (effectiveSessionId) {\n await saveMessages({\n sessionId: effectiveSessionId,\n userMessage: {\n content: userMessage.content,\n attachments: userMessage.attachments?.map((a) => ({\n id: a.id,\n name: a.name,\n type: a.type,\n mimeType: a.mimeType,\n size: a.size,\n url: a.url,\n })),\n },\n assistantMessage: {\n content: fullContent,\n tokenCount: result.tokenUsage?.totalTokens,\n model: undefined,\n },\n });\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('abort')) return;\n setError(msg);\n setResponse('');\n } finally {\n if (!doingChunkedReveal) {\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n abortRef.current = null;\n }\n }\n },\n [messages, sessionId, saveMessages],\n );\n\n const cancel = useCallback(() => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n }, []);\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n setResponse('');\n setError(null);\n }, []);\n\n return {\n messages,\n response,\n error,\n isLoading,\n isStreaming,\n hasMessages: messages.length > 0 || !!response,\n sendMessage,\n cancel,\n clearMessages,\n };\n}\n"],"names":["_a","_b","assistantMessage"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useChatStream.js","sources":["../../src/hooks/useChatStream.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useChatMutations, useChatMessages } from './useChatApi';\nimport { streamChatResponse } from '../api/chatApi';\n\n/** Chunk size for simulated streaming reveal (Kimi-style step-by-step) */\nconst REVEAL_CHUNK_SIZE = 6;\n/** Delay in ms between chunks */\nconst REVEAL_INTERVAL_MS = 20;\n\nexport interface MessageAttachment {\n id: string;\n name: string;\n type: 'file' | 'screenshot';\n dataUrl?: string;\n mimeType?: string;\n size?: number;\n url?: string;\n}\n\nexport interface ChatMessage {\n role: 'user' | 'assistant';\n content: string;\n attachments?: MessageAttachment[];\n metadata?: {\n tokenUsage?: { inputTokens: number; outputTokens: number; totalTokens: number };\n model?: string;\n };\n}\n\nexport function useChatStream(sessionId: string | null) {\n const [messages, setMessages] = useState<ChatMessage[]>([]);\n const [response, setResponse] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const abortRef = useRef<AbortController | null>(null);\n const isSendingRef = useRef(false);\n const revealIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const { saveMessages } = useChatMutations();\n const { messages: backendMessages } = useChatMessages(sessionId);\n\n useEffect(\n () => () => {\n if (revealIntervalRef.current) {\n clearInterval(revealIntervalRef.current);\n revealIntervalRef.current = null;\n }\n },\n [],\n );\n\n // Load messages from backend when session changes (skip if we're actively sending)\n useEffect(() => {\n if (isSendingRef.current) return;\n\n if (!sessionId) {\n setMessages([]);\n setResponse('');\n return;\n }\n // Only sync from backend when we have data - never clear when backend is empty\n // (we may have local messages from a send that just completed)\n if (backendMessages && backendMessages.length > 0) {\n const formatted: ChatMessage[] = backendMessages.map((msg) => ({\n role: msg.role as 'user' | 'assistant',\n content: msg.content ?? '',\n metadata: msg.tokenCount\n ? {\n tokenUsage: {\n inputTokens: 0,\n outputTokens: msg.tokenCount,\n totalTokens: msg.tokenCount,\n },\n model: msg.model,\n }\n : undefined,\n }));\n setMessages(formatted);\n setResponse('');\n }\n }, [sessionId, backendMessages]);\n\n const sendMessage = useCallback(\n async (content: string, attachments?: MessageAttachment[], sessionIdOverride?: string | null) => {\n if (!content.trim()) return;\n\n const effectiveSessionId = sessionIdOverride !== undefined ? sessionIdOverride : sessionId;\n\n const userMessage: ChatMessage = {\n role: 'user',\n content: content.trim(),\n attachments,\n };\n\n isSendingRef.current = true;\n setMessages((prev) => [...prev, userMessage]);\n setResponse('');\n setIsLoading(true);\n setIsStreaming(true);\n setError(null);\n\n abortRef.current = new AbortController();\n\n const chatMessages = [\n ...messages.map((m) => ({ role: m.role, content: m.content })),\n { role: 'user' as const, content: content.trim() },\n ];\n\n let doingChunkedReveal = false;\n try {\n const g = global as Record<string, unknown>;\n const preferNonStreaming =\n typeof g?.nativeCallSyncHook === 'function' || typeof g?.__fbBatchedBridge !== 'undefined';\n const result = await streamChatResponse(chatMessages, undefined, abortRef.current.signal, {\n preferNonStreaming,\n });\n const fullContent = result.content;\n\n if (preferNonStreaming && fullContent.length > 0) {\n doingChunkedReveal = true;\n if (revealIntervalRef.current) {\n clearInterval(revealIntervalRef.current);\n revealIntervalRef.current = null;\n }\n let revealedLen = 0;\n revealIntervalRef.current = setInterval(() => {\n revealedLen = Math.min(revealedLen + REVEAL_CHUNK_SIZE, fullContent.length);\n setResponse(fullContent.slice(0, revealedLen));\n if (revealedLen >= fullContent.length) {\n if (revealIntervalRef.current) {\n clearInterval(revealIntervalRef.current);\n revealIntervalRef.current = null;\n }\n const assistantMessage: ChatMessage = {\n role: 'assistant',\n content: fullContent,\n metadata: result.tokenUsage\n ? {\n tokenUsage: {\n inputTokens: result.tokenUsage.inputTokens,\n outputTokens: result.tokenUsage.outputTokens,\n totalTokens: result.tokenUsage.totalTokens,\n },\n }\n : undefined,\n };\n setMessages((prev) => [...prev, assistantMessage]);\n setResponse('');\n if (effectiveSessionId) {\n saveMessages({\n sessionId: effectiveSessionId,\n userMessage: {\n content: userMessage.content,\n attachments: userMessage.attachments?.map((a) => ({\n id: a.id,\n name: a.name,\n type: a.type,\n mimeType: a.mimeType,\n size: a.size,\n url: a.url,\n })),\n },\n assistantMessage: {\n content: fullContent,\n tokenCount: result.tokenUsage?.totalTokens,\n model: undefined,\n },\n }).catch((e) => console.error('[useChatStream] saveMessages:', e));\n }\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n abortRef.current = null;\n }\n }, REVEAL_INTERVAL_MS);\n return;\n }\n\n const assistantMessage: ChatMessage = {\n role: 'assistant',\n content: fullContent,\n metadata: result.tokenUsage\n ? {\n tokenUsage: {\n inputTokens: result.tokenUsage.inputTokens,\n outputTokens: result.tokenUsage.outputTokens,\n totalTokens: result.tokenUsage.totalTokens,\n },\n }\n : undefined,\n };\n\n setMessages((prev) => [...prev, assistantMessage]);\n setResponse('');\n\n if (effectiveSessionId) {\n await saveMessages({\n sessionId: effectiveSessionId,\n userMessage: {\n content: userMessage.content,\n attachments: userMessage.attachments?.map((a) => ({\n id: a.id,\n name: a.name,\n type: a.type,\n mimeType: a.mimeType,\n size: a.size,\n url: a.url,\n })),\n },\n assistantMessage: {\n content: fullContent,\n tokenCount: result.tokenUsage?.totalTokens,\n model: undefined,\n },\n });\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n if (msg.includes('abort')) return;\n setError(msg);\n setResponse('');\n } finally {\n if (!doingChunkedReveal) {\n isSendingRef.current = false;\n setIsLoading(false);\n setIsStreaming(false);\n abortRef.current = null;\n }\n }\n },\n [messages, sessionId, saveMessages],\n );\n\n const cancel = useCallback(() => {\n if (abortRef.current) {\n abortRef.current.abort();\n }\n }, []);\n\n const clearMessages = useCallback(() => {\n setMessages([]);\n setResponse('');\n setError(null);\n }, []);\n\n return {\n messages,\n response,\n error,\n isLoading,\n isStreaming,\n hasMessages: messages.length > 0 || !!response,\n sendMessage,\n cancel,\n clearMessages,\n };\n}\n"],"names":["_a","_b","assistantMessage"],"mappings":"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"}
|
package/lib/module.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import {Feature}from'@common-stack/client-react';import {filteredRoutes}from'./compute.js';var YantraMobileModule = new Feature({
|
|
2
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2
3
|
routeConfig: filteredRoutes
|
|
3
4
|
});export{YantraMobileModule as default};//# sourceMappingURL=module.js.map
|
package/lib/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sources":["../src/module.ts"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { Feature } from '@common-stack/client-react';\nimport { filteredRoutes } from './compute';\n\nexport default new Feature({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n routeConfig: filteredRoutes as any,\n});\n"],"names":[],"mappings":"2FAGA,yBAAe,IAAI,OAAQ,CAAA;AAAA,EAEzB,WAAa,EAAA;AACf,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"module.js","sources":["../src/module.ts"],"sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { Feature } from '@common-stack/client-react';\nimport { filteredRoutes } from './compute';\n\nexport default new Feature({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n routeConfig: filteredRoutes as any,\n});\n"],"names":[],"mappings":"2FAGA,yBAAe,IAAI,OAAQ,CAAA;AAAA;AAAA,EAEzB,WAAa,EAAA;AACf,CAAC,CAAA"}
|
|
@@ -56,8 +56,7 @@ function HomeScreenContent({
|
|
|
56
56
|
setActiveMode(mode);
|
|
57
57
|
}, []);
|
|
58
58
|
const handleSubmit = useCallback(async (attachments) => {
|
|
59
|
-
if (!canSubmit || isLoading || disabled)
|
|
60
|
-
return;
|
|
59
|
+
if (!canSubmit || isLoading || disabled) return;
|
|
61
60
|
const submission = {
|
|
62
61
|
mode: activeMode,
|
|
63
62
|
query: trimmedQuery,
|
|
@@ -104,8 +103,7 @@ function HomeScreenContent({
|
|
|
104
103
|
});
|
|
105
104
|
}, [navigation, handleNewChat]);
|
|
106
105
|
const handleSendMessage = useCallback(async (text) => {
|
|
107
|
-
if (!text.trim() || isLoading || disabled)
|
|
108
|
-
return;
|
|
106
|
+
if (!text.trim() || isLoading || disabled) return;
|
|
109
107
|
const submission = {
|
|
110
108
|
mode: activeMode,
|
|
111
109
|
query: text.trim()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HomeScreen.js","sources":["../../../src/screens/Home/HomeScreen.tsx"],"sourcesContent":["import React, { FC, useState, useCallback, useEffect } from 'react';\nimport { Pressable, StyleSheet } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Box, InputToolBar, Text, getDefaultLeftItems, getDefaultRightItems } from '@admin-layout/gluestack-ui-mobile';\nimport { SafeAreaView } from 'react-native-safe-area-context';\nimport { useGetAccountChatSessionsQuery } from 'common/graphql';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useNavigation } from '@react-navigation/native';\nimport { MessagesContainerUI } from '@messenger-box/platform-mobile';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { useChatStream } from '../../hooks/useChatStream';\nimport type { ModeSubmission, RoutingMode } from './types';\n\nexport type { RoutingMode, ModeSubmission };\n\nexport interface HomeScreenProps {\n initialMode?: RoutingMode;\n onSubmit?: (submission: ModeSubmission) => void;\n onStop?: () => void;\n isLoading?: boolean;\n disabled?: boolean;\n}\n\nfunction HomeScreenContent({\n initialMode = 'chat',\n onSubmit: onSubmitProp,\n onStop,\n isLoading: isLoadingProp = false,\n disabled = false,\n}: HomeScreenProps) {\n const navigation = useNavigation();\n const [value, setValue] = useState('');\n const [activeMode, setActiveMode] = useState<RoutingMode>(initialMode);\n const [activeSessionId, setActiveSessionId] = useState<string | null>(null);\n\n const { createSession } = useChatMutations();\n const chat = useChatStream(activeSessionId);\n\n useGetAccountChatSessionsQuery({\n variables: { first: 25, includeArchived: false },\n fetchPolicy: 'cache-first',\n });\n\n const {\n messages,\n response,\n error: chatError,\n isLoading: chatLoading,\n isStreaming,\n hasMessages,\n sendMessage,\n cancel,\n } = chat;\n\n const trimmedQuery = value.trim();\n const hasQuery = trimmedQuery.length > 0;\n const canSubmit = hasQuery;\n const isLoading = isLoadingProp || chatLoading;\n const isResearchMode = activeMode === 'deep-search';\n const inputPlaceholder = isResearchMode ? 'Research anything...' : 'Ask anything...';\n\n // useEffect(() => {\n // navigation.setOptions({\n // headerLeft: () => null,\n // });\n // }, []);\n\n const handleModeSwitch = useCallback((mode: RoutingMode) => {\n setActiveMode(mode);\n }, []);\n\n const handleSubmit = useCallback(\n async (attachments?: ModeSubmission['attachments']) => {\n if (!canSubmit || isLoading || disabled) return;\n\n const submission: ModeSubmission = {\n mode: activeMode,\n query: trimmedQuery,\n attachments,\n };\n\n // Research (deep-search): delegate to parent when provided, like browser NewChatPage → session page\n if (activeMode === 'deep-search' && onSubmitProp) {\n onSubmitProp(submission);\n setValue('');\n return;\n }\n\n if (onSubmitProp && activeMode === 'chat') {\n onSubmitProp(submission);\n setValue('');\n return;\n }\n\n if (!activeSessionId) {\n const newSessionId = uuidv4();\n const title = activeMode === 'deep-search' ? 'Deep Search' : 'New Chat';\n try {\n await createSession({ id: newSessionId, title });\n setActiveSessionId(newSessionId);\n setValue('');\n sendMessage(trimmedQuery, undefined, newSessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create session:', err);\n }\n } else {\n setValue('');\n sendMessage(trimmedQuery);\n }\n },\n [\n canSubmit,\n isLoading,\n disabled,\n activeMode,\n trimmedQuery,\n activeSessionId,\n onSubmitProp,\n createSession,\n sendMessage,\n ],\n );\n\n const handleNewChat = useCallback(() => {\n setActiveSessionId(null);\n setValue('');\n }, []);\n\n useEffect(() => {\n navigation.setOptions({\n headerRight: () => (\n <Pressable\n onPress={handleNewChat}\n style={({ pressed }) => [styles.newChatButton, pressed && styles.newChatButtonPressed]}\n accessibilityLabel=\"New chat\"\n >\n <MaterialCommunityIcons name=\"chat-plus-outline\" size={26} color=\"#000\" />\n </Pressable>\n ),\n });\n }, [navigation, handleNewChat]);\n\n const handleSendMessage = useCallback(\n async (text: string) => {\n if (!text.trim() || isLoading || disabled) return;\n const submission: ModeSubmission = { mode: activeMode, query: text.trim() };\n if (activeMode === 'deep-search' && onSubmitProp) {\n onSubmitProp(submission);\n return;\n }\n if (!activeSessionId) {\n const newSessionId = uuidv4();\n const title = activeMode === 'deep-search' ? 'Deep Search' : 'New Chat';\n try {\n await createSession({ id: newSessionId, title });\n setActiveSessionId(newSessionId);\n sendMessage(text.trim(), undefined, newSessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create session:', err);\n }\n } else {\n sendMessage(text.trim());\n }\n },\n [isLoading, disabled, activeSessionId, activeMode, onSubmitProp, createSession, sendMessage],\n );\n\n const leftItems = getDefaultLeftItems({\n search: {\n active: activeMode === 'chat',\n onClick: () => handleModeSwitch('chat'),\n },\n zap: {\n active: activeMode === 'deep-search',\n onClick: () => handleModeSwitch('deep-search'),\n },\n lightbulb: { enabled: false },\n });\n\n const rightItems = getDefaultRightItems({\n tag: { enabled: false },\n chip: { enabled: false },\n camera: { onClick: () => console.log('camera') },\n image: { onClick: () => console.log('image') },\n attach: { onClick: () => console.log('attach') },\n });\n\n return (\n <SafeAreaView style={{ flex: 1, backgroundColor: '#fff' }}>\n <Box flex={1} width=\"100%\">\n {chatError && (\n <Box mb=\"$2\" mx=\"$4\" p=\"$3\" bg=\"$gray200\" borderRadius=\"$md\">\n <Text fontSize=\"$sm\" color=\"$gray900\">\n {chatError}\n </Text>\n </Box>\n )}\n {hasMessages || response ? (\n <Box flex={1} width=\"100%\" alignSelf=\"stretch\">\n <MessagesContainerUI\n mode=\"plan\"\n showBackButton={false}\n onBackPress={handleNewChat}\n compactTop={true}\n messagesContainerStyle={{ paddingHorizontal: 0, paddingTop: 0, margin: 0 }}\n listContentStyle={{ paddingTop: 0, margin: 0 }}\n messages={messages.map((msg, index) => ({\n id: `msg-${index}-${msg.role}`,\n role: msg.role,\n content: msg.content,\n metadata: msg.metadata,\n }))}\n streamingContent={response}\n currentUser={{ id: 'user' }}\n onSend={handleSendMessage}\n disabled={isLoading || disabled}\n isLoading={isLoading}\n onStop={isStreaming ? cancel : onStop}\n renderPlanInputToolbar={({ value, onChange, onSend, disabled: inputDisabled }) => (\n <InputToolBar\n inputConfig={{\n value,\n onChange: (e) => onChange(e.nativeEvent.text),\n placeholder: inputPlaceholder,\n disabled: inputDisabled,\n }}\n leftItems={leftItems}\n rightItems={rightItems}\n templateButton={null}\n templateModalConfig={null}\n micSendButton={{\n hasContent: value.trim().length > 0,\n onSend: () => onSend(value.trim()),\n onMic: () => console.log('mic'),\n disabled: inputDisabled,\n isLoading,\n onStop: isStreaming ? cancel : onStop,\n }}\n />\n )}\n renderBuildInputToolbar={() => null}\n />\n </Box>\n ) : (\n <Box flex={1} justifyContent=\"center\" alignItems=\"stretch\" p=\"$4\">\n <InputToolBar\n inputConfig={{\n value,\n onChange: (e) => setValue(e.nativeEvent.text),\n placeholder: inputPlaceholder,\n disabled: isLoading || disabled,\n }}\n leftItems={leftItems}\n rightItems={rightItems}\n templateButton={null}\n templateModalConfig={null}\n micSendButton={{\n hasContent: canSubmit,\n onSend: () => handleSubmit(),\n onMic: () => console.log('mic'),\n disabled: isLoading || disabled,\n isLoading,\n onStop,\n }}\n />\n </Box>\n )}\n </Box>\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n newChatButton: {\n padding: 6,\n marginRight: 4,\n alignItems: 'center',\n justifyContent: 'center',\n },\n newChatButtonPressed: {\n opacity: 0.6,\n },\n});\n\nconst HomeScreen: FC<HomeScreenProps> = (props) => <HomeScreenContent {...props} />;\n\nexport default HomeScreen;\n"],"names":["uuidv4","value"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HomeScreen.js","sources":["../../../src/screens/Home/HomeScreen.tsx"],"sourcesContent":["import React, { FC, useState, useCallback, useEffect } from 'react';\nimport { Pressable, StyleSheet } from 'react-native';\nimport { MaterialCommunityIcons } from '@expo/vector-icons';\nimport { Box, InputToolBar, Text, getDefaultLeftItems, getDefaultRightItems } from '@admin-layout/gluestack-ui-mobile';\nimport { SafeAreaView } from 'react-native-safe-area-context';\nimport { useGetAccountChatSessionsQuery } from 'common/graphql';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useNavigation } from '@react-navigation/native';\nimport { MessagesContainerUI } from '@messenger-box/platform-mobile';\nimport { useChatMutations } from '../../hooks/useChatApi';\nimport { useChatStream } from '../../hooks/useChatStream';\nimport type { ModeSubmission, RoutingMode } from './types';\n\nexport type { RoutingMode, ModeSubmission };\n\nexport interface HomeScreenProps {\n initialMode?: RoutingMode;\n onSubmit?: (submission: ModeSubmission) => void;\n onStop?: () => void;\n isLoading?: boolean;\n disabled?: boolean;\n}\n\nfunction HomeScreenContent({\n initialMode = 'chat',\n onSubmit: onSubmitProp,\n onStop,\n isLoading: isLoadingProp = false,\n disabled = false,\n}: HomeScreenProps) {\n const navigation = useNavigation();\n const [value, setValue] = useState('');\n const [activeMode, setActiveMode] = useState<RoutingMode>(initialMode);\n const [activeSessionId, setActiveSessionId] = useState<string | null>(null);\n\n const { createSession } = useChatMutations();\n const chat = useChatStream(activeSessionId);\n\n useGetAccountChatSessionsQuery({\n variables: { first: 25, includeArchived: false },\n fetchPolicy: 'cache-first',\n });\n\n const {\n messages,\n response,\n error: chatError,\n isLoading: chatLoading,\n isStreaming,\n hasMessages,\n sendMessage,\n cancel,\n } = chat;\n\n const trimmedQuery = value.trim();\n const hasQuery = trimmedQuery.length > 0;\n const canSubmit = hasQuery;\n const isLoading = isLoadingProp || chatLoading;\n const isResearchMode = activeMode === 'deep-search';\n const inputPlaceholder = isResearchMode ? 'Research anything...' : 'Ask anything...';\n\n // useEffect(() => {\n // navigation.setOptions({\n // headerLeft: () => null,\n // });\n // }, []);\n\n const handleModeSwitch = useCallback((mode: RoutingMode) => {\n setActiveMode(mode);\n }, []);\n\n const handleSubmit = useCallback(\n async (attachments?: ModeSubmission['attachments']) => {\n if (!canSubmit || isLoading || disabled) return;\n\n const submission: ModeSubmission = {\n mode: activeMode,\n query: trimmedQuery,\n attachments,\n };\n\n // Research (deep-search): delegate to parent when provided, like browser NewChatPage → session page\n if (activeMode === 'deep-search' && onSubmitProp) {\n onSubmitProp(submission);\n setValue('');\n return;\n }\n\n if (onSubmitProp && activeMode === 'chat') {\n onSubmitProp(submission);\n setValue('');\n return;\n }\n\n if (!activeSessionId) {\n const newSessionId = uuidv4();\n const title = activeMode === 'deep-search' ? 'Deep Search' : 'New Chat';\n try {\n await createSession({ id: newSessionId, title });\n setActiveSessionId(newSessionId);\n setValue('');\n sendMessage(trimmedQuery, undefined, newSessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create session:', err);\n }\n } else {\n setValue('');\n sendMessage(trimmedQuery);\n }\n },\n [\n canSubmit,\n isLoading,\n disabled,\n activeMode,\n trimmedQuery,\n activeSessionId,\n onSubmitProp,\n createSession,\n sendMessage,\n ],\n );\n\n const handleNewChat = useCallback(() => {\n setActiveSessionId(null);\n setValue('');\n }, []);\n\n useEffect(() => {\n navigation.setOptions({\n headerRight: () => (\n <Pressable\n onPress={handleNewChat}\n style={({ pressed }) => [styles.newChatButton, pressed && styles.newChatButtonPressed]}\n accessibilityLabel=\"New chat\"\n >\n <MaterialCommunityIcons name=\"chat-plus-outline\" size={26} color=\"#000\" />\n </Pressable>\n ),\n });\n }, [navigation, handleNewChat]);\n\n const handleSendMessage = useCallback(\n async (text: string) => {\n if (!text.trim() || isLoading || disabled) return;\n const submission: ModeSubmission = { mode: activeMode, query: text.trim() };\n if (activeMode === 'deep-search' && onSubmitProp) {\n onSubmitProp(submission);\n return;\n }\n if (!activeSessionId) {\n const newSessionId = uuidv4();\n const title = activeMode === 'deep-search' ? 'Deep Search' : 'New Chat';\n try {\n await createSession({ id: newSessionId, title });\n setActiveSessionId(newSessionId);\n sendMessage(text.trim(), undefined, newSessionId);\n } catch (err) {\n console.error('[HomeScreen] Failed to create session:', err);\n }\n } else {\n sendMessage(text.trim());\n }\n },\n [isLoading, disabled, activeSessionId, activeMode, onSubmitProp, createSession, sendMessage],\n );\n\n const leftItems = getDefaultLeftItems({\n search: {\n active: activeMode === 'chat',\n onClick: () => handleModeSwitch('chat'),\n },\n zap: {\n active: activeMode === 'deep-search',\n onClick: () => handleModeSwitch('deep-search'),\n },\n lightbulb: { enabled: false },\n });\n\n const rightItems = getDefaultRightItems({\n tag: { enabled: false },\n chip: { enabled: false },\n camera: { onClick: () => console.log('camera') },\n image: { onClick: () => console.log('image') },\n attach: { onClick: () => console.log('attach') },\n });\n\n return (\n <SafeAreaView style={{ flex: 1, backgroundColor: '#fff' }}>\n <Box flex={1} width=\"100%\">\n {chatError && (\n <Box mb=\"$2\" mx=\"$4\" p=\"$3\" bg=\"$gray200\" borderRadius=\"$md\">\n <Text fontSize=\"$sm\" color=\"$gray900\">\n {chatError}\n </Text>\n </Box>\n )}\n {hasMessages || response ? (\n <Box flex={1} width=\"100%\" alignSelf=\"stretch\">\n <MessagesContainerUI\n mode=\"plan\"\n showBackButton={false}\n onBackPress={handleNewChat}\n compactTop={true}\n messagesContainerStyle={{ paddingHorizontal: 0, paddingTop: 0, margin: 0 }}\n listContentStyle={{ paddingTop: 0, margin: 0 }}\n messages={messages.map((msg, index) => ({\n id: `msg-${index}-${msg.role}`,\n role: msg.role,\n content: msg.content,\n metadata: msg.metadata,\n }))}\n streamingContent={response}\n currentUser={{ id: 'user' }}\n onSend={handleSendMessage}\n disabled={isLoading || disabled}\n isLoading={isLoading}\n onStop={isStreaming ? cancel : onStop}\n renderPlanInputToolbar={({ value, onChange, onSend, disabled: inputDisabled }) => (\n <InputToolBar\n inputConfig={{\n value,\n onChange: (e) => onChange(e.nativeEvent.text),\n placeholder: inputPlaceholder,\n disabled: inputDisabled,\n }}\n leftItems={leftItems}\n rightItems={rightItems}\n templateButton={null}\n templateModalConfig={null}\n micSendButton={{\n hasContent: value.trim().length > 0,\n onSend: () => onSend(value.trim()),\n onMic: () => console.log('mic'),\n disabled: inputDisabled,\n isLoading,\n onStop: isStreaming ? cancel : onStop,\n }}\n />\n )}\n renderBuildInputToolbar={() => null}\n />\n </Box>\n ) : (\n <Box flex={1} justifyContent=\"center\" alignItems=\"stretch\" p=\"$4\">\n <InputToolBar\n inputConfig={{\n value,\n onChange: (e) => setValue(e.nativeEvent.text),\n placeholder: inputPlaceholder,\n disabled: isLoading || disabled,\n }}\n leftItems={leftItems}\n rightItems={rightItems}\n templateButton={null}\n templateModalConfig={null}\n micSendButton={{\n hasContent: canSubmit,\n onSend: () => handleSubmit(),\n onMic: () => console.log('mic'),\n disabled: isLoading || disabled,\n isLoading,\n onStop,\n }}\n />\n </Box>\n )}\n </Box>\n </SafeAreaView>\n );\n}\n\nconst styles = StyleSheet.create({\n newChatButton: {\n padding: 6,\n marginRight: 4,\n alignItems: 'center',\n justifyContent: 'center',\n },\n newChatButtonPressed: {\n opacity: 0.6,\n },\n});\n\nconst HomeScreen: FC<HomeScreenProps> = (props) => <HomeScreenContent {...props} />;\n\nexport default HomeScreen;\n"],"names":["uuidv4","value"],"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.
|
|
3
|
+
"version": "12.0.22",
|
|
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.
|
|
28
|
+
"common": "^12.0.22"
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {
|
|
31
31
|
"@admin-layout/gluestack-ui-mobile": "*",
|
|
@@ -45,5 +45,5 @@
|
|
|
45
45
|
"typescript": {
|
|
46
46
|
"definition": "lib/index.d.ts"
|
|
47
47
|
},
|
|
48
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "eeec9f6adea91cf8f1827628c932ba0e0a79d2fe"
|
|
49
49
|
}
|