felona-voice 0.1.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 (126) hide show
  1. package/dist/agent.d.ts +105 -0
  2. package/dist/agent.d.ts.map +1 -0
  3. package/dist/agent.js +287 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/analytics/index.d.ts +3 -0
  6. package/dist/analytics/index.d.ts.map +1 -0
  7. package/dist/analytics/index.js +2 -0
  8. package/dist/analytics/index.js.map +1 -0
  9. package/dist/analytics/logger.d.ts +92 -0
  10. package/dist/analytics/logger.d.ts.map +1 -0
  11. package/dist/analytics/logger.js +75 -0
  12. package/dist/analytics/logger.js.map +1 -0
  13. package/dist/index.d.ts +45 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +54 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/jev/action-space.d.ts +38 -0
  18. package/dist/jev/action-space.d.ts.map +1 -0
  19. package/dist/jev/action-space.js +92 -0
  20. package/dist/jev/action-space.js.map +1 -0
  21. package/dist/jev/embeddings.d.ts +23 -0
  22. package/dist/jev/embeddings.d.ts.map +1 -0
  23. package/dist/jev/embeddings.js +63 -0
  24. package/dist/jev/embeddings.js.map +1 -0
  25. package/dist/jev/engine.d.ts +101 -0
  26. package/dist/jev/engine.d.ts.map +1 -0
  27. package/dist/jev/engine.js +173 -0
  28. package/dist/jev/engine.js.map +1 -0
  29. package/dist/jev/index.d.ts +4 -0
  30. package/dist/jev/index.d.ts.map +1 -0
  31. package/dist/jev/index.js +4 -0
  32. package/dist/jev/index.js.map +1 -0
  33. package/dist/llm/index.d.ts +2 -0
  34. package/dist/llm/index.d.ts.map +1 -0
  35. package/dist/llm/index.js +2 -0
  36. package/dist/llm/index.js.map +1 -0
  37. package/dist/llm/openai.d.ts +22 -0
  38. package/dist/llm/openai.d.ts.map +1 -0
  39. package/dist/llm/openai.js +140 -0
  40. package/dist/llm/openai.js.map +1 -0
  41. package/dist/memory/context.d.ts +53 -0
  42. package/dist/memory/context.d.ts.map +1 -0
  43. package/dist/memory/context.js +95 -0
  44. package/dist/memory/context.js.map +1 -0
  45. package/dist/memory/index.d.ts +2 -0
  46. package/dist/memory/index.d.ts.map +1 -0
  47. package/dist/memory/index.js +2 -0
  48. package/dist/memory/index.js.map +1 -0
  49. package/dist/pipeline.d.ts +93 -0
  50. package/dist/pipeline.d.ts.map +1 -0
  51. package/dist/pipeline.js +255 -0
  52. package/dist/pipeline.js.map +1 -0
  53. package/dist/stt/deepgram.d.ts +27 -0
  54. package/dist/stt/deepgram.d.ts.map +1 -0
  55. package/dist/stt/deepgram.js +137 -0
  56. package/dist/stt/deepgram.js.map +1 -0
  57. package/dist/stt/index.d.ts +2 -0
  58. package/dist/stt/index.d.ts.map +1 -0
  59. package/dist/stt/index.js +2 -0
  60. package/dist/stt/index.js.map +1 -0
  61. package/dist/tools/index.d.ts +2 -0
  62. package/dist/tools/index.d.ts.map +1 -0
  63. package/dist/tools/index.js +2 -0
  64. package/dist/tools/index.js.map +1 -0
  65. package/dist/tools/registry.d.ts +38 -0
  66. package/dist/tools/registry.d.ts.map +1 -0
  67. package/dist/tools/registry.js +77 -0
  68. package/dist/tools/registry.js.map +1 -0
  69. package/dist/transport/index.d.ts +2 -0
  70. package/dist/transport/index.d.ts.map +1 -0
  71. package/dist/transport/index.js +2 -0
  72. package/dist/transport/index.js.map +1 -0
  73. package/dist/transport/websocket.d.ts +38 -0
  74. package/dist/transport/websocket.d.ts.map +1 -0
  75. package/dist/transport/websocket.js +180 -0
  76. package/dist/transport/websocket.js.map +1 -0
  77. package/dist/tts/eleven-labs.d.ts +27 -0
  78. package/dist/tts/eleven-labs.d.ts.map +1 -0
  79. package/dist/tts/eleven-labs.js +73 -0
  80. package/dist/tts/eleven-labs.js.map +1 -0
  81. package/dist/tts/index.d.ts +2 -0
  82. package/dist/tts/index.d.ts.map +1 -0
  83. package/dist/tts/index.js +2 -0
  84. package/dist/tts/index.js.map +1 -0
  85. package/dist/types.d.ts +370 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +13 -0
  88. package/dist/types.js.map +1 -0
  89. package/dist/vad/energy.d.ts +49 -0
  90. package/dist/vad/energy.d.ts.map +1 -0
  91. package/dist/vad/energy.js +108 -0
  92. package/dist/vad/energy.js.map +1 -0
  93. package/dist/vad/index.d.ts +2 -0
  94. package/dist/vad/index.d.ts.map +1 -0
  95. package/dist/vad/index.js +2 -0
  96. package/dist/vad/index.js.map +1 -0
  97. package/package.json +51 -0
  98. package/src/agent.ts +373 -0
  99. package/src/analytics/index.ts +7 -0
  100. package/src/analytics/logger.ts +152 -0
  101. package/src/index.ts +121 -0
  102. package/src/jev/action-space.ts +119 -0
  103. package/src/jev/embeddings.ts +81 -0
  104. package/src/jev/engine.ts +225 -0
  105. package/src/jev/index.ts +3 -0
  106. package/src/llm/index.ts +1 -0
  107. package/src/llm/openai.ts +178 -0
  108. package/src/memory/context.ts +124 -0
  109. package/src/memory/index.ts +1 -0
  110. package/src/pipeline.ts +331 -0
  111. package/src/stt/deepgram.ts +182 -0
  112. package/src/stt/index.ts +1 -0
  113. package/src/tools/index.ts +1 -0
  114. package/src/tools/registry.ts +99 -0
  115. package/src/transport/index.ts +1 -0
  116. package/src/transport/websocket.ts +227 -0
  117. package/src/tts/eleven-labs.ts +100 -0
  118. package/src/tts/index.ts +1 -0
  119. package/src/types.ts +429 -0
  120. package/src/vad/energy.ts +135 -0
  121. package/src/vad/index.ts +1 -0
  122. package/tests/jev.test.ts +198 -0
  123. package/tests/memory.test.ts +169 -0
  124. package/tests/vad.test.ts +94 -0
  125. package/tsconfig.json +9 -0
  126. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,73 @@
1
+ /**
2
+ * ElevenLabsTTS — Streaming Text-to-Speech using ElevenLabs' API.
3
+ *
4
+ * Uses the streaming endpoint for chunk-by-chunk audio delivery,
5
+ * so the agent can start speaking before the full response is generated.
6
+ */
7
+ export class ElevenLabsTTS {
8
+ name = "elevenlabs";
9
+ apiKey;
10
+ defaultVoice;
11
+ baseUrl;
12
+ modelId;
13
+ constructor(options) {
14
+ this.apiKey = options.apiKey;
15
+ this.defaultVoice = options.voice ?? "21m00Tcm4TlvDq8ikWAM"; // Rachel
16
+ this.modelId = options.modelId ?? "eleven_turbo_v2_5";
17
+ this.baseUrl = options.baseUrl ?? "https://api.elevenlabs.io/v1";
18
+ }
19
+ async *synthesize(text, options) {
20
+ const voiceId = options?.voice ?? this.defaultVoice;
21
+ const response = await fetch(`${this.baseUrl}/text-to-speech/${voiceId}/stream`, {
22
+ method: "POST",
23
+ headers: {
24
+ "Content-Type": "application/json",
25
+ "xi-api-key": this.apiKey,
26
+ },
27
+ body: JSON.stringify({
28
+ text,
29
+ model_id: this.modelId,
30
+ voice_settings: {
31
+ stability: 0.5,
32
+ similarity_boost: 0.75,
33
+ speed: options?.speed ?? 1.0,
34
+ },
35
+ output_format: "pcm_16000",
36
+ }),
37
+ });
38
+ if (!response.ok) {
39
+ const error = await response.text();
40
+ throw new Error(`ElevenLabs TTS failed: ${response.status} ${error}`);
41
+ }
42
+ if (!response.body) {
43
+ throw new Error("ElevenLabs TTS returned no body");
44
+ }
45
+ const reader = response.body.getReader();
46
+ let timestampMs = 0;
47
+ const bytesPerSecond = 16000 * 2; // 16kHz * 16-bit = 32000 bytes/sec
48
+ try {
49
+ while (true) {
50
+ const { done, value } = await reader.read();
51
+ if (done)
52
+ break;
53
+ const chunk = {
54
+ data: Buffer.from(value),
55
+ sampleRate: 16000,
56
+ channels: 1,
57
+ bitDepth: 16,
58
+ timestampMs,
59
+ };
60
+ // Calculate timestamp based on audio duration
61
+ timestampMs += (value.length / bytesPerSecond) * 1000;
62
+ yield chunk;
63
+ }
64
+ }
65
+ finally {
66
+ reader.releaseLock();
67
+ }
68
+ }
69
+ }
70
+ export function createElevenLabsTTS(options) {
71
+ return new ElevenLabsTTS(options);
72
+ }
73
+ //# sourceMappingURL=eleven-labs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eleven-labs.js","sourceRoot":"","sources":["../../src/tts/eleven-labs.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,OAAO,aAAa;IACf,IAAI,GAAG,YAAY,CAAC;IACZ,MAAM,CAAS;IACf,YAAY,CAAS;IACrB,OAAO,CAAS;IAChB,OAAO,CAAS;IAEjC,YAAY,OAKX;QACC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,KAAK,IAAI,sBAAsB,CAAC,CAAC,SAAS;QACtE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,mBAAmB,CAAC;QACtD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,8BAA8B,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,CAAC,UAAU,CACf,IAAY,EACZ,OAAoB;QAEpB,MAAM,OAAO,GAAG,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC;QAEpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,IAAI,CAAC,OAAO,mBAAmB,OAAO,SAAS,EAClD;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,IAAI,CAAC,MAAM;aAC1B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,IAAI;gBACJ,QAAQ,EAAE,IAAI,CAAC,OAAO;gBACtB,cAAc,EAAE;oBACd,SAAS,EAAE,GAAG;oBACd,gBAAgB,EAAE,IAAI;oBACtB,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG;iBAC7B;gBACD,aAAa,EAAE,WAAW;aAC3B,CAAC;SACH,CACF,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,0BAA0B,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CACrD,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,cAAc,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,mCAAmC;QAErE,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI;oBAAE,MAAM;gBAEhB,MAAM,KAAK,GAAe;oBACxB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;oBACxB,UAAU,EAAE,KAAK;oBACjB,QAAQ,EAAE,CAAC;oBACX,QAAQ,EAAE,EAAE;oBACZ,WAAW;iBACZ,CAAC;gBAEF,8CAA8C;gBAC9C,WAAW,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,cAAc,CAAC,GAAG,IAAI,CAAC;gBAEtD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CAAC,OAInC;IACC,OAAO,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ElevenLabsTTS, createElevenLabsTTS } from "./eleven-labs.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ElevenLabsTTS, createElevenLabsTTS } from "./eleven-labs.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,370 @@
1
+ /**
2
+ * Core type definitions for Felona Voice.
3
+ *
4
+ * These types define the contracts between all modules in the framework.
5
+ * Every provider, engine, and component implements interfaces defined here.
6
+ */
7
+ /** Raw audio chunk flowing through the pipeline */
8
+ export interface AudioChunk {
9
+ /** PCM audio data (16-bit, 16kHz mono by default) */
10
+ data: Buffer;
11
+ /** Sample rate in Hz */
12
+ sampleRate: number;
13
+ /** Number of channels (1 = mono) */
14
+ channels: number;
15
+ /** Bit depth (16 = PCM16) */
16
+ bitDepth: number;
17
+ /** Timestamp in milliseconds (relative to session start) */
18
+ timestampMs: number;
19
+ }
20
+ /** Default audio format used throughout the pipeline */
21
+ export declare const DEFAULT_AUDIO_FORMAT: {
22
+ readonly sampleRate: 16000;
23
+ readonly channels: 1;
24
+ readonly bitDepth: 16;
25
+ };
26
+ /** Represents a single voice call/session */
27
+ export interface Session {
28
+ /** Unique session identifier */
29
+ id: string;
30
+ /** When the session started */
31
+ startedAt: Date;
32
+ /** Arbitrary metadata attached to this session */
33
+ metadata: Record<string, unknown>;
34
+ /** Current session state */
35
+ state: SessionState;
36
+ }
37
+ export type SessionState = "connecting" | "active" | "paused" | "ended";
38
+ /** A single turn in the conversation */
39
+ export interface ConversationTurn {
40
+ /** Who spoke */
41
+ role: "user" | "agent";
42
+ /** The transcribed/generated text */
43
+ content: string;
44
+ /** When this turn occurred */
45
+ timestampMs: number;
46
+ /** If agent turn, which action was selected by JEV */
47
+ actionId?: string;
48
+ /** JEV confidence score for the selected action (0-1) */
49
+ confidence?: number;
50
+ }
51
+ /** Full conversation context passed to the JEV engine */
52
+ export interface ConversationContext {
53
+ /** The current session */
54
+ session: Session;
55
+ /** All turns so far */
56
+ turns: ConversationTurn[];
57
+ /** The latest user utterance (may be partial for streaming) */
58
+ currentUtterance: string;
59
+ /** Extracted slots/entities */
60
+ slots: Record<string, unknown>;
61
+ /** System prompt for this agent */
62
+ systemPrompt: string;
63
+ }
64
+ /** An action the agent can take, as defined by the developer */
65
+ export interface AgentAction {
66
+ /** Unique identifier for this action */
67
+ id: string;
68
+ /** Human-readable description — this gets embedded by JEV */
69
+ description: string;
70
+ /**
71
+ * Handler executed when JEV selects this action.
72
+ * Returns the text the agent should speak.
73
+ */
74
+ handler: (ctx: ActionContext) => Promise<string>;
75
+ /** Optional: custom metadata for analytics/logging */
76
+ metadata?: Record<string, unknown>;
77
+ }
78
+ /** Context passed to action handlers */
79
+ export interface ActionContext {
80
+ /** The full conversation context */
81
+ conversation: ConversationContext;
82
+ /** LLM interface for generating responses */
83
+ llm: LLMInterface;
84
+ /** Tool executor for calling external tools */
85
+ tools: ToolExecutor;
86
+ /** Conversation memory manager */
87
+ memory: MemoryManager;
88
+ /** The current session */
89
+ session: Session;
90
+ }
91
+ /** Result of JEV action matching */
92
+ export interface ActionMatch {
93
+ /** The matched action */
94
+ action: AgentAction;
95
+ /** Confidence score (0-1) — cosine similarity or predictor confidence */
96
+ confidence: number;
97
+ /** All candidates with their scores, sorted descending */
98
+ candidates: Array<{
99
+ actionId: string;
100
+ score: number;
101
+ }>;
102
+ }
103
+ /** Transport layer interface — handles audio I/O */
104
+ export interface Transport {
105
+ /** Start listening for connections */
106
+ start(options: TransportOptions): Promise<void>;
107
+ /** Stop the transport */
108
+ stop(): Promise<void>;
109
+ /** Register handler for incoming audio */
110
+ onAudioChunk(handler: (sessionId: string, chunk: AudioChunk) => void): void;
111
+ /** Register handler for new connections */
112
+ onConnect(handler: (session: Session) => void): void;
113
+ /** Register handler for disconnections */
114
+ onDisconnect(handler: (session: Session) => void): void;
115
+ /** Send audio to a specific session */
116
+ sendAudio(sessionId: string, chunk: AudioChunk): Promise<void>;
117
+ }
118
+ export interface TransportOptions {
119
+ port: number;
120
+ host?: string;
121
+ }
122
+ /** Speech-to-Text provider interface */
123
+ export interface STTProvider {
124
+ /** Provider name (e.g., "deepgram", "whisper") */
125
+ readonly name: string;
126
+ /** Start a streaming recognition session */
127
+ createStream(options?: STTStreamOptions): STTStream;
128
+ }
129
+ export interface STTStreamOptions {
130
+ /** Language code (e.g., "en-US") */
131
+ language?: string;
132
+ /** Enable interim/partial results */
133
+ interimResults?: boolean;
134
+ /** Custom vocabulary/keywords to boost */
135
+ keywords?: string[];
136
+ }
137
+ export interface STTStream {
138
+ /** Feed audio data into the recognizer */
139
+ write(chunk: AudioChunk): void;
140
+ /** Register handler for transcription results */
141
+ onResult(handler: (result: STTResult) => void): void;
142
+ /** Close the stream */
143
+ close(): Promise<void>;
144
+ }
145
+ export interface STTResult {
146
+ /** Transcribed text */
147
+ text: string;
148
+ /** Whether this is a final or interim result */
149
+ isFinal: boolean;
150
+ /** Confidence score (0-1) */
151
+ confidence: number;
152
+ /** Word-level timestamps (if available) */
153
+ words?: Array<{
154
+ word: string;
155
+ startMs: number;
156
+ endMs: number;
157
+ }>;
158
+ }
159
+ /** Text-to-Speech provider interface */
160
+ export interface TTSProvider {
161
+ /** Provider name (e.g., "elevenlabs", "edge-tts") */
162
+ readonly name: string;
163
+ /** Synthesize text to audio — returns a stream of audio chunks */
164
+ synthesize(text: string, options?: TTSOptions): AsyncIterable<AudioChunk>;
165
+ }
166
+ export interface TTSOptions {
167
+ /** Voice ID or name */
168
+ voice?: string;
169
+ /** Speaking speed multiplier (1.0 = normal) */
170
+ speed?: number;
171
+ /** Voice pitch adjustment */
172
+ pitch?: number;
173
+ }
174
+ /** Voice Activity Detection interface */
175
+ export interface VADProvider {
176
+ /** Provider name */
177
+ readonly name: string;
178
+ /** Process an audio chunk and detect speech */
179
+ process(chunk: AudioChunk): VADResult;
180
+ /** Reset internal state */
181
+ reset(): void;
182
+ }
183
+ export interface VADResult {
184
+ /** Whether speech is detected in this chunk */
185
+ isSpeech: boolean;
186
+ /** Confidence score (0-1) */
187
+ confidence: number;
188
+ /** Speech event (if a transition occurred) */
189
+ event?: VADEvent;
190
+ }
191
+ export type VADEvent = {
192
+ type: "speech_start";
193
+ timestampMs: number;
194
+ } | {
195
+ type: "speech_end";
196
+ timestampMs: number;
197
+ durationMs: number;
198
+ };
199
+ /** LLM provider interface */
200
+ export interface LLMProvider {
201
+ /** Provider name (e.g., "openai", "anthropic") */
202
+ readonly name: string;
203
+ /** Create an LLM interface with specific config */
204
+ create(options: LLMOptions): LLMInterface;
205
+ }
206
+ export interface LLMOptions {
207
+ /** Model name (e.g., "gpt-4o-mini") */
208
+ model: string;
209
+ /** Temperature (0-2) */
210
+ temperature?: number;
211
+ /** Max tokens to generate */
212
+ maxTokens?: number;
213
+ }
214
+ /** LLM interface used by action handlers */
215
+ export interface LLMInterface {
216
+ /** Generate a response given a prompt and conversation context */
217
+ generate(prompt: string, context?: LLMContext): Promise<string>;
218
+ /** Generate a streaming response */
219
+ generateStream(prompt: string, context?: LLMContext): AsyncIterable<string>;
220
+ }
221
+ export interface LLMContext {
222
+ /** System prompt */
223
+ systemPrompt?: string;
224
+ /** Conversation history */
225
+ history?: Array<{
226
+ role: "user" | "assistant" | "system";
227
+ content: string;
228
+ }>;
229
+ /** Additional instructions */
230
+ instructions?: string;
231
+ }
232
+ /** A tool that the agent can call */
233
+ export interface AgentTool {
234
+ /** Unique tool name */
235
+ name: string;
236
+ /** Description of what this tool does */
237
+ description: string;
238
+ /** JSON schema for the tool's parameters */
239
+ parameters: Record<string, unknown>;
240
+ /** Execute the tool */
241
+ execute: (params: Record<string, unknown>) => Promise<unknown>;
242
+ }
243
+ /** Tool executor interface */
244
+ export interface ToolExecutor {
245
+ /** Call a registered tool by name */
246
+ call(toolName: string, params?: Record<string, unknown>): Promise<unknown>;
247
+ /** List all registered tools */
248
+ list(): AgentTool[];
249
+ }
250
+ /** Conversation memory manager */
251
+ export interface MemoryManager {
252
+ /** Add a turn to memory */
253
+ addTurn(turn: ConversationTurn): void;
254
+ /** Get all turns */
255
+ getTurns(): ConversationTurn[];
256
+ /** Get the last N turns */
257
+ getRecentTurns(n: number): ConversationTurn[];
258
+ /** Set a slot value */
259
+ setSlot(key: string, value: unknown): void;
260
+ /** Get a slot value */
261
+ getSlot(key: string): unknown;
262
+ /** Get all slots */
263
+ getSlots(): Record<string, unknown>;
264
+ /** Clear all memory */
265
+ clear(): void;
266
+ /** Build the full conversation context */
267
+ buildContext(session: Session, systemPrompt: string): ConversationContext;
268
+ }
269
+ /** JEV (Joint Embedding Vector) engine interface */
270
+ export interface JEVEngine {
271
+ /** Initialize the engine (load models, embed action space) */
272
+ initialize(actions: AgentAction[]): Promise<void>;
273
+ /** Full pipeline: encode context → predict → match to action */
274
+ decide(context: ConversationContext): Promise<ActionMatch>;
275
+ /** Encode conversation context into a vector */
276
+ encode(context: ConversationContext): Promise<Float64Array>;
277
+ /** Predict the next state vector from a context vector */
278
+ predict(contextVector: Float64Array): Promise<Float64Array>;
279
+ /** Match a vector to the closest action */
280
+ match(vector: Float64Array): Promise<ActionMatch>;
281
+ }
282
+ /** Embedding provider for JEV */
283
+ export interface EmbeddingProvider {
284
+ /** Provider name */
285
+ readonly name: string;
286
+ /** Embed a single text string */
287
+ embed(text: string): Promise<Float64Array>;
288
+ /** Embed multiple texts in a batch */
289
+ embedBatch(texts: string[]): Promise<Float64Array[]>;
290
+ /** Dimensionality of the embeddings */
291
+ readonly dimensions: number;
292
+ }
293
+ /** Lifecycle hooks for the agent */
294
+ export interface AgentHooks {
295
+ /** Called when a new session starts */
296
+ onCallStart?: (session: Session) => Promise<void>;
297
+ /** Called when JEV selects an action */
298
+ onActionSelected?: (action: AgentAction, confidence: number, context: ConversationContext) => Promise<void>;
299
+ /** Called after the agent speaks */
300
+ onAgentSpoke?: (text: string, session: Session) => Promise<void>;
301
+ /** Called after the user speaks */
302
+ onUserSpoke?: (text: string, session: Session) => Promise<void>;
303
+ /** Called when a session ends */
304
+ onCallEnd?: (session: Session, turns: ConversationTurn[]) => Promise<void>;
305
+ /** Called on any error */
306
+ onError?: (error: Error, session?: Session) => Promise<void>;
307
+ /** Called when the user interrupts (barge-in) */
308
+ onBargeIn?: (session: Session) => Promise<void>;
309
+ }
310
+ /** Full configuration for a FelAgent */
311
+ export interface FelAgentConfig {
312
+ /** Agent name */
313
+ name: string;
314
+ /** System prompt that defines the agent's personality */
315
+ systemPrompt: string;
316
+ /** STT provider configuration */
317
+ stt: {
318
+ provider: string;
319
+ apiKey?: string;
320
+ language?: string;
321
+ [key: string]: unknown;
322
+ };
323
+ /** TTS provider configuration */
324
+ tts: {
325
+ provider: string;
326
+ apiKey?: string;
327
+ voice?: string;
328
+ [key: string]: unknown;
329
+ };
330
+ /** LLM provider configuration */
331
+ llm: {
332
+ provider: string;
333
+ apiKey?: string;
334
+ model?: string;
335
+ temperature?: number;
336
+ [key: string]: unknown;
337
+ };
338
+ /** JEV engine configuration */
339
+ jev?: {
340
+ /** Embedding model/provider to use */
341
+ embeddingProvider?: string;
342
+ embeddingApiKey?: string;
343
+ /** Path to a trained predictor model (ONNX) */
344
+ predictorModel?: string;
345
+ /** Minimum confidence threshold — below this, fall back to LLM-only */
346
+ confidenceThreshold?: number;
347
+ };
348
+ /** Actions the agent can take */
349
+ actions: AgentAction[];
350
+ /** Tools the agent can call */
351
+ tools?: AgentTool[];
352
+ /** Lifecycle hooks */
353
+ hooks?: AgentHooks;
354
+ /** Transport config */
355
+ transport?: {
356
+ type?: "websocket" | "webrtc";
357
+ port?: number;
358
+ host?: string;
359
+ };
360
+ /** Logging configuration */
361
+ logging?: {
362
+ /** Enable call logging for JEV training */
363
+ enabled?: boolean;
364
+ /** Directory to write logs */
365
+ logDir?: string;
366
+ /** Log level */
367
+ level?: "debug" | "info" | "warn" | "error";
368
+ };
369
+ }
370
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Core type definitions for Felona Voice.
3
+ *
4
+ * These types define the contracts between all modules in the framework.
5
+ * Every provider, engine, and component implements interfaces defined here.
6
+ */
7
+ /** Default audio format used throughout the pipeline */
8
+ export const DEFAULT_AUDIO_FORMAT = {
9
+ sampleRate: 16000,
10
+ channels: 1,
11
+ bitDepth: 16,
12
+ };
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkBH,wDAAwD;AACxD,MAAM,CAAC,MAAM,oBAAoB,GAAG;IAClC,UAAU,EAAE,KAAK;IACjB,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,EAAE;CACJ,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { VADProvider, VADResult, AudioChunk } from "../types.js";
2
+ /**
3
+ * EnergyVAD — Simple energy-based Voice Activity Detection.
4
+ *
5
+ * This is a lightweight, zero-dependency VAD that detects speech
6
+ * based on audio energy levels (RMS). It works well for most use cases
7
+ * and requires no model loading.
8
+ *
9
+ * For Phase 1, this replaces the Silero VAD (which needs ONNX) to
10
+ * avoid the heavy dependency. Silero VAD will be added in Phase 2
11
+ * as an optional higher-accuracy alternative.
12
+ *
13
+ * Algorithm:
14
+ * 1. Compute RMS energy of each audio chunk
15
+ * 2. Compare against adaptive threshold
16
+ * 3. Use hangover timer to prevent false speech-end events
17
+ */
18
+ export declare class EnergyVAD implements VADProvider {
19
+ readonly name = "energy";
20
+ private readonly speechThreshold;
21
+ private readonly silenceThreshold;
22
+ private readonly hangoverMs;
23
+ private readonly minSpeechMs;
24
+ private isSpeaking;
25
+ private speechStartMs;
26
+ private lastSpeechMs;
27
+ private energyHistory;
28
+ private readonly historySize;
29
+ constructor(options?: {
30
+ /** RMS threshold to start detecting speech (0-1). Default: 0.01 */
31
+ speechThreshold?: number;
32
+ /** RMS threshold to stop detecting speech (0-1). Default: 0.005 */
33
+ silenceThreshold?: number;
34
+ /** Milliseconds to wait after last speech before emitting speech_end. Default: 800 */
35
+ hangoverMs?: number;
36
+ /** Minimum speech duration to be considered valid. Default: 100 */
37
+ minSpeechMs?: number;
38
+ });
39
+ process(chunk: AudioChunk): VADResult;
40
+ reset(): void;
41
+ /** Get the average energy level over the recent history */
42
+ get averageEnergy(): number;
43
+ }
44
+ export declare function createEnergyVAD(options?: {
45
+ speechThreshold?: number;
46
+ silenceThreshold?: number;
47
+ hangoverMs?: number;
48
+ }): EnergyVAD;
49
+ //# sourceMappingURL=energy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"energy.d.ts","sourceRoot":"","sources":["../../src/vad/energy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAY,UAAU,EAAE,MAAM,aAAa,CAAC;AAEhF;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,SAAU,YAAW,WAAW;IAC3C,QAAQ,CAAC,IAAI,YAAY;IAEzB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAM;gBAEtB,OAAO,CAAC,EAAE;QACpB,mEAAmE;QACnE,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,mEAAmE;QACnE,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,sFAAsF;QACtF,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,mEAAmE;QACnE,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB;IAOD,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS;IAyCrC,KAAK,IAAI,IAAI;IAOb,2DAA2D;IAC3D,IAAI,aAAa,IAAI,MAAM,CAM1B;CACF;AAwBD,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,SAAS,CAEZ"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * EnergyVAD — Simple energy-based Voice Activity Detection.
3
+ *
4
+ * This is a lightweight, zero-dependency VAD that detects speech
5
+ * based on audio energy levels (RMS). It works well for most use cases
6
+ * and requires no model loading.
7
+ *
8
+ * For Phase 1, this replaces the Silero VAD (which needs ONNX) to
9
+ * avoid the heavy dependency. Silero VAD will be added in Phase 2
10
+ * as an optional higher-accuracy alternative.
11
+ *
12
+ * Algorithm:
13
+ * 1. Compute RMS energy of each audio chunk
14
+ * 2. Compare against adaptive threshold
15
+ * 3. Use hangover timer to prevent false speech-end events
16
+ */
17
+ export class EnergyVAD {
18
+ name = "energy";
19
+ speechThreshold;
20
+ silenceThreshold;
21
+ hangoverMs;
22
+ minSpeechMs;
23
+ isSpeaking = false;
24
+ speechStartMs = 0;
25
+ lastSpeechMs = 0;
26
+ energyHistory = [];
27
+ historySize = 30;
28
+ constructor(options) {
29
+ this.speechThreshold = options?.speechThreshold ?? 0.01;
30
+ this.silenceThreshold = options?.silenceThreshold ?? 0.005;
31
+ this.hangoverMs = options?.hangoverMs ?? 800;
32
+ this.minSpeechMs = options?.minSpeechMs ?? 100;
33
+ }
34
+ process(chunk) {
35
+ const rms = computeRMS(chunk.data, chunk.bitDepth);
36
+ this.energyHistory.push(rms);
37
+ if (this.energyHistory.length > this.historySize) {
38
+ this.energyHistory.shift();
39
+ }
40
+ const now = chunk.timestampMs;
41
+ let event;
42
+ if (!this.isSpeaking && rms >= this.speechThreshold) {
43
+ // Speech started
44
+ this.isSpeaking = true;
45
+ this.speechStartMs = now;
46
+ this.lastSpeechMs = now;
47
+ event = { type: "speech_start", timestampMs: now };
48
+ }
49
+ else if (this.isSpeaking) {
50
+ if (rms >= this.silenceThreshold) {
51
+ // Still speaking
52
+ this.lastSpeechMs = now;
53
+ }
54
+ else if (now - this.lastSpeechMs >= this.hangoverMs) {
55
+ // Silence exceeded hangover — speech ended
56
+ const durationMs = this.lastSpeechMs - this.speechStartMs;
57
+ if (durationMs >= this.minSpeechMs) {
58
+ event = {
59
+ type: "speech_end",
60
+ timestampMs: now,
61
+ durationMs,
62
+ };
63
+ }
64
+ this.isSpeaking = false;
65
+ }
66
+ }
67
+ return {
68
+ isSpeech: this.isSpeaking,
69
+ confidence: rms >= this.speechThreshold ? Math.min(rms / this.speechThreshold, 1) : 0,
70
+ event,
71
+ };
72
+ }
73
+ reset() {
74
+ this.isSpeaking = false;
75
+ this.speechStartMs = 0;
76
+ this.lastSpeechMs = 0;
77
+ this.energyHistory = [];
78
+ }
79
+ /** Get the average energy level over the recent history */
80
+ get averageEnergy() {
81
+ if (this.energyHistory.length === 0)
82
+ return 0;
83
+ return (this.energyHistory.reduce((a, b) => a + b, 0) /
84
+ this.energyHistory.length);
85
+ }
86
+ }
87
+ /**
88
+ * Compute RMS (Root Mean Square) energy of a PCM audio buffer.
89
+ * Normalized to 0-1 range.
90
+ */
91
+ function computeRMS(buffer, bitDepth) {
92
+ const samples = bitDepth === 16 ? buffer.length / 2 : buffer.length;
93
+ if (samples === 0)
94
+ return 0;
95
+ let sumSquares = 0;
96
+ const maxVal = bitDepth === 16 ? 32768 : 128;
97
+ for (let i = 0; i < buffer.length; i += bitDepth === 16 ? 2 : 1) {
98
+ const sample = bitDepth === 16
99
+ ? buffer.readInt16LE(i) / maxVal
100
+ : (buffer[i] - 128) / maxVal;
101
+ sumSquares += sample * sample;
102
+ }
103
+ return Math.sqrt(sumSquares / samples);
104
+ }
105
+ export function createEnergyVAD(options) {
106
+ return new EnergyVAD(options);
107
+ }
108
+ //# sourceMappingURL=energy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"energy.js","sourceRoot":"","sources":["../../src/vad/energy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { EnergyVAD, createEnergyVAD } from "./energy.js";
2
+ //# sourceMappingURL=index.d.ts.map