@formmy.app/chat 0.0.3 → 0.0.4

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 CHANGED
@@ -1,186 +1,87 @@
1
1
  # @formmy.app/chat
2
2
 
3
- Official SDK for Formmy AI Chat - Build conversational AI experiences in your React applications.
3
+ AI agents that sell, support, and convert. RAG + Voice + Chat — drop-in React SDK.
4
4
 
5
5
  ## Installation
6
6
 
7
7
  ```bash
8
- npm install @formmy.app/chat
9
- ```
10
-
11
- **Peer Dependencies:**
12
- ```bash
13
- npm install react ai @ai-sdk/react
8
+ npm install @formmy.app/chat react ai @ai-sdk/react
14
9
  ```
15
10
 
16
11
  ## Quick Start
17
12
 
18
- ### Backend (Node.js)
19
-
20
- Use the `Formmy` client to manage agents and conversations from your server.
21
-
22
- ```typescript
23
- import { Formmy } from '@formmy.app/chat';
24
-
25
- const formmy = new Formmy({ secretKey: 'formmy_sk_live_xxx' });
26
-
27
- // List all agents
28
- const agents = await formmy.agents.list();
29
-
30
- // Create a new agent
31
- const { agent } = await formmy.agents.create({
32
- name: 'Customer Support',
33
- instructions: 'You are a helpful customer support agent.',
34
- welcomeMessage: 'Hello! How can I help you today?',
35
- });
36
-
37
- // Send a message (non-streaming)
38
- const response = await formmy.chat.send('Hello!', {
39
- agentId: agent.id,
40
- sessionId: 'user_123',
41
- });
42
- ```
43
-
44
- ### Frontend (React)
45
-
46
- Use the provider and components to add chat to your React app.
47
-
48
13
  ```tsx
49
- import { FormmyProvider, ChatBubble } from '@formmy.app/chat/react';
14
+ import { FormmyProvider, ChatBubble } from "@formmy.app/chat/react";
50
15
 
51
16
  function App() {
52
17
  return (
53
18
  <FormmyProvider publishableKey="formmy_pk_live_xxx">
54
19
  <YourApp />
55
- <ChatBubble
56
- agentId="agent_xxx"
57
- position="bottom-right"
58
- theme="light"
59
- />
20
+ <ChatBubble agentId="agent_xxx" />
60
21
  </FormmyProvider>
61
22
  );
62
23
  }
63
24
  ```
64
25
 
65
- ### Headless Hook
26
+ ## Keys
66
27
 
67
- Build custom chat UIs with the `useFormmyChat` hook.
28
+ | Key | Prefix | Use |
29
+ |-----|--------|-----|
30
+ | Secret | `formmy_sk_live_` | Backend — full API access |
31
+ | Publishable | `formmy_pk_live_` | Frontend — chat & voice only |
68
32
 
69
- ```tsx
70
- import { useFormmyChat } from '@formmy.app/chat/react';
33
+ Get your keys at [formmy.app/dashboard/api-keys](https://formmy.app/dashboard/api-keys).
71
34
 
72
- function CustomChat({ agentId }: { agentId: string }) {
73
- const { messages, input, setInput, handleSubmit, isLoading } = useFormmyChat({
74
- agentId,
75
- });
35
+ ## Documentation
76
36
 
77
- return (
78
- <div>
79
- {messages.map((msg) => (
80
- <div key={msg.id}>
81
- <strong>{msg.role}:</strong> {msg.content}
82
- </div>
83
- ))}
84
-
85
- <form onSubmit={handleSubmit}>
86
- <input
87
- value={input}
88
- onChange={(e) => setInput(e.target.value)}
89
- placeholder="Type a message..."
90
- />
91
- <button type="submit" disabled={isLoading}>
92
- Send
93
- </button>
94
- </form>
95
- </div>
96
- );
97
- }
98
- ```
37
+ - **[Getting Started](./docs/getting-started.md)** — installation, auth, chat widget & headless hook
38
+ - **[Voice API](./docs/voice-api.md)** — real-time voice conversations over WebSocket
99
39
 
100
40
  ## API Reference
101
41
 
102
- ### Formmy Client
42
+ ### Backend Client
103
43
 
104
44
  ```typescript
105
- const formmy = new Formmy({ secretKey: 'formmy_sk_live_xxx' });
106
-
107
- // Agents
108
- formmy.agents.list()
109
- formmy.agents.get(agentId)
110
- formmy.agents.create({ name, instructions, welcomeMessage?, model? })
111
- formmy.agents.update(agentId, { name?, instructions?, model? })
112
- formmy.agents.delete(agentId)
113
-
114
- // Chat
115
- formmy.chat.send(message, { agentId, sessionId })
116
- formmy.chat.history(sessionId, agentId)
117
- ```
45
+ import { Formmy } from "@formmy.app/chat";
118
46
 
119
- ### React Components
47
+ const formmy = new Formmy({ secretKey: "formmy_sk_live_xxx" });
120
48
 
121
- #### FormmyProvider
49
+ formmy.agents.list();
50
+ formmy.agents.get(agentId);
51
+ formmy.agents.create({ name, instructions, welcomeMessage?, model? });
52
+ formmy.agents.update(agentId, { name?, instructions?, model? });
53
+ formmy.agents.delete(agentId);
122
54
 
123
- ```tsx
124
- <FormmyProvider
125
- publishableKey="formmy_pk_live_xxx"
126
- baseUrl="https://formmy.app" // optional
127
- >
128
- {children}
129
- </FormmyProvider>
55
+ formmy.chat.send(message, { agentId, sessionId });
56
+ formmy.chat.history(sessionId, agentId);
130
57
  ```
131
58
 
132
- #### ChatBubble
59
+ ### React Components
133
60
 
134
61
  ```tsx
135
- <ChatBubble
136
- agentId="agent_xxx" // required
137
- position="bottom-right" // bottom-right | bottom-left
138
- theme="light" // light | dark
139
- welcomeMessage="Hello!" // optional override
140
- buttonLabel="Chat with us" // optional
141
- />
62
+ <FormmyProvider publishableKey="formmy_pk_live_xxx">
63
+ <ChatBubble
64
+ agentId="agent_xxx"
65
+ position="bottom-right" // bottom-right | bottom-left
66
+ theme="light" // light | dark
67
+ welcomeMessage="Hello!" // optional override
68
+ />
69
+ </FormmyProvider>
142
70
  ```
143
71
 
144
- #### useFormmyChat
72
+ ### Headless Hook
145
73
 
146
74
  ```typescript
147
- const {
148
- messages, // Message[]
149
- input, // string
150
- setInput, // (value: string) => void
151
- handleSubmit, // (e: FormEvent) => void
152
- isLoading, // boolean
153
- error, // Error | null
154
- reload, // () => void
155
- stop, // () => void
156
- } = useFormmyChat({ agentId });
75
+ const { messages, input, setInput, handleSubmit, isLoading, error, reload, stop } =
76
+ useFormmyChat({ agentId });
157
77
  ```
158
78
 
159
- ## Keys
160
-
161
- | Key Type | Prefix | Usage | Scope |
162
- |----------|--------|-------|-------|
163
- | Secret Key | `formmy_sk_live_` | Backend only | Full API access |
164
- | Publishable Key | `formmy_pk_live_` | Frontend safe | Chat only, domain-restricted |
165
-
166
- Get your keys at [formmy.app/dashboard/api-keys](https://formmy.app/dashboard/api-keys)
167
-
168
79
  ## TypeScript
169
80
 
170
- Full TypeScript support included.
171
-
172
81
  ```typescript
173
- import type {
174
- FormmyMessage,
175
- Agent,
176
- FormmyConfig
177
- } from '@formmy.app/chat';
82
+ import type { FormmyMessage, Agent, FormmyConfig } from "@formmy.app/chat";
178
83
  ```
179
84
 
180
- ## Documentation
181
-
182
- Full documentation at [formmy.app/docs/sdk](https://formmy.app/docs/sdk)
183
-
184
85
  ## License
185
86
 
186
87
  MIT
@@ -0,0 +1,47 @@
1
+ /**
2
+ * @formmy.app/chat/react - useFormmyVoice Hook
3
+ *
4
+ * Headless hook for Voice AI. Handles WebSocket, mic capture, audio playback,
5
+ * and transcripts. Developer provides their own UI.
6
+ *
7
+ * Usage:
8
+ * ```tsx
9
+ * import { useFormmyVoice } from '@formmy.app/chat/react';
10
+ *
11
+ * function VoiceButton() {
12
+ * const { start, stop, status, transcripts } = useFormmyVoice({
13
+ * agentId: 'agent_123',
14
+ * });
15
+ *
16
+ * return (
17
+ * <div>
18
+ * <button onClick={status === 'idle' ? start : stop}>
19
+ * {status === 'idle' ? 'Call' : 'Hang up'}
20
+ * </button>
21
+ * <p>Status: {status}</p>
22
+ * {transcripts.map((t, i) => (
23
+ * <p key={i}>{t.role}: {t.text}</p>
24
+ * ))}
25
+ * </div>
26
+ * );
27
+ * }
28
+ * ```
29
+ */
30
+ import { type VoiceStatus, type VoiceTranscript } from "../voice/voice-client";
31
+ export interface UseFormmyVoiceOptions {
32
+ agentId: string;
33
+ voiceId?: string;
34
+ }
35
+ export interface UseFormmyVoiceReturn {
36
+ start: () => Promise<void>;
37
+ stop: () => void;
38
+ toggleMute: () => void;
39
+ status: VoiceStatus;
40
+ isMuted: boolean;
41
+ isSpeaking: boolean;
42
+ isListening: boolean;
43
+ error: Error | null;
44
+ transcripts: VoiceTranscript[];
45
+ }
46
+ export declare function useFormmyVoice({ agentId, voiceId }: UseFormmyVoiceOptions): UseFormmyVoiceReturn;
47
+ //# sourceMappingURL=use-formmy-voice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-formmy-voice.d.ts","sourceRoot":"","sources":["../../src/hooks/use-formmy-voice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAIH,OAAO,EAAqB,KAAK,WAAW,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAElG,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,eAAe,EAAE,CAAC;CAChC;AAED,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,qBAAqB,GAAG,oBAAoB,CAkFhG"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * @formmy.app/chat/react - useFormmyVoice Hook
3
+ *
4
+ * Headless hook for Voice AI. Handles WebSocket, mic capture, audio playback,
5
+ * and transcripts. Developer provides their own UI.
6
+ *
7
+ * Usage:
8
+ * ```tsx
9
+ * import { useFormmyVoice } from '@formmy.app/chat/react';
10
+ *
11
+ * function VoiceButton() {
12
+ * const { start, stop, status, transcripts } = useFormmyVoice({
13
+ * agentId: 'agent_123',
14
+ * });
15
+ *
16
+ * return (
17
+ * <div>
18
+ * <button onClick={status === 'idle' ? start : stop}>
19
+ * {status === 'idle' ? 'Call' : 'Hang up'}
20
+ * </button>
21
+ * <p>Status: {status}</p>
22
+ * {transcripts.map((t, i) => (
23
+ * <p key={i}>{t.role}: {t.text}</p>
24
+ * ))}
25
+ * </div>
26
+ * );
27
+ * }
28
+ * ```
29
+ */
30
+ import { useState, useRef, useCallback, useEffect } from "react";
31
+ import { useFormmy } from "../ui/provider";
32
+ import { FormmyVoiceClient } from "../voice/voice-client";
33
+ export function useFormmyVoice({ agentId, voiceId }) {
34
+ const { publishableKey, baseUrl } = useFormmy();
35
+ const clientRef = useRef(null);
36
+ const [status, setStatus] = useState("idle");
37
+ const [isMuted, setIsMuted] = useState(false);
38
+ const [error, setError] = useState(null);
39
+ const [transcripts, setTranscripts] = useState([]);
40
+ // Cleanup on unmount
41
+ useEffect(() => {
42
+ return () => {
43
+ clientRef.current?.disconnect();
44
+ };
45
+ }, []);
46
+ const start = useCallback(async () => {
47
+ if (clientRef.current) {
48
+ clientRef.current.disconnect();
49
+ }
50
+ if (!publishableKey) {
51
+ setError(new Error("FormmyProvider: publishableKey is required for voice"));
52
+ return;
53
+ }
54
+ const client = new FormmyVoiceClient({
55
+ baseUrl,
56
+ publishableKey,
57
+ agentId,
58
+ voiceId,
59
+ });
60
+ client.on({
61
+ onStatusChange: (s) => setStatus(s),
62
+ onTranscript: (t) => {
63
+ setTranscripts((prev) => {
64
+ if (t.isFinal) {
65
+ // Add as final entry
66
+ return [...prev, t];
67
+ }
68
+ // Update last entry of same role if it's a partial
69
+ const last = prev[prev.length - 1];
70
+ if (last && last.role === t.role && !last.isFinal) {
71
+ return [...prev.slice(0, -1), t];
72
+ }
73
+ return [...prev, t];
74
+ });
75
+ },
76
+ onError: (err) => setError(err),
77
+ });
78
+ clientRef.current = client;
79
+ setError(null);
80
+ setTranscripts([]);
81
+ await client.connect();
82
+ }, [baseUrl, publishableKey, agentId, voiceId]);
83
+ const stop = useCallback(() => {
84
+ clientRef.current?.disconnect();
85
+ clientRef.current = null;
86
+ }, []);
87
+ const toggleMute = useCallback(() => {
88
+ setIsMuted((prev) => {
89
+ const next = !prev;
90
+ clientRef.current?.setMuted(next);
91
+ return next;
92
+ });
93
+ }, []);
94
+ return {
95
+ start,
96
+ stop,
97
+ toggleMute,
98
+ status,
99
+ isMuted,
100
+ isSpeaking: status === "speaking",
101
+ isListening: status === "ready",
102
+ error,
103
+ transcripts,
104
+ };
105
+ }
106
+ //# sourceMappingURL=use-formmy-voice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-formmy-voice.js","sourceRoot":"","sources":["../../src/hooks/use-formmy-voice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAA0C,MAAM,uBAAuB,CAAC;AAmBlG,MAAM,UAAU,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAyB;IACxE,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC;IAChD,MAAM,SAAS,GAAG,MAAM,CAA2B,IAAI,CAAC,CAAC;IAEzD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAc,MAAM,CAAC,CAAC;IAC1D,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAe,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAoB,EAAE,CAAC,CAAC;IAEtE,qBAAqB;IACrB,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;QAClC,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACnC,IAAI,SAAS,CAAC,OAAO,EAAE,CAAC;YACtB,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACjC,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,QAAQ,CAAC,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC,CAAC;YAC5E,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC;YACnC,OAAO;YACP,cAAc;YACd,OAAO;YACP,OAAO;SACR,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC;YACR,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;YACnC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE;gBAClB,cAAc,CAAC,CAAC,IAAI,EAAE,EAAE;oBACtB,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;wBACd,qBAAqB;wBACrB,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;oBACtB,CAAC;oBACD,mDAAmD;oBACnD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACnC,IAAI,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;wBAClD,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBACnC,CAAC;oBACD,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;gBACtB,CAAC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;SAChC,CAAC,CAAC;QAEH,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,CAAC;QACf,cAAc,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAEhD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;QAChC,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;IAC3B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QAClC,UAAU,CAAC,CAAC,IAAI,EAAE,EAAE;YAClB,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC;YACnB,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,KAAK;QACL,IAAI;QACJ,UAAU;QACV,MAAM;QACN,OAAO;QACP,UAAU,EAAE,MAAM,KAAK,UAAU;QACjC,WAAW,EAAE,MAAM,KAAK,OAAO;QAC/B,KAAK;QACL,WAAW;KACZ,CAAC;AACJ,CAAC"}
package/dist/react.d.ts CHANGED
@@ -18,5 +18,8 @@
18
18
  export type { FormmyConfig, FormmyProviderProps, UseFormmyChatOptions, Message, MessagePart, ChatBubbleProps, ChatTheme, } from "./core/types";
19
19
  export { FormmyProvider, useFormmy, useFormmyOptional } from "./ui/provider";
20
20
  export { useFormmyChat, getMessageText } from "./hooks/use-formmy-chat";
21
+ export { useFormmyVoice } from "./hooks/use-formmy-voice";
22
+ export type { UseFormmyVoiceOptions, UseFormmyVoiceReturn } from "./hooks/use-formmy-voice";
23
+ export type { VoiceStatus, VoiceTranscript } from "./voice/voice-client";
21
24
  export { ChatBubble } from "./ui/chat-bubble";
22
25
  //# sourceMappingURL=react.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,OAAO,EACP,WAAW,EACX,eAAe,EACf,SAAS,GACV,MAAM,cAAc,CAAC;AAKtB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAK7E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAKxE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,YAAY,EACV,YAAY,EACZ,mBAAmB,EACnB,oBAAoB,EACpB,OAAO,EACP,WAAW,EACX,eAAe,EACf,SAAS,GACV,MAAM,cAAc,CAAC;AAKtB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAK7E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAKzE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/react.js CHANGED
@@ -23,6 +23,7 @@ export { FormmyProvider, useFormmy, useFormmyOptional } from "./ui/provider";
23
23
  // Hooks
24
24
  // ═══════════════════════════════════════════════════════════════════════════
25
25
  export { useFormmyChat, getMessageText } from "./hooks/use-formmy-chat";
26
+ export { useFormmyVoice } from "./hooks/use-formmy-voice";
26
27
  // ═══════════════════════════════════════════════════════════════════════════
27
28
  // UI Components
28
29
  // ═══════════════════════════════════════════════════════════════════════════
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAeH,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAC9E,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE7E,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAC9E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAExE,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAeH,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAC9E,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE7E,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAC9E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI1D,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"chat-bubble.d.ts","sourceRoot":"","sources":["../../src/ui/chat-bubble.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAa,MAAM,eAAe,CAAC;AAiChE,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,QAAyB,EACzB,KAAU,EACV,WAAmB,EACnB,YAAY,GACb,EAAE,eAAe,2CA8RjB"}
1
+ {"version":3,"file":"chat-bubble.d.ts","sourceRoot":"","sources":["../../src/ui/chat-bubble.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAa,MAAM,eAAe,CAAC;AAiChE,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,QAAyB,EACzB,KAAU,EACV,WAAmB,EACnB,YAAY,GACb,EAAE,eAAe,2CAgTjB"}
@@ -55,10 +55,11 @@ export function ChatBubble({ agentId, position = "bottom-right", theme = {}, def
55
55
  const [input, setInput] = useState("");
56
56
  const messagesEndRef = useRef(null);
57
57
  const inputRef = useRef(null);
58
- const { messages, sendMessage, status } = useFormmyChat({ agentId });
58
+ const { messages, sendMessage, status, stop } = useFormmyChat({ agentId });
59
59
  const mergedTheme = { ...defaultTheme, ...theme };
60
60
  const positionStyles = getPositionStyles(position);
61
61
  const isLoading = status === "streaming" || status === "submitted";
62
+ const isStreaming = status === "streaming";
62
63
  // Handle open/close
63
64
  const handleToggle = () => {
64
65
  const newState = !isOpen;
@@ -152,13 +153,21 @@ export function ChatBubble({ agentId, position = "bottom-right", theme = {}, def
152
153
  whiteSpace: "pre-wrap",
153
154
  wordBreak: "break-word",
154
155
  }, children: text }) }, msg.id));
155
- }), isLoading && (_jsx("div", { style: { display: "flex", justifyContent: "flex-start" }, children: _jsxs("div", { style: {
156
- padding: "10px 14px",
157
- borderRadius: "12px",
158
- backgroundColor: "#f0f0f0",
159
- color: "#666",
160
- fontSize: "14px",
161
- }, children: [_jsx("span", { style: { animation: "pulse 1.5s infinite" }, children: "\u25CF" }), _jsx("span", { style: { animation: "pulse 1.5s infinite 0.2s" }, children: "\u25CF" }), _jsx("span", { style: { animation: "pulse 1.5s infinite 0.4s" }, children: "\u25CF" })] }) })), _jsx("div", { ref: messagesEndRef })] }), _jsxs("form", { onSubmit: handleSubmit, style: {
156
+ }), isLoading && (_jsxs("div", { style: { display: "flex", justifyContent: "flex-start", alignItems: "center", gap: "8px" }, children: [_jsxs("div", { style: {
157
+ padding: "10px 14px",
158
+ borderRadius: "12px",
159
+ backgroundColor: "#f0f0f0",
160
+ color: "#666",
161
+ fontSize: "14px",
162
+ }, children: [_jsx("span", { style: { animation: "pulse 1.5s infinite" }, children: "\u25CF" }), _jsx("span", { style: { animation: "pulse 1.5s infinite 0.2s" }, children: "\u25CF" }), _jsx("span", { style: { animation: "pulse 1.5s infinite 0.4s" }, children: "\u25CF" })] }), isStreaming && (_jsx("button", { onClick: stop, style: {
163
+ padding: "6px 12px",
164
+ borderRadius: "8px",
165
+ border: "1px solid #ddd",
166
+ backgroundColor: "#fff",
167
+ color: "#666",
168
+ fontSize: "12px",
169
+ cursor: "pointer",
170
+ }, "aria-label": "Stop generating", children: "Stop" }))] })), _jsx("div", { ref: messagesEndRef })] }), _jsxs("form", { onSubmit: handleSubmit, style: {
162
171
  padding: "12px 16px",
163
172
  borderTop: "1px solid #eee",
164
173
  display: "flex",
@@ -1 +1 @@
1
- {"version":3,"file":"chat-bubble.js","sourceRoot":"","sources":["../../src/ui/chat-bubble.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"chat-bubble.js","sourceRoot":"","sources":["../../src/ui/chat-bubble.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * FormmyVoiceClient - Core WebSocket + Audio client for Voice AI
3
+ *
4
+ * Handles:
5
+ * - WebSocket connection with auto-handshake (initialized → sessionStart → ready → audioStart)
6
+ * - AudioWorklet mic capture (Float32 → Int16 PCM 16kHz → base64)
7
+ * - Audio playback queue (base64 → PCM 24kHz → AudioContext)
8
+ * - Barge-in via Nova's contentEnd(INTERRUPTED)
9
+ * - Transcript parsing from textOutput + contentStart events
10
+ *
11
+ * Based on: aws-samples/sample-nova-sonic-websocket-agentcore
12
+ */
13
+ export type VoiceStatus = "idle" | "connecting" | "ready" | "speaking" | "error";
14
+ export interface VoiceTranscript {
15
+ role: "user" | "assistant";
16
+ text: string;
17
+ isFinal: boolean;
18
+ }
19
+ export interface FormmyVoiceClientConfig {
20
+ baseUrl: string;
21
+ publishableKey: string;
22
+ agentId: string;
23
+ voiceId?: string;
24
+ }
25
+ export interface VoiceEventHandlers {
26
+ onStatusChange?: (status: VoiceStatus) => void;
27
+ onTranscript?: (transcript: VoiceTranscript) => void;
28
+ onError?: (error: Error) => void;
29
+ }
30
+ export declare class FormmyVoiceClient {
31
+ private config;
32
+ private ws;
33
+ private mediaStream;
34
+ private audioContext;
35
+ private workletNode;
36
+ private audioQueue;
37
+ private isPlaying;
38
+ private currentSource;
39
+ private status;
40
+ private isMuted;
41
+ private activeContent;
42
+ private userTextBuffer;
43
+ private assistantTextBuffer;
44
+ private handlers;
45
+ constructor(config: FormmyVoiceClientConfig);
46
+ /**
47
+ * Register event handlers
48
+ */
49
+ on(handlers: VoiceEventHandlers): void;
50
+ /**
51
+ * Connect to voice session (mic + WebSocket + auto-handshake)
52
+ */
53
+ connect(): Promise<void>;
54
+ /**
55
+ * Disconnect and cleanup
56
+ */
57
+ disconnect(): void;
58
+ /**
59
+ * Set mute state
60
+ */
61
+ setMuted(muted: boolean): void;
62
+ /**
63
+ * Get current mute state
64
+ */
65
+ getMuted(): boolean;
66
+ /**
67
+ * Get current status
68
+ */
69
+ getStatus(): VoiceStatus;
70
+ private setStatus;
71
+ private handleMessage;
72
+ private startAudioCapture;
73
+ private float32ToBase64PCM16;
74
+ private playAudioChunk;
75
+ private _playbackCtx;
76
+ private getPlaybackContext;
77
+ private playNext;
78
+ private stopPlayback;
79
+ }
80
+ //# sourceMappingURL=voice-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-client.d.ts","sourceRoot":"","sources":["../../src/voice/voice-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,YAAY,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;AAEjF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IAC/C,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,eAAe,KAAK,IAAI,CAAC;IACrD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,qBAAa,iBAAiB;IAkBhB,OAAO,CAAC,MAAM;IAjB1B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAsC;IAC3D,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,aAAa,CAAiE;IACtF,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,mBAAmB,CAAM;IAEjC,OAAO,CAAC,QAAQ,CAA0B;gBAEtB,MAAM,EAAE,uBAAuB;IAEnD;;OAEG;IACH,EAAE,CAAC,QAAQ,EAAE,kBAAkB;IAI/B;;OAEG;IACG,OAAO;IA+Cb;;OAEG;IACH,UAAU;IAwBV;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO;IAIvB;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,SAAS,IAAI,WAAW;IAMxB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,aAAa;YA2FP,iBAAiB;IA4C/B,OAAO,CAAC,oBAAoB;IAc5B,OAAO,CAAC,cAAc;IA8BtB,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,YAAY;CAWrB"}
@@ -0,0 +1,334 @@
1
+ /**
2
+ * FormmyVoiceClient - Core WebSocket + Audio client for Voice AI
3
+ *
4
+ * Handles:
5
+ * - WebSocket connection with auto-handshake (initialized → sessionStart → ready → audioStart)
6
+ * - AudioWorklet mic capture (Float32 → Int16 PCM 16kHz → base64)
7
+ * - Audio playback queue (base64 → PCM 24kHz → AudioContext)
8
+ * - Barge-in via Nova's contentEnd(INTERRUPTED)
9
+ * - Transcript parsing from textOutput + contentStart events
10
+ *
11
+ * Based on: aws-samples/sample-nova-sonic-websocket-agentcore
12
+ */
13
+ export class FormmyVoiceClient {
14
+ config;
15
+ ws = null;
16
+ mediaStream = null;
17
+ audioContext = null;
18
+ workletNode = null;
19
+ audioQueue = [];
20
+ isPlaying = false;
21
+ currentSource = null;
22
+ status = "idle";
23
+ isMuted = false;
24
+ // Transcript tracking
25
+ activeContent = null;
26
+ userTextBuffer = "";
27
+ assistantTextBuffer = "";
28
+ handlers = {};
29
+ constructor(config) {
30
+ this.config = config;
31
+ }
32
+ /**
33
+ * Register event handlers
34
+ */
35
+ on(handlers) {
36
+ this.handlers = { ...this.handlers, ...handlers };
37
+ }
38
+ /**
39
+ * Connect to voice session (mic + WebSocket + auto-handshake)
40
+ */
41
+ async connect() {
42
+ if (this.status !== "idle")
43
+ return;
44
+ this.setStatus("connecting");
45
+ try {
46
+ // Request mic
47
+ this.mediaStream = await navigator.mediaDevices.getUserMedia({
48
+ audio: {
49
+ sampleRate: 16000,
50
+ channelCount: 1,
51
+ echoCancellation: true,
52
+ noiseSuppression: true,
53
+ },
54
+ });
55
+ // AudioContext for mic input
56
+ this.audioContext = new AudioContext({ sampleRate: 16000 });
57
+ // WebSocket
58
+ const base = this.config.baseUrl.replace(/^http/, "ws");
59
+ const voiceId = this.config.voiceId || "carlos";
60
+ const wsUrl = `${base}/api/voice/v2?chatbotId=${this.config.agentId}&pk=${this.config.publishableKey}&voiceId=${voiceId}`;
61
+ this.ws = new WebSocket(wsUrl);
62
+ this.ws.onopen = () => {
63
+ // Wait for "initialized" event (auto-handshake)
64
+ };
65
+ this.ws.onmessage = (e) => {
66
+ this.handleMessage(JSON.parse(e.data));
67
+ };
68
+ this.ws.onerror = () => {
69
+ this.setStatus("error");
70
+ this.handlers.onError?.(new Error("WebSocket connection failed"));
71
+ };
72
+ this.ws.onclose = () => {
73
+ this.setStatus("idle");
74
+ };
75
+ }
76
+ catch (err) {
77
+ this.setStatus("error");
78
+ this.handlers.onError?.(err);
79
+ }
80
+ }
81
+ /**
82
+ * Disconnect and cleanup
83
+ */
84
+ disconnect() {
85
+ this.stopPlayback();
86
+ if (this.ws?.readyState === WebSocket.OPEN) {
87
+ this.ws.send(JSON.stringify({ event: { close: {} } }));
88
+ }
89
+ this.ws?.close();
90
+ this.ws = null;
91
+ this.workletNode?.disconnect();
92
+ this.workletNode = null;
93
+ this.mediaStream?.getTracks().forEach((t) => t.stop());
94
+ this.mediaStream = null;
95
+ this.audioContext?.close();
96
+ this.audioContext = null;
97
+ this.userTextBuffer = "";
98
+ this.assistantTextBuffer = "";
99
+ this.activeContent = null;
100
+ this.setStatus("idle");
101
+ }
102
+ /**
103
+ * Set mute state
104
+ */
105
+ setMuted(muted) {
106
+ this.isMuted = muted;
107
+ }
108
+ /**
109
+ * Get current mute state
110
+ */
111
+ getMuted() {
112
+ return this.isMuted;
113
+ }
114
+ /**
115
+ * Get current status
116
+ */
117
+ getStatus() {
118
+ return this.status;
119
+ }
120
+ // ─── Private ──────────────────────────────────────────────────────────
121
+ setStatus(status) {
122
+ this.status = status;
123
+ this.handlers.onStatusChange?.(status);
124
+ }
125
+ handleMessage(message) {
126
+ const eventType = Object.keys(message.event || {})[0];
127
+ switch (eventType) {
128
+ case "initialized":
129
+ // Auto-handshake step 1: send sessionStart
130
+ this.ws?.send(JSON.stringify({ event: { sessionStart: {} } }));
131
+ break;
132
+ case "ready":
133
+ // Auto-handshake step 2: start audio capture + send audioStart
134
+ this.setStatus("ready");
135
+ this.startAudioCapture();
136
+ this.ws?.send(JSON.stringify({ event: { audioStart: {} } }));
137
+ break;
138
+ case "audioOutput":
139
+ this.playAudioChunk(message.event.audioOutput.content);
140
+ if (this.status !== "speaking")
141
+ this.setStatus("speaking");
142
+ break;
143
+ case "textOutput": {
144
+ const text = message.event.textOutput.content;
145
+ if (this.activeContent?.role === "user") {
146
+ this.userTextBuffer += text;
147
+ this.handlers.onTranscript?.({ role: "user", text: this.userTextBuffer, isFinal: false });
148
+ }
149
+ else if (this.activeContent?.role === "assistant" && this.activeContent.display) {
150
+ this.assistantTextBuffer += text;
151
+ this.handlers.onTranscript?.({ role: "assistant", text: this.assistantTextBuffer, isFinal: false });
152
+ }
153
+ break;
154
+ }
155
+ case "contentStart": {
156
+ const cs = message.event.contentStart;
157
+ if (cs?.type === "TEXT" && (cs.role === "USER" || cs.role === "ASSISTANT")) {
158
+ let display = true;
159
+ if (cs.additionalModelFields) {
160
+ try {
161
+ const fields = JSON.parse(cs.additionalModelFields);
162
+ if (cs.role === "ASSISTANT" && fields.generationStage === "SPECULATIVE") {
163
+ display = false;
164
+ }
165
+ }
166
+ catch { }
167
+ }
168
+ this.activeContent = {
169
+ role: cs.role === "USER" ? "user" : "assistant",
170
+ display,
171
+ };
172
+ }
173
+ else {
174
+ this.activeContent = null;
175
+ }
176
+ break;
177
+ }
178
+ case "contentEnd": {
179
+ const { stopReason } = message.event.contentEnd;
180
+ if (stopReason === "INTERRUPTED") {
181
+ // Barge-in: clear audio queue
182
+ this.stopPlayback();
183
+ this.userTextBuffer = "";
184
+ this.assistantTextBuffer = "";
185
+ this.activeContent = null;
186
+ this.setStatus("ready");
187
+ }
188
+ else {
189
+ // Flush transcripts as final
190
+ if (this.userTextBuffer.trim()) {
191
+ this.handlers.onTranscript?.({ role: "user", text: this.userTextBuffer.trim(), isFinal: true });
192
+ this.userTextBuffer = "";
193
+ }
194
+ if (this.assistantTextBuffer.trim()) {
195
+ this.handlers.onTranscript?.({ role: "assistant", text: this.assistantTextBuffer.trim(), isFinal: true });
196
+ this.assistantTextBuffer = "";
197
+ }
198
+ if (!this.isPlaying && this.audioQueue.length === 0) {
199
+ this.setStatus("ready");
200
+ }
201
+ }
202
+ break;
203
+ }
204
+ case "error":
205
+ this.setStatus("error");
206
+ this.handlers.onError?.(new Error(message.event.error.message));
207
+ break;
208
+ // Ignore: agentSpeaking (deprecated), usageEvent, toolUse
209
+ }
210
+ }
211
+ async startAudioCapture() {
212
+ if (!this.audioContext || !this.mediaStream)
213
+ return;
214
+ const source = this.audioContext.createMediaStreamSource(this.mediaStream);
215
+ try {
216
+ const workletCode = `
217
+ class AudioCaptureProcessor extends AudioWorkletProcessor {
218
+ process(inputs) {
219
+ const input = inputs[0]?.[0];
220
+ if (input) { this.port.postMessage(input); }
221
+ return true;
222
+ }
223
+ }
224
+ registerProcessor('audio-capture-processor', AudioCaptureProcessor);
225
+ `;
226
+ const blob = new Blob([workletCode], { type: "application/javascript" });
227
+ const url = URL.createObjectURL(blob);
228
+ await this.audioContext.audioWorklet.addModule(url);
229
+ URL.revokeObjectURL(url);
230
+ this.workletNode = new AudioWorkletNode(this.audioContext, "audio-capture-processor");
231
+ this.workletNode.port.onmessage = (e) => {
232
+ if (this.isMuted || !this.ws || this.ws.readyState !== WebSocket.OPEN)
233
+ return;
234
+ const base64 = this.float32ToBase64PCM16(e.data);
235
+ this.ws.send(JSON.stringify({ event: { audioInput: { content: base64 } } }));
236
+ };
237
+ source.connect(this.workletNode);
238
+ // Don't connect to destination to avoid feedback
239
+ }
240
+ catch {
241
+ // Fallback: ScriptProcessor
242
+ const processor = this.audioContext.createScriptProcessor(4096, 1, 1);
243
+ processor.onaudioprocess = (e) => {
244
+ if (this.isMuted || !this.ws || this.ws.readyState !== WebSocket.OPEN)
245
+ return;
246
+ const base64 = this.float32ToBase64PCM16(e.inputBuffer.getChannelData(0));
247
+ this.ws.send(JSON.stringify({ event: { audioInput: { content: base64 } } }));
248
+ };
249
+ source.connect(processor);
250
+ processor.connect(this.audioContext.destination);
251
+ }
252
+ }
253
+ float32ToBase64PCM16(float32) {
254
+ const pcm16 = new Int16Array(float32.length);
255
+ for (let i = 0; i < float32.length; i++) {
256
+ const s = Math.max(-1, Math.min(1, float32[i]));
257
+ pcm16[i] = s < 0 ? s * 0x8000 : s * 0x7fff;
258
+ }
259
+ const uint8 = new Uint8Array(pcm16.buffer);
260
+ let binary = "";
261
+ for (let i = 0; i < uint8.length; i++) {
262
+ binary += String.fromCharCode(uint8[i]);
263
+ }
264
+ return btoa(binary);
265
+ }
266
+ playAudioChunk(base64Audio) {
267
+ if (!this.audioContext)
268
+ return;
269
+ try {
270
+ const binaryString = atob(base64Audio);
271
+ const bytes = new Uint8Array(binaryString.length);
272
+ for (let i = 0; i < binaryString.length; i++) {
273
+ bytes[i] = binaryString.charCodeAt(i);
274
+ }
275
+ const pcm16 = new Int16Array(bytes.buffer);
276
+ const float32 = new Float32Array(pcm16.length);
277
+ for (let i = 0; i < pcm16.length; i++) {
278
+ float32[i] = pcm16[i] / (pcm16[i] < 0 ? 0x8000 : 0x7fff);
279
+ }
280
+ // Playback context at 24kHz (separate from mic context)
281
+ const playbackCtx = this.getPlaybackContext();
282
+ const audioBuffer = playbackCtx.createBuffer(1, float32.length, 24000);
283
+ audioBuffer.copyToChannel(float32, 0);
284
+ const src = playbackCtx.createBufferSource();
285
+ src.buffer = audioBuffer;
286
+ src.connect(playbackCtx.destination);
287
+ this.audioQueue.push(src);
288
+ if (!this.isPlaying)
289
+ this.playNext();
290
+ }
291
+ catch { }
292
+ }
293
+ _playbackCtx = null;
294
+ getPlaybackContext() {
295
+ if (!this._playbackCtx || this._playbackCtx.state === "closed") {
296
+ this._playbackCtx = new AudioContext({ sampleRate: 24000 });
297
+ }
298
+ return this._playbackCtx;
299
+ }
300
+ playNext() {
301
+ const next = this.audioQueue.shift();
302
+ if (!next) {
303
+ this.isPlaying = false;
304
+ this.currentSource = null;
305
+ if (this.status === "speaking")
306
+ this.setStatus("ready");
307
+ return;
308
+ }
309
+ this.isPlaying = true;
310
+ this.currentSource = next;
311
+ next.onended = () => this.playNext();
312
+ next.start();
313
+ }
314
+ stopPlayback() {
315
+ if (this.currentSource) {
316
+ try {
317
+ this.currentSource.stop(0);
318
+ this.currentSource.disconnect();
319
+ }
320
+ catch { }
321
+ this.currentSource = null;
322
+ }
323
+ this.audioQueue.forEach((s) => {
324
+ try {
325
+ s.stop(0);
326
+ s.disconnect();
327
+ }
328
+ catch { }
329
+ });
330
+ this.audioQueue = [];
331
+ this.isPlaying = false;
332
+ }
333
+ }
334
+ //# sourceMappingURL=voice-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-client.js","sourceRoot":"","sources":["../../src/voice/voice-client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@formmy.app/chat",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "Official React SDK for Formmy Chat - AI chatbot widgets and headless hooks",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",