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,105 @@
1
+ import { EventEmitter } from "node:events";
2
+ import type { FelAgentConfig, AgentAction } from "./types.js";
3
+ import { JEVEngine } from "./jev/engine.js";
4
+ /**
5
+ * FelAgent — The main entry point for building a voice agent with Felona Voice.
6
+ *
7
+ * Usage:
8
+ * ```typescript
9
+ * const agent = new FelAgent({
10
+ * name: "Support Bot",
11
+ * systemPrompt: "You are a helpful support agent.",
12
+ * stt: { provider: "deepgram", apiKey: "..." },
13
+ * tts: { provider: "elevenlabs", apiKey: "..." },
14
+ * llm: { provider: "openai", apiKey: "...", model: "gpt-4o-mini" },
15
+ * actions: [ ... ],
16
+ * });
17
+ *
18
+ * agent.listen({ port: 8080 });
19
+ * ```
20
+ *
21
+ * FelAgent wires together:
22
+ * - Transport (WebSocket server for audio I/O)
23
+ * - Voice Pipeline (STT → JEV → LLM → TTS per session)
24
+ * - JEV Engine (action prediction)
25
+ * - Memory, Tools, Analytics
26
+ */
27
+ export declare class FelAgent extends EventEmitter {
28
+ private readonly config;
29
+ private transport;
30
+ private readonly jev;
31
+ private readonly logger;
32
+ private readonly tools;
33
+ private readonly hooks;
34
+ private readonly sttProvider;
35
+ private readonly ttsProvider;
36
+ private readonly vadProvider;
37
+ private readonly llmProvider;
38
+ private readonly llmInterface;
39
+ private pipelines;
40
+ private initialized;
41
+ constructor(config: FelAgentConfig);
42
+ /**
43
+ * Start the agent — initialize JEV, start the transport, begin accepting calls.
44
+ */
45
+ listen(options?: {
46
+ port?: number;
47
+ host?: string;
48
+ }): Promise<void>;
49
+ /**
50
+ * Stop the agent — shut down all pipelines and the transport.
51
+ */
52
+ stop(): Promise<void>;
53
+ /**
54
+ * Handle a new client connection — create a voice pipeline for this session.
55
+ */
56
+ private handleConnect;
57
+ /**
58
+ * Handle a client disconnection — stop and clean up the pipeline.
59
+ */
60
+ private handleDisconnect;
61
+ /**
62
+ * Handle incoming audio from a client — route to the correct pipeline.
63
+ */
64
+ private handleAudio;
65
+ /** Create STT provider based on config */
66
+ private createSTTProvider;
67
+ /** Create TTS provider based on config */
68
+ private createTTSProvider;
69
+ /** Create LLM provider based on config */
70
+ private createLLMProvider;
71
+ /** Get the number of active calls */
72
+ get activeCallCount(): number;
73
+ /** Check if the agent is running */
74
+ get isRunning(): boolean;
75
+ /** Get the agent name */
76
+ get name(): string;
77
+ /** Get the JEV engine (for inspection/testing) */
78
+ get jevEngine(): JEVEngine;
79
+ }
80
+ /**
81
+ * Helper to define an action with type safety.
82
+ */
83
+ export declare function defineAction(action: AgentAction): AgentAction;
84
+ /**
85
+ * Quick-start factory — creates a minimal agent with sensible defaults.
86
+ * Automatically creates a default "respond" action that uses the LLM directly.
87
+ */
88
+ export declare function quickStart(config: {
89
+ llm: {
90
+ provider: string;
91
+ apiKey: string;
92
+ model?: string;
93
+ };
94
+ stt: {
95
+ provider: string;
96
+ apiKey: string;
97
+ };
98
+ tts: {
99
+ provider: string;
100
+ apiKey: string;
101
+ voice?: string;
102
+ };
103
+ systemPrompt?: string;
104
+ }): FelAgent;
105
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EACV,cAAc,EAGd,WAAW,EAGZ,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAa5C;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,QAAS,SAAQ,YAAY;IACxC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAY;IACxC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAY;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAG5C,OAAO,CAAC,SAAS,CAAyC;IAE1D,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,cAAc;IA4ClC;;OAEG;IACG,MAAM,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA8CvE;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B;;OAEG;YACW,aAAa;IA2C3B;;OAEG;YACW,gBAAgB;IAY9B;;OAEG;IACH,OAAO,CAAC,WAAW;IAOnB,0CAA0C;IAC1C,OAAO,CAAC,iBAAiB;IAiBzB,0CAA0C;IAC1C,OAAO,CAAC,iBAAiB;IAkBzB,0CAA0C;IAC1C,OAAO,CAAC,iBAAiB;IAiBzB,qCAAqC;IACrC,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,oCAAoC;IACpC,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,yBAAyB;IACzB,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,kDAAkD;IAClD,IAAI,SAAS,IAAI,SAAS,CAEzB;CACF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAE7D;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE;IACjC,GAAG,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,GAAG,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,GAAG,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GAAG,QAAQ,CAgCX"}
package/dist/agent.js ADDED
@@ -0,0 +1,287 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { WebSocketTransport } from "./transport/websocket.js";
3
+ import { JEVEngine } from "./jev/engine.js";
4
+ import { OpenAIEmbeddingProvider } from "./jev/embeddings.js";
5
+ import { ConversationMemory } from "./memory/context.js";
6
+ import { ToolRegistry } from "./tools/registry.js";
7
+ import { CallLogger } from "./analytics/logger.js";
8
+ import { VoicePipeline } from "./pipeline.js";
9
+ // Provider imports
10
+ import { DeepgramSTT } from "./stt/deepgram.js";
11
+ import { ElevenLabsTTS } from "./tts/eleven-labs.js";
12
+ import { EnergyVAD } from "./vad/energy.js";
13
+ import { OpenAILLM } from "./llm/openai.js";
14
+ /**
15
+ * FelAgent — The main entry point for building a voice agent with Felona Voice.
16
+ *
17
+ * Usage:
18
+ * ```typescript
19
+ * const agent = new FelAgent({
20
+ * name: "Support Bot",
21
+ * systemPrompt: "You are a helpful support agent.",
22
+ * stt: { provider: "deepgram", apiKey: "..." },
23
+ * tts: { provider: "elevenlabs", apiKey: "..." },
24
+ * llm: { provider: "openai", apiKey: "...", model: "gpt-4o-mini" },
25
+ * actions: [ ... ],
26
+ * });
27
+ *
28
+ * agent.listen({ port: 8080 });
29
+ * ```
30
+ *
31
+ * FelAgent wires together:
32
+ * - Transport (WebSocket server for audio I/O)
33
+ * - Voice Pipeline (STT → JEV → LLM → TTS per session)
34
+ * - JEV Engine (action prediction)
35
+ * - Memory, Tools, Analytics
36
+ */
37
+ export class FelAgent extends EventEmitter {
38
+ config;
39
+ transport;
40
+ jev;
41
+ logger;
42
+ tools;
43
+ hooks;
44
+ sttProvider;
45
+ ttsProvider;
46
+ vadProvider;
47
+ llmProvider;
48
+ llmInterface;
49
+ // Active pipelines (one per session)
50
+ pipelines = new Map();
51
+ initialized = false;
52
+ constructor(config) {
53
+ super();
54
+ this.config = config;
55
+ this.hooks = config.hooks ?? {};
56
+ // Initialize logger
57
+ this.logger = new CallLogger({
58
+ logDir: config.logging?.logDir,
59
+ level: config.logging?.level,
60
+ enabled: config.logging?.enabled ?? true,
61
+ });
62
+ // Initialize tools
63
+ this.tools = new ToolRegistry();
64
+ if (config.tools) {
65
+ this.tools.registerAll(config.tools);
66
+ }
67
+ // Initialize providers
68
+ this.sttProvider = this.createSTTProvider();
69
+ this.ttsProvider = this.createTTSProvider();
70
+ this.vadProvider = new EnergyVAD();
71
+ this.llmProvider = this.createLLMProvider();
72
+ this.llmInterface = this.llmProvider.create({
73
+ model: config.llm.model ?? "gpt-4o-mini",
74
+ temperature: config.llm.temperature,
75
+ });
76
+ // Initialize JEV engine
77
+ const embeddingProvider = new OpenAIEmbeddingProvider({
78
+ apiKey: config.jev?.embeddingApiKey ??
79
+ config.llm.apiKey ??
80
+ "",
81
+ });
82
+ this.jev = new JEVEngine({
83
+ embeddingProvider,
84
+ confidenceThreshold: config.jev?.confidenceThreshold,
85
+ });
86
+ // Initialize transport
87
+ this.transport = new WebSocketTransport();
88
+ }
89
+ /**
90
+ * Start the agent — initialize JEV, start the transport, begin accepting calls.
91
+ */
92
+ async listen(options) {
93
+ const port = options?.port ?? this.config.transport?.port ?? 8080;
94
+ const host = options?.host ?? this.config.transport?.host;
95
+ this.logger.log("info", `Starting Felona Voice agent: "${this.config.name}"`);
96
+ // Step 1: Initialize JEV — embed all action descriptions
97
+ this.logger.log("info", "Initializing JEV engine...");
98
+ await this.jev.initialize(this.config.actions);
99
+ this.logger.log("info", `JEV initialized with ${this.config.actions.length} actions`);
100
+ // Step 2: Load predictor model if specified
101
+ if (this.config.jev?.predictorModel) {
102
+ await this.jev.loadPredictor(this.config.jev.predictorModel);
103
+ }
104
+ // Step 3: Wire up transport event handlers
105
+ this.transport.onConnect((session) => this.handleConnect(session));
106
+ this.transport.onDisconnect((session) => this.handleDisconnect(session));
107
+ this.transport.onAudioChunk((sessionId, chunk) => this.handleAudio(sessionId, chunk));
108
+ // Step 4: Start the transport server
109
+ await this.transport.start({ port, host });
110
+ this.initialized = true;
111
+ this.logger.log("info", `Agent "${this.config.name}" ready on port ${port}`);
112
+ this.logger.log("info", ` STT: ${this.sttProvider.name}`);
113
+ this.logger.log("info", ` TTS: ${this.ttsProvider.name}`);
114
+ this.logger.log("info", ` LLM: ${this.llmProvider.name}`);
115
+ this.logger.log("info", ` JEV: ${this.jev.hasPredictor ? "trained predictor" : "cold-start mode"}`);
116
+ this.logger.log("info", ` Actions: ${this.config.actions.map((a) => a.id).join(", ")}`);
117
+ this.emit("ready", { port, host });
118
+ }
119
+ /**
120
+ * Stop the agent — shut down all pipelines and the transport.
121
+ */
122
+ async stop() {
123
+ this.logger.log("info", "Stopping agent...");
124
+ // Stop all active pipelines
125
+ for (const [sessionId, pipeline] of this.pipelines) {
126
+ await pipeline.stop();
127
+ }
128
+ this.pipelines.clear();
129
+ // Stop transport
130
+ await this.transport.stop();
131
+ this.initialized = false;
132
+ this.logger.log("info", "Agent stopped");
133
+ this.emit("stopped");
134
+ }
135
+ /**
136
+ * Handle a new client connection — create a voice pipeline for this session.
137
+ */
138
+ async handleConnect(session) {
139
+ this.logger.log("info", `New call: ${session.id}`);
140
+ // Create per-session memory
141
+ const memory = new ConversationMemory();
142
+ // Create a new VAD instance per session (has internal state)
143
+ const vad = new EnergyVAD();
144
+ // Create the voice pipeline for this session
145
+ const pipeline = new VoicePipeline({
146
+ sessionId: session.id,
147
+ session,
148
+ stt: this.sttProvider,
149
+ tts: this.ttsProvider,
150
+ vad,
151
+ llm: this.llmInterface,
152
+ jev: this.jev,
153
+ memory,
154
+ tools: this.tools,
155
+ logger: this.logger,
156
+ hooks: this.hooks,
157
+ systemPrompt: this.config.systemPrompt,
158
+ sendAudio: (chunk) => this.transport.sendAudio(session.id, chunk),
159
+ });
160
+ // Forward pipeline events
161
+ pipeline.on("transcript", (data) => this.emit("transcript", { sessionId: session.id, ...data }));
162
+ pipeline.on("error", (error) => this.emit("error", { sessionId: session.id, error }));
163
+ pipeline.on("bargeIn", () => this.emit("bargeIn", { sessionId: session.id }));
164
+ this.pipelines.set(session.id, pipeline);
165
+ await pipeline.start();
166
+ this.emit("callStarted", session);
167
+ }
168
+ /**
169
+ * Handle a client disconnection — stop and clean up the pipeline.
170
+ */
171
+ async handleDisconnect(session) {
172
+ this.logger.log("info", `Call ended: ${session.id}`);
173
+ const pipeline = this.pipelines.get(session.id);
174
+ if (pipeline) {
175
+ await pipeline.stop();
176
+ this.pipelines.delete(session.id);
177
+ }
178
+ this.emit("callEnded", session);
179
+ }
180
+ /**
181
+ * Handle incoming audio from a client — route to the correct pipeline.
182
+ */
183
+ handleAudio(sessionId, chunk) {
184
+ const pipeline = this.pipelines.get(sessionId);
185
+ if (pipeline) {
186
+ pipeline.processAudio(chunk);
187
+ }
188
+ }
189
+ /** Create STT provider based on config */
190
+ createSTTProvider() {
191
+ switch (this.config.stt.provider) {
192
+ case "deepgram":
193
+ return new DeepgramSTT({
194
+ apiKey: this.config.stt.apiKey ?? "",
195
+ });
196
+ default:
197
+ this.logger.log("warn", `Unknown STT provider "${this.config.stt.provider}", falling back to Deepgram`);
198
+ return new DeepgramSTT({
199
+ apiKey: this.config.stt.apiKey ?? "",
200
+ });
201
+ }
202
+ }
203
+ /** Create TTS provider based on config */
204
+ createTTSProvider() {
205
+ switch (this.config.tts.provider) {
206
+ case "elevenlabs":
207
+ return new ElevenLabsTTS({
208
+ apiKey: this.config.tts.apiKey ?? "",
209
+ voice: this.config.tts.voice,
210
+ });
211
+ default:
212
+ this.logger.log("warn", `Unknown TTS provider "${this.config.tts.provider}", falling back to ElevenLabs`);
213
+ return new ElevenLabsTTS({
214
+ apiKey: this.config.tts.apiKey ?? "",
215
+ });
216
+ }
217
+ }
218
+ /** Create LLM provider based on config */
219
+ createLLMProvider() {
220
+ switch (this.config.llm.provider) {
221
+ case "openai":
222
+ return new OpenAILLM({
223
+ apiKey: this.config.llm.apiKey ?? "",
224
+ });
225
+ default:
226
+ this.logger.log("warn", `Unknown LLM provider "${this.config.llm.provider}", falling back to OpenAI`);
227
+ return new OpenAILLM({
228
+ apiKey: this.config.llm.apiKey ?? "",
229
+ });
230
+ }
231
+ }
232
+ /** Get the number of active calls */
233
+ get activeCallCount() {
234
+ return this.pipelines.size;
235
+ }
236
+ /** Check if the agent is running */
237
+ get isRunning() {
238
+ return this.initialized;
239
+ }
240
+ /** Get the agent name */
241
+ get name() {
242
+ return this.config.name;
243
+ }
244
+ /** Get the JEV engine (for inspection/testing) */
245
+ get jevEngine() {
246
+ return this.jev;
247
+ }
248
+ }
249
+ /**
250
+ * Helper to define an action with type safety.
251
+ */
252
+ export function defineAction(action) {
253
+ return action;
254
+ }
255
+ /**
256
+ * Quick-start factory — creates a minimal agent with sensible defaults.
257
+ * Automatically creates a default "respond" action that uses the LLM directly.
258
+ */
259
+ export function quickStart(config) {
260
+ return new FelAgent({
261
+ name: "Felona Agent",
262
+ systemPrompt: config.systemPrompt ??
263
+ "You are a helpful, friendly voice assistant. Keep your responses concise and conversational.",
264
+ stt: config.stt,
265
+ tts: config.tts,
266
+ llm: config.llm,
267
+ actions: [
268
+ defineAction({
269
+ id: "respond",
270
+ description: "Respond to the user's message helpfully and conversationally",
271
+ handler: async (ctx) => {
272
+ const response = await ctx.llm.generate(`Respond to the user naturally. User said: "${ctx.conversation.currentUtterance}"`, {
273
+ systemPrompt: ctx.conversation.systemPrompt,
274
+ history: ctx.memory
275
+ .getRecentTurns(10)
276
+ .map((t) => ({
277
+ role: t.role === "user" ? "user" : "assistant",
278
+ content: t.content,
279
+ })),
280
+ });
281
+ return response;
282
+ },
283
+ }),
284
+ ],
285
+ });
286
+ }
287
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { CallLogger, createCallLogger } from "./logger.js";
2
+ export type { CallLogEntry, JEVDecisionLog, CallMetrics, CallLogFile, } from "./logger.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC3D,YAAY,EACV,YAAY,EACZ,cAAc,EACd,WAAW,EACX,WAAW,GACZ,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { CallLogger, createCallLogger } from "./logger.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analytics/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,92 @@
1
+ import type { ConversationTurn, Session } from "../types.js";
2
+ /**
3
+ * CallLogger — Logs structured conversation data for JEV training and analytics.
4
+ *
5
+ * Every completed call produces a log file with:
6
+ * - Session metadata
7
+ * - All conversation turns
8
+ * - JEV decisions (action selected, confidence, candidates)
9
+ * - Timing information
10
+ *
11
+ * These logs are the training data for the JEV predictor (Phase 2).
12
+ */
13
+ export declare class CallLogger {
14
+ private readonly logDir;
15
+ private readonly level;
16
+ private readonly enabled;
17
+ constructor(options?: {
18
+ logDir?: string;
19
+ level?: "debug" | "info" | "warn" | "error";
20
+ enabled?: boolean;
21
+ });
22
+ /**
23
+ * Log a complete call session.
24
+ * This is called when a call ends.
25
+ */
26
+ logCall(data: CallLogEntry): Promise<string | null>;
27
+ /**
28
+ * Log a JEV decision for the current session.
29
+ * Used to build (context, action) training pairs.
30
+ */
31
+ logDecision(decision: JEVDecisionLog): void;
32
+ /** General-purpose log */
33
+ log(level: "debug" | "info" | "warn" | "error", message: string, data?: Record<string, unknown>): void;
34
+ }
35
+ /** Data for a complete call log */
36
+ export interface CallLogEntry {
37
+ session: Session;
38
+ turns: ConversationTurn[];
39
+ decisions: JEVDecisionLog[];
40
+ metrics: CallMetrics;
41
+ }
42
+ /** A single JEV decision record */
43
+ export interface JEVDecisionLog {
44
+ /** Timestamp of the decision */
45
+ timestampMs: number;
46
+ /** The context string that was embedded */
47
+ contextSummary: string;
48
+ /** The action that was selected */
49
+ selectedAction: string;
50
+ /** Confidence score */
51
+ confidence: number;
52
+ /** Top N candidates with scores */
53
+ candidates: Array<{
54
+ actionId: string;
55
+ score: number;
56
+ }>;
57
+ /** Time taken for the JEV decision (ms) */
58
+ latencyMs: number;
59
+ }
60
+ /** Call-level metrics */
61
+ export interface CallMetrics {
62
+ /** Total number of turns */
63
+ totalTurns: number;
64
+ /** Average JEV decision latency (ms) */
65
+ avgJEVLatencyMs: number;
66
+ /** Average STT latency (ms) */
67
+ avgSTTLatencyMs?: number;
68
+ /** Average TTS latency (ms) */
69
+ avgTTSLatencyMs?: number;
70
+ /** Number of barge-in events */
71
+ bargeInCount: number;
72
+ /** Average JEV confidence */
73
+ avgConfidence: number;
74
+ }
75
+ /** Structure of a call log file */
76
+ export interface CallLogFile {
77
+ version: string;
78
+ sessionId: string;
79
+ startedAt: string;
80
+ endedAt: string;
81
+ durationMs: number;
82
+ metadata: Record<string, unknown>;
83
+ turns: ConversationTurn[];
84
+ decisions: JEVDecisionLog[];
85
+ metrics: CallMetrics;
86
+ }
87
+ export declare function createCallLogger(options?: {
88
+ logDir?: string;
89
+ level?: "debug" | "info" | "warn" | "error";
90
+ enabled?: boolean;
91
+ }): CallLogger;
92
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/analytics/logger.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAe,MAAM,aAAa,CAAC;AAE1E;;;;;;;;;;GAUG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAsC;IAC5D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAEtB,OAAO,CAAC,EAAE;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;QAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB;IAMD;;;OAGG;IACG,OAAO,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA0BzD;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAQ3C,0BAA0B;IAC1B,GAAG,CACD,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAC1C,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,IAAI;CAaR;AAED,mCAAmC;AACnC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,mCAAmC;AACnC,MAAM,WAAW,cAAc;IAC7B,gCAAgC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,2CAA2C;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,mCAAmC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,UAAU,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,yBAAyB;AACzB,MAAM,WAAW,WAAW;IAC1B,4BAA4B;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,+BAA+B;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+BAA+B;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,OAAO,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,UAAU,CAEb"}
@@ -0,0 +1,75 @@
1
+ import { writeFile, mkdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ /**
4
+ * CallLogger — Logs structured conversation data for JEV training and analytics.
5
+ *
6
+ * Every completed call produces a log file with:
7
+ * - Session metadata
8
+ * - All conversation turns
9
+ * - JEV decisions (action selected, confidence, candidates)
10
+ * - Timing information
11
+ *
12
+ * These logs are the training data for the JEV predictor (Phase 2).
13
+ */
14
+ export class CallLogger {
15
+ logDir;
16
+ level;
17
+ enabled;
18
+ constructor(options) {
19
+ this.logDir = options?.logDir ?? "./call-logs";
20
+ this.level = options?.level ?? "info";
21
+ this.enabled = options?.enabled ?? true;
22
+ }
23
+ /**
24
+ * Log a complete call session.
25
+ * This is called when a call ends.
26
+ */
27
+ async logCall(data) {
28
+ if (!this.enabled)
29
+ return null;
30
+ await mkdir(this.logDir, { recursive: true });
31
+ const filename = `${data.session.id}_${Date.now()}.json`;
32
+ const filepath = join(this.logDir, filename);
33
+ const logData = {
34
+ version: "1.0",
35
+ sessionId: data.session.id,
36
+ startedAt: data.session.startedAt.toISOString(),
37
+ endedAt: new Date().toISOString(),
38
+ durationMs: Date.now() - data.session.startedAt.getTime(),
39
+ metadata: data.session.metadata,
40
+ turns: data.turns,
41
+ decisions: data.decisions,
42
+ metrics: data.metrics,
43
+ };
44
+ await writeFile(filepath, JSON.stringify(logData, null, 2));
45
+ this.log("info", `Call log saved: ${filepath}`);
46
+ return filepath;
47
+ }
48
+ /**
49
+ * Log a JEV decision for the current session.
50
+ * Used to build (context, action) training pairs.
51
+ */
52
+ logDecision(decision) {
53
+ if (!this.enabled)
54
+ return;
55
+ this.log("debug", `JEV decision: ${decision.selectedAction} (confidence: ${decision.confidence.toFixed(3)})`);
56
+ }
57
+ /** General-purpose log */
58
+ log(level, message, data) {
59
+ const levels = { debug: 0, info: 1, warn: 2, error: 3 };
60
+ if (levels[level] < levels[this.level])
61
+ return;
62
+ const prefix = `[Felona/${level.toUpperCase()}]`;
63
+ const timestamp = new Date().toISOString();
64
+ if (data) {
65
+ console.log(`${prefix} ${timestamp} ${message}`, data);
66
+ }
67
+ else {
68
+ console.log(`${prefix} ${timestamp} ${message}`);
69
+ }
70
+ }
71
+ }
72
+ export function createCallLogger(options) {
73
+ return new CallLogger(options);
74
+ }
75
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/analytics/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Felona Voice — Open-source voice agent framework powered by JEV.
3
+ *
4
+ * @packageDocumentation
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { FelAgent, defineAction } from "felona-voice";
9
+ *
10
+ * const agent = new FelAgent({
11
+ * name: "My Agent",
12
+ * systemPrompt: "You are helpful.",
13
+ * stt: { provider: "deepgram", apiKey: process.env.DEEPGRAM_API_KEY },
14
+ * tts: { provider: "elevenlabs", apiKey: process.env.ELEVEN_API_KEY },
15
+ * llm: { provider: "openai", apiKey: process.env.OPENAI_API_KEY, model: "gpt-4o-mini" },
16
+ * actions: [
17
+ * defineAction({
18
+ * id: "greet",
19
+ * description: "Greet the user warmly",
20
+ * handler: async (ctx) => ctx.llm.generate("Greet the user", {
21
+ * systemPrompt: ctx.conversation.systemPrompt,
22
+ * }),
23
+ * }),
24
+ * ],
25
+ * });
26
+ *
27
+ * agent.listen({ port: 8080 });
28
+ * ```
29
+ */
30
+ export { FelAgent, defineAction, quickStart } from "./agent.js";
31
+ export { JEVEngine, createJEVEngine } from "./jev/engine.js";
32
+ export { ActionSpace, cosineSimilarity } from "./jev/action-space.js";
33
+ export { OpenAIEmbeddingProvider } from "./jev/embeddings.js";
34
+ export { VoicePipeline, createPipeline } from "./pipeline.js";
35
+ export { WebSocketTransport, createWebSocketTransport, } from "./transport/websocket.js";
36
+ export { DeepgramSTT, createDeepgramSTT } from "./stt/deepgram.js";
37
+ export { ElevenLabsTTS, createElevenLabsTTS } from "./tts/eleven-labs.js";
38
+ export { EnergyVAD, createEnergyVAD } from "./vad/energy.js";
39
+ export { OpenAILLM, createOpenAILLM } from "./llm/openai.js";
40
+ export { ConversationMemory, createMemory } from "./memory/context.js";
41
+ export { ToolRegistry, defineTool, createToolRegistry } from "./tools/registry.js";
42
+ export { CallLogger, createCallLogger } from "./analytics/logger.js";
43
+ export type { CallLogEntry, JEVDecisionLog, CallMetrics, CallLogFile, } from "./analytics/logger.js";
44
+ export type { AudioChunk, Session, SessionState, ConversationTurn, ConversationContext, AgentAction, ActionContext, ActionMatch, Transport, TransportOptions, STTProvider, STTStream, STTStreamOptions, STTResult, TTSProvider, TTSOptions, VADProvider, VADResult, VADEvent, LLMProvider, LLMInterface, LLMOptions, LLMContext, AgentTool, ToolExecutor, MemoryManager, JEVEngine as JEVEngineInterface, EmbeddingProvider, AgentHooks, FelAgentConfig, } from "./types.js";
45
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAGH,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGhE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG9D,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGnE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAG1E,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAG7D,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAG7D,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGnF,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACrE,YAAY,EACV,YAAY,EACZ,cAAc,EACd,WAAW,EACX,WAAW,GACZ,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EAEV,UAAU,EAEV,OAAO,EACP,YAAY,EAEZ,gBAAgB,EAChB,mBAAmB,EAEnB,WAAW,EACX,aAAa,EACb,WAAW,EAEX,SAAS,EACT,gBAAgB,EAEhB,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,SAAS,EAET,WAAW,EACX,UAAU,EAEV,WAAW,EACX,SAAS,EACT,QAAQ,EAER,WAAW,EACX,YAAY,EACZ,UAAU,EACV,UAAU,EAEV,SAAS,EACT,YAAY,EAEZ,aAAa,EAEb,SAAS,IAAI,kBAAkB,EAC/B,iBAAiB,EAEjB,UAAU,EAEV,cAAc,GACf,MAAM,YAAY,CAAC"}