@rapidaai/react 1.1.27

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 (60) hide show
  1. package/LICENSE +21 -0
  2. package/dist/chunk-32YFHJN5.mjs +59 -0
  3. package/dist/chunk-32YFHJN5.mjs.map +1 -0
  4. package/dist/chunk-3YJ3G4GZ.mjs +77 -0
  5. package/dist/chunk-3YJ3G4GZ.mjs.map +1 -0
  6. package/dist/chunk-AB3ZXSEN.mjs +27569 -0
  7. package/dist/chunk-AB3ZXSEN.mjs.map +1 -0
  8. package/dist/chunk-GFACTURU.mjs +50 -0
  9. package/dist/chunk-GFACTURU.mjs.map +1 -0
  10. package/dist/chunk-Q4OXFE34.mjs +88 -0
  11. package/dist/chunk-Q4OXFE34.mjs.map +1 -0
  12. package/dist/chunk-WT7OUEDJ.mjs +50 -0
  13. package/dist/chunk-WT7OUEDJ.mjs.map +1 -0
  14. package/dist/components/connection-status.d.mts +7 -0
  15. package/dist/components/connection-status.d.ts +7 -0
  16. package/dist/components/connection-status.js +25321 -0
  17. package/dist/components/connection-status.js.map +1 -0
  18. package/dist/components/connection-status.mjs +34 -0
  19. package/dist/components/connection-status.mjs.map +1 -0
  20. package/dist/components/device-selector.d.mts +5 -0
  21. package/dist/components/device-selector.d.ts +5 -0
  22. package/dist/components/device-selector.js +26800 -0
  23. package/dist/components/device-selector.js.map +1 -0
  24. package/dist/components/device-selector.mjs +99 -0
  25. package/dist/components/device-selector.mjs.map +1 -0
  26. package/dist/components/live-transcript.d.mts +16 -0
  27. package/dist/components/live-transcript.d.ts +16 -0
  28. package/dist/components/live-transcript.js +25376 -0
  29. package/dist/components/live-transcript.js.map +1 -0
  30. package/dist/components/live-transcript.mjs +9 -0
  31. package/dist/components/live-transcript.mjs.map +1 -0
  32. package/dist/components/text/conversations/index.d.mts +2 -0
  33. package/dist/components/text/conversations/index.d.ts +2 -0
  34. package/dist/components/text/conversations/index.js +25344 -0
  35. package/dist/components/text/conversations/index.js.map +1 -0
  36. package/dist/components/text/conversations/index.mjs +9 -0
  37. package/dist/components/text/conversations/index.mjs.map +1 -0
  38. package/dist/components/text/index.d.mts +2 -0
  39. package/dist/components/text/index.d.ts +2 -0
  40. package/dist/components/text/index.js +25344 -0
  41. package/dist/components/text/index.js.map +1 -0
  42. package/dist/components/text/index.mjs +9 -0
  43. package/dist/components/text/index.mjs.map +1 -0
  44. package/dist/components/visualization/agent-multiband-audio-visualizer.d.mts +18 -0
  45. package/dist/components/visualization/agent-multiband-audio-visualizer.d.ts +18 -0
  46. package/dist/components/visualization/agent-multiband-audio-visualizer.js +119 -0
  47. package/dist/components/visualization/agent-multiband-audio-visualizer.js.map +1 -0
  48. package/dist/components/visualization/agent-multiband-audio-visualizer.mjs +8 -0
  49. package/dist/components/visualization/agent-multiband-audio-visualizer.mjs.map +1 -0
  50. package/dist/index-0bkcyQsE.d.mts +79 -0
  51. package/dist/index-0bkcyQsE.d.ts +79 -0
  52. package/dist/index.d.mts +17707 -0
  53. package/dist/index.d.ts +17707 -0
  54. package/dist/index.js +66000 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/index.mjs +38213 -0
  57. package/dist/index.mjs.map +1 -0
  58. package/dist/styles/index.css +656 -0
  59. package/package.json +117 -0
  60. package/readme.md +127 -0
@@ -0,0 +1,50 @@
1
+ import {
2
+ agentMessageChangeEventObserver,
3
+ useMaybeVoiceAgent
4
+ } from "./chunk-AB3ZXSEN.mjs";
5
+ import {
6
+ cn
7
+ } from "./chunk-32YFHJN5.mjs";
8
+
9
+ // src/components/text/conversations/index.tsx
10
+ import React, { useEffect, useRef, useState } from "react";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ var Conversation = ({
13
+ className,
14
+ MessageWrapper,
15
+ intialConversations = []
16
+ }) => {
17
+ const [chats, setChats] = useState([]);
18
+ const ctrRef = useRef(null);
19
+ const [_, setChanged] = useState(false);
20
+ const agentContext = useMaybeVoiceAgent();
21
+ React.useEffect(() => {
22
+ const serverEventListner = agentMessageChangeEventObserver(
23
+ agentContext
24
+ ).subscribe((agentEvents) => {
25
+ setChats([...intialConversations, ...agentEvents.chats]);
26
+ setChanged((prevChanged) => !prevChanged);
27
+ });
28
+ return () => {
29
+ serverEventListner.unsubscribe();
30
+ };
31
+ }, [agentContext]);
32
+ const scrollTo = (ref) => {
33
+ setTimeout(
34
+ () => ref.current?.scrollIntoView({ inline: "center", behavior: "smooth" }),
35
+ 777
36
+ );
37
+ };
38
+ useEffect(() => {
39
+ scrollTo(ctrRef);
40
+ }, [JSON.stringify(chats)]);
41
+ return /* @__PURE__ */ jsxs("ul", { className: cn(className), children: [
42
+ chats.map((chat, idx) => /* @__PURE__ */ jsx(MessageWrapper, { message: chat }, `msg-idx-${idx}`)),
43
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx("div", { ref: ctrRef }) })
44
+ ] });
45
+ };
46
+
47
+ export {
48
+ Conversation
49
+ };
50
+ //# sourceMappingURL=chunk-GFACTURU.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/text/conversations/index.tsx"],"sourcesContent":["/*\n * Copyright (c) 2024. Rapida\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * Author: Prashant <prashant@rapida.ai>\n *\n */\nimport { agentMessageChangeEventObserver } from \"@/rapida/hooks/observables/voice-agent\";\nimport { Message } from \"@/rapida/agents/message\";\nimport { useMaybeVoiceAgent } from \"@/rapida/hooks/use-voice-agent\";\nimport { cn } from \"@/rapida/styles\";\nimport React, { FC, HTMLAttributes, useEffect, useRef, useState } from \"react\";\n\n/**\n * Props for the Conversation component.\n * @interface ConversationProps\n * @extends HTMLAttributes<HTMLDivElement>\n */\ninterface ConversationProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * A React component used to wrap individual messages.\n * It should accept props of type HTMLAttributes<HTMLLIElement> and a 'message' prop of type Message.\n */\n MessageWrapper: React.ComponentType<\n HTMLAttributes<HTMLLIElement> & { message: Message }\n >;\n\n /**\n * An optional array of initial messages to populate the conversation.\n */\n intialConversations?: Message[];\n}\n\nexport const Conversation: FC<ConversationProps> = ({\n className,\n MessageWrapper,\n intialConversations = [],\n}) => {\n const [chats, setChats] = useState<Message[]>([]);\n const ctrRef = useRef<HTMLDivElement>(null);\n const [_, setChanged] = useState(false);\n const agentContext = useMaybeVoiceAgent();\n //\n React.useEffect(() => {\n const serverEventListner = agentMessageChangeEventObserver(\n agentContext!\n ).subscribe((agentEvents) => {\n setChats([...intialConversations, ...agentEvents.chats]);\n setChanged((prevChanged) => !prevChanged);\n });\n\n return () => {\n serverEventListner.unsubscribe();\n };\n }, [agentContext]);\n\n const scrollTo = (ref) => {\n setTimeout(\n () =>\n ref.current?.scrollIntoView({ inline: \"center\", behavior: \"smooth\" }),\n 777\n );\n };\n\n // on change of message to scroll\n useEffect(() => {\n scrollTo(ctrRef);\n }, [JSON.stringify(chats)]);\n\n return (\n <ul className={cn(className)}>\n {chats.map((chat, idx) => (\n <MessageWrapper key={`msg-idx-${idx}`} message={chat} />\n ))}\n <li>\n <div ref={ctrRef} />\n </li>\n </ul>\n );\n};\n"],"mappings":";;;;;;;;;AA4BA,OAAO,SAA6B,WAAW,QAAQ,gBAAgB;AA2DnE,SAEI,KAFJ;AArCG,IAAM,eAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA,sBAAsB,CAAC;AACzB,MAAM;AACJ,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAoB,CAAC,CAAC;AAChD,QAAM,SAAS,OAAuB,IAAI;AAC1C,QAAM,CAAC,GAAG,UAAU,IAAI,SAAS,KAAK;AACtC,QAAM,eAAe,mBAAmB;AAExC,QAAM,UAAU,MAAM;AACpB,UAAM,qBAAqB;AAAA,MACzB;AAAA,IACF,EAAE,UAAU,CAAC,gBAAgB;AAC3B,eAAS,CAAC,GAAG,qBAAqB,GAAG,YAAY,KAAK,CAAC;AACvD,iBAAW,CAAC,gBAAgB,CAAC,WAAW;AAAA,IAC1C,CAAC;AAED,WAAO,MAAM;AACX,yBAAmB,YAAY;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,WAAW,CAAC,QAAQ;AACxB;AAAA,MACE,MACE,IAAI,SAAS,eAAe,EAAE,QAAQ,UAAU,UAAU,SAAS,CAAC;AAAA,MACtE;AAAA,IACF;AAAA,EACF;AAGA,YAAU,MAAM;AACd,aAAS,MAAM;AAAA,EACjB,GAAG,CAAC,KAAK,UAAU,KAAK,CAAC,CAAC;AAE1B,SACE,qBAAC,QAAG,WAAW,GAAG,SAAS,GACxB;AAAA,UAAM,IAAI,CAAC,MAAM,QAChB,oBAAC,kBAAsC,SAAS,QAA3B,WAAW,GAAG,EAAmB,CACvD;AAAA,IACD,oBAAC,QACC,8BAAC,SAAI,KAAK,QAAQ,GACpB;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,88 @@
1
+ import {
2
+ agentInputMediaDeviceChangeObservable,
3
+ browserMediaDeviceObserver,
4
+ useMaybeVoiceAgent
5
+ } from "./chunk-AB3ZXSEN.mjs";
6
+
7
+ // src/hooks/use-select-input-device-agent.ts
8
+ import * as React2 from "react";
9
+
10
+ // src/hooks/use-observable-state.ts
11
+ import * as React from "react";
12
+ function useObservableState(observable, startWith, resetWhenObservableChanges = true) {
13
+ const [state, setState] = React.useState(startWith);
14
+ React.useEffect(() => {
15
+ if (resetWhenObservableChanges) {
16
+ setState(startWith);
17
+ }
18
+ if (typeof window === "undefined" || !observable) return;
19
+ const subscription = observable.subscribe(setState);
20
+ return () => subscription.unsubscribe();
21
+ }, [observable, resetWhenObservableChanges]);
22
+ return state;
23
+ }
24
+
25
+ // src/hooks/use-select-input-device-agent.ts
26
+ import { BehaviorSubject } from "rxjs";
27
+ function useSelectInputDeviceAgent({
28
+ requestPermissions,
29
+ onError
30
+ }) {
31
+ const voiceAgentContext = useMaybeVoiceAgent();
32
+ const deviceObserver = React2.useMemo(
33
+ () => browserMediaDeviceObserver("audioinput", onError, requestPermissions),
34
+ [requestPermissions, onError]
35
+ );
36
+ const devices = useObservableState(
37
+ deviceObserver,
38
+ []
39
+ );
40
+ const [currentDeviceId, setCurrentDeviceId] = React2.useState(
41
+ voiceAgentContext?.inputMediaDevice ?? ""
42
+ );
43
+ const { className, activeDeviceObservable, setActiveMediaDevice } = React2.useMemo(
44
+ () => setupDeviceSelector("audioinput", voiceAgentContext),
45
+ [voiceAgentContext]
46
+ );
47
+ React2.useEffect(() => {
48
+ const listener = activeDeviceObservable.subscribe((deviceId) => {
49
+ if (deviceId && deviceId !== currentDeviceId) {
50
+ setCurrentDeviceId(deviceId);
51
+ }
52
+ });
53
+ return () => {
54
+ listener?.unsubscribe();
55
+ };
56
+ }, [activeDeviceObservable]);
57
+ return {
58
+ devices,
59
+ className,
60
+ activeDeviceId: currentDeviceId,
61
+ setActiveMediaDevice
62
+ };
63
+ }
64
+ function setupDeviceSelector(_, agent) {
65
+ const activeDeviceSubject = new BehaviorSubject(
66
+ void 0
67
+ );
68
+ const activeDeviceObservable = agent ? agentInputMediaDeviceChangeObservable(agent) : activeDeviceSubject.asObservable();
69
+ const setActiveMediaDevice = async (id) => {
70
+ if (agent) {
71
+ await agent.setInputMediaDevice(id);
72
+ } else if (activeDeviceSubject.value !== id) {
73
+ activeDeviceSubject.next(id);
74
+ }
75
+ };
76
+ const className = "media-device-select";
77
+ return {
78
+ className,
79
+ activeDeviceObservable,
80
+ setActiveMediaDevice
81
+ };
82
+ }
83
+
84
+ export {
85
+ useObservableState,
86
+ useSelectInputDeviceAgent
87
+ };
88
+ //# sourceMappingURL=chunk-Q4OXFE34.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-select-input-device-agent.ts","../src/hooks/use-observable-state.ts"],"sourcesContent":["/*\n * Copyright (c) 2024. Rapida\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * Author: Prashant <prashant@rapida.ai>\n *\n */\nimport * as React from \"react\";\nimport { useObservableState } from \"@/rapida/hooks/use-observable-state\";\nimport { BehaviorSubject } from \"rxjs\";\nimport {\n browserMediaDeviceObserver,\n agentInputMediaDeviceChangeObservable,\n} from \"@/rapida/hooks/observables/voice-agent\";\nimport { useMaybeVoiceAgent } from \"@/rapida/hooks/use-voice-agent\";\nimport { VoiceAgent } from \"@/rapida/agents/voice-agent\";\n\n/** @public */\ninterface UseMediaDeviceSelectProps {\n /**\n * this will call getUserMedia if the permissions are not yet given to enumerate the devices with device labels.\n * in some browsers multiple calls to getUserMedia result in multiple permission prompts.\n * It's generally advised only flip this to true, once a (preview) track has been acquired successfully with the\n * appropriate permissions.\n *\n * @see {@link MediaDeviceMenu}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices | MDN enumerateDevices}\n */\n requestPermissions?: boolean;\n /**\n * this callback gets called if an error is thrown when failing to select a device and also if a user\n * denied permissions, eventhough the `requestPermissions` option is set to `true`.\n * Most commonly this will emit a MediaDeviceError\n */\n onError?: (e: Error) => void;\n}\n\n/**\n * The `useMediaDeviceSelect` hook is used to implement the `MediaDeviceSelect` component and\n * returns o.a. the list of devices of a given kind (audioinput or videoinput), the currently active device\n * and a function to set the the active device.\n *\n * @example\n * ```tsx\n * const { devices, activeDeviceId, setActiveMediaDevice } = useMediaDeviceSelect({kind: 'audioinput'});\n * ```\n * @public\n */\nexport function useSelectInputDeviceAgent({\n requestPermissions,\n onError,\n}: UseMediaDeviceSelectProps) {\n const voiceAgentContext = useMaybeVoiceAgent();\n // List of all devices.\n const deviceObserver = React.useMemo(\n () => browserMediaDeviceObserver(\"audioinput\", onError, requestPermissions),\n [requestPermissions, onError]\n );\n // @ts-ignore\n const devices: MediaDeviceInfo[] = useObservableState(\n deviceObserver,\n [] as MediaDeviceInfo[]\n );\n //\n const [currentDeviceId, setCurrentDeviceId] = React.useState<string>(\n voiceAgentContext?.inputMediaDevice ?? \"\"\n );\n const { className, activeDeviceObservable, setActiveMediaDevice } =\n React.useMemo(\n () => setupDeviceSelector(\"audioinput\", voiceAgentContext),\n [voiceAgentContext]\n );\n\n React.useEffect(() => {\n const listener = activeDeviceObservable.subscribe((deviceId) => {\n if (deviceId && deviceId !== currentDeviceId) {\n setCurrentDeviceId(deviceId);\n }\n });\n return () => {\n listener?.unsubscribe();\n };\n }, [activeDeviceObservable]);\n\n return {\n devices,\n className,\n activeDeviceId: currentDeviceId,\n setActiveMediaDevice,\n };\n}\n\nfunction setupDeviceSelector(_: MediaDeviceKind, agent?: VoiceAgent) {\n const activeDeviceSubject = new BehaviorSubject<string | undefined>(\n undefined\n );\n\n const activeDeviceObservable = agent\n ? agentInputMediaDeviceChangeObservable(agent)\n : activeDeviceSubject.asObservable();\n\n const setActiveMediaDevice = async (id: string) => {\n if (agent) {\n await agent.setInputMediaDevice(id);\n } else if (activeDeviceSubject.value !== id) {\n activeDeviceSubject.next(id);\n }\n };\n const className: string = \"media-device-select\";\n return {\n className,\n activeDeviceObservable,\n setActiveMediaDevice,\n };\n}\n","/*\n * Copyright (c) 2024. Rapida\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * Author: Prashant <prashant@rapida.ai>\n *\n */\nimport * as React from \"react\";\n// @ts-ignore\nimport type { Observable } from \"rxjs\";\n\n/**\n * @internal\n */\nexport function useObservableState<T>(\n observable: Observable<T> | undefined,\n startWith: T,\n resetWhenObservableChanges = true\n): T {\n const [state, setState] = React.useState<T>(startWith);\n React.useEffect(() => {\n if (resetWhenObservableChanges) {\n setState(startWith);\n }\n // observable state doesn't run in SSR\n if (typeof window === \"undefined\" || !observable) return;\n const subscription = observable.subscribe(setState);\n //\n return () => subscription.unsubscribe();\n }, [observable, resetWhenObservableChanges]);\n return state;\n}\n"],"mappings":";;;;;;;AAwBA,YAAYA,YAAW;;;ACAvB,YAAY,WAAW;AAOhB,SAAS,mBACd,YACA,WACA,6BAA6B,MAC1B;AACH,QAAM,CAAC,OAAO,QAAQ,IAAU,eAAY,SAAS;AACrD,EAAM,gBAAU,MAAM;AACpB,QAAI,4BAA4B;AAC9B,eAAS,SAAS;AAAA,IACpB;AAEA,QAAI,OAAO,WAAW,eAAe,CAAC,WAAY;AAClD,UAAM,eAAe,WAAW,UAAU,QAAQ;AAElD,WAAO,MAAM,aAAa,YAAY;AAAA,EACxC,GAAG,CAAC,YAAY,0BAA0B,CAAC;AAC3C,SAAO;AACT;;;ADtBA,SAAS,uBAAuB;AAuCzB,SAAS,0BAA0B;AAAA,EACxC;AAAA,EACA;AACF,GAA8B;AAC5B,QAAM,oBAAoB,mBAAmB;AAE7C,QAAM,iBAAuB;AAAA,IAC3B,MAAM,2BAA2B,cAAc,SAAS,kBAAkB;AAAA,IAC1E,CAAC,oBAAoB,OAAO;AAAA,EAC9B;AAEA,QAAM,UAA6B;AAAA,IACjC;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,CAAC,iBAAiB,kBAAkB,IAAU;AAAA,IAClD,mBAAmB,oBAAoB;AAAA,EACzC;AACA,QAAM,EAAE,WAAW,wBAAwB,qBAAqB,IACxD;AAAA,IACJ,MAAM,oBAAoB,cAAc,iBAAiB;AAAA,IACzD,CAAC,iBAAiB;AAAA,EACpB;AAEF,EAAM,iBAAU,MAAM;AACpB,UAAM,WAAW,uBAAuB,UAAU,CAAC,aAAa;AAC9D,UAAI,YAAY,aAAa,iBAAiB;AAC5C,2BAAmB,QAAQ;AAAA,MAC7B;AAAA,IACF,CAAC;AACD,WAAO,MAAM;AACX,gBAAU,YAAY;AAAA,IACxB;AAAA,EACF,GAAG,CAAC,sBAAsB,CAAC;AAE3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,GAAoB,OAAoB;AACnE,QAAM,sBAAsB,IAAI;AAAA,IAC9B;AAAA,EACF;AAEA,QAAM,yBAAyB,QAC3B,sCAAsC,KAAK,IAC3C,oBAAoB,aAAa;AAErC,QAAM,uBAAuB,OAAO,OAAe;AACjD,QAAI,OAAO;AACT,YAAM,MAAM,oBAAoB,EAAE;AAAA,IACpC,WAAW,oBAAoB,UAAU,IAAI;AAC3C,0BAAoB,KAAK,EAAE;AAAA,IAC7B;AAAA,EACF;AACA,QAAM,YAAoB;AAC1B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":["React"]}
@@ -0,0 +1,50 @@
1
+ import {
2
+ agentConnectionStateObservable,
3
+ agentServerEventObserver,
4
+ toContentText,
5
+ useMaybeVoiceAgent
6
+ } from "./chunk-AB3ZXSEN.mjs";
7
+ import {
8
+ cn
9
+ } from "./chunk-32YFHJN5.mjs";
10
+
11
+ // src/components/live-transcript.tsx
12
+ import React, { useState } from "react";
13
+ import { jsx } from "react/jsx-runtime";
14
+ var AgentLiveTranscript = ({
15
+ className,
16
+ placeholder
17
+ }) => {
18
+ const agentContext = useMaybeVoiceAgent();
19
+ const [connected, setConnected] = useState(false);
20
+ const [transcript, setTranscript] = useState("");
21
+ React.useEffect(() => {
22
+ const listener = agentConnectionStateObservable(agentContext).subscribe(
23
+ (x) => {
24
+ setConnected(x.isConnected);
25
+ }
26
+ );
27
+ return () => listener.unsubscribe();
28
+ }, [agentContext]);
29
+ React.useEffect(() => {
30
+ const serverEventListner = agentServerEventObserver(
31
+ agentContext
32
+ ).subscribe((agentEvents) => {
33
+ if (agentEvents?.eventType === "talk.onTranscript" /* Transcript */) {
34
+ if (agentEvents.argument) {
35
+ let arg = agentEvents.argument;
36
+ setTranscript(toContentText(arg.getMessage()?.getContentsList()));
37
+ }
38
+ }
39
+ });
40
+ return () => {
41
+ serverEventListner.unsubscribe();
42
+ };
43
+ }, [agentContext]);
44
+ return /* @__PURE__ */ jsx("div", { className: cn(className), children: !connected ? placeholder : transcript ? transcript : placeholder });
45
+ };
46
+
47
+ export {
48
+ AgentLiveTranscript
49
+ };
50
+ //# sourceMappingURL=chunk-WT7OUEDJ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/live-transcript.tsx"],"sourcesContent":["/*\n * Copyright (c) 2024. Rapida\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * Author: Prashant <prashant@rapida.ai>\n *\n */\nimport {\n agentConnectionStateObservable,\n agentServerEventObserver,\n} from \"@/rapida/hooks/observables/voice-agent\";\nimport { AgentServerEvent } from \"@/rapida/events/agent-server-event\";\nimport { useMaybeVoiceAgent } from \"@/rapida/hooks/use-voice-agent\";\nimport { cn } from \"@/rapida/styles\";\nimport React, { FC, HTMLAttributes, useState } from \"react\";\nimport {\n AssistantConversationInterruption,\n AssistantConversationUserMessage,\n} from \"@/rapida/clients/protos/talk-api_pb\";\nimport { toContentText, toTextContent } from \"@/rapida/utils/rapida_content\";\n\n/**\n * agent live transcript props\n */\ninterface AgentLiveTranscriptProps extends HTMLAttributes<HTMLDivElement> {\n placeholder?: string;\n}\n\n/**\n * Agent live audio transcript\n * @param param0\n * @returns\n */\nexport const AgentLiveTranscript: FC<AgentLiveTranscriptProps> = ({\n className,\n placeholder,\n}) => {\n const agentContext = useMaybeVoiceAgent();\n const [connected, setConnected] = useState<boolean>(false);\n const [transcript, setTranscript] = useState(\"\");\n\n React.useEffect(() => {\n const listener = agentConnectionStateObservable(agentContext!).subscribe(\n (x) => {\n setConnected(x.isConnected);\n }\n );\n return () => listener.unsubscribe();\n }, [agentContext]);\n\n //\n React.useEffect(() => {\n const serverEventListner = agentServerEventObserver(\n agentContext!\n ).subscribe((agentEvents) => {\n if (agentEvents?.eventType === AgentServerEvent.Transcript) {\n if (agentEvents.argument) {\n let arg = agentEvents.argument as AssistantConversationUserMessage;\n setTranscript(toContentText(arg.getMessage()?.getContentsList()));\n }\n }\n });\n return () => {\n serverEventListner.unsubscribe();\n };\n }, [agentContext]);\n\n return (\n <div className={cn(className)}>\n {!connected ? placeholder : transcript ? transcript : placeholder}\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;AA+BA,OAAO,SAA6B,gBAAgB;AAsDhD;AAnCG,IAAM,sBAAoD,CAAC;AAAA,EAChE;AAAA,EACA;AACF,MAAM;AACJ,QAAM,eAAe,mBAAmB;AACxC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAkB,KAAK;AACzD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,EAAE;AAE/C,QAAM,UAAU,MAAM;AACpB,UAAM,WAAW,+BAA+B,YAAa,EAAE;AAAA,MAC7D,CAAC,MAAM;AACL,qBAAa,EAAE,WAAW;AAAA,MAC5B;AAAA,IACF;AACA,WAAO,MAAM,SAAS,YAAY;AAAA,EACpC,GAAG,CAAC,YAAY,CAAC;AAGjB,QAAM,UAAU,MAAM;AACpB,UAAM,qBAAqB;AAAA,MACzB;AAAA,IACF,EAAE,UAAU,CAAC,gBAAgB;AAC3B,UAAI,aAAa,oDAA2C;AAC1D,YAAI,YAAY,UAAU;AACxB,cAAI,MAAM,YAAY;AACtB,wBAAc,cAAc,IAAI,WAAW,GAAG,gBAAgB,CAAC,CAAC;AAAA,QAClE;AAAA,MACF;AAAA,IACF,CAAC;AACD,WAAO,MAAM;AACX,yBAAmB,YAAY;AAAA,IACjC;AAAA,EACF,GAAG,CAAC,YAAY,CAAC;AAEjB,SACE,oBAAC,SAAI,WAAW,GAAG,SAAS,GACzB,WAAC,YAAY,cAAc,aAAa,aAAa,aACxD;AAEJ;","names":[]}
@@ -0,0 +1,7 @@
1
+ import { FC, HTMLAttributes } from 'react';
2
+
3
+ interface ConnectionStatusProps extends HTMLAttributes<HTMLSpanElement> {
4
+ }
5
+ declare const ConnectionStatus: FC<ConnectionStatusProps>;
6
+
7
+ export { ConnectionStatus };
@@ -0,0 +1,7 @@
1
+ import { FC, HTMLAttributes } from 'react';
2
+
3
+ interface ConnectionStatusProps extends HTMLAttributes<HTMLSpanElement> {
4
+ }
5
+ declare const ConnectionStatus: FC<ConnectionStatusProps>;
6
+
7
+ export { ConnectionStatus };