@absolutejs/voice 0.0.22-beta.546 → 0.0.22-beta.547

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.
@@ -745,7 +745,9 @@ export type VoiceSurfaceConfig<O> = false | O | (Record<string, never> extends O
745
745
  export type VoicePluginConfig<TContext = unknown, TSession extends VoiceSessionRecord = VoiceSessionRecord, TResult = unknown> = {
746
746
  costTelemetry?: VoiceCostTelemetryConfig<TContext, TSession, TResult>;
747
747
  path: string;
748
- greeting?: string | (() => string | Promise<string>);
748
+ greeting?: string | ((input: {
749
+ session: TSession;
750
+ }) => string | Promise<string>);
749
751
  languageStrategy?: VoiceLanguageStrategy;
750
752
  lexicon?: VoiceLexiconEntry[] | VoiceLexiconResolver<TContext>;
751
753
  phraseHints?: VoicePhraseHint[] | VoicePhraseHintResolver<TContext>;
@@ -859,7 +861,9 @@ export type CreateVoiceSessionOptions<TContext = unknown, TSession extends Voice
859
861
  id: string;
860
862
  context: TContext;
861
863
  socket: VoiceSocket;
862
- greeting?: string | (() => string | Promise<string>);
864
+ greeting?: string | ((input: {
865
+ session: TSession;
866
+ }) => string | Promise<string>);
863
867
  stt?: STTAdapter;
864
868
  realtime?: RealtimeAdapter;
865
869
  realtimeInputFormat?: AudioFormat;
package/dist/index.js CHANGED
@@ -5721,7 +5721,7 @@ var createVoiceSession = (options) => {
5721
5721
  kickCallSilenceWatchdog();
5722
5722
  startAmdEvaluationTimer();
5723
5723
  if (shouldFireOnSession && options.greeting && session.turns.length === 0) {
5724
- const greetingText = typeof options.greeting === "function" ? await options.greeting() : options.greeting;
5724
+ const greetingText = typeof options.greeting === "function" ? await options.greeting({ session }) : options.greeting;
5725
5725
  const greetingTurnId = createId();
5726
5726
  await send({
5727
5727
  text: greetingText,
@@ -24302,8 +24302,23 @@ var createTwilioSocketAdapter = (socket, getState) => ({
24302
24302
  if (!state.streamSid) {
24303
24303
  return;
24304
24304
  }
24305
+ const clearMessage = { event: "clear", streamSid: state.streamSid };
24305
24306
  state.reviewRecorder?.recordTwilioOutbound({ event: "clear" });
24306
- await Promise.resolve(socket.send(JSON.stringify({ event: "clear", streamSid: state.streamSid })));
24307
+ await state.trace?.append({
24308
+ at: Date.now(),
24309
+ payload: {
24310
+ callSid: state.callSid ?? undefined,
24311
+ carrier: state.carrier,
24312
+ direction: "outbound",
24313
+ envelope: clearMessage,
24314
+ event: "clear",
24315
+ streamId: state.streamSid
24316
+ },
24317
+ scenarioId: state.scenarioId ?? undefined,
24318
+ sessionId: state.sessionId ?? state.streamSid,
24319
+ type: "client.telephony_media"
24320
+ });
24321
+ await Promise.resolve(socket.send(JSON.stringify(clearMessage)));
24307
24322
  },
24308
24323
  close: async (code, reason) => {
24309
24324
  await Promise.resolve(socket.close(code, reason));
@@ -7538,7 +7538,7 @@ var createVoiceSession = (options) => {
7538
7538
  kickCallSilenceWatchdog();
7539
7539
  startAmdEvaluationTimer();
7540
7540
  if (shouldFireOnSession && options.greeting && session.turns.length === 0) {
7541
- const greetingText = typeof options.greeting === "function" ? await options.greeting() : options.greeting;
7541
+ const greetingText = typeof options.greeting === "function" ? await options.greeting({ session }) : options.greeting;
7542
7542
  const greetingTurnId = createId();
7543
7543
  await send({
7544
7544
  text: greetingText,
@@ -12838,8 +12838,23 @@ var createTwilioSocketAdapter = (socket, getState) => ({
12838
12838
  if (!state.streamSid) {
12839
12839
  return;
12840
12840
  }
12841
+ const clearMessage = { event: "clear", streamSid: state.streamSid };
12841
12842
  state.reviewRecorder?.recordTwilioOutbound({ event: "clear" });
12842
- await Promise.resolve(socket.send(JSON.stringify({ event: "clear", streamSid: state.streamSid })));
12843
+ await state.trace?.append({
12844
+ at: Date.now(),
12845
+ payload: {
12846
+ callSid: state.callSid ?? undefined,
12847
+ carrier: state.carrier,
12848
+ direction: "outbound",
12849
+ envelope: clearMessage,
12850
+ event: "clear",
12851
+ streamId: state.streamSid
12852
+ },
12853
+ scenarioId: state.scenarioId ?? undefined,
12854
+ sessionId: state.sessionId ?? state.streamSid,
12855
+ type: "client.telephony_media"
12856
+ });
12857
+ await Promise.resolve(socket.send(JSON.stringify(clearMessage)));
12843
12858
  },
12844
12859
  close: async (code, reason) => {
12845
12860
  await Promise.resolve(socket.close(code, reason));
@@ -13361,7 +13376,7 @@ var createFakeSTTAdapter = (inputSpy, sttDelayMs) => ({
13361
13376
  final: new Set,
13362
13377
  partial: new Set
13363
13378
  };
13364
- let delivered = false;
13379
+ let sendCount = 0;
13365
13380
  return {
13366
13381
  close: async () => {
13367
13382
  for (const handler of listeners.close) {
@@ -13376,31 +13391,44 @@ var createFakeSTTAdapter = (inputSpy, sttDelayMs) => ({
13376
13391
  },
13377
13392
  send: async (audio) => {
13378
13393
  inputSpy.push(toUint8Array2(audio));
13379
- if (delivered) {
13394
+ sendCount += 1;
13395
+ if (sendCount === 1) {
13396
+ if (sttDelayMs > 0) {
13397
+ await Bun.sleep(sttDelayMs);
13398
+ }
13399
+ const receivedAt = Date.now();
13400
+ for (const handler of listeners.final) {
13401
+ handler({
13402
+ receivedAt,
13403
+ transcript: {
13404
+ id: "telephony-benchmark-final",
13405
+ isFinal: true,
13406
+ text: "hello from twilio"
13407
+ },
13408
+ type: "final"
13409
+ });
13410
+ }
13411
+ for (const handler of listeners.endOfTurn) {
13412
+ handler({
13413
+ reason: "vendor",
13414
+ receivedAt,
13415
+ type: "endOfTurn"
13416
+ });
13417
+ }
13380
13418
  return;
13381
13419
  }
13382
- delivered = true;
13383
- if (sttDelayMs > 0) {
13384
- await Bun.sleep(sttDelayMs);
13385
- }
13386
- const receivedAt = Date.now();
13387
- for (const handler of listeners.final) {
13388
- handler({
13389
- receivedAt,
13390
- transcript: {
13391
- id: "telephony-benchmark-final",
13392
- isFinal: true,
13393
- text: "hello from twilio"
13394
- },
13395
- type: "final"
13396
- });
13397
- }
13398
- for (const handler of listeners.endOfTurn) {
13399
- handler({
13400
- reason: "vendor",
13401
- receivedAt,
13402
- type: "endOfTurn"
13403
- });
13420
+ if (sendCount === 2) {
13421
+ for (const handler of listeners.partial) {
13422
+ handler({
13423
+ receivedAt: Date.now(),
13424
+ transcript: {
13425
+ id: "telephony-benchmark-partial",
13426
+ isFinal: false,
13427
+ text: "actually wait"
13428
+ },
13429
+ type: "partial"
13430
+ });
13431
+ }
13404
13432
  }
13405
13433
  }
13406
13434
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@absolutejs/voice",
3
- "version": "0.0.22-beta.546",
3
+ "version": "0.0.22-beta.547",
4
4
  "description": "Voice primitives and Elysia plugin for AbsoluteJS",
5
5
  "repository": {
6
6
  "type": "git",