@wix/legends-platform-sdk 1.35.0 → 1.36.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.
Files changed (38) hide show
  1. package/README.md +18 -1
  2. package/dist/cjs/components/LegendsPlatform/LegendsPlatform.js +10 -7
  3. package/dist/cjs/components/LegendsPlatform/LegendsPlatform.js.map +1 -1
  4. package/dist/cjs/components/LegendsPlatformCore/LegendsPlatformCore.js +73 -0
  5. package/dist/cjs/components/LegendsPlatformCore/LegendsPlatformCore.js.map +1 -0
  6. package/dist/cjs/components/LegendsPlatformCore/index.js +10 -0
  7. package/dist/cjs/components/LegendsPlatformCore/index.js.map +1 -0
  8. package/dist/cjs/sdk.js +7 -1
  9. package/dist/cjs/sdk.js.map +1 -1
  10. package/dist/cjs/services/BearerPersonaChatService.js +187 -0
  11. package/dist/cjs/services/BearerPersonaChatService.js.map +1 -0
  12. package/dist/cjs/services/FetchPersonaChatService.js +10 -4
  13. package/dist/cjs/services/FetchPersonaChatService.js.map +1 -1
  14. package/dist/esm/components/LegendsPlatform/LegendsPlatform.js +5 -2
  15. package/dist/esm/components/LegendsPlatform/LegendsPlatform.js.map +1 -1
  16. package/dist/esm/components/LegendsPlatformCore/LegendsPlatformCore.js +40 -0
  17. package/dist/esm/components/LegendsPlatformCore/LegendsPlatformCore.js.map +1 -0
  18. package/dist/esm/components/LegendsPlatformCore/index.js +2 -0
  19. package/dist/esm/components/LegendsPlatformCore/index.js.map +1 -0
  20. package/dist/esm/sdk.js +2 -0
  21. package/dist/esm/sdk.js.map +1 -1
  22. package/dist/esm/services/BearerPersonaChatService.js +177 -0
  23. package/dist/esm/services/BearerPersonaChatService.js.map +1 -0
  24. package/dist/esm/services/FetchPersonaChatService.js +12 -3
  25. package/dist/esm/services/FetchPersonaChatService.js.map +1 -1
  26. package/dist/types/components/LegendsPlatform/LegendsPlatform.d.ts +3 -0
  27. package/dist/types/components/LegendsPlatform/LegendsPlatform.d.ts.map +1 -1
  28. package/dist/types/components/LegendsPlatformCore/LegendsPlatformCore.d.ts +23 -0
  29. package/dist/types/components/LegendsPlatformCore/LegendsPlatformCore.d.ts.map +1 -0
  30. package/dist/types/components/LegendsPlatformCore/index.d.ts +2 -0
  31. package/dist/types/components/LegendsPlatformCore/index.d.ts.map +1 -0
  32. package/dist/types/sdk.d.ts +4 -0
  33. package/dist/types/sdk.d.ts.map +1 -1
  34. package/dist/types/services/BearerPersonaChatService.d.ts +37 -0
  35. package/dist/types/services/BearerPersonaChatService.d.ts.map +1 -0
  36. package/dist/types/services/FetchPersonaChatService.d.ts +11 -1
  37. package/dist/types/services/FetchPersonaChatService.d.ts.map +1 -1
  38. package/package.json +2 -2
@@ -15,6 +15,7 @@ export function LegendsPlatform(props) {
15
15
  _props$tools = props.tools,
16
16
  tools = _props$tools === void 0 ? {} : _props$tools,
17
17
  apiKey = props.apiKey,
18
+ baseUrl = props.baseUrl,
18
19
  personaChatService = props.personaChatService;
19
20
  const store = useMemo(() => props.store || createStore(), [props.store]);
20
21
  const queryClient = useMemo(() => props.queryClient || new QueryClient({
@@ -30,10 +31,12 @@ export function LegendsPlatform(props) {
30
31
  return personaChatService;
31
32
  }
32
33
  if (apiKey) {
33
- return new FetchPersonaChatService(apiKey);
34
+ return new FetchPersonaChatService(apiKey, {
35
+ baseUrl
36
+ });
34
37
  }
35
38
  return undefined;
36
- }, [personaChatService, apiKey]);
39
+ }, [personaChatService, apiKey, baseUrl]);
37
40
  const telemetryRef = useRef(props.startupTelemetry);
38
41
  telemetryRef.current = props.startupTelemetry;
39
42
  const telemetryEnabled = (_props$startupTelemet = props.startupTelemetry) == null ? void 0 : _props$startupTelemet.enabled;
@@ -1 +1 @@
1
- {"version":3,"names":["React","useMemo","useRef","Provider","createStore","LiveKitRoom","QueryClientProvider","QueryClient","BusProvider","FetchPersonaChatService","SdkConsumerContext","StartupTelemetrySession","LegendsPlatform","props","_props$startupTelemet","_props$startupTelemet2","_props$startupTelemet3","chatId","namespace","children","className","_props$tools","tools","apiKey","personaChatService","store","queryClient","defaultOptions","queries","refetchOnMount","refetchOnWindowFocus","resolvedService","undefined","telemetryRef","startupTelemetry","current","telemetryEnabled","enabled","intentId","intent","id","attemptId","attempt","startupTelemetrySession","config","report","event","_telemetryRef$current","consumer","createElement","value","client","serverUrl","token"],"sources":["../../../../src/components/LegendsPlatform/LegendsPlatform.tsx"],"sourcesContent":["import React, { useMemo, useRef } from 'react';\nimport { Provider, createStore } from 'jotai';\nimport { type Store } from 'jotai/vanilla/store';\nimport { LiveKitRoom } from '@livekit/components-react';\nimport { QueryClientProvider, QueryClient } from '@tanstack/react-query';\nimport { Provider as BusProvider } from 'react-bus';\n\nimport type { ToolsRegistry } from '../../hooks/useTools/model/types';\nimport type { IPersonaChatService } from '../../types/service';\nimport { FetchPersonaChatService } from '../../services/FetchPersonaChatService';\nimport { SdkConsumerContext } from '../../sdk-consumer';\nimport {\n StartupTelemetrySession,\n type StartupTelemetryOptions,\n} from '../../startup-telemetry/attempt';\n\nexport type LegendsPlatformProps = {\n startupTelemetry?: StartupTelemetryOptions;\n chatId: string;\n namespace: string;\n apiKey?: string;\n personaChatService?: IPersonaChatService;\n store?: Store;\n tools?: ToolsRegistry;\n children: React.ReactNode;\n queryClient?: QueryClient;\n className?: string;\n};\n\nexport function LegendsPlatform(props: LegendsPlatformProps) {\n const {\n chatId,\n namespace,\n children,\n className,\n tools = {},\n apiKey,\n personaChatService,\n } = props;\n\n const store = useMemo(() => props.store || createStore(), [props.store]);\n\n const queryClient = useMemo(\n () =>\n props.queryClient ||\n new QueryClient({\n defaultOptions: {\n queries: { refetchOnMount: false, refetchOnWindowFocus: false },\n },\n }),\n [props.queryClient],\n );\n\n const resolvedService = useMemo<IPersonaChatService | undefined>(() => {\n if (personaChatService) {\n return personaChatService;\n }\n if (apiKey) {\n return new FetchPersonaChatService(apiKey);\n }\n return undefined;\n }, [personaChatService, apiKey]);\n\n const telemetryRef = useRef(props.startupTelemetry);\n telemetryRef.current = props.startupTelemetry;\n const telemetryEnabled = props.startupTelemetry?.enabled;\n const intentId = props.startupTelemetry?.intent?.id;\n const attemptId = props.startupTelemetry?.attempt?.id;\n const startupTelemetrySession = useMemo(() => {\n const config = telemetryRef.current;\n if (!telemetryEnabled || !config) {\n return undefined;\n }\n return new StartupTelemetrySession(\n {\n ...config,\n report: (event) => {\n if (telemetryRef.current?.enabled) {\n return telemetryRef.current.report?.(event);\n }\n return undefined;\n },\n },\n chatId,\n );\n // A new intent/attempt changes ownership; report callbacks stay live via the ref.\n }, [chatId, telemetryEnabled, intentId, attemptId]);\n\n const consumer = useMemo(\n () => ({\n chatId,\n namespace,\n tools,\n personaChatService: resolvedService,\n startupTelemetrySession,\n }),\n [chatId, namespace, tools, resolvedService, startupTelemetrySession],\n );\n\n return (\n <SdkConsumerContext.Provider value={consumer}>\n <QueryClientProvider client={queryClient}>\n <Provider store={store}>\n <BusProvider>\n <LiveKitRoom\n className={className}\n serverUrl={undefined}\n token={undefined}\n >\n {children}\n </LiveKitRoom>\n </BusProvider>\n </Provider>\n </QueryClientProvider>\n </SdkConsumerContext.Provider>\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useMemo","useRef","Provider","createStore","LiveKitRoom","QueryClientProvider","QueryClient","BusProvider","FetchPersonaChatService","SdkConsumerContext","StartupTelemetrySession","LegendsPlatform","props","_props$startupTelemet","_props$startupTelemet2","_props$startupTelemet3","chatId","namespace","children","className","_props$tools","tools","apiKey","baseUrl","personaChatService","store","queryClient","defaultOptions","queries","refetchOnMount","refetchOnWindowFocus","resolvedService","undefined","telemetryRef","startupTelemetry","current","telemetryEnabled","enabled","intentId","intent","id","attemptId","attempt","startupTelemetrySession","config","report","event","_telemetryRef$current","consumer","createElement","value","client","serverUrl","token"],"sources":["../../../../src/components/LegendsPlatform/LegendsPlatform.tsx"],"sourcesContent":["import React, { useMemo, useRef } from 'react';\nimport { Provider, createStore } from 'jotai';\nimport { type Store } from 'jotai/vanilla/store';\nimport { LiveKitRoom } from '@livekit/components-react';\nimport { QueryClientProvider, QueryClient } from '@tanstack/react-query';\nimport { Provider as BusProvider } from 'react-bus';\n\nimport type { ToolsRegistry } from '../../hooks/useTools/model/types';\nimport type { IPersonaChatService } from '../../types/service';\nimport { FetchPersonaChatService } from '../../services/FetchPersonaChatService';\nimport { SdkConsumerContext } from '../../sdk-consumer';\nimport {\n StartupTelemetrySession,\n type StartupTelemetryOptions,\n} from '../../startup-telemetry/attempt';\n\nexport type LegendsPlatformProps = {\n startupTelemetry?: StartupTelemetryOptions;\n chatId: string;\n namespace: string;\n /** Server-side only: a namespace API key never reaches a browser (use personaChatService with a BearerPersonaChatService there). */\n apiKey?: string;\n /** API host for the apiKey service. Defaults to https://www.wixapis.com. */\n baseUrl?: string;\n personaChatService?: IPersonaChatService;\n store?: Store;\n tools?: ToolsRegistry;\n children: React.ReactNode;\n queryClient?: QueryClient;\n className?: string;\n};\n\nexport function LegendsPlatform(props: LegendsPlatformProps) {\n const {\n chatId,\n namespace,\n children,\n className,\n tools = {},\n apiKey,\n baseUrl,\n personaChatService,\n } = props;\n\n const store = useMemo(() => props.store || createStore(), [props.store]);\n\n const queryClient = useMemo(\n () =>\n props.queryClient ||\n new QueryClient({\n defaultOptions: {\n queries: { refetchOnMount: false, refetchOnWindowFocus: false },\n },\n }),\n [props.queryClient],\n );\n\n const resolvedService = useMemo<IPersonaChatService | undefined>(() => {\n if (personaChatService) {\n return personaChatService;\n }\n if (apiKey) {\n return new FetchPersonaChatService(apiKey, { baseUrl });\n }\n return undefined;\n }, [personaChatService, apiKey, baseUrl]);\n\n const telemetryRef = useRef(props.startupTelemetry);\n telemetryRef.current = props.startupTelemetry;\n const telemetryEnabled = props.startupTelemetry?.enabled;\n const intentId = props.startupTelemetry?.intent?.id;\n const attemptId = props.startupTelemetry?.attempt?.id;\n const startupTelemetrySession = useMemo(() => {\n const config = telemetryRef.current;\n if (!telemetryEnabled || !config) {\n return undefined;\n }\n return new StartupTelemetrySession(\n {\n ...config,\n report: (event) => {\n if (telemetryRef.current?.enabled) {\n return telemetryRef.current.report?.(event);\n }\n return undefined;\n },\n },\n chatId,\n );\n // A new intent/attempt changes ownership; report callbacks stay live via the ref.\n }, [chatId, telemetryEnabled, intentId, attemptId]);\n\n const consumer = useMemo(\n () => ({\n chatId,\n namespace,\n tools,\n personaChatService: resolvedService,\n startupTelemetrySession,\n }),\n [chatId, namespace, tools, resolvedService, startupTelemetrySession],\n );\n\n return (\n <SdkConsumerContext.Provider value={consumer}>\n <QueryClientProvider client={queryClient}>\n <Provider store={store}>\n <BusProvider>\n <LiveKitRoom\n className={className}\n serverUrl={undefined}\n token={undefined}\n >\n {children}\n </LiveKitRoom>\n </BusProvider>\n </Provider>\n </QueryClientProvider>\n </SdkConsumerContext.Provider>\n );\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,40 @@
1
+ import React, { useMemo } from 'react';
2
+ import { Provider, createStore } from 'jotai';
3
+ import { QueryClientProvider, QueryClient } from '@tanstack/react-query';
4
+ import { Provider as BusProvider } from 'react-bus';
5
+ import { SdkConsumerContext } from '../../sdk-consumer';
6
+ /**
7
+ * The text-chat providers without LiveKit, from the main entry: for a page that
8
+ * loads LiveKit only when a call starts (`@wix/legends-platform-sdk/livekit/sdk`'s
9
+ * LegendsPlatform then wraps the call, with the same store and query client).
10
+ */
11
+ export function LegendsPlatformCore(props) {
12
+ const chatId = props.chatId,
13
+ namespace = props.namespace,
14
+ personaChatService = props.personaChatService,
15
+ tools = props.tools,
16
+ children = props.children;
17
+ const store = useMemo(() => props.store || createStore(), [props.store]);
18
+ const queryClient = useMemo(() => props.queryClient || new QueryClient({
19
+ defaultOptions: {
20
+ queries: {
21
+ refetchOnMount: false,
22
+ refetchOnWindowFocus: false
23
+ }
24
+ }
25
+ }), [props.queryClient]);
26
+ const consumer = useMemo(() => ({
27
+ chatId,
28
+ namespace,
29
+ tools: tools ?? {},
30
+ personaChatService
31
+ }), [chatId, namespace, tools, personaChatService]);
32
+ return /*#__PURE__*/React.createElement(SdkConsumerContext.Provider, {
33
+ value: consumer
34
+ }, /*#__PURE__*/React.createElement(QueryClientProvider, {
35
+ client: queryClient
36
+ }, /*#__PURE__*/React.createElement(Provider, {
37
+ store: store
38
+ }, /*#__PURE__*/React.createElement(BusProvider, null, children))));
39
+ }
40
+ //# sourceMappingURL=LegendsPlatformCore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","useMemo","Provider","createStore","QueryClientProvider","QueryClient","BusProvider","SdkConsumerContext","LegendsPlatformCore","props","chatId","namespace","personaChatService","tools","children","store","queryClient","defaultOptions","queries","refetchOnMount","refetchOnWindowFocus","consumer","createElement","value","client"],"sources":["../../../../src/components/LegendsPlatformCore/LegendsPlatformCore.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { Provider, createStore } from 'jotai';\nimport { type Store } from 'jotai/vanilla/store';\nimport { QueryClientProvider, QueryClient } from '@tanstack/react-query';\nimport { Provider as BusProvider } from 'react-bus';\n\nimport type { ToolsRegistry } from '../../hooks/useTools/model/types';\nimport type { IPersonaChatService } from '../../types/service';\nimport { SdkConsumerContext } from '../../sdk-consumer';\n\nexport type LegendsPlatformCoreProps = {\n chatId: string;\n namespace: string;\n /** Required: in a browser, a BearerPersonaChatService with the caller's own token. */\n personaChatService: IPersonaChatService;\n tools?: ToolsRegistry;\n /** Pass the same store and query client to LegendsPlatform when a call starts, to keep the chat state. */\n store?: Store;\n queryClient?: QueryClient;\n children: React.ReactNode;\n};\n\n/**\n * The text-chat providers without LiveKit, from the main entry: for a page that\n * loads LiveKit only when a call starts (`@wix/legends-platform-sdk/livekit/sdk`'s\n * LegendsPlatform then wraps the call, with the same store and query client).\n */\nexport function LegendsPlatformCore(props: LegendsPlatformCoreProps) {\n const { chatId, namespace, personaChatService, tools, children } = props;\n\n const store = useMemo(() => props.store || createStore(), [props.store]);\n const queryClient = useMemo(\n () =>\n props.queryClient ||\n new QueryClient({\n defaultOptions: {\n queries: { refetchOnMount: false, refetchOnWindowFocus: false },\n },\n }),\n [props.queryClient],\n );\n\n const consumer = useMemo(\n () => ({ chatId, namespace, tools: tools ?? {}, personaChatService }),\n [chatId, namespace, tools, personaChatService],\n );\n\n return (\n <SdkConsumerContext.Provider value={consumer}>\n <QueryClientProvider client={queryClient}>\n <Provider store={store}>\n <BusProvider>{children}</BusProvider>\n </Provider>\n </QueryClientProvider>\n </SdkConsumerContext.Provider>\n );\n}\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,OAAO,QAAQ,OAAO;AACtC,SAASC,QAAQ,EAAEC,WAAW,QAAQ,OAAO;AAE7C,SAASC,mBAAmB,EAAEC,WAAW,QAAQ,uBAAuB;AACxE,SAASH,QAAQ,IAAII,WAAW,QAAQ,WAAW;AAInD,SAASC,kBAAkB,QAAQ,oBAAoB;AAcvD;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,mBAAmBA,CAACC,KAA+B,EAAE;EACnE,MAAQC,MAAM,GAAqDD,KAAK,CAAhEC,MAAM;IAAEC,SAAS,GAA0CF,KAAK,CAAxDE,SAAS;IAAEC,kBAAkB,GAAsBH,KAAK,CAA7CG,kBAAkB;IAAEC,KAAK,GAAeJ,KAAK,CAAzBI,KAAK;IAAEC,QAAQ,GAAKL,KAAK,CAAlBK,QAAQ;EAE9D,MAAMC,KAAK,GAAGd,OAAO,CAAC,MAAMQ,KAAK,CAACM,KAAK,IAAIZ,WAAW,CAAC,CAAC,EAAE,CAACM,KAAK,CAACM,KAAK,CAAC,CAAC;EACxE,MAAMC,WAAW,GAAGf,OAAO,CACzB,MACEQ,KAAK,CAACO,WAAW,IACjB,IAAIX,WAAW,CAAC;IACdY,cAAc,EAAE;MACdC,OAAO,EAAE;QAAEC,cAAc,EAAE,KAAK;QAAEC,oBAAoB,EAAE;MAAM;IAChE;EACF,CAAC,CAAC,EACJ,CAACX,KAAK,CAACO,WAAW,CACpB,CAAC;EAED,MAAMK,QAAQ,GAAGpB,OAAO,CACtB,OAAO;IAAES,MAAM;IAAEC,SAAS;IAAEE,KAAK,EAAEA,KAAK,IAAI,CAAC,CAAC;IAAED;EAAmB,CAAC,CAAC,EACrE,CAACF,MAAM,EAAEC,SAAS,EAAEE,KAAK,EAAED,kBAAkB,CAC/C,CAAC;EAED,oBACEZ,KAAA,CAAAsB,aAAA,CAACf,kBAAkB,CAACL,QAAQ;IAACqB,KAAK,EAAEF;EAAS,gBAC3CrB,KAAA,CAAAsB,aAAA,CAAClB,mBAAmB;IAACoB,MAAM,EAAER;EAAY,gBACvChB,KAAA,CAAAsB,aAAA,CAACpB,QAAQ;IAACa,KAAK,EAAEA;EAAM,gBACrBf,KAAA,CAAAsB,aAAA,CAAChB,WAAW,QAAEQ,QAAsB,CAC5B,CACS,CACM,CAAC;AAElC","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export * from './LegendsPlatformCore';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["../../../../src/components/LegendsPlatformCore/index.ts"],"sourcesContent":["export * from './LegendsPlatformCore';\n"],"mappings":"AAAA,cAAc,uBAAuB","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
@@ -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,SACEA,mBAAmB,EACnBC,cAAc,QACT,6BAA6B","ignoreList":[]}
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,177 @@
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
+ const data = await this.request('POST', `${PERSONA_CHAT}/chat/messages`, {
130
+ chatId,
131
+ namespace,
132
+ ...(message ? {
133
+ message
134
+ } : {}),
135
+ ...(functionCallResults ? {
136
+ functionCallResults
137
+ } : {}),
138
+ ...(chatConfig ? {
139
+ chatConfig
140
+ } : {}),
141
+ ...(attachments ? {
142
+ attachments
143
+ } : {}),
144
+ ...(metadata ? {
145
+ metadata
146
+ } : {}),
147
+ ...(conversationLanguage !== undefined ? {
148
+ conversationLanguage
149
+ } : {})
150
+ });
151
+ return {
152
+ functionCalls: data.functionCalls,
153
+ messages: (data.messages ?? []).map(toMessage)
154
+ };
155
+ }
156
+ async queryChatMessages(params) {
157
+ var _data$pagingMetadata;
158
+ const chatId = params.chatId,
159
+ namespace = params.namespace,
160
+ _params$limit = params.limit,
161
+ limit = _params$limit === void 0 ? 100 : _params$limit,
162
+ cursor = params.cursor;
163
+ const query = new URLSearchParams({
164
+ namespace,
165
+ 'query.cursorPaging.limit': String(limit),
166
+ ...(cursor ? {
167
+ 'query.cursorPaging.cursor': cursor
168
+ } : {})
169
+ });
170
+ const data = await this.request('GET', `${PERSONA_CHAT}/chats/${encodeURIComponent(chatId)}/messages?${query}`);
171
+ return {
172
+ messages: (data.chatMessages ?? []).map(toMessage),
173
+ nextCursor: (_data$pagingMetadata = data.pagingMetadata) == null || (_data$pagingMetadata = _data$pagingMetadata.cursors) == null ? void 0 : _data$pagingMetadata.next
174
+ };
175
+ }
176
+ }
177
+ //# 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","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 } = 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 });\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 BASE_URL = 'https://www.wixapis.com';
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
- constructor(apiKey) {
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(`${BASE_URL}${path}`, {
39
+ const response = await fetch(`${this.baseUrl}${path}`, {
31
40
  method: 'POST',
32
41
  headers: this.headers(),
33
42
  body: JSON.stringify(body)
@@ -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","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 } = 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":[]}
@@ -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,qBAuF1D"}
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"}
@@ -0,0 +1,23 @@
1
+ import React from 'react';
2
+ import { type Store } from 'jotai/vanilla/store';
3
+ import { QueryClient } from '@tanstack/react-query';
4
+ import type { ToolsRegistry } from '../../hooks/useTools/model/types';
5
+ import type { IPersonaChatService } from '../../types/service';
6
+ export type LegendsPlatformCoreProps = {
7
+ chatId: string;
8
+ namespace: string;
9
+ /** Required: in a browser, a BearerPersonaChatService with the caller's own token. */
10
+ personaChatService: IPersonaChatService;
11
+ tools?: ToolsRegistry;
12
+ /** Pass the same store and query client to LegendsPlatform when a call starts, to keep the chat state. */
13
+ store?: Store;
14
+ queryClient?: QueryClient;
15
+ children: React.ReactNode;
16
+ };
17
+ /**
18
+ * The text-chat providers without LiveKit, from the main entry: for a page that
19
+ * loads LiveKit only when a call starts (`@wix/legends-platform-sdk/livekit/sdk`'s
20
+ * LegendsPlatform then wraps the call, with the same store and query client).
21
+ */
22
+ export declare function LegendsPlatformCore(props: LegendsPlatformCoreProps): React.JSX.Element;
23
+ //# sourceMappingURL=LegendsPlatformCore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LegendsPlatformCore.d.ts","sourceRoot":"","sources":["../../../../src/components/LegendsPlatformCore/LegendsPlatformCore.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,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,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,sFAAsF;IACtF,kBAAkB,EAAE,mBAAmB,CAAC;IACxC,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,0GAA0G;IAC1G,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,qBA6BlE"}
@@ -0,0 +1,2 @@
1
+ export * from './LegendsPlatformCore';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/LegendsPlatformCore/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
@@ -16,6 +16,10 @@ 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 type { BearerPersonaChatServiceOptions } from './services/BearerPersonaChatService';
21
+ export { LegendsPlatformCore } from './components/LegendsPlatformCore';
22
+ export type { LegendsPlatformCoreProps } from './components/LegendsPlatformCore';
19
23
  export { createStartupIntent, StartupAttempt, } from './startup-telemetry/attempt';
20
24
  export type { StartupIntent, StartupReport, StartupTelemetryOptions, } from './startup-telemetry/attempt';
21
25
  //# sourceMappingURL=sdk.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/sdk.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AAExB,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AAEjC,cAAc,sBAAsB,CAAC;AAErC,OAAO,EACL,mBAAmB,EACnB,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,aAAa,EACb,aAAa,EACb,uBAAuB,GACxB,MAAM,6BAA6B,CAAC"}
1
+ {"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../src/sdk.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AAExB,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AAEjC,cAAc,sBAAsB,CAAC;AAErC,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,YAAY,EAAE,+BAA+B,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,YAAY,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAEjF,OAAO,EACL,mBAAmB,EACnB,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,aAAa,EACb,aAAa,EACb,uBAAuB,GACxB,MAAM,6BAA6B,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { IPersonaChatService, CreateConversationParams, ConversationResult, EndConversationParams, SendMessageParams, QueryMessagesParams, QueryMessagesResult, ChatFunctionCall, ChatMessage } from '../types';
2
+ export interface BearerPersonaChatServiceOptions {
3
+ /** API host. Defaults to https://www.wixapis.com. */
4
+ baseUrl?: string;
5
+ /**
6
+ * The caller's own access token, e.g. a visitor token minted by the Legend's
7
+ * sign-in app. Sent as the Authorization header, the way Wix's headless
8
+ * clients send it. Called for every request, so a refreshed token is used.
9
+ */
10
+ getAccessToken: () => string | Promise<string>;
11
+ /**
12
+ * Called once when a request answers 401. Refresh the token and resolve true
13
+ * to retry the request with the new token; resolve false to fail it.
14
+ */
15
+ onUnauthorized?: () => Promise<boolean>;
16
+ }
17
+ /**
18
+ * The persona-chat service for a browser: authenticated with the caller's own
19
+ * bearer token (never a namespace API key), on the same REST paths the
20
+ * Legend's own page uses for a visitor.
21
+ */
22
+ export declare class BearerPersonaChatService implements IPersonaChatService {
23
+ private readonly options;
24
+ private readonly baseUrl;
25
+ constructor(options: BearerPersonaChatServiceOptions);
26
+ private request;
27
+ private createConversation;
28
+ createVoiceConversation(params: CreateConversationParams): Promise<ConversationResult>;
29
+ createInteractiveConversation(params: CreateConversationParams): Promise<ConversationResult>;
30
+ endInteractiveConversation(params: EndConversationParams): Promise<void>;
31
+ sendChatMessage(params: SendMessageParams): Promise<{
32
+ functionCalls?: ChatFunctionCall[];
33
+ messages?: ChatMessage[];
34
+ }>;
35
+ queryChatMessages(params: QueryMessagesParams): Promise<QueryMessagesResult>;
36
+ }
37
+ //# sourceMappingURL=BearerPersonaChatService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BearerPersonaChatService.d.ts","sourceRoot":"","sources":["../../../src/services/BearerPersonaChatService.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EAEZ,MAAM,UAAU,CAAC;AAGlB,MAAM,WAAW,+BAA+B;IAC9C,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,cAAc,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CACzC;AA8CD;;;;GAIG;AACH,qBAAa,wBAAyB,YAAW,mBAAmB;IAGtD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAEJ,OAAO,EAAE,+BAA+B;YAIvD,OAAO;YAqCP,kBAAkB;IA8BhC,uBAAuB,CACrB,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,kBAAkB,CAAC;IAI9B,6BAA6B,CAC3B,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,kBAAkB,CAAC;IAIxB,0BAA0B,CAC9B,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,IAAI,CAAC;IAaV,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC;QACxD,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC;QACnC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;KAC1B,CAAC;IA8BI,iBAAiB,CACrB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC;CAmBhC"}
@@ -1,7 +1,17 @@
1
1
  import type { IPersonaChatService, CreateConversationParams, ConversationResult, EndConversationParams, SendMessageParams, QueryMessagesParams, QueryMessagesResult, FunctionCall, ChatFunctionCall, ChatMessage } from '../types';
2
+ export declare const DEFAULT_BASE_URL = "https://www.wixapis.com";
3
+ export interface FetchPersonaChatServiceOptions {
4
+ /** API host, e.g. a local or test gateway. Defaults to https://www.wixapis.com. */
5
+ baseUrl?: string;
6
+ }
2
7
  export declare class FetchPersonaChatService implements IPersonaChatService {
3
8
  private readonly apiKey;
4
- constructor(apiKey: string);
9
+ private readonly baseUrl;
10
+ /**
11
+ * Server side only: a namespace API key skips owner checks and must never
12
+ * reach a browser. A browser uses BearerPersonaChatService with a visitor token.
13
+ */
14
+ constructor(apiKey: string, options?: FetchPersonaChatServiceOptions);
5
15
  private headers;
6
16
  private post;
7
17
  createVoiceConversation(params: CreateConversationParams): Promise<ConversationResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"FetchPersonaChatService.d.ts","sourceRoot":"","sources":["../../../src/services/FetchPersonaChatService.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,WAAW,EAEZ,MAAM,UAAU,CAAC;AAmBlB,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;gBAEpB,MAAM,EAAE,MAAM;IAI1B,OAAO,CAAC,OAAO;YAOD,IAAI;IAmBZ,uBAAuB,CAC3B,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,kBAAkB,CAAC;IAuBxB,6BAA6B,CACjC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,kBAAkB,CAAC;IAuBxB,0BAA0B,CAC9B,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,IAAI,CAAC;IAWV,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC;QACxD,aAAa,CAAC,EAAE,CAAC,YAAY,GAAG,gBAAgB,CAAC,EAAE,CAAC;QACpD,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;KAC1B,CAAC;IAwBI,iBAAiB,CACrB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC;CA0BhC"}
1
+ {"version":3,"file":"FetchPersonaChatService.d.ts","sourceRoot":"","sources":["../../../src/services/FetchPersonaChatService.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EACnB,wBAAwB,EACxB,kBAAkB,EAClB,qBAAqB,EACrB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,WAAW,EAEZ,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,gBAAgB,4BAA4B,CAAC;AAE1D,MAAM,WAAW,8BAA8B;IAC7C,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAiBD,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC;;;OAGG;gBACS,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,8BAAmC;IAKxE,OAAO,CAAC,OAAO;YAOD,IAAI;IAmBZ,uBAAuB,CAC3B,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,kBAAkB,CAAC;IAuBxB,6BAA6B,CACjC,MAAM,EAAE,wBAAwB,GAC/B,OAAO,CAAC,kBAAkB,CAAC;IAuBxB,0BAA0B,CAC9B,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,IAAI,CAAC;IAWV,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC;QACxD,aAAa,CAAC,EAAE,CAAC,YAAY,GAAG,gBAAgB,CAAC,EAAE,CAAC;QACpD,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;KAC1B,CAAC;IAwBI,iBAAiB,CACrB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,mBAAmB,CAAC;CA0BhC"}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.35.0",
2
+ "version": "1.36.0",
3
3
  "name": "@wix/legends-platform-sdk",
4
4
  "license": "MIT",
5
5
  "author": {
@@ -103,5 +103,5 @@
103
103
  "wallaby": {
104
104
  "autoDetect": true
105
105
  },
106
- "falconPackageHash": "a60e1d005efde7754c396cadf3ef9f8f53bcac058a2f2a3b2d17f313"
106
+ "falconPackageHash": "4f974d90de9401ebfbe0a6cd71f0ee0242f5fa87cb45ad31825e1c22"
107
107
  }