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
package/dist/index.js ADDED
@@ -0,0 +1,54 @@
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
+ // ─── Main Entry Points ─────────────────────────────────────────────────────
31
+ export { FelAgent, defineAction, quickStart } from "./agent.js";
32
+ // ─── JEV Engine ─────────────────────────────────────────────────────────────
33
+ export { JEVEngine, createJEVEngine } from "./jev/engine.js";
34
+ export { ActionSpace, cosineSimilarity } from "./jev/action-space.js";
35
+ export { OpenAIEmbeddingProvider } from "./jev/embeddings.js";
36
+ // ─── Voice Pipeline ─────────────────────────────────────────────────────────
37
+ export { VoicePipeline, createPipeline } from "./pipeline.js";
38
+ // ─── Transport ──────────────────────────────────────────────────────────────
39
+ export { WebSocketTransport, createWebSocketTransport, } from "./transport/websocket.js";
40
+ // ─── STT Providers ──────────────────────────────────────────────────────────
41
+ export { DeepgramSTT, createDeepgramSTT } from "./stt/deepgram.js";
42
+ // ─── TTS Providers ──────────────────────────────────────────────────────────
43
+ export { ElevenLabsTTS, createElevenLabsTTS } from "./tts/eleven-labs.js";
44
+ // ─── VAD Providers ──────────────────────────────────────────────────────────
45
+ export { EnergyVAD, createEnergyVAD } from "./vad/energy.js";
46
+ // ─── LLM Providers ─────────────────────────────────────────────────────────
47
+ export { OpenAILLM, createOpenAILLM } from "./llm/openai.js";
48
+ // ─── Memory ─────────────────────────────────────────────────────────────────
49
+ export { ConversationMemory, createMemory } from "./memory/context.js";
50
+ // ─── Tools ──────────────────────────────────────────────────────────────────
51
+ export { ToolRegistry, defineTool, createToolRegistry } from "./tools/registry.js";
52
+ // ─── Analytics ──────────────────────────────────────────────────────────────
53
+ export { CallLogger, createCallLogger } from "./analytics/logger.js";
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,8EAA8E;AAC9E,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEhE,+EAA+E;AAC/E,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;AAE9D,+EAA+E;AAC/E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE9D,+EAA+E;AAC/E,OAAO,EACL,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAElC,+EAA+E;AAC/E,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEnE,+EAA+E;AAC/E,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE1E,+EAA+E;AAC/E,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE7D,8EAA8E;AAC9E,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE7D,+EAA+E;AAC/E,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEvE,+EAA+E;AAC/E,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEnF,+EAA+E;AAC/E,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { AgentAction, ActionMatch, EmbeddingProvider } from "../types.js";
2
+ /**
3
+ * ActionSpace — Manages the set of actions available to the agent and
4
+ * performs embedding-based matching.
5
+ *
6
+ * At initialization, each action's description is embedded. During inference,
7
+ * a predicted/context vector is compared against all action embeddings via
8
+ * cosine similarity to find the best match.
9
+ */
10
+ export declare class ActionSpace {
11
+ private actions;
12
+ private embeddings;
13
+ private readonly embeddingProvider;
14
+ constructor(embeddingProvider: EmbeddingProvider);
15
+ /**
16
+ * Initialize the action space — embeds all action descriptions.
17
+ * Must be called before any matching.
18
+ */
19
+ initialize(actions: AgentAction[]): Promise<void>;
20
+ /**
21
+ * Find the closest action to the given vector using cosine similarity.
22
+ */
23
+ match(vector: Float64Array): ActionMatch;
24
+ /** Get an action by ID */
25
+ getAction(id: string): AgentAction | undefined;
26
+ /** Get the embedding for an action */
27
+ getEmbedding(actionId: string): Float64Array | undefined;
28
+ /** Get all actions */
29
+ getActions(): AgentAction[];
30
+ /** Number of actions in the space */
31
+ get size(): number;
32
+ }
33
+ /**
34
+ * Compute cosine similarity between two vectors.
35
+ * Returns a value between -1 and 1 (1 = identical direction).
36
+ */
37
+ export declare function cosineSimilarity(a: Float64Array, b: Float64Array): number;
38
+ //# sourceMappingURL=action-space.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-space.d.ts","sourceRoot":"","sources":["../../src/jev/action-space.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAErB;;;;;;;GAOG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,UAAU,CAAwC;IAC1D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;gBAE1C,iBAAiB,EAAE,iBAAiB;IAIhD;;;OAGG;IACG,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvD;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW;IA8BxC,0BAA0B;IAC1B,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI9C,sCAAsC;IACtC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAIxD,sBAAsB;IACtB,UAAU,IAAI,WAAW,EAAE;IAI3B,qCAAqC;IACrC,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAqBzE"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * ActionSpace — Manages the set of actions available to the agent and
3
+ * performs embedding-based matching.
4
+ *
5
+ * At initialization, each action's description is embedded. During inference,
6
+ * a predicted/context vector is compared against all action embeddings via
7
+ * cosine similarity to find the best match.
8
+ */
9
+ export class ActionSpace {
10
+ actions = [];
11
+ embeddings = new Map();
12
+ embeddingProvider;
13
+ constructor(embeddingProvider) {
14
+ this.embeddingProvider = embeddingProvider;
15
+ }
16
+ /**
17
+ * Initialize the action space — embeds all action descriptions.
18
+ * Must be called before any matching.
19
+ */
20
+ async initialize(actions) {
21
+ this.actions = actions;
22
+ // Batch embed all action descriptions
23
+ const descriptions = actions.map((a) => a.description);
24
+ const vectors = await this.embeddingProvider.embedBatch(descriptions);
25
+ for (let i = 0; i < actions.length; i++) {
26
+ this.embeddings.set(actions[i].id, vectors[i]);
27
+ }
28
+ }
29
+ /**
30
+ * Find the closest action to the given vector using cosine similarity.
31
+ */
32
+ match(vector) {
33
+ if (this.actions.length === 0) {
34
+ throw new Error("ActionSpace not initialized — call initialize() first");
35
+ }
36
+ const candidates = [];
37
+ for (const action of this.actions) {
38
+ const actionEmbedding = this.embeddings.get(action.id);
39
+ if (!actionEmbedding)
40
+ continue;
41
+ const score = cosineSimilarity(vector, actionEmbedding);
42
+ candidates.push({ actionId: action.id, score });
43
+ }
44
+ // Sort by score descending
45
+ candidates.sort((a, b) => b.score - a.score);
46
+ const bestMatch = candidates[0];
47
+ const matchedAction = this.actions.find((a) => a.id === bestMatch.actionId);
48
+ return {
49
+ action: matchedAction,
50
+ confidence: bestMatch.score,
51
+ candidates,
52
+ };
53
+ }
54
+ /** Get an action by ID */
55
+ getAction(id) {
56
+ return this.actions.find((a) => a.id === id);
57
+ }
58
+ /** Get the embedding for an action */
59
+ getEmbedding(actionId) {
60
+ return this.embeddings.get(actionId);
61
+ }
62
+ /** Get all actions */
63
+ getActions() {
64
+ return [...this.actions];
65
+ }
66
+ /** Number of actions in the space */
67
+ get size() {
68
+ return this.actions.length;
69
+ }
70
+ }
71
+ /**
72
+ * Compute cosine similarity between two vectors.
73
+ * Returns a value between -1 and 1 (1 = identical direction).
74
+ */
75
+ export function cosineSimilarity(a, b) {
76
+ if (a.length !== b.length) {
77
+ throw new Error(`Vector dimension mismatch: ${a.length} vs ${b.length}`);
78
+ }
79
+ let dotProduct = 0;
80
+ let normA = 0;
81
+ let normB = 0;
82
+ for (let i = 0; i < a.length; i++) {
83
+ dotProduct += a[i] * b[i];
84
+ normA += a[i] * a[i];
85
+ normB += b[i] * b[i];
86
+ }
87
+ const denominator = Math.sqrt(normA) * Math.sqrt(normB);
88
+ if (denominator === 0)
89
+ return 0;
90
+ return dotProduct / denominator;
91
+ }
92
+ //# sourceMappingURL=action-space.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"action-space.js","sourceRoot":"","sources":["../../src/jev/action-space.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { EmbeddingProvider } from "../types.js";
2
+ /**
3
+ * OpenAI Embedding Provider — uses the OpenAI API for text embeddings.
4
+ *
5
+ * Default embedding model for JEV in Phase 1.
6
+ * Uses `text-embedding-3-small` (1536 dimensions) for best quality/cost tradeoff.
7
+ */
8
+ export declare class OpenAIEmbeddingProvider implements EmbeddingProvider {
9
+ readonly name = "openai";
10
+ readonly dimensions: number;
11
+ private readonly apiKey;
12
+ private readonly model;
13
+ private readonly baseUrl;
14
+ constructor(options: {
15
+ apiKey: string;
16
+ model?: string;
17
+ dimensions?: number;
18
+ baseUrl?: string;
19
+ });
20
+ embed(text: string): Promise<Float64Array>;
21
+ embedBatch(texts: string[]): Promise<Float64Array[]>;
22
+ }
23
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/jev/embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;;;GAKG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,EAAE;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB;IAOK,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAyB1C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CA4B3D"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * OpenAI Embedding Provider — uses the OpenAI API for text embeddings.
3
+ *
4
+ * Default embedding model for JEV in Phase 1.
5
+ * Uses `text-embedding-3-small` (1536 dimensions) for best quality/cost tradeoff.
6
+ */
7
+ export class OpenAIEmbeddingProvider {
8
+ name = "openai";
9
+ dimensions;
10
+ apiKey;
11
+ model;
12
+ baseUrl;
13
+ constructor(options) {
14
+ this.apiKey = options.apiKey;
15
+ this.model = options.model ?? "text-embedding-3-small";
16
+ this.dimensions = options.dimensions ?? 1536;
17
+ this.baseUrl = options.baseUrl ?? "https://api.openai.com/v1";
18
+ }
19
+ async embed(text) {
20
+ const response = await fetch(`${this.baseUrl}/embeddings`, {
21
+ method: "POST",
22
+ headers: {
23
+ "Content-Type": "application/json",
24
+ Authorization: `Bearer ${this.apiKey}`,
25
+ },
26
+ body: JSON.stringify({
27
+ input: text,
28
+ model: this.model,
29
+ dimensions: this.dimensions,
30
+ }),
31
+ });
32
+ if (!response.ok) {
33
+ const error = await response.text();
34
+ throw new Error(`OpenAI embedding failed: ${response.status} ${error}`);
35
+ }
36
+ const data = (await response.json());
37
+ return new Float64Array(data.data[0].embedding);
38
+ }
39
+ async embedBatch(texts) {
40
+ // OpenAI supports batching natively
41
+ const response = await fetch(`${this.baseUrl}/embeddings`, {
42
+ method: "POST",
43
+ headers: {
44
+ "Content-Type": "application/json",
45
+ Authorization: `Bearer ${this.apiKey}`,
46
+ },
47
+ body: JSON.stringify({
48
+ input: texts,
49
+ model: this.model,
50
+ dimensions: this.dimensions,
51
+ }),
52
+ });
53
+ if (!response.ok) {
54
+ const error = await response.text();
55
+ throw new Error(`OpenAI batch embedding failed: ${response.status} ${error}`);
56
+ }
57
+ const data = (await response.json());
58
+ // Sort by index to maintain order
59
+ const sorted = data.data.sort((a, b) => a.index - b.index);
60
+ return sorted.map((d) => new Float64Array(d.embedding));
61
+ }
62
+ }
63
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/jev/embeddings.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,OAAO,uBAAuB;IACzB,IAAI,GAAG,QAAQ,CAAC;IAChB,UAAU,CAAS;IACX,MAAM,CAAS;IACf,KAAK,CAAS;IACd,OAAO,CAAS;IAEjC,YAAY,OAKX;QACC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,wBAAwB,CAAC;QACvD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,2BAA2B,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,aAAa,EAAE;YACzD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACvC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;aAC5B,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;QACF,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,oCAAoC;QACpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,aAAa,EAAE;YACzD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;aACvC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,UAAU,EAAE,IAAI,CAAC,UAAU;aAC5B,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAElC,CAAC;QAEF,kCAAkC;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC3D,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC1D,CAAC;CACF"}
@@ -0,0 +1,101 @@
1
+ import type { JEVEngine as IJEVEngine, AgentAction, ActionMatch, ConversationContext, EmbeddingProvider } from "../types.js";
2
+ import { ActionSpace } from "./action-space.js";
3
+ /**
4
+ * JEVEngine — The core Joint Embedding Vector engine.
5
+ *
6
+ * This is the brain of Felona Voice. It decides what the agent should do next
7
+ * by encoding the conversation context into a vector and matching it against
8
+ * the action space.
9
+ *
10
+ * Two modes:
11
+ *
12
+ * 1. **Cold Start (no predictor)**: Encodes the current context directly and
13
+ * matches against action embeddings via cosine similarity. Works out of the
14
+ * box with zero training data.
15
+ *
16
+ * 2. **Trained (with predictor)**: Uses a trained MLP predictor to transform
17
+ * the context vector into a predicted next-state vector before matching.
18
+ * The predictor learns conversation flow patterns from call logs.
19
+ *
20
+ * The engine gracefully degrades: if no predictor is loaded, it falls back
21
+ * to cold-start mode automatically.
22
+ */
23
+ export declare class JEVEngine implements IJEVEngine {
24
+ private readonly embeddingProvider;
25
+ private readonly actionSpace;
26
+ private readonly confidenceThreshold;
27
+ private predictorModel;
28
+ private initialized;
29
+ constructor(options: {
30
+ embeddingProvider: EmbeddingProvider;
31
+ confidenceThreshold?: number;
32
+ });
33
+ /**
34
+ * Initialize the engine — embed all action descriptions into the action space.
35
+ */
36
+ initialize(actions: AgentAction[]): Promise<void>;
37
+ /**
38
+ * Load a trained predictor model.
39
+ * In Phase 1, this is a no-op — we run in cold-start mode.
40
+ * Phase 2 will add ONNX.js predictor loading.
41
+ */
42
+ loadPredictor(modelPath: string): Promise<void>;
43
+ /**
44
+ * Full decision pipeline:
45
+ * 1. Encode the conversation context
46
+ * 2. Predict next state (or use context directly if no predictor)
47
+ * 3. Match against action space
48
+ */
49
+ decide(context: ConversationContext): Promise<ActionMatch>;
50
+ /**
51
+ * Encode the conversation context into a single embedding vector.
52
+ *
53
+ * The context string is constructed from:
54
+ * - System prompt (agent personality)
55
+ * - Recent conversation history
56
+ * - Current user utterance
57
+ * - Extracted slots
58
+ *
59
+ * This is the input to the predictor network.
60
+ */
61
+ encode(context: ConversationContext): Promise<Float64Array>;
62
+ /**
63
+ * Predict the next-state vector from a context vector.
64
+ *
65
+ * In cold-start mode (no predictor), returns the input vector unchanged.
66
+ * With a trained predictor, transforms the context vector to predict
67
+ * what the next conversation state should look like.
68
+ */
69
+ predict(contextVector: Float64Array): Promise<Float64Array>;
70
+ /**
71
+ * Match a vector against the action space.
72
+ */
73
+ match(vector: Float64Array): Promise<ActionMatch>;
74
+ /**
75
+ * Build a text string from the conversation context for embedding.
76
+ *
77
+ * Design: We want the embedding to capture:
78
+ * - What kind of agent this is (system prompt excerpt)
79
+ * - What has been discussed (recent turns)
80
+ * - What the user just said (current utterance)
81
+ * - What we know so far (slots)
82
+ */
83
+ private buildContextString;
84
+ /** Get the action space (for testing/inspection) */
85
+ getActionSpace(): ActionSpace;
86
+ /** Check if the engine is initialized */
87
+ get isInitialized(): boolean;
88
+ /** Check if a predictor model is loaded */
89
+ get hasPredictor(): boolean;
90
+ /** Get the confidence threshold */
91
+ get threshold(): number;
92
+ private assertInitialized;
93
+ }
94
+ /**
95
+ * Create a JEV engine with the given embedding provider.
96
+ */
97
+ export declare function createJEVEngine(options: {
98
+ embeddingProvider: EmbeddingProvider;
99
+ confidenceThreshold?: number;
100
+ }): JEVEngine;
101
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/jev/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,IAAI,UAAU,EACvB,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,SAAU,YAAW,UAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE;QACnB,iBAAiB,EAAE,iBAAiB,CAAC;QACrC,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B;IAMD;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKvD;;;;OAIG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASrD;;;;;OAKG;IACG,MAAM,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,CAAC;IAiBhE;;;;;;;;;;OAUG;IACG,MAAM,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;IAKjE;;;;;;OAMG;IACG,OAAO,CAAC,aAAa,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAWjE;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAKvD;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAsC1B,oDAAoD;IACpD,cAAc,IAAI,WAAW;IAI7B,yCAAyC;IACzC,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,2CAA2C;IAC3C,IAAI,YAAY,IAAI,OAAO,CAE1B;IAED,mCAAmC;IACnC,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,OAAO,CAAC,iBAAiB;CAO1B;AAUD;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,GAAG,SAAS,CAEZ"}
@@ -0,0 +1,173 @@
1
+ import { ActionSpace } from "./action-space.js";
2
+ /**
3
+ * JEVEngine — The core Joint Embedding Vector engine.
4
+ *
5
+ * This is the brain of Felona Voice. It decides what the agent should do next
6
+ * by encoding the conversation context into a vector and matching it against
7
+ * the action space.
8
+ *
9
+ * Two modes:
10
+ *
11
+ * 1. **Cold Start (no predictor)**: Encodes the current context directly and
12
+ * matches against action embeddings via cosine similarity. Works out of the
13
+ * box with zero training data.
14
+ *
15
+ * 2. **Trained (with predictor)**: Uses a trained MLP predictor to transform
16
+ * the context vector into a predicted next-state vector before matching.
17
+ * The predictor learns conversation flow patterns from call logs.
18
+ *
19
+ * The engine gracefully degrades: if no predictor is loaded, it falls back
20
+ * to cold-start mode automatically.
21
+ */
22
+ export class JEVEngine {
23
+ embeddingProvider;
24
+ actionSpace;
25
+ confidenceThreshold;
26
+ predictorModel = null;
27
+ initialized = false;
28
+ constructor(options) {
29
+ this.embeddingProvider = options.embeddingProvider;
30
+ this.actionSpace = new ActionSpace(options.embeddingProvider);
31
+ this.confidenceThreshold = options.confidenceThreshold ?? 0.3;
32
+ }
33
+ /**
34
+ * Initialize the engine — embed all action descriptions into the action space.
35
+ */
36
+ async initialize(actions) {
37
+ await this.actionSpace.initialize(actions);
38
+ this.initialized = true;
39
+ }
40
+ /**
41
+ * Load a trained predictor model.
42
+ * In Phase 1, this is a no-op — we run in cold-start mode.
43
+ * Phase 2 will add ONNX.js predictor loading.
44
+ */
45
+ async loadPredictor(modelPath) {
46
+ // Phase 2: Load ONNX model here
47
+ // this.predictorModel = await loadONNXModel(modelPath);
48
+ console.log(`[JEV] Predictor model loading not yet implemented. Path: ${modelPath}`);
49
+ console.log("[JEV] Running in cold-start mode (direct embedding similarity)");
50
+ }
51
+ /**
52
+ * Full decision pipeline:
53
+ * 1. Encode the conversation context
54
+ * 2. Predict next state (or use context directly if no predictor)
55
+ * 3. Match against action space
56
+ */
57
+ async decide(context) {
58
+ this.assertInitialized();
59
+ // Step 1: Encode context
60
+ const contextVector = await this.encode(context);
61
+ // Step 2: Predict (or passthrough in cold-start mode)
62
+ const targetVector = this.predictorModel
63
+ ? await this.predict(contextVector)
64
+ : contextVector;
65
+ // Step 3: Match against action space
66
+ const match = await this.match(targetVector);
67
+ return match;
68
+ }
69
+ /**
70
+ * Encode the conversation context into a single embedding vector.
71
+ *
72
+ * The context string is constructed from:
73
+ * - System prompt (agent personality)
74
+ * - Recent conversation history
75
+ * - Current user utterance
76
+ * - Extracted slots
77
+ *
78
+ * This is the input to the predictor network.
79
+ */
80
+ async encode(context) {
81
+ const contextString = this.buildContextString(context);
82
+ return this.embeddingProvider.embed(contextString);
83
+ }
84
+ /**
85
+ * Predict the next-state vector from a context vector.
86
+ *
87
+ * In cold-start mode (no predictor), returns the input vector unchanged.
88
+ * With a trained predictor, transforms the context vector to predict
89
+ * what the next conversation state should look like.
90
+ */
91
+ async predict(contextVector) {
92
+ if (!this.predictorModel) {
93
+ // Cold-start mode: direct passthrough
94
+ return contextVector;
95
+ }
96
+ // Phase 2: Run ONNX predictor
97
+ // return this.predictorModel.predict(contextVector);
98
+ return contextVector;
99
+ }
100
+ /**
101
+ * Match a vector against the action space.
102
+ */
103
+ async match(vector) {
104
+ this.assertInitialized();
105
+ return this.actionSpace.match(vector);
106
+ }
107
+ /**
108
+ * Build a text string from the conversation context for embedding.
109
+ *
110
+ * Design: We want the embedding to capture:
111
+ * - What kind of agent this is (system prompt excerpt)
112
+ * - What has been discussed (recent turns)
113
+ * - What the user just said (current utterance)
114
+ * - What we know so far (slots)
115
+ */
116
+ buildContextString(context) {
117
+ const parts = [];
118
+ // Agent personality (truncated to keep embedding focused)
119
+ if (context.systemPrompt) {
120
+ const truncated = context.systemPrompt.slice(0, 200);
121
+ parts.push(`Agent: ${truncated}`);
122
+ }
123
+ // Recent conversation history (last 5 turns for embedding focus)
124
+ const recentTurns = context.turns.slice(-5);
125
+ if (recentTurns.length > 0) {
126
+ const history = recentTurns
127
+ .map((t) => `${t.role === "user" ? "User" : "Agent"}: ${t.content}`)
128
+ .join("\n");
129
+ parts.push(`History:\n${history}`);
130
+ }
131
+ // Current user utterance (most important for decision)
132
+ if (context.currentUtterance) {
133
+ parts.push(`Current user message: ${context.currentUtterance}`);
134
+ }
135
+ // Extracted slots
136
+ const slotEntries = Object.entries(context.slots);
137
+ if (slotEntries.length > 0) {
138
+ const slotsStr = slotEntries
139
+ .map(([k, v]) => `${k}: ${String(v)}`)
140
+ .join(", ");
141
+ parts.push(`Known information: ${slotsStr}`);
142
+ }
143
+ return parts.join("\n\n");
144
+ }
145
+ /** Get the action space (for testing/inspection) */
146
+ getActionSpace() {
147
+ return this.actionSpace;
148
+ }
149
+ /** Check if the engine is initialized */
150
+ get isInitialized() {
151
+ return this.initialized;
152
+ }
153
+ /** Check if a predictor model is loaded */
154
+ get hasPredictor() {
155
+ return this.predictorModel !== null;
156
+ }
157
+ /** Get the confidence threshold */
158
+ get threshold() {
159
+ return this.confidenceThreshold;
160
+ }
161
+ assertInitialized() {
162
+ if (!this.initialized) {
163
+ throw new Error("JEV engine not initialized — call initialize() with actions first");
164
+ }
165
+ }
166
+ }
167
+ /**
168
+ * Create a JEV engine with the given embedding provider.
169
+ */
170
+ export function createJEVEngine(options) {
171
+ return new JEVEngine(options);
172
+ }
173
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/jev/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { JEVEngine, createJEVEngine } from "./engine.js";
2
+ export { ActionSpace, cosineSimilarity } from "./action-space.js";
3
+ export { OpenAIEmbeddingProvider } from "./embeddings.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jev/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { JEVEngine, createJEVEngine } from "./engine.js";
2
+ export { ActionSpace, cosineSimilarity } from "./action-space.js";
3
+ export { OpenAIEmbeddingProvider } from "./embeddings.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/jev/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { OpenAILLM, createOpenAILLM } from "./openai.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { OpenAILLM, createOpenAILLM } from "./openai.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/llm/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { LLMProvider, LLMInterface, LLMOptions } from "../types.js";
2
+ /**
3
+ * OpenAILLM — LLM provider using OpenAI's chat completions API.
4
+ *
5
+ * The LLM in Felona Voice is used for **content generation**, not flow control.
6
+ * JEV decides what to do; the LLM decides how to say it.
7
+ */
8
+ export declare class OpenAILLM implements LLMProvider {
9
+ readonly name = "openai";
10
+ private readonly apiKey;
11
+ private readonly baseUrl;
12
+ constructor(options: {
13
+ apiKey: string;
14
+ baseUrl?: string;
15
+ });
16
+ create(options: LLMOptions): LLMInterface;
17
+ }
18
+ export declare function createOpenAILLM(options: {
19
+ apiKey: string;
20
+ baseUrl?: string;
21
+ }): OpenAILLM;
22
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/llm/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAc,MAAM,aAAa,CAAC;AAErF;;;;;GAKG;AACH,qBAAa,SAAU,YAAW,WAAW;IAC3C,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAKzD,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,YAAY;CAS1C;AAiJD,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,SAAS,CAEZ"}