@fonoster/autopilot 0.16.10 → 0.17.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.
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 Fonoster Inc
3
+ Copyright (c) 2026 Fonoster Inc
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -18,4 +18,4 @@ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
18
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
21
+ SOFTWARE.
package/README.md CHANGED
@@ -183,13 +183,19 @@ For example:
183
183
 
184
184
  Please use the following environment variables to configure the Autopilot:
185
185
 
186
- - `ASSISTANTS`: The path to the configuration file.
187
- - `OPEN_API_KEY`: The OpenAI API key for embeddings support.
188
- - `KNOWLEDGE_BASE_ENABLED`: Enable knowledge base powered by AWS S3 and Unstructured API.
189
- - `AWS_S3_ACCESS_KEY_ID`: The AWS S3 access key.
190
- - `AWS_S3_SECRET_ACCESS_KEY`: The AWS S3 secret access key.
191
- - `UNSTRUCTURED_API_KEY`: The Unstructured API key.
192
- - `UNSTRUCTURED_API_URL`: The Unstructured API URL. Default is `https://api.unstructured.com`.
186
+ - `AUTOPILOT_AWS_S3_ACCESS_KEY_ID`: The AWS S3 access key.
187
+ - `AUTOPILOT_AWS_S3_ENDPOINT`: The AWS S3 endpoint.
188
+ - `AUTOPILOT_AWS_S3_REGION`: The AWS S3 region.
189
+ - `AUTOPILOT_AWS_S3_SECRET_ACCESS_KEY`: The AWS S3 secret access key.
190
+ - `AUTOPILOT_CONVERSATION_PROVIDER`: The conversation provider.
191
+ - `AUTOPILOT_KNOWLEDGE_BASE_ENABLED`: Enable knowledge base powered by AWS S3 and Unstructured API.
192
+ - `AUTOPILOT_LOGS_FORMAT`: The logs format.
193
+ - `AUTOPILOT_LOGS_LEVEL`: The logs level.
194
+ - `AUTOPILOT_LOGS_TRANSPORT`: The logs transport.
195
+ - `AUTOPILOT_OPENAI_API_KEY`: The OpenAI API key needed for embeddings support.
196
+ - `AUTOPILOT_UNSTRUCTURED_API_KEY`: The Unstructured API key.
197
+ - `AUTOPILOT_UNSTRUCTURED_API_URL`: The Unstructured API URL. Default is `https://api.unstructured.com`.
198
+ - `AUTOPILOT_RECORDING_BASE_URL`: The recording base URL. Default is `http://localhost:9876/api/recordings`.
193
199
 
194
200
  ## What's Next
195
201
 
package/dist/envs.d.ts CHANGED
@@ -12,3 +12,4 @@ export declare const APISERVER_ENDPOINT: string;
12
12
  export declare const INTEGRATIONS_FILE: string;
13
13
  export declare const OPENAI_API_KEY: string;
14
14
  export declare const SKIP_IDENTITY: boolean;
15
+ export declare const RECORDING_BASE_URL: string;
package/dist/envs.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.SKIP_IDENTITY = exports.OPENAI_API_KEY = exports.INTEGRATIONS_FILE = exports.APISERVER_ENDPOINT = exports.CONVERSATION_PROVIDER_FILE = exports.CONVERSATION_PROVIDER = exports.UNSTRUCTURED_API_URL = exports.UNSTRUCTURED_API_KEY = exports.NODE_ENV = exports.KNOWLEDGE_BASE_ENABLED = exports.AWS_S3_SECRET_ACCESS_KEY = exports.AWS_S3_REGION = exports.AWS_S3_ENDPOINT = exports.AWS_S3_ACCESS_KEY_ID = void 0;
6
+ exports.RECORDING_BASE_URL = exports.SKIP_IDENTITY = exports.OPENAI_API_KEY = exports.INTEGRATIONS_FILE = exports.APISERVER_ENDPOINT = exports.CONVERSATION_PROVIDER_FILE = exports.CONVERSATION_PROVIDER = exports.UNSTRUCTURED_API_URL = exports.UNSTRUCTURED_API_KEY = exports.NODE_ENV = exports.KNOWLEDGE_BASE_ENABLED = exports.AWS_S3_SECRET_ACCESS_KEY = exports.AWS_S3_REGION = exports.AWS_S3_ENDPOINT = exports.AWS_S3_ACCESS_KEY_ID = void 0;
7
7
  /**
8
8
  * Copyright (C) 2025 by Fonoster Inc (https://fonoster.com)
9
9
  * http://github.com/fonoster/fonoster
@@ -54,6 +54,9 @@ exports.INTEGRATIONS_FILE = e.AUTOPILOT_INTEGRATIONS_FILE
54
54
  : "/opt/fonoster/integrations.json";
55
55
  exports.OPENAI_API_KEY = e.AUTOPILOT_OPENAI_API_KEY;
56
56
  exports.SKIP_IDENTITY = e.AUTOPILOT_SKIP_IDENTITY === "true";
57
+ exports.RECORDING_BASE_URL = e.AUTOPILOT_RECORDING_BASE_URL
58
+ ? e.AUTOPILOT_RECORDING_BASE_URL
59
+ : "http://localhost:9876/api/recordings";
57
60
  if (exports.CONVERSATION_PROVIDER.toLocaleLowerCase() !== types_1.ConversationProvider.API &&
58
61
  exports.CONVERSATION_PROVIDER.toLocaleLowerCase() !== types_1.ConversationProvider.FILE) {
59
62
  console.error("CONVERSATION_PROVIDER must be set to 'api' or 'file'");
@@ -66,12 +66,13 @@ const sendConversationEndedEvent_1 = require("./sendConversationEndedEvent");
66
66
  const _1 = __importStar(require("."));
67
67
  const logger = (0, logger_1.getLogger)({ service: "autopilot", filePath: __filename });
68
68
  async function handleVoiceRequest(req, res) {
69
- const { accessKeyId, callerNumber, ingressNumber, sessionRef, appRef, callDirection, metadata } = req;
69
+ const { accessKeyId, callerNumber, ingressNumber, mediaSessionRef, appRef, callRef, callDirection, metadata } = req;
70
70
  logger.verbose("voice request", {
71
71
  accessKeyId,
72
72
  ingressNumber,
73
- sessionRef,
73
+ mediaSessionRef,
74
74
  appRef,
75
+ callRef,
75
76
  metadata
76
77
  });
77
78
  const assistantConfig = envs_1.CONVERSATION_PROVIDER === _1.ConversationProvider.FILE
@@ -103,7 +104,7 @@ async function handleVoiceRequest(req, res) {
103
104
  knowledgeBase?.load().then(() => {
104
105
  logger.verbose("knowledge base loaded");
105
106
  });
106
- const voice = new _1.VoiceImpl(sessionRef, res);
107
+ const voice = new _1.VoiceImpl(mediaSessionRef, res);
107
108
  const languageModel = (0, createLanguageModel_1.createLanguageModel)({
108
109
  voice,
109
110
  assistantConfig,
@@ -138,11 +139,14 @@ async function handleVoiceRequest(req, res) {
138
139
  })
139
140
  .filter(Boolean);
140
141
  if (assistantConfig.eventsHook?.url) {
142
+ // Construct recording URL: baseUrl + appRef + mediaSessionRef
143
+ const recordingUrl = `${envs_1.RECORDING_BASE_URL}/${appRef}_${mediaSessionRef}.wav`;
141
144
  await (0, sendConversationEndedEvent_1.sendConversationEndedEvent)(assistantConfig.eventsHook, {
142
- chatHistory: chatHistory,
143
- phone: ingressNumber,
144
145
  appRef,
145
- sessionRef
146
+ callRef,
147
+ phone: ingressNumber,
148
+ chatHistory: chatHistory,
149
+ recordingUrl
146
150
  });
147
151
  }
148
152
  });
@@ -23,7 +23,7 @@ const logger_1 = require("@fonoster/logger");
23
23
  const logger = (0, logger_1.getLogger)({ service: "autopilot", filePath: __filename });
24
24
  const interruptPlayback = async ({ context }) => {
25
25
  logger.verbose("called the interruptPlayback action", {
26
- sessionRef: context.sessionRef
26
+ mediaSessionRef: context.mediaSessionRef
27
27
  });
28
28
  await context.voice.stopSpeech();
29
29
  };
@@ -26,7 +26,7 @@ declare const context: ({ input }: {
26
26
  conversationSettings: ConversationSettings;
27
27
  };
28
28
  }) => {
29
- sessionRef: string;
29
+ mediaSessionRef: string;
30
30
  voice: Voice;
31
31
  languageModel: LanguageModel;
32
32
  speechBuffer: string;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.context = void 0;
4
4
  const context = ({ input }) => ({
5
- sessionRef: input.voice.sessionRef,
5
+ mediaSessionRef: input.voice.mediaSessionRef,
6
6
  voice: input.voice,
7
7
  languageModel: input.languageModel,
8
8
  speechBuffer: "",
@@ -71,7 +71,7 @@ declare const machine: import("xstate").StateMachine<any, import("./types").Auto
71
71
  conversationSettings: import("..").ConversationSettings;
72
72
  };
73
73
  }) => {
74
- sessionRef: string;
74
+ mediaSessionRef: string;
75
75
  voice: import("..").Voice;
76
76
  languageModel: import("..").LanguageModel;
77
77
  speechBuffer: string;
@@ -147,11 +147,11 @@ declare const machineSetup: {
147
147
  type: "history";
148
148
  } ? [never, never] : T_6 extends infer T_10 ? T_10 extends T_6 ? T_10 extends {
149
149
  type: "parallel";
150
- } ? [T_9, never] : "states" extends keyof T_10["states"][T_9] ? [T_9, never] : [never, T_9] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_1 in (S & string extends infer T_11 ? T_11 extends S & string ? T_11 extends any ? T_6["states"][T_11] extends {
150
+ } ? [T_9, never] : "states" extends keyof T_10["states"][T_9] ? [T_9, never] : [never, T_9] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_2 in (S & string extends infer T_11 ? T_11 extends S & string ? T_11 extends any ? T_6["states"][T_11] extends {
151
151
  type: "history";
152
152
  } ? [never, never] : T_6 extends infer T_12 ? T_12 extends T_6 ? T_12 extends {
153
153
  type: "parallel";
154
- } ? [T_11, never] : "states" extends keyof T_12["states"][T_11] ? [T_11, never] : [never, T_11] : never : never : never : never : never)[0]]?: T_6["states"][K_1] extends infer T_13 ? T_13 extends T_6["states"][K_1] ? T_13 extends {
154
+ } ? [T_11, never] : "states" extends keyof T_12["states"][T_11] ? [T_11, never] : [never, T_11] : never : never : never : never : never)[0]]?: T_6["states"][K_2] extends infer T_13 ? T_13 extends T_6["states"][K_2] ? T_13 extends {
155
155
  states: Record<infer S, any>;
156
156
  } ? import("xstate").IsNever<S> extends true ? {} : (S & string extends infer T_14 ? T_14 extends S & string ? T_14 extends any ? T_13["states"][T_14] extends {
157
157
  type: "history";
@@ -161,11 +161,11 @@ declare const machineSetup: {
161
161
  type: "history";
162
162
  } ? [never, never] : T_13 extends infer T_17 ? T_17 extends T_13 ? T_17 extends {
163
163
  type: "parallel";
164
- } ? [T_16, never] : "states" extends keyof T_17["states"][T_16] ? [T_16, never] : [never, T_16] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_2 in (S & string extends infer T_18 ? T_18 extends S & string ? T_18 extends any ? T_13["states"][T_18] extends {
164
+ } ? [T_16, never] : "states" extends keyof T_17["states"][T_16] ? [T_16, never] : [never, T_16] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_3 in (S & string extends infer T_18 ? T_18 extends S & string ? T_18 extends any ? T_13["states"][T_18] extends {
165
165
  type: "history";
166
166
  } ? [never, never] : T_13 extends infer T_19 ? T_19 extends T_13 ? T_19 extends {
167
167
  type: "parallel";
168
- } ? [T_18, never] : "states" extends keyof T_19["states"][T_18] ? [T_18, never] : [never, T_18] : never : never : never : never : never)[0]]?: T_13["states"][K_2] extends infer T_20 ? T_20 extends T_13["states"][K_2] ? T_20 extends {
168
+ } ? [T_18, never] : "states" extends keyof T_19["states"][T_18] ? [T_18, never] : [never, T_18] : never : never : never : never : never)[0]]?: T_13["states"][K_3] extends infer T_20 ? T_20 extends T_13["states"][K_3] ? T_20 extends {
169
169
  states: Record<infer S, any>;
170
170
  } ? import("xstate").IsNever<S> extends true ? {} : (S & string extends infer T_21 ? T_21 extends S & string ? T_21 extends any ? T_20["states"][T_21] extends {
171
171
  type: "history";
@@ -175,11 +175,11 @@ declare const machineSetup: {
175
175
  type: "history";
176
176
  } ? [never, never] : T_20 extends infer T_24 ? T_24 extends T_20 ? T_24 extends {
177
177
  type: "parallel";
178
- } ? [T_23, never] : "states" extends keyof T_24["states"][T_23] ? [T_23, never] : [never, T_23] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_3 in (S & string extends infer T_25 ? T_25 extends S & string ? T_25 extends any ? T_20["states"][T_25] extends {
178
+ } ? [T_23, never] : "states" extends keyof T_24["states"][T_23] ? [T_23, never] : [never, T_23] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_4 in (S & string extends infer T_25 ? T_25 extends S & string ? T_25 extends any ? T_20["states"][T_25] extends {
179
179
  type: "history";
180
180
  } ? [never, never] : T_20 extends infer T_26 ? T_26 extends T_20 ? T_26 extends {
181
181
  type: "parallel";
182
- } ? [T_25, never] : "states" extends keyof T_26["states"][T_25] ? [T_25, never] : [never, T_25] : never : never : never : never : never)[0]]?: T_20["states"][K_3] extends infer T_27 ? T_27 extends T_20["states"][K_3] ? T_27 extends {
182
+ } ? [T_25, never] : "states" extends keyof T_26["states"][T_25] ? [T_25, never] : [never, T_25] : never : never : never : never : never)[0]]?: T_20["states"][K_4] extends infer T_27 ? T_27 extends T_20["states"][K_4] ? T_27 extends {
183
183
  states: Record<infer S, any>;
184
184
  } ? import("xstate").IsNever<S> extends true ? {} : (S & string extends infer T_28 ? T_28 extends S & string ? T_28 extends any ? T_27["states"][T_28] extends {
185
185
  type: "history";
@@ -189,11 +189,11 @@ declare const machineSetup: {
189
189
  type: "history";
190
190
  } ? [never, never] : T_27 extends infer T_31 ? T_31 extends T_27 ? T_31 extends {
191
191
  type: "parallel";
192
- } ? [T_30, never] : "states" extends keyof T_31["states"][T_30] ? [T_30, never] : [never, T_30] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_4 in (S & string extends infer T_32 ? T_32 extends S & string ? T_32 extends any ? T_27["states"][T_32] extends {
192
+ } ? [T_30, never] : "states" extends keyof T_31["states"][T_30] ? [T_30, never] : [never, T_30] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_5 in (S & string extends infer T_32 ? T_32 extends S & string ? T_32 extends any ? T_27["states"][T_32] extends {
193
193
  type: "history";
194
194
  } ? [never, never] : T_27 extends infer T_33 ? T_33 extends T_27 ? T_33 extends {
195
195
  type: "parallel";
196
- } ? [T_32, never] : "states" extends keyof T_33["states"][T_32] ? [T_32, never] : [never, T_32] : never : never : never : never : never)[0]]?: T_27["states"][K_4] extends infer T_34 ? T_34 extends T_27["states"][K_4] ? T_34 extends {
196
+ } ? [T_32, never] : "states" extends keyof T_33["states"][T_32] ? [T_32, never] : [never, T_32] : never : never : never : never : never)[0]]?: T_27["states"][K_5] extends infer T_34 ? T_34 extends T_27["states"][K_5] ? T_34 extends {
197
197
  states: Record<infer S, any>;
198
198
  } ? import("xstate").IsNever<S> extends true ? {} : (S & string extends infer T_35 ? T_35 extends S & string ? T_35 extends any ? T_34["states"][T_35] extends {
199
199
  type: "history";
@@ -203,11 +203,11 @@ declare const machineSetup: {
203
203
  type: "history";
204
204
  } ? [never, never] : T_34 extends infer T_38 ? T_38 extends T_34 ? T_38 extends {
205
205
  type: "parallel";
206
- } ? [T_37, never] : "states" extends keyof T_38["states"][T_37] ? [T_37, never] : [never, T_37] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_5 in (S & string extends infer T_39 ? T_39 extends S & string ? T_39 extends any ? T_34["states"][T_39] extends {
206
+ } ? [T_37, never] : "states" extends keyof T_38["states"][T_37] ? [T_37, never] : [never, T_37] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_6 in (S & string extends infer T_39 ? T_39 extends S & string ? T_39 extends any ? T_34["states"][T_39] extends {
207
207
  type: "history";
208
208
  } ? [never, never] : T_34 extends infer T_40 ? T_40 extends T_34 ? T_40 extends {
209
209
  type: "parallel";
210
- } ? [T_39, never] : "states" extends keyof T_40["states"][T_39] ? [T_39, never] : [never, T_39] : never : never : never : never : never)[0]]?: T_34["states"][K_5] extends infer T_41 ? T_41 extends T_34["states"][K_5] ? T_41 extends {
210
+ } ? [T_39, never] : "states" extends keyof T_40["states"][T_39] ? [T_39, never] : [never, T_39] : never : never : never : never : never)[0]]?: T_34["states"][K_6] extends infer T_41 ? T_41 extends T_34["states"][K_6] ? T_41 extends {
211
211
  states: Record<infer S, any>;
212
212
  } ? import("xstate").IsNever<S> extends true ? {} : (S & string extends infer T_42 ? T_42 extends S & string ? T_42 extends any ? T_41["states"][T_42] extends {
213
213
  type: "history";
@@ -217,11 +217,11 @@ declare const machineSetup: {
217
217
  type: "history";
218
218
  } ? [never, never] : T_41 extends infer T_45 ? T_45 extends T_41 ? T_45 extends {
219
219
  type: "parallel";
220
- } ? [T_44, never] : "states" extends keyof T_45["states"][T_44] ? [T_44, never] : [never, T_44] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_6 in (S & string extends infer T_46 ? T_46 extends S & string ? T_46 extends any ? T_41["states"][T_46] extends {
220
+ } ? [T_44, never] : "states" extends keyof T_45["states"][T_44] ? [T_44, never] : [never, T_44] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_7 in (S & string extends infer T_46 ? T_46 extends S & string ? T_46 extends any ? T_41["states"][T_46] extends {
221
221
  type: "history";
222
222
  } ? [never, never] : T_41 extends infer T_47 ? T_47 extends T_41 ? T_47 extends {
223
223
  type: "parallel";
224
- } ? [T_46, never] : "states" extends keyof T_47["states"][T_46] ? [T_46, never] : [never, T_46] : never : never : never : never : never)[0]]?: T_41["states"][K_6] extends infer T_48 ? T_48 extends T_41["states"][K_6] ? T_48 extends {
224
+ } ? [T_46, never] : "states" extends keyof T_47["states"][T_46] ? [T_46, never] : [never, T_46] : never : never : never : never : never)[0]]?: T_41["states"][K_7] extends infer T_48 ? T_48 extends T_41["states"][K_7] ? T_48 extends {
225
225
  states: Record<infer S, any>;
226
226
  } ? import("xstate").IsNever<S> extends true ? {} : (S & string extends infer T_49 ? T_49 extends S & string ? T_49 extends any ? T_48["states"][T_49] extends {
227
227
  type: "history";
@@ -231,11 +231,11 @@ declare const machineSetup: {
231
231
  type: "history";
232
232
  } ? [never, never] : T_48 extends infer T_52 ? T_52 extends T_48 ? T_52 extends {
233
233
  type: "parallel";
234
- } ? [T_51, never] : "states" extends keyof T_52["states"][T_51] ? [T_51, never] : [never, T_51] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_7 in (S & string extends infer T_53 ? T_53 extends S & string ? T_53 extends any ? T_48["states"][T_53] extends {
234
+ } ? [T_51, never] : "states" extends keyof T_52["states"][T_51] ? [T_51, never] : [never, T_51] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_8 in (S & string extends infer T_53 ? T_53 extends S & string ? T_53 extends any ? T_48["states"][T_53] extends {
235
235
  type: "history";
236
236
  } ? [never, never] : T_48 extends infer T_54 ? T_54 extends T_48 ? T_54 extends {
237
237
  type: "parallel";
238
- } ? [T_53, never] : "states" extends keyof T_54["states"][T_53] ? [T_53, never] : [never, T_53] : never : never : never : never : never)[0]]?: T_48["states"][K_7] extends infer T_55 ? T_55 extends T_48["states"][K_7] ? T_55 extends {
238
+ } ? [T_53, never] : "states" extends keyof T_54["states"][T_53] ? [T_53, never] : [never, T_53] : never : never : never : never : never)[0]]?: T_48["states"][K_8] extends infer T_55 ? T_55 extends T_48["states"][K_8] ? T_55 extends {
239
239
  states: Record<infer S, any>;
240
240
  } ? import("xstate").IsNever<S> extends true ? {} : (S & string extends infer T_56 ? T_56 extends S & string ? T_56 extends any ? T_55["states"][T_56] extends {
241
241
  type: "history";
@@ -245,11 +245,11 @@ declare const machineSetup: {
245
245
  type: "history";
246
246
  } ? [never, never] : T_55 extends infer T_59 ? T_59 extends T_55 ? T_59 extends {
247
247
  type: "parallel";
248
- } ? [T_58, never] : "states" extends keyof T_59["states"][T_58] ? [T_58, never] : [never, T_58] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_8 in (S & string extends infer T_60 ? T_60 extends S & string ? T_60 extends any ? T_55["states"][T_60] extends {
248
+ } ? [T_58, never] : "states" extends keyof T_59["states"][T_58] ? [T_58, never] : [never, T_58] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_9 in (S & string extends infer T_60 ? T_60 extends S & string ? T_60 extends any ? T_55["states"][T_60] extends {
249
249
  type: "history";
250
250
  } ? [never, never] : T_55 extends infer T_61 ? T_61 extends T_55 ? T_61 extends {
251
251
  type: "parallel";
252
- } ? [T_60, never] : "states" extends keyof T_61["states"][T_60] ? [T_60, never] : [never, T_60] : never : never : never : never : never)[0]]?: T_55["states"][K_8] extends infer T_62 ? T_62 extends T_55["states"][K_8] ? T_62 extends {
252
+ } ? [T_60, never] : "states" extends keyof T_61["states"][T_60] ? [T_60, never] : [never, T_60] : never : never : never : never : never)[0]]?: T_55["states"][K_9] extends infer T_62 ? T_62 extends T_55["states"][K_9] ? T_62 extends {
253
253
  states: Record<infer S, any>;
254
254
  } ? import("xstate").IsNever<S> extends true ? {} : (S & string extends infer T_63 ? T_63 extends S & string ? T_63 extends any ? T_62["states"][T_63] extends {
255
255
  type: "history";
@@ -259,11 +259,11 @@ declare const machineSetup: {
259
259
  type: "history";
260
260
  } ? [never, never] : T_62 extends infer T_66 ? T_66 extends T_62 ? T_66 extends {
261
261
  type: "parallel";
262
- } ? [T_65, never] : "states" extends keyof T_66["states"][T_65] ? [T_65, never] : [never, T_65] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_9 in (S & string extends infer T_67 ? T_67 extends S & string ? T_67 extends any ? T_62["states"][T_67] extends {
262
+ } ? [T_65, never] : "states" extends keyof T_66["states"][T_65] ? [T_65, never] : [never, T_65] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_10 in (S & string extends infer T_67 ? T_67 extends S & string ? T_67 extends any ? T_62["states"][T_67] extends {
263
263
  type: "history";
264
264
  } ? [never, never] : T_62 extends infer T_68 ? T_68 extends T_62 ? T_68 extends {
265
265
  type: "parallel";
266
- } ? [T_67, never] : "states" extends keyof T_68["states"][T_67] ? [T_67, never] : [never, T_67] : never : never : never : never : never)[0]]?: T_62["states"][K_9] extends infer T_69 ? T_69 extends T_62["states"][K_9] ? T_69 extends {
266
+ } ? [T_67, never] : "states" extends keyof T_68["states"][T_67] ? [T_67, never] : [never, T_67] : never : never : never : never : never)[0]]?: T_62["states"][K_10] extends infer T_69 ? T_69 extends T_62["states"][K_10] ? T_69 extends {
267
267
  states: Record<infer S, any>;
268
268
  } ? import("xstate").IsNever<S> extends true ? {} : (S & string extends infer T_70 ? T_70 extends S & string ? T_70 extends any ? T_69["states"][T_70] extends {
269
269
  type: "history";
@@ -273,7 +273,7 @@ declare const machineSetup: {
273
273
  type: "history";
274
274
  } ? [never, never] : T_69 extends infer T_73 ? T_73 extends T_69 ? T_73 extends {
275
275
  type: "parallel";
276
- } ? [T_72, never] : "states" extends keyof T_73["states"][T_72] ? [T_72, never] : [never, T_72] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_10 in (S & string extends infer T_74 ? T_74 extends S & string ? T_74 extends any ? T_69["states"][T_74] extends {
276
+ } ? [T_72, never] : "states" extends keyof T_73["states"][T_72] ? [T_72, never] : [never, T_72] : never : never : never : never : never)[0]> extends false ? import("xstate").ConditionalRequired<{ [K_11 in (S & string extends infer T_74 ? T_74 extends S & string ? T_74 extends any ? T_69["states"][T_74] extends {
277
277
  type: "history";
278
278
  } ? [never, never] : T_69 extends infer T_75 ? T_75 extends T_69 ? T_75 extends {
279
279
  type: "parallel";
@@ -19,7 +19,7 @@
19
19
  import { LanguageModel } from "../models";
20
20
  import { Voice } from "../voice";
21
21
  type AutopilotContext = {
22
- sessionRef: string;
22
+ mediaSessionRef: string;
23
23
  languageModel: LanguageModel;
24
24
  voice: Voice;
25
25
  firstMessage?: string;
@@ -23,8 +23,9 @@ export type EventsHook = {
23
23
  headers?: Record<string, string>;
24
24
  };
25
25
  export declare function sendConversationEndedEvent(eventsHook: EventsHook, data: {
26
- chatHistory: Record<string, string>[];
27
- phone: string;
28
26
  appRef: string;
29
- sessionRef: string;
27
+ callRef: string;
28
+ phone: string;
29
+ chatHistory: Record<string, string>[];
30
+ recordingUrl: string;
30
31
  }): Promise<void>;
@@ -23,7 +23,7 @@ const common_1 = require("@fonoster/common");
23
23
  const logger_1 = require("@fonoster/logger");
24
24
  const logger = (0, logger_1.getLogger)({ service: "autopilot", filePath: __filename });
25
25
  async function sendConversationEndedEvent(eventsHook, data) {
26
- const { chatHistory, phone, appRef, sessionRef } = data;
26
+ const { chatHistory, phone, appRef, callRef, recordingUrl } = data;
27
27
  if (!eventsHook?.events.includes(common_1.EventsHookAllowedEvents.CONVERSATION_ENDED) &&
28
28
  !eventsHook?.events.includes(common_1.EventsHookAllowedEvents.ALL)) {
29
29
  return;
@@ -32,9 +32,10 @@ async function sendConversationEndedEvent(eventsHook, data) {
32
32
  const params = {
33
33
  eventType: common_1.EventsHookAllowedEvents.CONVERSATION_ENDED,
34
34
  appRef,
35
- sessionRef,
35
+ callRef,
36
36
  phone,
37
- chatHistory
37
+ chatHistory,
38
+ ...(recordingUrl && { recordingUrl })
38
39
  };
39
40
  try {
40
41
  await (0, common_1.sendHttpRequest)({
@@ -3,7 +3,7 @@ import { Voice } from "./types";
3
3
  declare class VoiceImpl implements Voice {
4
4
  private readonly voice;
5
5
  private readonly playbackRef;
6
- sessionRef: string;
6
+ mediaSessionRef: string;
7
7
  sgatherStream: {
8
8
  stop: () => Promise<void>;
9
9
  onData: (cb: (payload: {
@@ -15,7 +15,7 @@ declare class VoiceImpl implements Voice {
15
15
  stop: () => Promise<void>;
16
16
  onData: (cb: (chunk: Uint8Array) => void) => void;
17
17
  };
18
- constructor(sessionRef: string, voice: VoiceResponse);
18
+ constructor(mediaSessionRef: string, voice: VoiceResponse);
19
19
  answer(): Promise<void>;
20
20
  hangup(): Promise<void>;
21
21
  say(text: string): Promise<void>;
@@ -22,9 +22,9 @@ exports.VoiceImpl = void 0;
22
22
  const common_1 = require("@fonoster/common");
23
23
  const uuid_1 = require("uuid");
24
24
  class VoiceImpl {
25
- constructor(sessionRef, voice) {
25
+ constructor(mediaSessionRef, voice) {
26
26
  this.voice = voice;
27
- this.sessionRef = sessionRef;
27
+ this.mediaSessionRef = mediaSessionRef;
28
28
  this.playbackRef = (0, uuid_1.v4)();
29
29
  }
30
30
  async answer() {
@@ -32,7 +32,7 @@ type TransferOptions = {
32
32
  record?: boolean;
33
33
  };
34
34
  type Voice = {
35
- sessionRef: string;
35
+ mediaSessionRef: string;
36
36
  answer: () => Promise<void>;
37
37
  hangup: () => Promise<void>;
38
38
  say: (text: string) => Promise<void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fonoster/autopilot",
3
- "version": "0.16.10",
3
+ "version": "0.17.0",
4
4
  "description": "Voice AI for the Fonoster platform",
5
5
  "author": "Pedro Sanders <psanders@fonoster.com>",
6
6
  "homepage": "https://github.com/fonoster/fonoster#readme",
@@ -35,11 +35,11 @@
35
35
  "dependencies": {
36
36
  "@aws-sdk/client-s3": "^3.958.0",
37
37
  "@dmitryrechkin/json-schema-to-zod": "^1.0.1",
38
- "@fonoster/common": "^0.16.8",
39
- "@fonoster/logger": "^0.16.7",
40
- "@fonoster/sdk": "^0.16.8",
41
- "@fonoster/types": "^0.16.7",
42
- "@fonoster/voice": "^0.16.10",
38
+ "@fonoster/common": "^0.17.0",
39
+ "@fonoster/logger": "^0.17.0",
40
+ "@fonoster/sdk": "^0.17.0",
41
+ "@fonoster/types": "^0.17.0",
42
+ "@fonoster/voice": "^0.17.0",
43
43
  "@langchain/anthropic": "^1.3.3",
44
44
  "@langchain/community": "^1.1.1",
45
45
  "@langchain/core": "^1.1.8",
@@ -50,7 +50,7 @@
50
50
  "@langchain/textsplitters": "^1.0.1",
51
51
  "cheerio": "^1.1.2",
52
52
  "dotenv": "^16.6.1",
53
- "js-yaml": "^4.1.0",
53
+ "js-yaml": "^4.1.1",
54
54
  "langchain": "^1.2.3",
55
55
  "moment": "^2.30.1",
56
56
  "onnxruntime-node": "1.21.1",
@@ -59,5 +59,5 @@
59
59
  "xstate": "^5.17.3",
60
60
  "zod": "^3.25.76"
61
61
  },
62
- "gitHead": "01b11ee98556983fa4dae5aabc0daa66bcbe9e82"
62
+ "gitHead": "4d1a9afaec6f294184386e009d1a4e292fb3583b"
63
63
  }