@wix/legends-platform-sdk 1.35.0 → 1.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -1
- package/dist/cjs/components/LegendsPlatform/LegendsPlatform.js +10 -7
- package/dist/cjs/components/LegendsPlatform/LegendsPlatform.js.map +1 -1
- package/dist/cjs/components/LegendsPlatformCore/LegendsPlatformCore.js +73 -0
- package/dist/cjs/components/LegendsPlatformCore/LegendsPlatformCore.js.map +1 -0
- package/dist/cjs/components/LegendsPlatformCore/index.js +10 -0
- package/dist/cjs/components/LegendsPlatformCore/index.js.map +1 -0
- package/dist/cjs/hooks/useTextChat/streamChatMessage.js +3 -1
- package/dist/cjs/hooks/useTextChat/streamChatMessage.js.map +1 -1
- package/dist/cjs/hooks/useTextChat/useTextChat.js +3 -2
- package/dist/cjs/hooks/useTextChat/useTextChat.js.map +1 -1
- package/dist/cjs/hooks/useTextChat/useTextChatStream.js +3 -1
- package/dist/cjs/hooks/useTextChat/useTextChatStream.js.map +1 -1
- package/dist/cjs/hooks/useTextChat/useToolAwareSend.js +5 -3
- package/dist/cjs/hooks/useTextChat/useToolAwareSend.js.map +1 -1
- package/dist/cjs/sdk.js +7 -1
- package/dist/cjs/sdk.js.map +1 -1
- package/dist/cjs/services/BearerPersonaChatService.js +191 -0
- package/dist/cjs/services/BearerPersonaChatService.js.map +1 -0
- package/dist/cjs/services/FetchPersonaChatService.js +15 -5
- package/dist/cjs/services/FetchPersonaChatService.js.map +1 -1
- package/dist/cjs/types/service.js.map +1 -1
- package/dist/esm/components/LegendsPlatform/LegendsPlatform.js +5 -2
- package/dist/esm/components/LegendsPlatform/LegendsPlatform.js.map +1 -1
- package/dist/esm/components/LegendsPlatformCore/LegendsPlatformCore.js +40 -0
- package/dist/esm/components/LegendsPlatformCore/LegendsPlatformCore.js.map +1 -0
- package/dist/esm/components/LegendsPlatformCore/index.js +2 -0
- package/dist/esm/components/LegendsPlatformCore/index.js.map +1 -0
- package/dist/esm/hooks/useTextChat/streamChatMessage.js +3 -1
- package/dist/esm/hooks/useTextChat/streamChatMessage.js.map +1 -1
- package/dist/esm/hooks/useTextChat/useTextChat.js +3 -2
- package/dist/esm/hooks/useTextChat/useTextChat.js.map +1 -1
- package/dist/esm/hooks/useTextChat/useTextChatStream.js +3 -1
- package/dist/esm/hooks/useTextChat/useTextChatStream.js.map +1 -1
- package/dist/esm/hooks/useTextChat/useToolAwareSend.js +5 -3
- package/dist/esm/hooks/useTextChat/useToolAwareSend.js.map +1 -1
- package/dist/esm/sdk.js +2 -0
- package/dist/esm/sdk.js.map +1 -1
- package/dist/esm/services/BearerPersonaChatService.js +181 -0
- package/dist/esm/services/BearerPersonaChatService.js.map +1 -0
- package/dist/esm/services/FetchPersonaChatService.js +17 -4
- package/dist/esm/services/FetchPersonaChatService.js.map +1 -1
- package/dist/esm/types/service.js.map +1 -1
- package/dist/types/components/LegendsPlatform/LegendsPlatform.d.ts +3 -0
- package/dist/types/components/LegendsPlatform/LegendsPlatform.d.ts.map +1 -1
- package/dist/types/components/LegendsPlatformCore/LegendsPlatformCore.d.ts +23 -0
- package/dist/types/components/LegendsPlatformCore/LegendsPlatformCore.d.ts.map +1 -0
- package/dist/types/components/LegendsPlatformCore/index.d.ts +2 -0
- package/dist/types/components/LegendsPlatformCore/index.d.ts.map +1 -0
- package/dist/types/hooks/useTextChat/streamChatMessage.d.ts +1 -0
- package/dist/types/hooks/useTextChat/streamChatMessage.d.ts.map +1 -1
- package/dist/types/hooks/useTextChat/useTextChat.d.ts +2 -0
- package/dist/types/hooks/useTextChat/useTextChat.d.ts.map +1 -1
- package/dist/types/hooks/useTextChat/useTextChatStream.d.ts +1 -0
- package/dist/types/hooks/useTextChat/useTextChatStream.d.ts.map +1 -1
- package/dist/types/hooks/useTextChat/useToolAwareSend.d.ts +1 -1
- package/dist/types/hooks/useTextChat/useToolAwareSend.d.ts.map +1 -1
- package/dist/types/sdk.d.ts +4 -0
- package/dist/types/sdk.d.ts.map +1 -1
- package/dist/types/services/BearerPersonaChatService.d.ts +37 -0
- package/dist/types/services/BearerPersonaChatService.d.ts.map +1 -0
- package/dist/types/services/FetchPersonaChatService.d.ts +11 -1
- package/dist/types/services/FetchPersonaChatService.d.ts.map +1 -1
- package/dist/types/types/service.d.ts +2 -0
- package/dist/types/types/service.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useInfiniteQuery","useSdkConsumer","usePendingMessages","useToolAwareSend","useTextChat","options","_options","_options$limit","limit","conversationLanguage","_useSdkConsumer","chatId","namespace","personaChatService","send","pending","_useInfiniteQuery","queryKey","queryFn","_ref","pageParam","messages","nextCursor","undefined","queryChatMessages","cursor","getNextPageParam","lastPage","initialPageParam","select","data","pages","flatMap","page","_useInfiniteQuery$dat","status","fetchNextPage","refetch","fetchNext","sendMessage","message"],"sources":["../../../../src/hooks/useTextChat/useTextChat.ts"],"sourcesContent":["import { useInfiniteQuery } from '@tanstack/react-query';\nimport type {\n ChatMessage,\n ChatMessageAttachment,\n SendMessageMetadata,\n} from '../../types';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { usePendingMessages } from './usePendingMessages';\nimport { useToolAwareSend } from './useToolAwareSend';\n\ninterface UseTextChatOptions {\n limit?: number;\n /** Language or locale for the persona's text reply, e.g. es or en-GB. Omit to keep the default behavior. */\n conversationLanguage?: string;\n}\n\nexport function useTextChat(options: UseTextChatOptions = {}) {\n const { limit = 100, conversationLanguage } = options;\n\n const { chatId, namespace, personaChatService } = useSdkConsumer();\n\n const send = useToolAwareSend(chatId
|
|
1
|
+
{"version":3,"names":["useInfiniteQuery","useSdkConsumer","usePendingMessages","useToolAwareSend","useTextChat","options","_options","_options$limit","limit","conversationLanguage","includeCitations","_useSdkConsumer","chatId","namespace","personaChatService","send","pending","_useInfiniteQuery","queryKey","queryFn","_ref","pageParam","messages","nextCursor","undefined","queryChatMessages","cursor","getNextPageParam","lastPage","initialPageParam","select","data","pages","flatMap","page","_useInfiniteQuery$dat","status","fetchNextPage","refetch","fetchNext","sendMessage","message"],"sources":["../../../../src/hooks/useTextChat/useTextChat.ts"],"sourcesContent":["import { useInfiniteQuery } from '@tanstack/react-query';\nimport type {\n ChatMessage,\n ChatMessageAttachment,\n SendMessageMetadata,\n} from '../../types';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { usePendingMessages } from './usePendingMessages';\nimport { useToolAwareSend } from './useToolAwareSend';\n\ninterface UseTextChatOptions {\n limit?: number;\n /** Language or locale for the persona's text reply, e.g. es or en-GB. Omit to keep the default behavior. */\n conversationLanguage?: string;\n /** Asks the backend for the Knowledge sources behind each answer. Honoured only in PREVIEW chats. */\n includeCitations?: boolean;\n}\n\nexport function useTextChat(options: UseTextChatOptions = {}) {\n const { limit = 100, conversationLanguage, includeCitations } = options;\n\n const { chatId, namespace, personaChatService } = useSdkConsumer();\n\n const send = useToolAwareSend(\n chatId,\n namespace,\n conversationLanguage,\n includeCitations,\n );\n const pending = usePendingMessages();\n\n const {\n data: messages = [],\n status,\n fetchNextPage,\n refetch,\n } = useInfiniteQuery({\n queryKey: ['chat-messages', chatId, namespace],\n queryFn: async ({ pageParam }: { pageParam?: string }) => {\n if (!personaChatService) {\n return { messages: [], nextCursor: undefined };\n }\n return personaChatService.queryChatMessages({\n chatId,\n namespace,\n limit,\n cursor: pageParam,\n });\n },\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n initialPageParam: undefined as string | undefined,\n select: (data) =>\n data.pages.flatMap((page) => page.messages as ChatMessage[]),\n });\n\n return {\n status,\n pending,\n messages,\n fetchNext,\n refetch,\n send: sendMessage,\n };\n\n function sendMessage(message: {\n message?: string;\n chatConfig?: object;\n attachments?: ChatMessageAttachment[];\n metadata?: SendMessageMetadata;\n }) {\n return send(message);\n }\n\n function fetchNext() {\n void fetchNextPage();\n }\n}\n"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,uBAAuB;AAMxD,SAASC,cAAc,QAAQ,oBAAoB;AACnD,SAASC,kBAAkB,QAAQ,sBAAsB;AACzD,SAASC,gBAAgB,QAAQ,oBAAoB;AAUrD,OAAO,SAASC,WAAWA,CAACC,OAA2B,EAAO;EAAA,IAAlCA,OAA2B;IAA3BA,OAA2B,GAAG,CAAC,CAAC;EAAA;EAC1D,MAAAC,QAAA,GAAgED,OAAO;IAAAE,cAAA,GAAAD,QAAA,CAA/DE,KAAK;IAALA,KAAK,GAAAD,cAAA,cAAG,GAAG,GAAAA,cAAA;IAAEE,oBAAoB,GAAAH,QAAA,CAApBG,oBAAoB;IAAEC,gBAAgB,GAAAJ,QAAA,CAAhBI,gBAAgB;EAE3D,MAAAC,eAAA,GAAkDV,cAAc,CAAC,CAAC;IAA1DW,MAAM,GAAAD,eAAA,CAANC,MAAM;IAAEC,SAAS,GAAAF,eAAA,CAATE,SAAS;IAAEC,kBAAkB,GAAAH,eAAA,CAAlBG,kBAAkB;EAE7C,MAAMC,IAAI,GAAGZ,gBAAgB,CAC3BS,MAAM,EACNC,SAAS,EACTJ,oBAAoB,EACpBC,gBACF,CAAC;EACD,MAAMM,OAAO,GAAGd,kBAAkB,CAAC,CAAC;EAEpC,MAAAe,iBAAA,GAKIjB,gBAAgB,CAAC;MACnBkB,QAAQ,EAAE,CAAC,eAAe,EAAEN,MAAM,EAAEC,SAAS,CAAC;MAC9CM,OAAO,EAAE,MAAAC,IAAA,IAAiD;QAAA,IAAxCC,SAAS,GAAAD,IAAA,CAATC,SAAS;QACzB,IAAI,CAACP,kBAAkB,EAAE;UACvB,OAAO;YAAEQ,QAAQ,EAAE,EAAE;YAAEC,UAAU,EAAEC;UAAU,CAAC;QAChD;QACA,OAAOV,kBAAkB,CAACW,iBAAiB,CAAC;UAC1Cb,MAAM;UACNC,SAAS;UACTL,KAAK;UACLkB,MAAM,EAAEL;QACV,CAAC,CAAC;MACJ,CAAC;MACDM,gBAAgB,EAAGC,QAAQ,IAAKA,QAAQ,CAACL,UAAU;MACnDM,gBAAgB,EAAEL,SAA+B;MACjDM,MAAM,EAAGC,IAAI,IACXA,IAAI,CAACC,KAAK,CAACC,OAAO,CAAEC,IAAI,IAAKA,IAAI,CAACZ,QAAyB;IAC/D,CAAC,CAAC;IAAAa,qBAAA,GAAAlB,iBAAA,CArBAc,IAAI;IAAET,QAAQ,GAAAa,qBAAA,cAAG,EAAE,GAAAA,qBAAA;IACnBC,MAAM,GAAAnB,iBAAA,CAANmB,MAAM;IACNC,aAAa,GAAApB,iBAAA,CAAboB,aAAa;IACbC,OAAO,GAAArB,iBAAA,CAAPqB,OAAO;EAoBT,OAAO;IACLF,MAAM;IACNpB,OAAO;IACPM,QAAQ;IACRiB,SAAS;IACTD,OAAO;IACPvB,IAAI,EAAEyB;EACR,CAAC;EAED,SAASA,WAAWA,CAACC,OAKpB,EAAE;IACD,OAAO1B,IAAI,CAAC0B,OAAO,CAAC;EACtB;EAEA,SAASF,SAASA,CAAA,EAAG;IACnB,KAAKF,aAAa,CAAC,CAAC;EACtB;AACF","ignoreList":[]}
|
|
@@ -37,6 +37,7 @@ export function useTextChatStream(options) {
|
|
|
37
37
|
limit = _options$limit === void 0 ? 50 : _options$limit,
|
|
38
38
|
headers = _options.headers,
|
|
39
39
|
conversationLanguage = _options.conversationLanguage,
|
|
40
|
+
includeCitations = _options.includeCitations,
|
|
40
41
|
onError = _options.onError,
|
|
41
42
|
_options$revealMsPerC = _options.revealMsPerChar,
|
|
42
43
|
revealMsPerChar = _options$revealMsPerC === void 0 ? 16 : _options$revealMsPerC;
|
|
@@ -194,6 +195,7 @@ export function useTextChatStream(options) {
|
|
|
194
195
|
attachments,
|
|
195
196
|
metadata,
|
|
196
197
|
conversationLanguage,
|
|
198
|
+
includeCitations,
|
|
197
199
|
headers
|
|
198
200
|
}, {
|
|
199
201
|
onChunk: token => {
|
|
@@ -219,7 +221,7 @@ export function useTextChatStream(options) {
|
|
|
219
221
|
aborted: !streamDone && !errored,
|
|
220
222
|
canSendChatMessage
|
|
221
223
|
};
|
|
222
|
-
}, [chatId, namespace, headers, conversationLanguage, onError, refetch, revealMsPerChar, stopRaf]);
|
|
224
|
+
}, [chatId, namespace, headers, conversationLanguage, includeCitations, onError, refetch, revealMsPerChar, stopRaf]);
|
|
223
225
|
return {
|
|
224
226
|
status,
|
|
225
227
|
pending: [],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useCallback","useEffect","useMemo","useRef","useState","useInfiniteQuery","useSdkConsumer","streamChatMessage","messageKey","m","role","content","trim","useTextChatStream","options","_options","_options$limit","limit","headers","conversationLanguage","onError","_options$revealMsPerC","revealMsPerChar","_useSdkConsumer","chatId","namespace","personaChatService","_useInfiniteQuery","queryKey","queryFn","_ref","pageParam","messages","nextCursor","undefined","queryChatMessages","cursor","getNextPageParam","lastPage","initialPageParam","select","data","pages","flatMap","page","_useInfiniteQuery$dat","sdkMessages","status","fetchNextPage","refetch","_useState","streamingMessages","setStreamingMessages","_useState2","completedMessages","setCompletedMessages","abortRef","rafRef","lastConfirmedRef","sendSeqRef","stopRaf","current","cancelAnimationFrame","_abortRef$current","abort","converted","reverse","confirmedMessages","length","completedKeys","Set","map","confirmedShown","filter","has","chronological","send","_ref2","_abortRef$current2","message","chatConfig","attachments","metadata","controller","AbortController","seq","userMsgId","Date","now","assistantMsgId","optimisticUserMsg","id","streamingAssistantMsg","streamStatus","streamingText","accumulated","revealedLen","streamDone","carry","lastFrameTime","receivedContent","errored","canSendChatMessage","settle","finalAssistantMsg","prev","frame","elapsedMs","step","Math","floor","min","slice","requestAnimationFrame","startRaf","onChunk","token","onDone","err","onCanSendChatMessage","canSend","signal","ok","producedContent","aborted","pending","fetchNext"],"sources":["../../../../src/hooks/useTextChat/useTextChatStream.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport type { ChatMessage, ChatMessageAttachment } from '../../types';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { streamChatMessage } from './streamChatMessage';\n\nexport type {\n StreamCallbacks,\n StreamChatMessageParams,\n} from './streamChatMessage';\n\n/**\n * A platform `ChatMessage` augmented with streaming metadata. The host renderer\n * uses `streamStatus`/`streamingText` to drive its typewriter; confirmed\n * (non-streamed) messages carry neither.\n */\nexport type StreamingChatMessage = ChatMessage & {\n streamingText?: string;\n streamStatus?: 'streaming' | 'settled';\n};\n\nexport interface UseTextChatStreamOptions {\n limit?: number;\n // Extra headers forwarded on every stream request — e.g. an `x-xsrf-token`\n // for the CSRF-protected persona-chat gateway.\n headers?: Record<string, string>;\n // Language or locale for the persona's text reply, e.g. es or en-GB.\n // Omit to keep the default behavior.\n conversationLanguage?: string;\n // Stream failures surfaced to the host (e.g. report to Sentry + toast).\n onError?: (err: Error) => void;\n // Milliseconds per character for the requestAnimationFrame reveal drip.\n // Default 16 (~62 chars/s).\n revealMsPerChar?: number;\n}\n\nexport interface SendStreamMessageParams {\n message: string;\n chatConfig?: object;\n attachments?: ChatMessageAttachment[];\n metadata?: object;\n}\n\n/**\n * Per-send outcome resolved by `send`. Reported at the transport level,\n * independent of the rAF reveal state — so a consumer can implement a\n * race-free, reveal-independent safe fallback.\n */\nexport type StreamSendResult = {\n ok: boolean; // stream completed successfully (reached onDone)\n producedContent: boolean; // at least one content chunk was received\n aborted: boolean; // the send was superseded/cancelled — not a real failure\n canSendChatMessage?: boolean; // set only when a frame reported it\n};\n\nconst messageKey = (m: StreamingChatMessage) =>\n `${m.role}::${(m.content ?? '').trim()}`;\n\n/**\n * Streaming counterpart to `useTextChat`. Sends a message over the SSE transport\n * and drips the accumulated reply into `streamingText` at a steady, time-paced\n * rate via requestAnimationFrame.\n *\n * Uses the same React Query key as `useTextChat` so mounting both hooks\n * does not double-fetch the message history.\n *\n * NOTE: uses `credentials: 'include'` + XSRF cookie auth — intended for\n * Wix-internal consumers where the persona-chat gateway is same-origin.\n */\nexport function useTextChatStream(options: UseTextChatStreamOptions = {}) {\n const {\n limit = 50,\n headers,\n conversationLanguage,\n onError,\n revealMsPerChar = 16,\n } = options;\n\n const { chatId, namespace, personaChatService } = useSdkConsumer();\n\n // Same query key as useTextChat — dedupes the history fetch when both are mounted.\n const {\n data: sdkMessages = [],\n status,\n fetchNextPage,\n refetch,\n } = useInfiniteQuery({\n queryKey: ['chat-messages', chatId, namespace],\n queryFn: async ({ pageParam }: { pageParam?: string }) => {\n if (!personaChatService) {\n return { messages: [], nextCursor: undefined };\n }\n return personaChatService.queryChatMessages({\n chatId,\n namespace,\n limit,\n cursor: pageParam,\n });\n },\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n initialPageParam: undefined as string | undefined,\n select: (data) =>\n data.pages.flatMap((page) => page.messages as ChatMessage[]),\n });\n\n const [streamingMessages, setStreamingMessages] = useState<\n StreamingChatMessage[]\n >([]);\n const [completedMessages, setCompletedMessages] = useState<\n StreamingChatMessage[]\n >([]);\n const abortRef = useRef<AbortController | null>(null);\n const rafRef = useRef<number | null>(null);\n const lastConfirmedRef = useRef<StreamingChatMessage[]>([]);\n const sendSeqRef = useRef(0);\n\n const stopRaf = useCallback(() => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n }, []);\n\n useEffect(() => {\n return () => {\n abortRef.current?.abort();\n stopRaf();\n };\n }, [stopRaf]);\n\n const messages = useMemo<StreamingChatMessage[]>(() => {\n const converted = [...sdkMessages].reverse() as StreamingChatMessage[];\n const confirmedMessages =\n converted.length > 0 ? converted : lastConfirmedRef.current;\n\n const completedKeys = new Set(completedMessages.map(messageKey));\n const confirmedShown = confirmedMessages.filter(\n (m) => !completedKeys.has(messageKey(m)),\n );\n const chronological = [\n ...confirmedShown,\n ...completedMessages,\n ...streamingMessages,\n ];\n return chronological.reverse();\n }, [sdkMessages, streamingMessages, completedMessages]);\n\n useEffect(() => {\n const converted = [...sdkMessages].reverse() as StreamingChatMessage[];\n if (converted.length > 0) {\n lastConfirmedRef.current = converted;\n }\n }, [sdkMessages]);\n\n const send = useCallback(\n async ({\n message,\n chatConfig,\n attachments,\n metadata,\n }: SendStreamMessageParams): Promise<StreamSendResult> => {\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n\n const seq = (sendSeqRef.current += 1);\n const userMsgId = `stream-user-${Date.now()}-${seq}`;\n const assistantMsgId = `stream-assistant-${Date.now()}-${seq}`;\n\n const optimisticUserMsg: StreamingChatMessage = {\n id: userMsgId,\n role: 'USER' as ChatMessage['role'],\n content: message,\n attachments: attachments as StreamingChatMessage['attachments'],\n };\n\n const streamingAssistantMsg: StreamingChatMessage = {\n id: assistantMsgId,\n role: 'ASSISTANT' as ChatMessage['role'],\n content: '',\n streamStatus: 'streaming',\n streamingText: '',\n };\n\n setStreamingMessages([optimisticUserMsg, streamingAssistantMsg]);\n\n let accumulated = '';\n let revealedLen = 0;\n let streamDone = false;\n let carry = 0;\n let lastFrameTime = 0;\n let receivedContent = false;\n let errored = false;\n let canSendChatMessage: boolean | undefined;\n\n const settle = () => {\n stopRaf();\n const finalAssistantMsg: StreamingChatMessage = {\n ...streamingAssistantMsg,\n content: accumulated,\n streamStatus: 'settled',\n streamingText: accumulated,\n };\n setCompletedMessages((prev) => [\n ...prev,\n optimisticUserMsg,\n finalAssistantMsg,\n ]);\n setStreamingMessages([]);\n void refetch();\n };\n\n const frame = (now: number) => {\n if (lastFrameTime === 0) {\n lastFrameTime = now;\n }\n const elapsedMs = now - lastFrameTime;\n lastFrameTime = now;\n\n if (revealedLen < accumulated.length) {\n carry += elapsedMs / revealMsPerChar;\n const step = Math.floor(carry);\n if (step > 0) {\n carry -= step;\n revealedLen = Math.min(accumulated.length, revealedLen + step);\n setStreamingMessages([\n optimisticUserMsg,\n {\n ...streamingAssistantMsg,\n streamStatus: 'streaming',\n streamingText: accumulated.slice(0, revealedLen),\n },\n ]);\n }\n rafRef.current = requestAnimationFrame(frame);\n } else if (streamDone) {\n settle();\n } else {\n stopRaf();\n }\n };\n\n const startRaf = () => {\n if (rafRef.current === null) {\n lastFrameTime = 0;\n rafRef.current = requestAnimationFrame(frame);\n }\n };\n\n await streamChatMessage(\n {\n chatId,\n message,\n namespace,\n chatConfig,\n attachments,\n metadata,\n conversationLanguage,\n headers,\n },\n {\n onChunk: (token) => {\n receivedContent = true;\n accumulated += token;\n startRaf();\n },\n onDone: () => {\n streamDone = true;\n startRaf();\n },\n onError: (err) => {\n errored = true;\n stopRaf();\n onError?.(err);\n setStreamingMessages([]);\n },\n onCanSendChatMessage: (canSend) => (canSendChatMessage = canSend),\n },\n controller.signal,\n );\n\n return {\n ok: streamDone && !errored,\n producedContent: receivedContent,\n aborted: !streamDone && !errored,\n canSendChatMessage,\n };\n },\n [\n chatId,\n namespace,\n headers,\n conversationLanguage,\n onError,\n refetch,\n revealMsPerChar,\n stopRaf,\n ],\n );\n\n return {\n status,\n pending: [] as never[],\n messages,\n fetchNext,\n refetch,\n send,\n };\n\n function fetchNext() {\n void fetchNextPage();\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["useCallback","useEffect","useMemo","useRef","useState","useInfiniteQuery","useSdkConsumer","streamChatMessage","messageKey","m","role","content","trim","useTextChatStream","options","_options","_options$limit","limit","headers","conversationLanguage","includeCitations","onError","_options$revealMsPerC","revealMsPerChar","_useSdkConsumer","chatId","namespace","personaChatService","_useInfiniteQuery","queryKey","queryFn","_ref","pageParam","messages","nextCursor","undefined","queryChatMessages","cursor","getNextPageParam","lastPage","initialPageParam","select","data","pages","flatMap","page","_useInfiniteQuery$dat","sdkMessages","status","fetchNextPage","refetch","_useState","streamingMessages","setStreamingMessages","_useState2","completedMessages","setCompletedMessages","abortRef","rafRef","lastConfirmedRef","sendSeqRef","stopRaf","current","cancelAnimationFrame","_abortRef$current","abort","converted","reverse","confirmedMessages","length","completedKeys","Set","map","confirmedShown","filter","has","chronological","send","_ref2","_abortRef$current2","message","chatConfig","attachments","metadata","controller","AbortController","seq","userMsgId","Date","now","assistantMsgId","optimisticUserMsg","id","streamingAssistantMsg","streamStatus","streamingText","accumulated","revealedLen","streamDone","carry","lastFrameTime","receivedContent","errored","canSendChatMessage","settle","finalAssistantMsg","prev","frame","elapsedMs","step","Math","floor","min","slice","requestAnimationFrame","startRaf","onChunk","token","onDone","err","onCanSendChatMessage","canSend","signal","ok","producedContent","aborted","pending","fetchNext"],"sources":["../../../../src/hooks/useTextChat/useTextChatStream.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useInfiniteQuery } from '@tanstack/react-query';\nimport type { ChatMessage, ChatMessageAttachment } from '../../types';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { streamChatMessage } from './streamChatMessage';\n\nexport type {\n StreamCallbacks,\n StreamChatMessageParams,\n} from './streamChatMessage';\n\n/**\n * A platform `ChatMessage` augmented with streaming metadata. The host renderer\n * uses `streamStatus`/`streamingText` to drive its typewriter; confirmed\n * (non-streamed) messages carry neither.\n */\nexport type StreamingChatMessage = ChatMessage & {\n streamingText?: string;\n streamStatus?: 'streaming' | 'settled';\n};\n\nexport interface UseTextChatStreamOptions {\n limit?: number;\n // Extra headers forwarded on every stream request — e.g. an `x-xsrf-token`\n // for the CSRF-protected persona-chat gateway.\n headers?: Record<string, string>;\n // Language or locale for the persona's text reply, e.g. es or en-GB.\n // Omit to keep the default behavior.\n conversationLanguage?: string;\n // Asks the backend for the Knowledge sources behind each answer. Honoured\n // only in PREVIEW chats.\n includeCitations?: boolean;\n // Stream failures surfaced to the host (e.g. report to Sentry + toast).\n onError?: (err: Error) => void;\n // Milliseconds per character for the requestAnimationFrame reveal drip.\n // Default 16 (~62 chars/s).\n revealMsPerChar?: number;\n}\n\nexport interface SendStreamMessageParams {\n message: string;\n chatConfig?: object;\n attachments?: ChatMessageAttachment[];\n metadata?: object;\n}\n\n/**\n * Per-send outcome resolved by `send`. Reported at the transport level,\n * independent of the rAF reveal state — so a consumer can implement a\n * race-free, reveal-independent safe fallback.\n */\nexport type StreamSendResult = {\n ok: boolean; // stream completed successfully (reached onDone)\n producedContent: boolean; // at least one content chunk was received\n aborted: boolean; // the send was superseded/cancelled — not a real failure\n canSendChatMessage?: boolean; // set only when a frame reported it\n};\n\nconst messageKey = (m: StreamingChatMessage) =>\n `${m.role}::${(m.content ?? '').trim()}`;\n\n/**\n * Streaming counterpart to `useTextChat`. Sends a message over the SSE transport\n * and drips the accumulated reply into `streamingText` at a steady, time-paced\n * rate via requestAnimationFrame.\n *\n * Uses the same React Query key as `useTextChat` so mounting both hooks\n * does not double-fetch the message history.\n *\n * NOTE: uses `credentials: 'include'` + XSRF cookie auth — intended for\n * Wix-internal consumers where the persona-chat gateway is same-origin.\n */\nexport function useTextChatStream(options: UseTextChatStreamOptions = {}) {\n const {\n limit = 50,\n headers,\n conversationLanguage,\n includeCitations,\n onError,\n revealMsPerChar = 16,\n } = options;\n\n const { chatId, namespace, personaChatService } = useSdkConsumer();\n\n // Same query key as useTextChat — dedupes the history fetch when both are mounted.\n const {\n data: sdkMessages = [],\n status,\n fetchNextPage,\n refetch,\n } = useInfiniteQuery({\n queryKey: ['chat-messages', chatId, namespace],\n queryFn: async ({ pageParam }: { pageParam?: string }) => {\n if (!personaChatService) {\n return { messages: [], nextCursor: undefined };\n }\n return personaChatService.queryChatMessages({\n chatId,\n namespace,\n limit,\n cursor: pageParam,\n });\n },\n getNextPageParam: (lastPage) => lastPage.nextCursor,\n initialPageParam: undefined as string | undefined,\n select: (data) =>\n data.pages.flatMap((page) => page.messages as ChatMessage[]),\n });\n\n const [streamingMessages, setStreamingMessages] = useState<\n StreamingChatMessage[]\n >([]);\n const [completedMessages, setCompletedMessages] = useState<\n StreamingChatMessage[]\n >([]);\n const abortRef = useRef<AbortController | null>(null);\n const rafRef = useRef<number | null>(null);\n const lastConfirmedRef = useRef<StreamingChatMessage[]>([]);\n const sendSeqRef = useRef(0);\n\n const stopRaf = useCallback(() => {\n if (rafRef.current !== null) {\n cancelAnimationFrame(rafRef.current);\n rafRef.current = null;\n }\n }, []);\n\n useEffect(() => {\n return () => {\n abortRef.current?.abort();\n stopRaf();\n };\n }, [stopRaf]);\n\n const messages = useMemo<StreamingChatMessage[]>(() => {\n const converted = [...sdkMessages].reverse() as StreamingChatMessage[];\n const confirmedMessages =\n converted.length > 0 ? converted : lastConfirmedRef.current;\n\n const completedKeys = new Set(completedMessages.map(messageKey));\n const confirmedShown = confirmedMessages.filter(\n (m) => !completedKeys.has(messageKey(m)),\n );\n const chronological = [\n ...confirmedShown,\n ...completedMessages,\n ...streamingMessages,\n ];\n return chronological.reverse();\n }, [sdkMessages, streamingMessages, completedMessages]);\n\n useEffect(() => {\n const converted = [...sdkMessages].reverse() as StreamingChatMessage[];\n if (converted.length > 0) {\n lastConfirmedRef.current = converted;\n }\n }, [sdkMessages]);\n\n const send = useCallback(\n async ({\n message,\n chatConfig,\n attachments,\n metadata,\n }: SendStreamMessageParams): Promise<StreamSendResult> => {\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n\n const seq = (sendSeqRef.current += 1);\n const userMsgId = `stream-user-${Date.now()}-${seq}`;\n const assistantMsgId = `stream-assistant-${Date.now()}-${seq}`;\n\n const optimisticUserMsg: StreamingChatMessage = {\n id: userMsgId,\n role: 'USER' as ChatMessage['role'],\n content: message,\n attachments: attachments as StreamingChatMessage['attachments'],\n };\n\n const streamingAssistantMsg: StreamingChatMessage = {\n id: assistantMsgId,\n role: 'ASSISTANT' as ChatMessage['role'],\n content: '',\n streamStatus: 'streaming',\n streamingText: '',\n };\n\n setStreamingMessages([optimisticUserMsg, streamingAssistantMsg]);\n\n let accumulated = '';\n let revealedLen = 0;\n let streamDone = false;\n let carry = 0;\n let lastFrameTime = 0;\n let receivedContent = false;\n let errored = false;\n let canSendChatMessage: boolean | undefined;\n\n const settle = () => {\n stopRaf();\n const finalAssistantMsg: StreamingChatMessage = {\n ...streamingAssistantMsg,\n content: accumulated,\n streamStatus: 'settled',\n streamingText: accumulated,\n };\n setCompletedMessages((prev) => [\n ...prev,\n optimisticUserMsg,\n finalAssistantMsg,\n ]);\n setStreamingMessages([]);\n void refetch();\n };\n\n const frame = (now: number) => {\n if (lastFrameTime === 0) {\n lastFrameTime = now;\n }\n const elapsedMs = now - lastFrameTime;\n lastFrameTime = now;\n\n if (revealedLen < accumulated.length) {\n carry += elapsedMs / revealMsPerChar;\n const step = Math.floor(carry);\n if (step > 0) {\n carry -= step;\n revealedLen = Math.min(accumulated.length, revealedLen + step);\n setStreamingMessages([\n optimisticUserMsg,\n {\n ...streamingAssistantMsg,\n streamStatus: 'streaming',\n streamingText: accumulated.slice(0, revealedLen),\n },\n ]);\n }\n rafRef.current = requestAnimationFrame(frame);\n } else if (streamDone) {\n settle();\n } else {\n stopRaf();\n }\n };\n\n const startRaf = () => {\n if (rafRef.current === null) {\n lastFrameTime = 0;\n rafRef.current = requestAnimationFrame(frame);\n }\n };\n\n await streamChatMessage(\n {\n chatId,\n message,\n namespace,\n chatConfig,\n attachments,\n metadata,\n conversationLanguage,\n includeCitations,\n headers,\n },\n {\n onChunk: (token) => {\n receivedContent = true;\n accumulated += token;\n startRaf();\n },\n onDone: () => {\n streamDone = true;\n startRaf();\n },\n onError: (err) => {\n errored = true;\n stopRaf();\n onError?.(err);\n setStreamingMessages([]);\n },\n onCanSendChatMessage: (canSend) => (canSendChatMessage = canSend),\n },\n controller.signal,\n );\n\n return {\n ok: streamDone && !errored,\n producedContent: receivedContent,\n aborted: !streamDone && !errored,\n canSendChatMessage,\n };\n },\n [\n chatId,\n namespace,\n headers,\n conversationLanguage,\n includeCitations,\n onError,\n refetch,\n revealMsPerChar,\n stopRaf,\n ],\n );\n\n return {\n status,\n pending: [] as never[],\n messages,\n fetchNext,\n refetch,\n send,\n };\n\n function fetchNext() {\n void fetchNextPage();\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -4,7 +4,7 @@ import { ToolExecutionInProgressError } from '../useTools';
|
|
|
4
4
|
import { useToolCallingRuntime } from '../useTools/runtime/useToolCallingRuntime';
|
|
5
5
|
import { append, appendMany } from './helpers';
|
|
6
6
|
import { fromChatFunctionCall, toChatFunctionCallResult } from './chatFunctionCalls';
|
|
7
|
-
export function useToolAwareSend(chatId, namespace, conversationLanguage) {
|
|
7
|
+
export function useToolAwareSend(chatId, namespace, conversationLanguage, includeCitations) {
|
|
8
8
|
const _useSdkConsumer = useSdkConsumer(),
|
|
9
9
|
personaChatService = _useSdkConsumer.personaChatService;
|
|
10
10
|
const toolRuntime = useToolCallingRuntime();
|
|
@@ -55,7 +55,8 @@ export function useToolAwareSend(chatId, namespace, conversationLanguage) {
|
|
|
55
55
|
chatConfig: message.chatConfig,
|
|
56
56
|
attachments: message.attachments,
|
|
57
57
|
metadata: message.metadata,
|
|
58
|
-
conversationLanguage
|
|
58
|
+
conversationLanguage,
|
|
59
|
+
includeCitations
|
|
59
60
|
});
|
|
60
61
|
return toolRuntime.resolveResponseToolCalls(initialResponse, functionCallResults => sendAndReadCalls({
|
|
61
62
|
chatId,
|
|
@@ -63,7 +64,8 @@ export function useToolAwareSend(chatId, namespace, conversationLanguage) {
|
|
|
63
64
|
message: '',
|
|
64
65
|
chatConfig: message.chatConfig,
|
|
65
66
|
functionCallResults: functionCallResults.map(result => toChatFunctionCallResult(result, toolNames.get(result.functionCallId) ?? '')),
|
|
66
|
-
conversationLanguage
|
|
67
|
+
conversationLanguage,
|
|
68
|
+
includeCitations
|
|
67
69
|
}));
|
|
68
70
|
};
|
|
69
71
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useMutation","useQueryClient","useSdkConsumer","ToolExecutionInProgressError","useToolCallingRuntime","append","appendMany","fromChatFunctionCall","toChatFunctionCallResult","useToolAwareSend","chatId","namespace","conversationLanguage","_useSdkConsumer","personaChatService","toolRuntime","queryClient","mutation","mutationKey","mutationFn","params","Error","sendChatMessage","onSuccess","data","variables","_data$messages","queryKey","message","setQueryData","id","Date","now","toString","content","role","attachments","messages","length","send","isRunning","toolNames","Map","sendAndReadCalls","_response$functionCal","response","mutateAsync","functionCalls","map","forEach","call","set","functionCallId","name","initialResponse","chatConfig","metadata","resolveResponseToolCalls","functionCallResults","result","get"],"sources":["../../../../src/hooks/useTextChat/useToolAwareSend.ts"],"sourcesContent":["import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport type {\n FunctionCall,\n ChatMessageAttachment,\n SendMessageParams,\n SendMessageMetadata,\n} from '../../types';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { ToolExecutionInProgressError } from '../useTools';\nimport { useToolCallingRuntime } from '../useTools/runtime/useToolCallingRuntime';\nimport { append, appendMany } from './helpers';\nimport {\n fromChatFunctionCall,\n toChatFunctionCallResult,\n} from './chatFunctionCalls';\n\nexport interface SendChatMessageResponse {\n functionCalls?: FunctionCall[];\n}\n\nexport function useToolAwareSend(\n chatId: string,\n namespace: string,\n conversationLanguage?: string,\n) {\n const { personaChatService } = useSdkConsumer();\n const toolRuntime = useToolCallingRuntime<SendChatMessageResponse>();\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationKey: ['pending-chat-message'],\n mutationFn: (params: SendMessageParams) => {\n if (!personaChatService) {\n throw new Error('personaChatService is required to send messages.');\n }\n return personaChatService.sendChatMessage(params);\n },\n onSuccess(data, variables) {\n const queryKey = ['chat-messages', chatId, namespace];\n\n if (variables.message) {\n queryClient.setQueryData(\n queryKey,\n append({\n id: Date.now().toString(),\n content: variables.message,\n role: 'USER' as const,\n attachments: variables.attachments,\n }),\n );\n }\n\n if (data.messages?.length) {\n queryClient.setQueryData(queryKey, appendMany(data.messages));\n }\n },\n });\n\n return async function send(message: {\n message?: string;\n chatConfig?: object;\n attachments?: ChatMessageAttachment[];\n metadata?: SendMessageMetadata;\n }) {\n if (toolRuntime.isRunning) {\n throw new ToolExecutionInProgressError();\n }\n\n const toolNames = new Map<string, string>();\n const sendAndReadCalls = async (params: SendMessageParams) => {\n const response = await mutation.mutateAsync(params);\n const functionCalls = response.functionCalls?.map(fromChatFunctionCall);\n functionCalls?.forEach((call) =>\n toolNames.set(call.functionCallId, call.name),\n );\n return { ...response, functionCalls };\n };\n\n const initialResponse = await sendAndReadCalls({\n chatId,\n namespace,\n message: message.message ?? '',\n chatConfig: message.chatConfig,\n attachments: message.attachments,\n metadata: message.metadata,\n conversationLanguage,\n });\n\n return toolRuntime.resolveResponseToolCalls(\n initialResponse,\n (functionCallResults) =>\n sendAndReadCalls({\n chatId,\n namespace,\n message: '',\n chatConfig: message.chatConfig,\n functionCallResults: functionCallResults.map((result) =>\n toChatFunctionCallResult(\n result,\n toolNames.get(result.functionCallId) ?? '',\n ),\n ),\n conversationLanguage,\n }),\n );\n };\n}\n"],"mappings":"AAAA,SAASA,WAAW,EAAEC,cAAc,QAAQ,uBAAuB;AAOnE,SAASC,cAAc,QAAQ,oBAAoB;AACnD,SAASC,4BAA4B,QAAQ,aAAa;AAC1D,SAASC,qBAAqB,QAAQ,2CAA2C;AACjF,SAASC,MAAM,EAAEC,UAAU,QAAQ,WAAW;AAC9C,SACEC,oBAAoB,EACpBC,wBAAwB,QACnB,qBAAqB;AAM5B,OAAO,SAASC,gBAAgBA,CAC9BC,MAAc,EACdC,SAAiB,EACjBC,oBAA6B,
|
|
1
|
+
{"version":3,"names":["useMutation","useQueryClient","useSdkConsumer","ToolExecutionInProgressError","useToolCallingRuntime","append","appendMany","fromChatFunctionCall","toChatFunctionCallResult","useToolAwareSend","chatId","namespace","conversationLanguage","includeCitations","_useSdkConsumer","personaChatService","toolRuntime","queryClient","mutation","mutationKey","mutationFn","params","Error","sendChatMessage","onSuccess","data","variables","_data$messages","queryKey","message","setQueryData","id","Date","now","toString","content","role","attachments","messages","length","send","isRunning","toolNames","Map","sendAndReadCalls","_response$functionCal","response","mutateAsync","functionCalls","map","forEach","call","set","functionCallId","name","initialResponse","chatConfig","metadata","resolveResponseToolCalls","functionCallResults","result","get"],"sources":["../../../../src/hooks/useTextChat/useToolAwareSend.ts"],"sourcesContent":["import { useMutation, useQueryClient } from '@tanstack/react-query';\nimport type {\n FunctionCall,\n ChatMessageAttachment,\n SendMessageParams,\n SendMessageMetadata,\n} from '../../types';\nimport { useSdkConsumer } from '../../sdk-consumer';\nimport { ToolExecutionInProgressError } from '../useTools';\nimport { useToolCallingRuntime } from '../useTools/runtime/useToolCallingRuntime';\nimport { append, appendMany } from './helpers';\nimport {\n fromChatFunctionCall,\n toChatFunctionCallResult,\n} from './chatFunctionCalls';\n\nexport interface SendChatMessageResponse {\n functionCalls?: FunctionCall[];\n}\n\nexport function useToolAwareSend(\n chatId: string,\n namespace: string,\n conversationLanguage?: string,\n includeCitations?: boolean,\n) {\n const { personaChatService } = useSdkConsumer();\n const toolRuntime = useToolCallingRuntime<SendChatMessageResponse>();\n const queryClient = useQueryClient();\n\n const mutation = useMutation({\n mutationKey: ['pending-chat-message'],\n mutationFn: (params: SendMessageParams) => {\n if (!personaChatService) {\n throw new Error('personaChatService is required to send messages.');\n }\n return personaChatService.sendChatMessage(params);\n },\n onSuccess(data, variables) {\n const queryKey = ['chat-messages', chatId, namespace];\n\n if (variables.message) {\n queryClient.setQueryData(\n queryKey,\n append({\n id: Date.now().toString(),\n content: variables.message,\n role: 'USER' as const,\n attachments: variables.attachments,\n }),\n );\n }\n\n if (data.messages?.length) {\n queryClient.setQueryData(queryKey, appendMany(data.messages));\n }\n },\n });\n\n return async function send(message: {\n message?: string;\n chatConfig?: object;\n attachments?: ChatMessageAttachment[];\n metadata?: SendMessageMetadata;\n }) {\n if (toolRuntime.isRunning) {\n throw new ToolExecutionInProgressError();\n }\n\n const toolNames = new Map<string, string>();\n const sendAndReadCalls = async (params: SendMessageParams) => {\n const response = await mutation.mutateAsync(params);\n const functionCalls = response.functionCalls?.map(fromChatFunctionCall);\n functionCalls?.forEach((call) =>\n toolNames.set(call.functionCallId, call.name),\n );\n return { ...response, functionCalls };\n };\n\n const initialResponse = await sendAndReadCalls({\n chatId,\n namespace,\n message: message.message ?? '',\n chatConfig: message.chatConfig,\n attachments: message.attachments,\n metadata: message.metadata,\n conversationLanguage,\n includeCitations,\n });\n\n return toolRuntime.resolveResponseToolCalls(\n initialResponse,\n (functionCallResults) =>\n sendAndReadCalls({\n chatId,\n namespace,\n message: '',\n chatConfig: message.chatConfig,\n functionCallResults: functionCallResults.map((result) =>\n toChatFunctionCallResult(\n result,\n toolNames.get(result.functionCallId) ?? '',\n ),\n ),\n conversationLanguage,\n includeCitations,\n }),\n );\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
package/dist/esm/sdk.js
CHANGED
|
@@ -16,5 +16,7 @@ export * from './hooks/usePictureInPicture';
|
|
|
16
16
|
export * from './hooks/useMediaPermissions';
|
|
17
17
|
export * from './hooks/useTools';
|
|
18
18
|
export * from './conversation/types';
|
|
19
|
+
export { BearerPersonaChatService } from './services/BearerPersonaChatService';
|
|
20
|
+
export { LegendsPlatformCore } from './components/LegendsPlatformCore';
|
|
19
21
|
export { createStartupIntent, StartupAttempt } from './startup-telemetry/attempt';
|
|
20
22
|
//# sourceMappingURL=sdk.js.map
|
package/dist/esm/sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createStartupIntent","StartupAttempt"],"sources":["../../src/sdk.ts"],"sourcesContent":["export * from './types';\n\nexport * from './hooks/useTextChat';\nexport * from './hooks/useTranscriptions';\nexport * from './hooks/useConversationStatus';\nexport * from './hooks/useMicrophone';\nexport * from './hooks/useSpeaker';\nexport * from './hooks/useCamera';\nexport * from './hooks/useMediaRecorder';\nexport * from './hooks/useConversationTimer';\nexport * from './hooks/useConversationEvents';\nexport * from './hooks/useUserActivity';\nexport * from './hooks/useAudio';\nexport * from './hooks/useConnectionState';\nexport * from './hooks/useActivityState';\nexport * from './hooks/usePictureInPicture';\nexport * from './hooks/useMediaPermissions';\nexport * from './hooks/useTools';\n\nexport * from './conversation/types';\n\nexport {\n createStartupIntent,\n StartupAttempt,\n} from './startup-telemetry/attempt';\nexport type {\n StartupIntent,\n StartupReport,\n StartupTelemetryOptions,\n} from './startup-telemetry/attempt';\n"],"mappings":"AAAA,cAAc,SAAS;AAEvB,cAAc,qBAAqB;AACnC,cAAc,2BAA2B;AACzC,cAAc,+BAA+B;AAC7C,cAAc,uBAAuB;AACrC,cAAc,oBAAoB;AAClC,cAAc,mBAAmB;AACjC,cAAc,0BAA0B;AACxC,cAAc,8BAA8B;AAC5C,cAAc,+BAA+B;AAC7C,cAAc,yBAAyB;AACvC,cAAc,kBAAkB;AAChC,cAAc,4BAA4B;AAC1C,cAAc,0BAA0B;AACxC,cAAc,6BAA6B;AAC3C,cAAc,6BAA6B;AAC3C,cAAc,kBAAkB;AAEhC,cAAc,sBAAsB;AAEpC,
|
|
1
|
+
{"version":3,"names":["BearerPersonaChatService","LegendsPlatformCore","createStartupIntent","StartupAttempt"],"sources":["../../src/sdk.ts"],"sourcesContent":["export * from './types';\n\nexport * from './hooks/useTextChat';\nexport * from './hooks/useTranscriptions';\nexport * from './hooks/useConversationStatus';\nexport * from './hooks/useMicrophone';\nexport * from './hooks/useSpeaker';\nexport * from './hooks/useCamera';\nexport * from './hooks/useMediaRecorder';\nexport * from './hooks/useConversationTimer';\nexport * from './hooks/useConversationEvents';\nexport * from './hooks/useUserActivity';\nexport * from './hooks/useAudio';\nexport * from './hooks/useConnectionState';\nexport * from './hooks/useActivityState';\nexport * from './hooks/usePictureInPicture';\nexport * from './hooks/useMediaPermissions';\nexport * from './hooks/useTools';\n\nexport * from './conversation/types';\n\nexport { BearerPersonaChatService } from './services/BearerPersonaChatService';\nexport type { BearerPersonaChatServiceOptions } from './services/BearerPersonaChatService';\nexport { LegendsPlatformCore } from './components/LegendsPlatformCore';\nexport type { LegendsPlatformCoreProps } from './components/LegendsPlatformCore';\n\nexport {\n createStartupIntent,\n StartupAttempt,\n} from './startup-telemetry/attempt';\nexport type {\n StartupIntent,\n StartupReport,\n StartupTelemetryOptions,\n} from './startup-telemetry/attempt';\n"],"mappings":"AAAA,cAAc,SAAS;AAEvB,cAAc,qBAAqB;AACnC,cAAc,2BAA2B;AACzC,cAAc,+BAA+B;AAC7C,cAAc,uBAAuB;AACrC,cAAc,oBAAoB;AAClC,cAAc,mBAAmB;AACjC,cAAc,0BAA0B;AACxC,cAAc,8BAA8B;AAC5C,cAAc,+BAA+B;AAC7C,cAAc,yBAAyB;AACvC,cAAc,kBAAkB;AAChC,cAAc,4BAA4B;AAC1C,cAAc,0BAA0B;AACxC,cAAc,6BAA6B;AAC3C,cAAc,6BAA6B;AAC3C,cAAc,kBAAkB;AAEhC,cAAc,sBAAsB;AAEpC,SAASA,wBAAwB,QAAQ,qCAAqC;AAE9E,SAASC,mBAAmB,QAAQ,kCAAkC;AAGtE,SACEC,mBAAmB,EACnBC,cAAc,QACT,6BAA6B","ignoreList":[]}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
+
import { HttpError } from '../types/http';
|
|
3
|
+
import { DEFAULT_BASE_URL } from './FetchPersonaChatService';
|
|
4
|
+
const PERSONA_CHAT = '/_api/persona-chat-service/v1';
|
|
5
|
+
function resolveLimitMs(limitation) {
|
|
6
|
+
if (!limitation) {
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
switch (limitation.type) {
|
|
10
|
+
case 'MINUTES':
|
|
11
|
+
return (limitation.limit ?? 0) * 60 * 1000;
|
|
12
|
+
case 'SECONDS':
|
|
13
|
+
return (limitation.limit ?? 0) * 1000;
|
|
14
|
+
case 'TOKENS':
|
|
15
|
+
default:
|
|
16
|
+
return 0;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function parseJson(text) {
|
|
20
|
+
try {
|
|
21
|
+
return JSON.parse(text);
|
|
22
|
+
} catch {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function toMessage(m) {
|
|
27
|
+
return {
|
|
28
|
+
id: m.id ?? '',
|
|
29
|
+
content: m.content ?? '',
|
|
30
|
+
role: m.role,
|
|
31
|
+
createdAt: m.createdAt ?? m.createdDate,
|
|
32
|
+
...(m.attachments ? {
|
|
33
|
+
attachments: m.attachments
|
|
34
|
+
} : {})
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The persona-chat service for a browser: authenticated with the caller's own
|
|
40
|
+
* bearer token (never a namespace API key), on the same REST paths the
|
|
41
|
+
* Legend's own page uses for a visitor.
|
|
42
|
+
*/
|
|
43
|
+
export class BearerPersonaChatService {
|
|
44
|
+
constructor(options) {
|
|
45
|
+
this.options = options;
|
|
46
|
+
_defineProperty(this, "baseUrl", void 0);
|
|
47
|
+
this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, '');
|
|
48
|
+
}
|
|
49
|
+
async request(method, path, body, retried) {
|
|
50
|
+
if (retried === void 0) {
|
|
51
|
+
retried = false;
|
|
52
|
+
}
|
|
53
|
+
const token = await this.options.getAccessToken();
|
|
54
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
55
|
+
method,
|
|
56
|
+
headers: {
|
|
57
|
+
...(body === undefined ? {} : {
|
|
58
|
+
'Content-Type': 'application/json'
|
|
59
|
+
}),
|
|
60
|
+
Authorization: token
|
|
61
|
+
},
|
|
62
|
+
...(body === undefined ? {} : {
|
|
63
|
+
body: JSON.stringify(body)
|
|
64
|
+
})
|
|
65
|
+
});
|
|
66
|
+
if (response.status === 401 && !retried && this.options.onUnauthorized && (await this.options.onUnauthorized())) {
|
|
67
|
+
return this.request(method, path, body, true);
|
|
68
|
+
}
|
|
69
|
+
if (!response.ok) {
|
|
70
|
+
const text = await response.text().catch(() => '');
|
|
71
|
+
throw new HttpError(response.status, `Request failed: ${response.status} ${text}`, parseJson(text));
|
|
72
|
+
}
|
|
73
|
+
return response.json();
|
|
74
|
+
}
|
|
75
|
+
async createConversation(kind, params) {
|
|
76
|
+
const chatId = params.chatId,
|
|
77
|
+
namespace = params.namespace,
|
|
78
|
+
chatConfig = params.chatConfig,
|
|
79
|
+
firstConversation = params.firstConversation,
|
|
80
|
+
lastConversationTopic = params.lastConversationTopic,
|
|
81
|
+
conversationLanguage = params.conversationLanguage;
|
|
82
|
+
const data = await this.request('POST', `${PERSONA_CHAT}/chats/${encodeURIComponent(chatId)}/${kind}`, {
|
|
83
|
+
namespace,
|
|
84
|
+
...(chatConfig ? {
|
|
85
|
+
chatConfig
|
|
86
|
+
} : {}),
|
|
87
|
+
...(firstConversation !== undefined ? {
|
|
88
|
+
firstConversation
|
|
89
|
+
} : {}),
|
|
90
|
+
...(lastConversationTopic ? {
|
|
91
|
+
lastConversationTopic
|
|
92
|
+
} : {}),
|
|
93
|
+
...(conversationLanguage !== undefined ? {
|
|
94
|
+
conversationLanguage
|
|
95
|
+
} : {})
|
|
96
|
+
});
|
|
97
|
+
return {
|
|
98
|
+
url: data.conversationUrl ?? '',
|
|
99
|
+
id: data.interactiveConversationId ?? '',
|
|
100
|
+
limit: resolveLimitMs(data.limitation)
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
createVoiceConversation(params) {
|
|
104
|
+
return this.createConversation('create-voice-conversation', params);
|
|
105
|
+
}
|
|
106
|
+
createInteractiveConversation(params) {
|
|
107
|
+
return this.createConversation('create-interactive-conversation', params);
|
|
108
|
+
}
|
|
109
|
+
async endInteractiveConversation(params) {
|
|
110
|
+
const chatId = params.chatId,
|
|
111
|
+
conversationId = params.conversationId,
|
|
112
|
+
namespace = params.namespace;
|
|
113
|
+
await this.request('POST', `${PERSONA_CHAT}/chats/${encodeURIComponent(chatId)}/end-interactive-conversation`, {
|
|
114
|
+
namespace,
|
|
115
|
+
interactiveConversationId: conversationId
|
|
116
|
+
}).catch(() => {
|
|
117
|
+
// best-effort
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
async sendChatMessage(params) {
|
|
121
|
+
const chatId = params.chatId,
|
|
122
|
+
namespace = params.namespace,
|
|
123
|
+
message = params.message,
|
|
124
|
+
functionCallResults = params.functionCallResults,
|
|
125
|
+
chatConfig = params.chatConfig,
|
|
126
|
+
attachments = params.attachments,
|
|
127
|
+
metadata = params.metadata,
|
|
128
|
+
conversationLanguage = params.conversationLanguage,
|
|
129
|
+
includeCitations = params.includeCitations;
|
|
130
|
+
const data = await this.request('POST', `${PERSONA_CHAT}/chat/messages`, {
|
|
131
|
+
chatId,
|
|
132
|
+
namespace,
|
|
133
|
+
...(message ? {
|
|
134
|
+
message
|
|
135
|
+
} : {}),
|
|
136
|
+
...(functionCallResults ? {
|
|
137
|
+
functionCallResults
|
|
138
|
+
} : {}),
|
|
139
|
+
...(chatConfig ? {
|
|
140
|
+
chatConfig
|
|
141
|
+
} : {}),
|
|
142
|
+
...(attachments ? {
|
|
143
|
+
attachments
|
|
144
|
+
} : {}),
|
|
145
|
+
...(metadata ? {
|
|
146
|
+
metadata
|
|
147
|
+
} : {}),
|
|
148
|
+
...(conversationLanguage !== undefined ? {
|
|
149
|
+
conversationLanguage
|
|
150
|
+
} : {}),
|
|
151
|
+
...(includeCitations !== undefined ? {
|
|
152
|
+
includeCitations
|
|
153
|
+
} : {})
|
|
154
|
+
});
|
|
155
|
+
return {
|
|
156
|
+
functionCalls: data.functionCalls,
|
|
157
|
+
messages: (data.messages ?? []).map(toMessage)
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
async queryChatMessages(params) {
|
|
161
|
+
var _data$pagingMetadata;
|
|
162
|
+
const chatId = params.chatId,
|
|
163
|
+
namespace = params.namespace,
|
|
164
|
+
_params$limit = params.limit,
|
|
165
|
+
limit = _params$limit === void 0 ? 100 : _params$limit,
|
|
166
|
+
cursor = params.cursor;
|
|
167
|
+
const query = new URLSearchParams({
|
|
168
|
+
namespace,
|
|
169
|
+
'query.cursorPaging.limit': String(limit),
|
|
170
|
+
...(cursor ? {
|
|
171
|
+
'query.cursorPaging.cursor': cursor
|
|
172
|
+
} : {})
|
|
173
|
+
});
|
|
174
|
+
const data = await this.request('GET', `${PERSONA_CHAT}/chats/${encodeURIComponent(chatId)}/messages?${query}`);
|
|
175
|
+
return {
|
|
176
|
+
messages: (data.chatMessages ?? []).map(toMessage),
|
|
177
|
+
nextCursor: (_data$pagingMetadata = data.pagingMetadata) == null || (_data$pagingMetadata = _data$pagingMetadata.cursors) == null ? void 0 : _data$pagingMetadata.next
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=BearerPersonaChatService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["HttpError","DEFAULT_BASE_URL","PERSONA_CHAT","resolveLimitMs","limitation","undefined","type","limit","parseJson","text","JSON","parse","toMessage","m","id","content","role","createdAt","createdDate","attachments","BearerPersonaChatService","constructor","options","_defineProperty","baseUrl","replace","request","method","path","body","retried","token","getAccessToken","response","fetch","headers","Authorization","stringify","status","onUnauthorized","ok","catch","json","createConversation","kind","params","chatId","namespace","chatConfig","firstConversation","lastConversationTopic","conversationLanguage","data","encodeURIComponent","url","conversationUrl","interactiveConversationId","createVoiceConversation","createInteractiveConversation","endInteractiveConversation","conversationId","sendChatMessage","message","functionCallResults","metadata","includeCitations","functionCalls","messages","map","queryChatMessages","_data$pagingMetadata","_params$limit","cursor","query","URLSearchParams","String","chatMessages","nextCursor","pagingMetadata","cursors","next"],"sources":["../../../src/services/BearerPersonaChatService.ts"],"sourcesContent":["import { HttpError } from '../types/http';\nimport type {\n IPersonaChatService,\n CreateConversationParams,\n ConversationResult,\n EndConversationParams,\n SendMessageParams,\n QueryMessagesParams,\n QueryMessagesResult,\n ChatFunctionCall,\n ChatMessage,\n Limitation,\n} from '../types';\nimport { DEFAULT_BASE_URL } from './FetchPersonaChatService';\n\nexport interface BearerPersonaChatServiceOptions {\n /** API host. Defaults to https://www.wixapis.com. */\n baseUrl?: string;\n /**\n * The caller's own access token, e.g. a visitor token minted by the Legend's\n * sign-in app. Sent as the Authorization header, the way Wix's headless\n * clients send it. Called for every request, so a refreshed token is used.\n */\n getAccessToken: () => string | Promise<string>;\n /**\n * Called once when a request answers 401. Refresh the token and resolve true\n * to retry the request with the new token; resolve false to fail it.\n */\n onUnauthorized?: () => Promise<boolean>;\n}\n\nconst PERSONA_CHAT = '/_api/persona-chat-service/v1';\n\nfunction resolveLimitMs(limitation?: Limitation): number | undefined {\n if (!limitation) {\n return undefined;\n }\n switch (limitation.type) {\n case 'MINUTES':\n return (limitation.limit ?? 0) * 60 * 1000;\n case 'SECONDS':\n return (limitation.limit ?? 0) * 1000;\n case 'TOKENS':\n default:\n return 0;\n }\n}\n\nfunction parseJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\ntype RawMessage = {\n id?: string;\n content?: string;\n role?: string;\n createdAt?: string;\n createdDate?: string;\n attachments?: ChatMessage['attachments'];\n};\n\nfunction toMessage(m: RawMessage): ChatMessage {\n return {\n id: m.id ?? '',\n content: m.content ?? '',\n role: m.role as 'USER' | 'ASSISTANT',\n createdAt: m.createdAt ?? m.createdDate,\n ...(m.attachments ? { attachments: m.attachments } : {}),\n };\n}\n\n/**\n * The persona-chat service for a browser: authenticated with the caller's own\n * bearer token (never a namespace API key), on the same REST paths the\n * Legend's own page uses for a visitor.\n */\nexport class BearerPersonaChatService implements IPersonaChatService {\n private readonly baseUrl: string;\n\n constructor(private readonly options: BearerPersonaChatServiceOptions) {\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n }\n\n private async request<T>(\n method: 'GET' | 'POST',\n path: string,\n body?: unknown,\n retried = false,\n ): Promise<T> {\n const token = await this.options.getAccessToken();\n const response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: {\n ...(body === undefined ? {} : { 'Content-Type': 'application/json' }),\n Authorization: token,\n },\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n });\n\n if (\n response.status === 401 &&\n !retried &&\n this.options.onUnauthorized &&\n (await this.options.onUnauthorized())\n ) {\n return this.request<T>(method, path, body, true);\n }\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new HttpError(\n response.status,\n `Request failed: ${response.status} ${text}`,\n parseJson(text),\n );\n }\n\n return response.json() as Promise<T>;\n }\n\n private async createConversation(\n kind: 'create-voice-conversation' | 'create-interactive-conversation',\n params: CreateConversationParams,\n ): Promise<ConversationResult> {\n const {\n chatId,\n namespace,\n chatConfig,\n firstConversation,\n lastConversationTopic,\n conversationLanguage,\n } = params;\n const data = await this.request<{\n conversationUrl?: string;\n interactiveConversationId?: string;\n limitation?: Limitation;\n }>('POST', `${PERSONA_CHAT}/chats/${encodeURIComponent(chatId)}/${kind}`, {\n namespace,\n ...(chatConfig ? { chatConfig } : {}),\n ...(firstConversation !== undefined ? { firstConversation } : {}),\n ...(lastConversationTopic ? { lastConversationTopic } : {}),\n ...(conversationLanguage !== undefined ? { conversationLanguage } : {}),\n });\n return {\n url: data.conversationUrl ?? '',\n id: data.interactiveConversationId ?? '',\n limit: resolveLimitMs(data.limitation),\n };\n }\n\n createVoiceConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult> {\n return this.createConversation('create-voice-conversation', params);\n }\n\n createInteractiveConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult> {\n return this.createConversation('create-interactive-conversation', params);\n }\n\n async endInteractiveConversation(\n params: EndConversationParams,\n ): Promise<void> {\n const { chatId, conversationId, namespace } = params;\n await this.request(\n 'POST',\n `${PERSONA_CHAT}/chats/${encodeURIComponent(\n chatId,\n )}/end-interactive-conversation`,\n { namespace, interactiveConversationId: conversationId },\n ).catch(() => {\n // best-effort\n });\n }\n\n async sendChatMessage(params: SendMessageParams): Promise<{\n functionCalls?: ChatFunctionCall[];\n messages?: ChatMessage[];\n }> {\n const {\n chatId,\n namespace,\n message,\n functionCallResults,\n chatConfig,\n attachments,\n metadata,\n conversationLanguage,\n includeCitations,\n } = params;\n const data = await this.request<{\n functionCalls?: ChatFunctionCall[];\n messages?: RawMessage[];\n }>('POST', `${PERSONA_CHAT}/chat/messages`, {\n chatId,\n namespace,\n ...(message ? { message } : {}),\n ...(functionCallResults ? { functionCallResults } : {}),\n ...(chatConfig ? { chatConfig } : {}),\n ...(attachments ? { attachments } : {}),\n ...(metadata ? { metadata } : {}),\n ...(conversationLanguage !== undefined ? { conversationLanguage } : {}),\n ...(includeCitations !== undefined ? { includeCitations } : {}),\n });\n return {\n functionCalls: data.functionCalls,\n messages: (data.messages ?? []).map(toMessage),\n };\n }\n\n async queryChatMessages(\n params: QueryMessagesParams,\n ): Promise<QueryMessagesResult> {\n const { chatId, namespace, limit = 100, cursor } = params;\n const query = new URLSearchParams({\n namespace,\n 'query.cursorPaging.limit': String(limit),\n ...(cursor ? { 'query.cursorPaging.cursor': cursor } : {}),\n });\n const data = await this.request<{\n chatMessages?: RawMessage[];\n pagingMetadata?: { cursors?: { next?: string } };\n }>(\n 'GET',\n `${PERSONA_CHAT}/chats/${encodeURIComponent(chatId)}/messages?${query}`,\n );\n return {\n messages: (data.chatMessages ?? []).map(toMessage),\n nextCursor: data.pagingMetadata?.cursors?.next,\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
2
|
import { HttpError } from '../types/http';
|
|
3
|
-
const
|
|
3
|
+
export const DEFAULT_BASE_URL = 'https://www.wixapis.com';
|
|
4
4
|
function resolveLimitMs(limitation) {
|
|
5
5
|
if (!limitation) {
|
|
6
6
|
return undefined;
|
|
@@ -16,9 +16,18 @@ function resolveLimitMs(limitation) {
|
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
export class FetchPersonaChatService {
|
|
19
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Server side only: a namespace API key skips owner checks and must never
|
|
21
|
+
* reach a browser. A browser uses BearerPersonaChatService with a visitor token.
|
|
22
|
+
*/
|
|
23
|
+
constructor(apiKey, options) {
|
|
24
|
+
if (options === void 0) {
|
|
25
|
+
options = {};
|
|
26
|
+
}
|
|
20
27
|
_defineProperty(this, "apiKey", void 0);
|
|
28
|
+
_defineProperty(this, "baseUrl", void 0);
|
|
21
29
|
this.apiKey = apiKey;
|
|
30
|
+
this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/+$/, '');
|
|
22
31
|
}
|
|
23
32
|
headers() {
|
|
24
33
|
return {
|
|
@@ -27,7 +36,7 @@ export class FetchPersonaChatService {
|
|
|
27
36
|
};
|
|
28
37
|
}
|
|
29
38
|
async post(path, body) {
|
|
30
|
-
const response = await fetch(`${
|
|
39
|
+
const response = await fetch(`${this.baseUrl}${path}`, {
|
|
31
40
|
method: 'POST',
|
|
32
41
|
headers: this.headers(),
|
|
33
42
|
body: JSON.stringify(body)
|
|
@@ -96,7 +105,8 @@ export class FetchPersonaChatService {
|
|
|
96
105
|
functionCallResults = params.functionCallResults,
|
|
97
106
|
chatConfig = params.chatConfig,
|
|
98
107
|
attachments = params.attachments,
|
|
99
|
-
conversationLanguage = params.conversationLanguage
|
|
108
|
+
conversationLanguage = params.conversationLanguage,
|
|
109
|
+
includeCitations = params.includeCitations;
|
|
100
110
|
return this.post(`/_api/persona-chat-service/v1/chats/${chatId}/messages`, {
|
|
101
111
|
namespace,
|
|
102
112
|
message,
|
|
@@ -111,6 +121,9 @@ export class FetchPersonaChatService {
|
|
|
111
121
|
} : {}),
|
|
112
122
|
...(conversationLanguage !== undefined ? {
|
|
113
123
|
conversationLanguage
|
|
124
|
+
} : {}),
|
|
125
|
+
...(includeCitations !== undefined ? {
|
|
126
|
+
includeCitations
|
|
114
127
|
} : {})
|
|
115
128
|
});
|
|
116
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["HttpError","BASE_URL","resolveLimitMs","limitation","undefined","type","limit","FetchPersonaChatService","constructor","apiKey","_defineProperty","headers","Authorization","post","path","body","response","fetch","method","JSON","stringify","ok","text","catch","status","parseJson","json","createVoiceConversation","params","chatId","namespace","chatConfig","conversationLanguage","data","url","conversationUrl","id","interactiveConversationId","createInteractiveConversation","endInteractiveConversation","conversationId","sendChatMessage","message","functionCallResults","attachments","queryChatMessages","_data$pagingMetadata","_params$limit","cursor","query","cursorPaging","messages","chatMessages","map","m","content","role","createdAt","nextCursor","pagingMetadata","cursors","next","parse"],"sources":["../../../src/services/FetchPersonaChatService.ts"],"sourcesContent":["import { HttpError } from '../types/http';\nimport type {\n IPersonaChatService,\n CreateConversationParams,\n ConversationResult,\n EndConversationParams,\n SendMessageParams,\n QueryMessagesParams,\n QueryMessagesResult,\n FunctionCall,\n ChatFunctionCall,\n ChatMessage,\n Limitation,\n} from '../types';\n\nconst BASE_URL = 'https://www.wixapis.com';\n\nfunction resolveLimitMs(limitation?: Limitation): number | undefined {\n if (!limitation) {\n return undefined;\n }\n switch (limitation.type) {\n case 'MINUTES':\n return (limitation.limit ?? 0) * 60 * 1000;\n case 'SECONDS':\n return (limitation.limit ?? 0) * 1000;\n case 'TOKENS':\n default:\n return 0;\n }\n}\n\nexport class FetchPersonaChatService implements IPersonaChatService {\n private readonly apiKey: string;\n\n constructor(apiKey: string) {\n this.apiKey = apiKey;\n }\n\n private headers(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Authorization: `Api-Key ${this.apiKey}`,\n };\n }\n\n private async post<T>(path: string, body: unknown): Promise<T> {\n const response = await fetch(`${BASE_URL}${path}`, {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new HttpError(\n response.status,\n `Request failed: ${response.status} ${text}`,\n parseJson(text),\n );\n }\n\n return response.json() as Promise<T>;\n }\n\n async createVoiceConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult> {\n const { chatId, namespace, chatConfig, conversationLanguage } = params;\n\n const data = await this.post<{\n conversationUrl?: string;\n interactiveConversationId?: string;\n limitation?: Limitation;\n }>(\n `/_api/persona-chat-service/v1/chats/${chatId}/create-voice-conversation`,\n {\n namespace,\n ...(chatConfig ? { chatConfig } : {}),\n ...(conversationLanguage !== undefined ? { conversationLanguage } : {}),\n },\n );\n\n return {\n url: data.conversationUrl ?? '',\n id: data.interactiveConversationId ?? '',\n limit: resolveLimitMs(data.limitation),\n };\n }\n\n async createInteractiveConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult> {\n const { chatId, namespace, chatConfig, conversationLanguage } = params;\n\n const data = await this.post<{\n conversationUrl?: string;\n interactiveConversationId?: string;\n limitation?: Limitation;\n }>(\n `/_api/persona-chat-service/v1/chats/${chatId}/create-interactive-conversation`,\n {\n namespace,\n ...(chatConfig ? { chatConfig } : {}),\n ...(conversationLanguage !== undefined ? { conversationLanguage } : {}),\n },\n );\n\n return {\n url: data.conversationUrl ?? '',\n id: data.interactiveConversationId ?? '',\n limit: resolveLimitMs(data.limitation),\n };\n }\n\n async endInteractiveConversation(\n params: EndConversationParams,\n ): Promise<void> {\n const { chatId, conversationId, namespace } = params;\n\n await this.post(\n `/_api/persona-chat-service/v1/chats/${chatId}/end-interactive-conversation`,\n { namespace, interactiveConversationId: conversationId },\n ).catch(() => {\n // best-effort\n });\n }\n\n async sendChatMessage(params: SendMessageParams): Promise<{\n functionCalls?: (FunctionCall | ChatFunctionCall)[];\n messages?: ChatMessage[];\n }> {\n const {\n chatId,\n namespace,\n message,\n functionCallResults,\n chatConfig,\n attachments,\n conversationLanguage,\n } = params;\n\n return this.post<{\n functionCalls?: ChatFunctionCall[];\n messages?: ChatMessage[];\n }>(`/_api/persona-chat-service/v1/chats/${chatId}/messages`, {\n namespace,\n message,\n ...(functionCallResults ? { functionCallResults } : {}),\n ...(chatConfig ? { chatConfig } : {}),\n ...(attachments ? { attachments } : {}),\n ...(conversationLanguage !== undefined ? { conversationLanguage } : {}),\n });\n }\n\n async queryChatMessages(\n params: QueryMessagesParams,\n ): Promise<QueryMessagesResult> {\n const { chatId, namespace, limit = 100, cursor } = params;\n\n const data = await this.post<{\n chatMessages?: {\n id: string;\n content: string;\n role: string;\n createdAt?: string;\n }[];\n pagingMetadata?: { cursors?: { next?: string } };\n }>(`/_api/persona-chat-service/v1/chats/${chatId}/messages/query`, {\n namespace,\n query: { cursorPaging: { limit, ...(cursor ? { cursor } : {}) } },\n });\n\n return {\n messages: (data.chatMessages ?? []).map((m) => ({\n id: m.id,\n content: m.content,\n role: m.role as 'USER' | 'ASSISTANT',\n createdAt: m.createdAt,\n })),\n nextCursor: data.pagingMetadata?.cursors?.next,\n };\n }\n}\n\nfunction parseJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["HttpError","DEFAULT_BASE_URL","resolveLimitMs","limitation","undefined","type","limit","FetchPersonaChatService","constructor","apiKey","options","_defineProperty","baseUrl","replace","headers","Authorization","post","path","body","response","fetch","method","JSON","stringify","ok","text","catch","status","parseJson","json","createVoiceConversation","params","chatId","namespace","chatConfig","conversationLanguage","data","url","conversationUrl","id","interactiveConversationId","createInteractiveConversation","endInteractiveConversation","conversationId","sendChatMessage","message","functionCallResults","attachments","includeCitations","queryChatMessages","_data$pagingMetadata","_params$limit","cursor","query","cursorPaging","messages","chatMessages","map","m","content","role","createdAt","nextCursor","pagingMetadata","cursors","next","parse"],"sources":["../../../src/services/FetchPersonaChatService.ts"],"sourcesContent":["import { HttpError } from '../types/http';\nimport type {\n IPersonaChatService,\n CreateConversationParams,\n ConversationResult,\n EndConversationParams,\n SendMessageParams,\n QueryMessagesParams,\n QueryMessagesResult,\n FunctionCall,\n ChatFunctionCall,\n ChatMessage,\n Limitation,\n} from '../types';\n\nexport const DEFAULT_BASE_URL = 'https://www.wixapis.com';\n\nexport interface FetchPersonaChatServiceOptions {\n /** API host, e.g. a local or test gateway. Defaults to https://www.wixapis.com. */\n baseUrl?: string;\n}\n\nfunction resolveLimitMs(limitation?: Limitation): number | undefined {\n if (!limitation) {\n return undefined;\n }\n switch (limitation.type) {\n case 'MINUTES':\n return (limitation.limit ?? 0) * 60 * 1000;\n case 'SECONDS':\n return (limitation.limit ?? 0) * 1000;\n case 'TOKENS':\n default:\n return 0;\n }\n}\n\nexport class FetchPersonaChatService implements IPersonaChatService {\n private readonly apiKey: string;\n private readonly baseUrl: string;\n\n /**\n * Server side only: a namespace API key skips owner checks and must never\n * reach a browser. A browser uses BearerPersonaChatService with a visitor token.\n */\n constructor(apiKey: string, options: FetchPersonaChatServiceOptions = {}) {\n this.apiKey = apiKey;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, '');\n }\n\n private headers(): Record<string, string> {\n return {\n 'Content-Type': 'application/json',\n Authorization: `Api-Key ${this.apiKey}`,\n };\n }\n\n private async post<T>(path: string, body: unknown): Promise<T> {\n const response = await fetch(`${this.baseUrl}${path}`, {\n method: 'POST',\n headers: this.headers(),\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => '');\n throw new HttpError(\n response.status,\n `Request failed: ${response.status} ${text}`,\n parseJson(text),\n );\n }\n\n return response.json() as Promise<T>;\n }\n\n async createVoiceConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult> {\n const { chatId, namespace, chatConfig, conversationLanguage } = params;\n\n const data = await this.post<{\n conversationUrl?: string;\n interactiveConversationId?: string;\n limitation?: Limitation;\n }>(\n `/_api/persona-chat-service/v1/chats/${chatId}/create-voice-conversation`,\n {\n namespace,\n ...(chatConfig ? { chatConfig } : {}),\n ...(conversationLanguage !== undefined ? { conversationLanguage } : {}),\n },\n );\n\n return {\n url: data.conversationUrl ?? '',\n id: data.interactiveConversationId ?? '',\n limit: resolveLimitMs(data.limitation),\n };\n }\n\n async createInteractiveConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult> {\n const { chatId, namespace, chatConfig, conversationLanguage } = params;\n\n const data = await this.post<{\n conversationUrl?: string;\n interactiveConversationId?: string;\n limitation?: Limitation;\n }>(\n `/_api/persona-chat-service/v1/chats/${chatId}/create-interactive-conversation`,\n {\n namespace,\n ...(chatConfig ? { chatConfig } : {}),\n ...(conversationLanguage !== undefined ? { conversationLanguage } : {}),\n },\n );\n\n return {\n url: data.conversationUrl ?? '',\n id: data.interactiveConversationId ?? '',\n limit: resolveLimitMs(data.limitation),\n };\n }\n\n async endInteractiveConversation(\n params: EndConversationParams,\n ): Promise<void> {\n const { chatId, conversationId, namespace } = params;\n\n await this.post(\n `/_api/persona-chat-service/v1/chats/${chatId}/end-interactive-conversation`,\n { namespace, interactiveConversationId: conversationId },\n ).catch(() => {\n // best-effort\n });\n }\n\n async sendChatMessage(params: SendMessageParams): Promise<{\n functionCalls?: (FunctionCall | ChatFunctionCall)[];\n messages?: ChatMessage[];\n }> {\n const {\n chatId,\n namespace,\n message,\n functionCallResults,\n chatConfig,\n attachments,\n conversationLanguage,\n includeCitations,\n } = params;\n\n return this.post<{\n functionCalls?: ChatFunctionCall[];\n messages?: ChatMessage[];\n }>(`/_api/persona-chat-service/v1/chats/${chatId}/messages`, {\n namespace,\n message,\n ...(functionCallResults ? { functionCallResults } : {}),\n ...(chatConfig ? { chatConfig } : {}),\n ...(attachments ? { attachments } : {}),\n ...(conversationLanguage !== undefined ? { conversationLanguage } : {}),\n ...(includeCitations !== undefined ? { includeCitations } : {}),\n });\n }\n\n async queryChatMessages(\n params: QueryMessagesParams,\n ): Promise<QueryMessagesResult> {\n const { chatId, namespace, limit = 100, cursor } = params;\n\n const data = await this.post<{\n chatMessages?: {\n id: string;\n content: string;\n role: string;\n createdAt?: string;\n }[];\n pagingMetadata?: { cursors?: { next?: string } };\n }>(`/_api/persona-chat-service/v1/chats/${chatId}/messages/query`, {\n namespace,\n query: { cursorPaging: { limit, ...(cursor ? { cursor } : {}) } },\n });\n\n return {\n messages: (data.chatMessages ?? []).map((m) => ({\n id: m.id,\n content: m.content,\n role: m.role as 'USER' | 'ASSISTANT',\n createdAt: m.createdAt,\n })),\n nextCursor: data.pagingMetadata?.cursors?.next,\n };\n }\n}\n\nfunction parseJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["../../../src/types/service.ts"],"sourcesContent":["export type FunctionCall = {\n functionCallId: string;\n name: string;\n arguments: string;\n};\n\nexport type FunctionCallResult = {\n functionCallId: string;\n result: string;\n error?: string;\n};\n\n/** A function call as persona-chat's text chat returns it. */\nexport type ChatFunctionCall = {\n id: string;\n name: string;\n arguments?: Record<string, unknown> | null;\n};\n\n/** A function call result as persona-chat's text chat expects it. */\nexport type ChatFunctionCallResult = {\n id: string;\n name: string;\n content: string;\n success: boolean;\n};\n\nexport type LimitationType = 'MINUTES' | 'SECONDS' | 'TOKENS';\n\nexport interface Limitation {\n type?: LimitationType;\n limit?: number;\n}\n\nexport interface ConversationResult {\n url: string;\n id: string;\n limit?: number;\n}\n\nexport interface CreateConversationParams {\n chatId: string;\n namespace: string;\n chatConfig?: object;\n /** Whether this is the visitor's first-ever conversation with the persona (drives the opening message). */\n firstConversation?: boolean;\n /** Title of the visitor's last meaningful conversation, for a returning-visitor greeting. */\n lastConversationTopic?: string;\n /** Language or locale for a new voice/video call, e.g. es or en-GB. Omit to keep the default behavior. */\n conversationLanguage?: string;\n}\n\nexport interface EndConversationParams {\n chatId: string;\n conversationId: string;\n namespace: string;\n}\n\nexport interface ChatMessageAttachment {\n fileName?: string;\n url?: string | null;\n mimeType?: string;\n textFileContent?: string | null;\n}\n\nexport interface AdditionalMetadata {\n key?: string | null;\n value?: string | null;\n excludeFromPrompt?: boolean | null;\n}\n\nexport interface SendMessageMetadata {\n additionalMetadata?: AdditionalMetadata[];\n}\n\nexport interface SendMessageParams {\n chatId: string;\n namespace: string;\n message: string;\n functionCallResults?: (FunctionCallResult | ChatFunctionCallResult)[];\n chatConfig?: object;\n attachments?: ChatMessageAttachment[];\n metadata?: SendMessageMetadata;\n /** Language or locale for the persona's text reply, e.g. es or en-GB. Omit to keep the default behavior. */\n conversationLanguage?: string;\n}\n\nexport interface ChatMessage {\n id: string;\n content: string;\n role: 'USER' | 'ASSISTANT';\n createdAt?: string;\n attachments?: ChatMessageAttachment[];\n}\n\nexport interface QueryMessagesParams {\n chatId: string;\n namespace: string;\n limit?: number;\n cursor?: string;\n}\n\nexport interface QueryMessagesResult {\n messages: ChatMessage[];\n nextCursor?: string;\n}\n\nexport interface IPersonaChatService {\n createVoiceConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult>;\n createInteractiveConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult>;\n endInteractiveConversation(params: EndConversationParams): Promise<void>;\n sendChatMessage(params: SendMessageParams): Promise<{\n functionCalls?: (FunctionCall | ChatFunctionCall)[];\n messages?: ChatMessage[];\n }>;\n queryChatMessages(params: QueryMessagesParams): Promise<QueryMessagesResult>;\n}\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["../../../src/types/service.ts"],"sourcesContent":["export type FunctionCall = {\n functionCallId: string;\n name: string;\n arguments: string;\n};\n\nexport type FunctionCallResult = {\n functionCallId: string;\n result: string;\n error?: string;\n};\n\n/** A function call as persona-chat's text chat returns it. */\nexport type ChatFunctionCall = {\n id: string;\n name: string;\n arguments?: Record<string, unknown> | null;\n};\n\n/** A function call result as persona-chat's text chat expects it. */\nexport type ChatFunctionCallResult = {\n id: string;\n name: string;\n content: string;\n success: boolean;\n};\n\nexport type LimitationType = 'MINUTES' | 'SECONDS' | 'TOKENS';\n\nexport interface Limitation {\n type?: LimitationType;\n limit?: number;\n}\n\nexport interface ConversationResult {\n url: string;\n id: string;\n limit?: number;\n}\n\nexport interface CreateConversationParams {\n chatId: string;\n namespace: string;\n chatConfig?: object;\n /** Whether this is the visitor's first-ever conversation with the persona (drives the opening message). */\n firstConversation?: boolean;\n /** Title of the visitor's last meaningful conversation, for a returning-visitor greeting. */\n lastConversationTopic?: string;\n /** Language or locale for a new voice/video call, e.g. es or en-GB. Omit to keep the default behavior. */\n conversationLanguage?: string;\n}\n\nexport interface EndConversationParams {\n chatId: string;\n conversationId: string;\n namespace: string;\n}\n\nexport interface ChatMessageAttachment {\n fileName?: string;\n url?: string | null;\n mimeType?: string;\n textFileContent?: string | null;\n}\n\nexport interface AdditionalMetadata {\n key?: string | null;\n value?: string | null;\n excludeFromPrompt?: boolean | null;\n}\n\nexport interface SendMessageMetadata {\n additionalMetadata?: AdditionalMetadata[];\n}\n\nexport interface SendMessageParams {\n chatId: string;\n namespace: string;\n message: string;\n functionCallResults?: (FunctionCallResult | ChatFunctionCallResult)[];\n chatConfig?: object;\n attachments?: ChatMessageAttachment[];\n metadata?: SendMessageMetadata;\n /** Language or locale for the persona's text reply, e.g. es or en-GB. Omit to keep the default behavior. */\n conversationLanguage?: string;\n /** Asks the backend for the Knowledge sources behind the answer. Honoured only in PREVIEW chats. */\n includeCitations?: boolean;\n}\n\nexport interface ChatMessage {\n id: string;\n content: string;\n role: 'USER' | 'ASSISTANT';\n createdAt?: string;\n attachments?: ChatMessageAttachment[];\n}\n\nexport interface QueryMessagesParams {\n chatId: string;\n namespace: string;\n limit?: number;\n cursor?: string;\n}\n\nexport interface QueryMessagesResult {\n messages: ChatMessage[];\n nextCursor?: string;\n}\n\nexport interface IPersonaChatService {\n createVoiceConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult>;\n createInteractiveConversation(\n params: CreateConversationParams,\n ): Promise<ConversationResult>;\n endInteractiveConversation(params: EndConversationParams): Promise<void>;\n sendChatMessage(params: SendMessageParams): Promise<{\n functionCalls?: (FunctionCall | ChatFunctionCall)[];\n messages?: ChatMessage[];\n }>;\n queryChatMessages(params: QueryMessagesParams): Promise<QueryMessagesResult>;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -8,7 +8,10 @@ export type LegendsPlatformProps = {
|
|
|
8
8
|
startupTelemetry?: StartupTelemetryOptions;
|
|
9
9
|
chatId: string;
|
|
10
10
|
namespace: string;
|
|
11
|
+
/** Server-side only: a namespace API key never reaches a browser (use personaChatService with a BearerPersonaChatService there). */
|
|
11
12
|
apiKey?: string;
|
|
13
|
+
/** API host for the apiKey service. Defaults to https://www.wixapis.com. */
|
|
14
|
+
baseUrl?: string;
|
|
12
15
|
personaChatService?: IPersonaChatService;
|
|
13
16
|
store?: Store;
|
|
14
17
|
tools?: ToolsRegistry;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LegendsPlatform.d.ts","sourceRoot":"","sources":["../../../../src/components/LegendsPlatform/LegendsPlatform.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAE/C,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAuB,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,iCAAiC,CAAC;AAEzC,MAAM,MAAM,oBAAoB,GAAG;IACjC,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,mBAAmB,CAAC;IACzC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,
|
|
1
|
+
{"version":3,"file":"LegendsPlatform.d.ts","sourceRoot":"","sources":["../../../../src/components/LegendsPlatform/LegendsPlatform.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA0B,MAAM,OAAO,CAAC;AAE/C,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAuB,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG/D,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,iCAAiC,CAAC;AAEzC,MAAM,MAAM,oBAAoB,GAAG;IACjC,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,oIAAoI;IACpI,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,mBAAmB,CAAC;IACzC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,eAAe,CAAC,KAAK,EAAE,oBAAoB,qBAwF1D"}
|