@shogo-ai/voice 1.4.1

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 (48) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +30 -0
  3. package/dist/chunk-D2EVSUZX.js +27 -0
  4. package/dist/chunk-Q3TJAJ54.js +165 -0
  5. package/dist/chunk-QHDIEE7O.js +453 -0
  6. package/dist/chunk-S3S2RNO6.js +671 -0
  7. package/dist/chunk-ZGYHDC5G.js +423 -0
  8. package/dist/index.cjs +1316 -0
  9. package/dist/index.d.cts +432 -0
  10. package/dist/index.d.ts +432 -0
  11. package/dist/index.js +735 -0
  12. package/dist/native/index.cjs +1667 -0
  13. package/dist/native/index.d.cts +285 -0
  14. package/dist/native/index.d.ts +285 -0
  15. package/dist/native/index.js +949 -0
  16. package/dist/organicParticlesShaders-DIva0vBO.d.cts +693 -0
  17. package/dist/organicParticlesShaders-DIva0vBO.d.ts +693 -0
  18. package/dist/react/index.cjs +1670 -0
  19. package/dist/react/index.d.cts +423 -0
  20. package/dist/react/index.d.ts +423 -0
  21. package/dist/react/index.js +952 -0
  22. package/dist/route/agent.cjs +981 -0
  23. package/dist/route/agent.d.cts +20 -0
  24. package/dist/route/agent.d.ts +20 -0
  25. package/dist/route/agent.js +17 -0
  26. package/dist/route/audio-tags.cjs +975 -0
  27. package/dist/route/audio-tags.d.cts +16 -0
  28. package/dist/route/audio-tags.d.ts +16 -0
  29. package/dist/route/audio-tags.js +13 -0
  30. package/dist/route/index.cjs +987 -0
  31. package/dist/route/index.d.cts +115 -0
  32. package/dist/route/index.d.ts +115 -0
  33. package/dist/route/index.js +12 -0
  34. package/dist/route/signed-url.cjs +975 -0
  35. package/dist/route/signed-url.d.cts +12 -0
  36. package/dist/route/signed-url.d.ts +12 -0
  37. package/dist/route/signed-url.js +13 -0
  38. package/dist/route/tts-preview.cjs +975 -0
  39. package/dist/route/tts-preview.d.cts +17 -0
  40. package/dist/route/tts-preview.d.ts +17 -0
  41. package/dist/route/tts-preview.js +13 -0
  42. package/dist/server.cjs +999 -0
  43. package/dist/server.d.cts +88 -0
  44. package/dist/server.d.ts +88 -0
  45. package/dist/server.js +11 -0
  46. package/dist/types-BKJtOUbE.d.cts +352 -0
  47. package/dist/types-BKJtOUbE.d.ts +352 -0
  48. package/package.json +148 -0
@@ -0,0 +1,352 @@
1
+ /**
2
+ * ElevenLabs v3 expressive audio tags.
3
+ *
4
+ * Tags are inline markers like `[whispers]` that the TTS model interprets as
5
+ * performance cues. They can appear mid-sentence ("[excited] that's amazing!")
6
+ * or as non-verbal sounds ("[laughs]").
7
+ *
8
+ * Exposed to:
9
+ * - Settings UI (chip picker, per-companion allow-list)
10
+ * - Agent-driven "god mode" (tool surface)
11
+ * - Server-side prompt composer (composeExpressivityBlock)
12
+ */
13
+ type AudioTagGroup = 'emotion' | 'delivery' | 'reaction';
14
+ interface AudioTag {
15
+ tag: string;
16
+ group: AudioTagGroup;
17
+ label: string;
18
+ description: string;
19
+ example: string;
20
+ }
21
+ declare const AUDIO_TAGS: AudioTag[];
22
+ declare const AUDIO_TAG_GROUPS: {
23
+ id: AudioTagGroup;
24
+ label: string;
25
+ description: string;
26
+ }[];
27
+ type Expressivity = 'off' | 'subtle' | 'full';
28
+ declare const EXPRESSIVITY_OPTIONS: {
29
+ id: Expressivity;
30
+ label: string;
31
+ description: string;
32
+ }[];
33
+ declare const DEFAULT_ALLOWED_TAGS: string[];
34
+ interface VoiceSettings {
35
+ stability?: number;
36
+ similarity_boost?: number;
37
+ style?: number;
38
+ use_speaker_boost?: boolean;
39
+ }
40
+ declare const DEFAULT_VOICE_SETTINGS: VoiceSettings;
41
+ declare function stripAudioTags(text: string | null | undefined): string;
42
+ declare const EXPRESSIVITY_BLOCK_OPEN = "<!--expressivity-->";
43
+ declare const EXPRESSIVITY_BLOCK_CLOSE = "<!--/expressivity-->";
44
+ /**
45
+ * Strip any previous expressivity block from a prompt so we can re-inject a
46
+ * fresh one without duplicating.
47
+ */
48
+ declare function stripExpressivityBlock(prompt: string): string;
49
+ /**
50
+ * Compose the expressivity instruction block to inject into the system prompt.
51
+ * Wrapped in HTML-comment delimiters so it can be stripped and replaced
52
+ * idempotently across edits.
53
+ *
54
+ * Returns '' when expressivity is 'off' (caller should still strip any
55
+ * previous block first).
56
+ */
57
+ declare function composeExpressivityBlock(expressivity: Expressivity, allowedTags: string[] | null | undefined): string;
58
+ /**
59
+ * A short demo sentence built from up to 3 of the selected tags, used by the
60
+ * voice-preview endpoint so users can hear what their current settings sound
61
+ * like.
62
+ */
63
+ declare function buildPreviewLine(allowedTags: string[] | null | undefined, characterName?: string): string;
64
+ /**
65
+ * Normalize an arbitrary `audioTags` value from client JSON into a clean,
66
+ * de-duplicated list of known tags. Returns `null` if `raw` isn't an array.
67
+ */
68
+ declare function normalizeAudioTags(raw: unknown): string[] | null;
69
+ /**
70
+ * Returns the provided expressivity string if it's a valid {@link Expressivity},
71
+ * otherwise `undefined`.
72
+ */
73
+ declare function normalizeExpressivity(raw: unknown): Expressivity | undefined;
74
+ /**
75
+ * Clamp + pick only known voice-setting fields from arbitrary JSON. Accepts
76
+ * both snake_case and camelCase input keys.
77
+ */
78
+ declare function normalizeVoiceSettings(raw: unknown): VoiceSettings | undefined;
79
+ declare function readAudioTags(raw: unknown): string[];
80
+ declare function readExpressivity(raw: unknown): Expressivity;
81
+ declare function readVoiceSettings(raw: unknown): VoiceSettings;
82
+
83
+ /**
84
+ * Typed ElevenLabs REST client for convai agents + TTS.
85
+ *
86
+ * Scoped to the endpoints the voice server handlers need:
87
+ * - POST /v1/convai/agents/create
88
+ * - PATCH /v1/convai/agents/:id
89
+ * - DELETE /v1/convai/agents/:id
90
+ * - GET /v1/convai/conversation/get-signed-url?agent_id=…
91
+ * - POST /v1/text-to-speech/:voiceId
92
+ * - GET /v1/voices/:voiceId
93
+ *
94
+ * All network calls use the global `fetch`. No module-level env reads —
95
+ * the API key is always supplied to the constructor.
96
+ */
97
+
98
+ declare const DEFAULT_ELEVENLABS_BASE_URL = "https://api.elevenlabs.io";
99
+ /** TTS models the convai runtime supports as of 2026-Q2. */
100
+ declare const CONVAI_SUPPORTED_TTS_MODELS: Set<string>;
101
+ declare const CONVAI_TTS_MODEL_FALLBACK = "eleven_turbo_v2_5";
102
+ /** If `requested` isn't a convai-compatible TTS model, fall back to the default. */
103
+ declare function resolveConvaiTtsModel(requested: string | null | undefined): string;
104
+ interface ElevenLabsClientConfig {
105
+ apiKey: string;
106
+ /** Override for tests or self-hosted proxies. Defaults to the public API. */
107
+ baseUrl?: string;
108
+ /** Custom fetch (for tests). Defaults to the global `fetch`. */
109
+ fetch?: typeof fetch;
110
+ }
111
+ /** A `type: 'client'` tool entry attached to an agent's prompt config. */
112
+ interface ConvaiClientTool {
113
+ type: 'client';
114
+ name: string;
115
+ description: string;
116
+ expects_response?: boolean;
117
+ parameters?: Record<string, unknown>;
118
+ }
119
+ interface CreateAgentParams {
120
+ displayName: string;
121
+ characterName: string;
122
+ voiceId: string;
123
+ /** Base system prompt — memory/expressivity blocks are appended before sending. */
124
+ systemPrompt: string;
125
+ firstMessage: string;
126
+ expressivity?: Expressivity;
127
+ audioTags?: string[] | null;
128
+ voiceSettings?: VoiceSettings;
129
+ ttsModelId?: string | null;
130
+ /**
131
+ * Tools the client (browser) implements. When omitted, no tools are attached.
132
+ * Consumers who want memory typically pass `MEMORY_CLIENT_TOOLS`.
133
+ */
134
+ tools?: ReadonlyArray<ConvaiClientTool>;
135
+ /** Optional memory block for the prompt composer. Default keeps the built-in block. */
136
+ memoryBlock?: string | null;
137
+ /** Language code for the conversation (default: 'en'). */
138
+ language?: string;
139
+ /** Per-user dynamic variable defaults. Merged on top of `character_name` / `user_context`. */
140
+ dynamicVariablePlaceholders?: Record<string, string>;
141
+ }
142
+ interface PatchAgentParams {
143
+ displayName?: string;
144
+ characterName?: string;
145
+ voiceId?: string;
146
+ systemPrompt?: string;
147
+ firstMessage?: string;
148
+ tools?: ReadonlyArray<ConvaiClientTool>;
149
+ enableUserContextOverride?: boolean;
150
+ expressivity?: Expressivity;
151
+ audioTags?: string[] | null;
152
+ voiceSettings?: VoiceSettings;
153
+ ttsModelId?: string | null;
154
+ memoryBlock?: string | null;
155
+ }
156
+ interface TextToSpeechParams {
157
+ voiceId: string;
158
+ text: string;
159
+ modelId?: string;
160
+ voiceSettings?: VoiceSettings;
161
+ /** Accept header; defaults to `audio/mpeg`. */
162
+ accept?: string;
163
+ }
164
+ /**
165
+ * An error thrown when ElevenLabs returns a non-2xx response. Preserves the
166
+ * status and response body so callers can decide how to surface it.
167
+ */
168
+ declare class ElevenLabsApiError extends Error {
169
+ readonly status: number;
170
+ readonly body: string;
171
+ constructor(message: string, status: number, body: string);
172
+ }
173
+ declare class ElevenLabsClient {
174
+ private readonly config;
175
+ private readonly baseUrl;
176
+ private readonly fetchImpl;
177
+ constructor(config: ElevenLabsClientConfig);
178
+ private headers;
179
+ /** Create a new convai agent. Returns the new `agent_id`. */
180
+ createAgent(params: CreateAgentParams): Promise<string>;
181
+ /** PATCH any subset of agent settings. Idempotent; only sends the keys you supply. */
182
+ patchAgent(agentId: string, params: PatchAgentParams): Promise<void>;
183
+ /**
184
+ * Delete a convai agent. Best-effort: swallow errors so teardown during a
185
+ * 500 response doesn't cascade into a second failure.
186
+ */
187
+ deleteAgent(agentId: string): Promise<void>;
188
+ /** Fetch a short-lived signed URL the browser can use to start a session. */
189
+ getSignedUrl(agentId: string): Promise<string>;
190
+ /**
191
+ * One-shot TTS. Returns the raw audio bytes plus the model id that was
192
+ * actually used (some models aren't available for every account, so we
193
+ * fall back to `eleven_turbo_v2_5` on the first failure).
194
+ */
195
+ textToSpeech(params: TextToSpeechParams): Promise<{
196
+ audio: ArrayBuffer;
197
+ modelId: string;
198
+ contentType: string;
199
+ }>;
200
+ /** Probe whether a given voice id still exists on the caller's account. */
201
+ voiceExists(voiceId: string): Promise<boolean>;
202
+ /**
203
+ * Register a Twilio phone number with an ElevenLabs agent. EL becomes
204
+ * the SIP target for inbound calls to that number — Twilio bridges
205
+ * the call via EL's native integration and we never have to run a
206
+ * Media Streams ↔ convai WebSocket bridge ourselves.
207
+ *
208
+ * Returns the ElevenLabs `phone_number_id` (distinct from the Twilio
209
+ * `sid`) which is the handle used by `outboundCall` + `deletePhoneNumber`.
210
+ */
211
+ createPhoneNumberTwilio(params: {
212
+ phoneNumber: string;
213
+ label?: string;
214
+ agentId: string;
215
+ twilioAccountSid: string;
216
+ twilioAuthToken: string;
217
+ }): Promise<{
218
+ phoneNumberId: string;
219
+ }>;
220
+ /** Detach a previously-registered phone number from ElevenLabs. */
221
+ deletePhoneNumber(phoneNumberId: string): Promise<void>;
222
+ /**
223
+ * Place an outbound PSTN call via a previously-registered EL phone
224
+ * number. EL drives Twilio (or a SIP trunk) under the hood — we just
225
+ * hand it the destination number and the agent to bridge to. Returns
226
+ * the Twilio `callSid` + EL `conversationId` for metering / tracing.
227
+ *
228
+ * As of 2026-Q2 the EL API uses provider-scoped routes:
229
+ * - Twilio numbers → POST /v1/convai/twilio/outbound-call
230
+ * - SIP numbers → POST /v1/convai/sip-trunk/outbound-call
231
+ * and `agent_phone_number_id` is a body field (no longer a path
232
+ * segment). The previous `/v1/convai/phone-numbers/{id}/outbound-call`
233
+ * route now returns 404. Callers that don't know the provider can
234
+ * look it up from `GET /v1/convai/phone-numbers/{id}` (`provider:
235
+ * "twilio" | "sip_trunk"`); most hosted setups are Twilio, so that's
236
+ * the default here.
237
+ */
238
+ outboundCall(params: {
239
+ phoneNumberId: string;
240
+ agentId: string;
241
+ toNumber: string;
242
+ /** EL provider route to use. Defaults to `'twilio'`. */
243
+ provider?: 'twilio' | 'sip-trunk';
244
+ dynamicVariables?: Record<string, string>;
245
+ }): Promise<{
246
+ callSid: string;
247
+ conversationId: string;
248
+ }>;
249
+ }
250
+ /**
251
+ * Canonical `add_memory` client-tool definition. Consumers can attach this to
252
+ * their agent's prompt so the model knows it can persist user facts.
253
+ */
254
+ declare const MEMORY_CLIENT_TOOLS: ReadonlyArray<ConvaiClientTool>;
255
+
256
+ /**
257
+ * Shared types for the voice module.
258
+ *
259
+ * The SDK does NOT own Prisma migrations. The consumer supplies their own
260
+ * persistence layer via {@link CompanionStore}; this interface just documents
261
+ * the fields we read/write.
262
+ */
263
+
264
+ /**
265
+ * The persistent representation of a user's voice companion.
266
+ *
267
+ * Consumers typically back this with a Prisma model named `Companion` (or
268
+ * whatever they choose) with one row per user.
269
+ */
270
+ interface Companion {
271
+ /** Stable id (matches user id in single-companion apps). */
272
+ id: string;
273
+ /** The authenticated user's id that owns this companion. */
274
+ userId: string;
275
+ /** ElevenLabs convai agent id returned by `createAgent`. */
276
+ agentId: string | null;
277
+ /** Human-facing name of the end user (used in agent greeting). */
278
+ displayName: string;
279
+ /** The companion's own name / persona. */
280
+ characterName: string;
281
+ /** ElevenLabs voice id. */
282
+ voiceId: string;
283
+ /** Base system prompt authored by the app (without memory/expressivity blocks). */
284
+ systemPrompt: string;
285
+ /** First line the agent speaks when the session starts. */
286
+ firstMessage: string;
287
+ /** `off` | `subtle` | `full` — controls whether the expressivity block is injected. */
288
+ expressivity: Expressivity;
289
+ /** Allow-list of audio tags the agent may use (empty ⇒ DEFAULT_ALLOWED_TAGS). */
290
+ audioTags: string[];
291
+ /** Optional ElevenLabs voice settings override. */
292
+ voiceSettings: VoiceSettings | null;
293
+ /** Optional TTS model override (e.g. `eleven_turbo_v2_5`). */
294
+ ttsModelId: string | null;
295
+ }
296
+ /**
297
+ * Consumer-supplied persistence layer. The SDK only calls these methods from
298
+ * the server handlers; it never reaches into a database directly.
299
+ */
300
+ interface CompanionStore {
301
+ findByUserId(userId: string): Promise<Companion | null>;
302
+ create(data: Omit<Companion, 'id'> & {
303
+ id?: string;
304
+ }): Promise<Companion>;
305
+ update(userId: string, patch: Partial<Companion>): Promise<Companion>;
306
+ delete(userId: string): Promise<void>;
307
+ }
308
+ /**
309
+ * The shape required of the authenticated user. Consumers pass a `getUser`
310
+ * function to `createVoiceHandlers` that returns this (or `null`).
311
+ */
312
+ interface VoiceUser {
313
+ id: string;
314
+ }
315
+ /**
316
+ * Minimal interface the voice server needs from a memory backend. Matches
317
+ * {@link import('../memory').MemoryStore.search} so consumers can wire the
318
+ * SDK's MemoryStore directly.
319
+ */
320
+ interface VoiceMemoryStore {
321
+ search(query: string, options: {
322
+ limit: number;
323
+ }): ReadonlyArray<{
324
+ chunk: string;
325
+ matchType?: string;
326
+ }>;
327
+ }
328
+ /** Shape of the JSON body for `POST /voice/agent` (create). */
329
+ interface CreateCompanionBody {
330
+ displayName: string;
331
+ characterName: string;
332
+ voiceId: string;
333
+ systemPrompt: string;
334
+ firstMessage: string;
335
+ expressivity?: Expressivity;
336
+ audioTags?: string[];
337
+ voiceSettings?: VoiceSettings;
338
+ ttsModelId?: string;
339
+ }
340
+ /** Shape of the JSON body for `PATCH /voice/agent`. Every field is optional. */
341
+ type PatchCompanionBody = Partial<CreateCompanionBody>;
342
+ /** Shape of the JSON body for `POST /voice/tts-preview`. */
343
+ interface TtsPreviewBody {
344
+ voiceId: string;
345
+ text?: string;
346
+ audioTags?: string[];
347
+ modelId?: string;
348
+ voiceSettings?: VoiceSettings;
349
+ characterName?: string;
350
+ }
351
+
352
+ export { AUDIO_TAGS as A, readAudioTags as B, CONVAI_SUPPORTED_TTS_MODELS as C, DEFAULT_ALLOWED_TAGS as D, type Expressivity as E, readExpressivity as F, readVoiceSettings as G, resolveConvaiTtsModel as H, stripAudioTags as I, stripExpressivityBlock as J, MEMORY_CLIENT_TOOLS as M, type PatchAgentParams as P, type TextToSpeechParams as T, type VoiceMemoryStore as V, AUDIO_TAG_GROUPS as a, type AudioTag as b, type AudioTagGroup as c, CONVAI_TTS_MODEL_FALLBACK as d, type Companion as e, type CompanionStore as f, type ConvaiClientTool as g, type CreateAgentParams as h, type CreateCompanionBody as i, DEFAULT_ELEVENLABS_BASE_URL as j, DEFAULT_VOICE_SETTINGS as k, EXPRESSIVITY_BLOCK_CLOSE as l, EXPRESSIVITY_BLOCK_OPEN as m, EXPRESSIVITY_OPTIONS as n, ElevenLabsApiError as o, ElevenLabsClient as p, type ElevenLabsClientConfig as q, type PatchCompanionBody as r, type TtsPreviewBody as s, type VoiceSettings as t, type VoiceUser as u, buildPreviewLine as v, composeExpressivityBlock as w, normalizeAudioTags as x, normalizeExpressivity as y, normalizeVoiceSettings as z };
package/package.json ADDED
@@ -0,0 +1,148 @@
1
+ {
2
+ "name": "@shogo-ai/voice",
3
+ "version": "1.4.1",
4
+ "description": "Shogo Voice — ElevenLabs/Twilio voice agent infrastructure with React + React Native UI primitives.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "dist/index.cjs",
8
+ "module": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "sideEffects": false,
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/index.d.ts",
14
+ "import": "./dist/index.js",
15
+ "require": "./dist/index.cjs"
16
+ },
17
+ "./server": {
18
+ "types": "./dist/server.d.ts",
19
+ "import": "./dist/server.js",
20
+ "require": "./dist/server.cjs"
21
+ },
22
+ "./react": {
23
+ "types": "./dist/react/index.d.ts",
24
+ "import": "./dist/react/index.js",
25
+ "require": "./dist/react/index.cjs"
26
+ },
27
+ "./native": {
28
+ "types": "./dist/native/index.d.ts",
29
+ "import": "./dist/native/index.js",
30
+ "require": "./dist/native/index.cjs"
31
+ },
32
+ "./route": {
33
+ "types": "./dist/route/index.d.ts",
34
+ "import": "./dist/route/index.js",
35
+ "require": "./dist/route/index.cjs"
36
+ },
37
+ "./route/signed-url": {
38
+ "types": "./dist/route/signed-url.d.ts",
39
+ "import": "./dist/route/signed-url.js",
40
+ "require": "./dist/route/signed-url.cjs"
41
+ },
42
+ "./route/tts-preview": {
43
+ "types": "./dist/route/tts-preview.d.ts",
44
+ "import": "./dist/route/tts-preview.js",
45
+ "require": "./dist/route/tts-preview.cjs"
46
+ },
47
+ "./route/agent": {
48
+ "types": "./dist/route/agent.d.ts",
49
+ "import": "./dist/route/agent.js",
50
+ "require": "./dist/route/agent.cjs"
51
+ },
52
+ "./route/audio-tags": {
53
+ "types": "./dist/route/audio-tags.d.ts",
54
+ "import": "./dist/route/audio-tags.js",
55
+ "require": "./dist/route/audio-tags.cjs"
56
+ }
57
+ },
58
+ "files": [
59
+ "dist/**/*.js",
60
+ "dist/**/*.cjs",
61
+ "dist/**/*.d.ts",
62
+ "dist/**/*.d.cts"
63
+ ],
64
+ "scripts": {
65
+ "build": "tsup",
66
+ "dev": "tsup --watch",
67
+ "typecheck": "tsc --noEmit",
68
+ "test": "bun --no-env-file test src/"
69
+ },
70
+ "peerDependencies": {
71
+ "@ai-sdk/react": ">=3.0.0",
72
+ "@elevenlabs/react": ">=1.1.0",
73
+ "@elevenlabs/react-native": ">=1.1.0",
74
+ "ai": ">=6.0.0",
75
+ "react": ">=18.0.0",
76
+ "react-native": ">=0.70.0",
77
+ "three": ">=0.160.0",
78
+ "expo-gl": ">=15.0.0",
79
+ "expo-three": ">=8.0.0"
80
+ },
81
+ "peerDependenciesMeta": {
82
+ "@ai-sdk/react": {
83
+ "optional": true
84
+ },
85
+ "@elevenlabs/react": {
86
+ "optional": true
87
+ },
88
+ "@elevenlabs/react-native": {
89
+ "optional": true
90
+ },
91
+ "ai": {
92
+ "optional": true
93
+ },
94
+ "react": {
95
+ "optional": true
96
+ },
97
+ "react-native": {
98
+ "optional": true
99
+ },
100
+ "three": {
101
+ "optional": true
102
+ },
103
+ "expo-gl": {
104
+ "optional": true
105
+ },
106
+ "expo-three": {
107
+ "optional": true
108
+ }
109
+ },
110
+ "devDependencies": {
111
+ "@ai-sdk/react": "^3.0.99",
112
+ "@elevenlabs/react": "^1.1.1",
113
+ "@elevenlabs/react-native": "^1.1.4",
114
+ "@types/node": "^25.5.0",
115
+ "@types/react": "^19.0.0",
116
+ "@types/three": "^0.180.0",
117
+ "ai": "^6.0.97",
118
+ "expo-gl": "^15.0.0",
119
+ "expo-three": "^8.0.0",
120
+ "react-native": "^0.81.0",
121
+ "three": "^0.180.0",
122
+ "tsup": "^8.0.0",
123
+ "typescript": "^6.0.2"
124
+ },
125
+ "publishConfig": {
126
+ "access": "public"
127
+ },
128
+ "keywords": [
129
+ "shogo",
130
+ "voice",
131
+ "elevenlabs",
132
+ "twilio",
133
+ "tts",
134
+ "react",
135
+ "react-native",
136
+ "three"
137
+ ],
138
+ "author": "Shogo Labs",
139
+ "repository": {
140
+ "type": "git",
141
+ "url": "git+https://github.com/shogo-labs/shogo-ai.git",
142
+ "directory": "packages/voice"
143
+ },
144
+ "homepage": "https://github.com/shogo-labs/shogo-ai/tree/main/packages/voice#readme",
145
+ "bugs": {
146
+ "url": "https://github.com/shogo-labs/shogo-ai/issues"
147
+ }
148
+ }