@framers/agentos 0.1.74 → 0.1.76

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 (138) hide show
  1. package/README.md +139 -34
  2. package/dist/core/agency/AgentCommunicationBus.d.ts +1 -0
  3. package/dist/core/agency/AgentCommunicationBus.d.ts.map +1 -1
  4. package/dist/core/agency/AgentCommunicationBus.js +62 -8
  5. package/dist/core/agency/AgentCommunicationBus.js.map +1 -1
  6. package/dist/core/agency/IAgentCommunicationBus.d.ts +1 -1
  7. package/dist/core/agency/IAgentCommunicationBus.d.ts.map +1 -1
  8. package/dist/orchestration/builders/index.d.ts +1 -1
  9. package/dist/orchestration/builders/index.d.ts.map +1 -1
  10. package/dist/orchestration/builders/index.js +1 -1
  11. package/dist/orchestration/builders/index.js.map +1 -1
  12. package/dist/orchestration/builders/nodes.d.ts +15 -0
  13. package/dist/orchestration/builders/nodes.d.ts.map +1 -1
  14. package/dist/orchestration/builders/nodes.js +33 -0
  15. package/dist/orchestration/builders/nodes.js.map +1 -1
  16. package/dist/orchestration/runtime/LoopController.d.ts +10 -10
  17. package/dist/orchestration/runtime/LoopController.d.ts.map +1 -1
  18. package/dist/orchestration/runtime/LoopController.js +1 -1
  19. package/dist/orchestration/runtime/LoopController.js.map +1 -1
  20. package/dist/orchestration/runtime/index.d.ts +1 -1
  21. package/dist/orchestration/runtime/index.d.ts.map +1 -1
  22. package/dist/orchestration/runtime/index.js.map +1 -1
  23. package/dist/speech/FallbackProxy.d.ts +104 -0
  24. package/dist/speech/FallbackProxy.d.ts.map +1 -0
  25. package/dist/speech/FallbackProxy.js +151 -0
  26. package/dist/speech/FallbackProxy.js.map +1 -0
  27. package/dist/speech/SpeechProviderResolver.d.ts +103 -0
  28. package/dist/speech/SpeechProviderResolver.d.ts.map +1 -0
  29. package/dist/speech/SpeechProviderResolver.js +256 -0
  30. package/dist/speech/SpeechProviderResolver.js.map +1 -0
  31. package/dist/speech/SpeechRuntime.d.ts +23 -1
  32. package/dist/speech/SpeechRuntime.d.ts.map +1 -1
  33. package/dist/speech/SpeechRuntime.js +82 -8
  34. package/dist/speech/SpeechRuntime.js.map +1 -1
  35. package/dist/speech/index.d.ts +6 -0
  36. package/dist/speech/index.d.ts.map +1 -1
  37. package/dist/speech/index.js +6 -0
  38. package/dist/speech/index.js.map +1 -1
  39. package/dist/speech/providerCatalog.d.ts.map +1 -1
  40. package/dist/speech/providerCatalog.js +15 -1
  41. package/dist/speech/providerCatalog.js.map +1 -1
  42. package/dist/speech/providers/AssemblyAISTTProvider.d.ts +49 -0
  43. package/dist/speech/providers/AssemblyAISTTProvider.d.ts.map +1 -0
  44. package/dist/speech/providers/AssemblyAISTTProvider.js +151 -0
  45. package/dist/speech/providers/AssemblyAISTTProvider.js.map +1 -0
  46. package/dist/speech/providers/AzureSpeechSTTProvider.d.ts +48 -0
  47. package/dist/speech/providers/AzureSpeechSTTProvider.d.ts.map +1 -0
  48. package/dist/speech/providers/AzureSpeechSTTProvider.js +90 -0
  49. package/dist/speech/providers/AzureSpeechSTTProvider.js.map +1 -0
  50. package/dist/speech/providers/AzureSpeechTTSProvider.d.ts +60 -0
  51. package/dist/speech/providers/AzureSpeechTTSProvider.d.ts.map +1 -0
  52. package/dist/speech/providers/AzureSpeechTTSProvider.js +127 -0
  53. package/dist/speech/providers/AzureSpeechTTSProvider.js.map +1 -0
  54. package/dist/speech/providers/DeepgramBatchSTTProvider.d.ts +55 -0
  55. package/dist/speech/providers/DeepgramBatchSTTProvider.d.ts.map +1 -0
  56. package/dist/speech/providers/DeepgramBatchSTTProvider.js +102 -0
  57. package/dist/speech/providers/DeepgramBatchSTTProvider.js.map +1 -0
  58. package/dist/speech/types.d.ts +35 -0
  59. package/dist/speech/types.d.ts.map +1 -1
  60. package/dist/voice/CallManager.d.ts +1 -1
  61. package/dist/voice/CallManager.d.ts.map +1 -1
  62. package/dist/voice/CallManager.js +9 -0
  63. package/dist/voice/CallManager.js.map +1 -1
  64. package/dist/voice/MediaStreamParser.d.ts +83 -0
  65. package/dist/voice/MediaStreamParser.d.ts.map +1 -0
  66. package/dist/voice/MediaStreamParser.js +2 -0
  67. package/dist/voice/MediaStreamParser.js.map +1 -0
  68. package/dist/voice/TelephonyStreamTransport.d.ts +112 -0
  69. package/dist/voice/TelephonyStreamTransport.d.ts.map +1 -0
  70. package/dist/voice/TelephonyStreamTransport.js +208 -0
  71. package/dist/voice/TelephonyStreamTransport.js.map +1 -0
  72. package/dist/voice/index.d.ts +10 -0
  73. package/dist/voice/index.d.ts.map +1 -1
  74. package/dist/voice/index.js +11 -0
  75. package/dist/voice/index.js.map +1 -1
  76. package/dist/voice/parsers/PlivoMediaStreamParser.d.ts +43 -0
  77. package/dist/voice/parsers/PlivoMediaStreamParser.d.ts.map +1 -0
  78. package/dist/voice/parsers/PlivoMediaStreamParser.js +92 -0
  79. package/dist/voice/parsers/PlivoMediaStreamParser.js.map +1 -0
  80. package/dist/voice/parsers/TelnyxMediaStreamParser.d.ts +51 -0
  81. package/dist/voice/parsers/TelnyxMediaStreamParser.d.ts.map +1 -0
  82. package/dist/voice/parsers/TelnyxMediaStreamParser.js +103 -0
  83. package/dist/voice/parsers/TelnyxMediaStreamParser.js.map +1 -0
  84. package/dist/voice/parsers/TwilioMediaStreamParser.d.ts +50 -0
  85. package/dist/voice/parsers/TwilioMediaStreamParser.d.ts.map +1 -0
  86. package/dist/voice/parsers/TwilioMediaStreamParser.js +144 -0
  87. package/dist/voice/parsers/TwilioMediaStreamParser.js.map +1 -0
  88. package/dist/voice/providers/plivo.d.ts +77 -0
  89. package/dist/voice/providers/plivo.d.ts.map +1 -0
  90. package/dist/voice/providers/plivo.js +180 -0
  91. package/dist/voice/providers/plivo.js.map +1 -0
  92. package/dist/voice/providers/telnyx.d.ts +93 -0
  93. package/dist/voice/providers/telnyx.d.ts.map +1 -0
  94. package/dist/voice/providers/telnyx.js +193 -0
  95. package/dist/voice/providers/telnyx.js.map +1 -0
  96. package/dist/voice/providers/twilio.d.ts +79 -0
  97. package/dist/voice/providers/twilio.d.ts.map +1 -0
  98. package/dist/voice/providers/twilio.js +191 -0
  99. package/dist/voice/providers/twilio.js.map +1 -0
  100. package/dist/voice/twiml.d.ts +69 -0
  101. package/dist/voice/twiml.d.ts.map +1 -0
  102. package/dist/voice/twiml.js +92 -0
  103. package/dist/voice/twiml.js.map +1 -0
  104. package/dist/voice/types.d.ts +9 -1
  105. package/dist/voice/types.d.ts.map +1 -1
  106. package/dist/voice-pipeline/AcousticEndpointDetector.d.ts +90 -0
  107. package/dist/voice-pipeline/AcousticEndpointDetector.d.ts.map +1 -0
  108. package/dist/voice-pipeline/AcousticEndpointDetector.js +123 -0
  109. package/dist/voice-pipeline/AcousticEndpointDetector.js.map +1 -0
  110. package/dist/voice-pipeline/HardCutBargeinHandler.d.ts +67 -0
  111. package/dist/voice-pipeline/HardCutBargeinHandler.d.ts.map +1 -0
  112. package/dist/voice-pipeline/HardCutBargeinHandler.js +55 -0
  113. package/dist/voice-pipeline/HardCutBargeinHandler.js.map +1 -0
  114. package/dist/voice-pipeline/HeuristicEndpointDetector.d.ts +128 -0
  115. package/dist/voice-pipeline/HeuristicEndpointDetector.d.ts.map +1 -0
  116. package/dist/voice-pipeline/HeuristicEndpointDetector.js +240 -0
  117. package/dist/voice-pipeline/HeuristicEndpointDetector.js.map +1 -0
  118. package/dist/voice-pipeline/SoftFadeBargeinHandler.d.ts +96 -0
  119. package/dist/voice-pipeline/SoftFadeBargeinHandler.d.ts.map +1 -0
  120. package/dist/voice-pipeline/SoftFadeBargeinHandler.js +69 -0
  121. package/dist/voice-pipeline/SoftFadeBargeinHandler.js.map +1 -0
  122. package/dist/voice-pipeline/VoicePipelineOrchestrator.d.ts +122 -0
  123. package/dist/voice-pipeline/VoicePipelineOrchestrator.d.ts.map +1 -0
  124. package/dist/voice-pipeline/VoicePipelineOrchestrator.js +317 -0
  125. package/dist/voice-pipeline/VoicePipelineOrchestrator.js.map +1 -0
  126. package/dist/voice-pipeline/WebSocketStreamTransport.d.ts +148 -0
  127. package/dist/voice-pipeline/WebSocketStreamTransport.d.ts.map +1 -0
  128. package/dist/voice-pipeline/WebSocketStreamTransport.js +207 -0
  129. package/dist/voice-pipeline/WebSocketStreamTransport.js.map +1 -0
  130. package/dist/voice-pipeline/index.d.ts +13 -0
  131. package/dist/voice-pipeline/index.d.ts.map +1 -0
  132. package/dist/voice-pipeline/index.js +13 -0
  133. package/dist/voice-pipeline/index.js.map +1 -0
  134. package/dist/voice-pipeline/types.d.ts +905 -0
  135. package/dist/voice-pipeline/types.d.ts.map +1 -0
  136. package/dist/voice-pipeline/types.js +23 -0
  137. package/dist/voice-pipeline/types.js.map +1 -0
  138. package/package.json +6 -1
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Parses the Twilio `<Connect><Stream>` WebSocket media stream protocol.
3
+ *
4
+ * Twilio sends all messages as JSON-encoded strings. Outbound audio is
5
+ * wrapped in the same JSON envelope so Twilio can associate it with the
6
+ * correct stream. An explicit `connected` acknowledgment is sent once
7
+ * immediately after the WebSocket handshake to signal that the listener is
8
+ * ready to receive media.
9
+ *
10
+ * @see {@link https://www.twilio.com/docs/voice/twiml/stream}
11
+ */
12
+ export class TwilioMediaStreamParser {
13
+ /**
14
+ * Parse a raw WebSocket frame from Twilio's media stream.
15
+ *
16
+ * Supported Twilio event types:
17
+ * - `start` — stream established, includes callSid
18
+ * - `media` — audio chunk (inbound track only; outbound chunks are ignored)
19
+ * - `dtmf` — DTMF keypress detected
20
+ * - `stop` — stream ended
21
+ * - `mark` — named synchronisation marker
22
+ *
23
+ * @param data - Raw WebSocket frame payload (always a JSON string from Twilio).
24
+ * @returns Normalised {@link MediaStreamIncoming} event, or `null` for
25
+ * outbound audio tracks, unknown event types, or malformed messages.
26
+ */
27
+ parseIncoming(data) {
28
+ const raw = typeof data === 'string' ? data : data.toString('utf8');
29
+ let msg;
30
+ try {
31
+ msg = JSON.parse(raw);
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ const event = msg['event'];
37
+ const streamSid = msg['streamSid'];
38
+ if (!event || !streamSid) {
39
+ return null;
40
+ }
41
+ switch (event) {
42
+ case 'start': {
43
+ const startPayload = msg['start'];
44
+ const callSid = startPayload?.['callSid'] ?? '';
45
+ const result = {
46
+ type: 'start',
47
+ streamSid,
48
+ callSid,
49
+ metadata: startPayload,
50
+ };
51
+ return result;
52
+ }
53
+ case 'media': {
54
+ const media = msg['media'];
55
+ if (!media)
56
+ return null;
57
+ // Only process inbound audio — outbound echoes must be discarded.
58
+ const track = media['track'];
59
+ if (track === 'outbound')
60
+ return null;
61
+ const payloadB64 = media['payload'];
62
+ if (!payloadB64)
63
+ return null;
64
+ const sequenceNumber = typeof msg['sequenceNumber'] === 'number'
65
+ ? msg['sequenceNumber']
66
+ : undefined;
67
+ const result = {
68
+ type: 'audio',
69
+ payload: Buffer.from(payloadB64, 'base64'),
70
+ streamSid,
71
+ ...(sequenceNumber !== undefined ? { sequenceNumber } : {}),
72
+ };
73
+ return result;
74
+ }
75
+ case 'dtmf': {
76
+ const dtmf = msg['dtmf'];
77
+ if (!dtmf)
78
+ return null;
79
+ const digit = dtmf['digit'];
80
+ if (!digit)
81
+ return null;
82
+ const duration = typeof dtmf['duration'] === 'number'
83
+ ? dtmf['duration']
84
+ : undefined;
85
+ const result = {
86
+ type: 'dtmf',
87
+ digit,
88
+ streamSid,
89
+ ...(duration !== undefined ? { durationMs: duration } : {}),
90
+ };
91
+ return result;
92
+ }
93
+ case 'stop': {
94
+ const result = { type: 'stop', streamSid };
95
+ return result;
96
+ }
97
+ case 'mark': {
98
+ const mark = msg['mark'];
99
+ if (!mark)
100
+ return null;
101
+ const name = mark['name'];
102
+ if (!name)
103
+ return null;
104
+ const result = { type: 'mark', name, streamSid };
105
+ return result;
106
+ }
107
+ default:
108
+ return null;
109
+ }
110
+ }
111
+ /**
112
+ * Encode mu-law audio for transmission back to the Twilio stream.
113
+ *
114
+ * Twilio requires base64-encoded audio wrapped in a JSON `media` envelope
115
+ * so it can route the audio to the correct stream.
116
+ *
117
+ * @param audio - Raw mu-law PCM bytes to send to the caller.
118
+ * @param streamSid - The stream identifier to include in the envelope.
119
+ * @returns JSON string conforming to the Twilio media-out envelope format.
120
+ */
121
+ formatOutgoing(audio, streamSid) {
122
+ return JSON.stringify({
123
+ event: 'media',
124
+ streamSid,
125
+ media: { payload: audio.toString('base64') },
126
+ });
127
+ }
128
+ /**
129
+ * Generate the initial `connected` acknowledgment expected by Twilio
130
+ * immediately after the WebSocket connection is established.
131
+ *
132
+ * @param _streamSid - Unused — Twilio does not require the stream ID in the
133
+ * `connected` message, but the parameter is accepted for interface parity.
134
+ * @returns JSON string with the `connected` envelope.
135
+ */
136
+ formatConnected(_streamSid) {
137
+ return JSON.stringify({
138
+ event: 'connected',
139
+ protocol: 'Call',
140
+ version: '1.0.0',
141
+ });
142
+ }
143
+ }
144
+ //# sourceMappingURL=TwilioMediaStreamParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TwilioMediaStreamParser.js","sourceRoot":"","sources":["../../../src/voice/parsers/TwilioMediaStreamParser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * @fileoverview Plivo telephony provider for AgentOS voice calls.
3
+ *
4
+ * Implements {@link IVoiceCallProvider} using the Plivo Voice REST API v1.
5
+ * Webhook verification uses HMAC-SHA256 with the v3 signature scheme.
6
+ *
7
+ * @module @framers/agentos/voice/providers/plivo
8
+ */
9
+ import type { IVoiceCallProvider, InitiateCallInput, InitiateCallResult, HangupCallInput, PlayTtsInput } from '../IVoiceCallProvider.js';
10
+ import type { WebhookContext, WebhookVerificationResult, WebhookParseResult } from '../types.js';
11
+ /** Configuration for {@link PlivoVoiceProvider}. */
12
+ export interface PlivoVoiceProviderConfig {
13
+ /** Plivo Auth ID (account identifier). */
14
+ authId: string;
15
+ /** Plivo Auth Token. */
16
+ authToken: string;
17
+ /**
18
+ * Optional fetch override — inject a mock in tests.
19
+ * Defaults to the global `fetch`.
20
+ */
21
+ fetchImpl?: typeof fetch;
22
+ }
23
+ /**
24
+ * Plivo voice call provider.
25
+ *
26
+ * Uses the Plivo REST API v1 for outbound call control and HMAC-SHA256
27
+ * for inbound webhook signature verification (v3 signature scheme).
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const provider = new PlivoVoiceProvider({
32
+ * authId: process.env.PLIVO_AUTH_ID!,
33
+ * authToken: process.env.PLIVO_AUTH_TOKEN!,
34
+ * });
35
+ * ```
36
+ */
37
+ export declare class PlivoVoiceProvider implements IVoiceCallProvider {
38
+ readonly name: "plivo";
39
+ private readonly config;
40
+ private readonly baseUrl;
41
+ private readonly authHeader;
42
+ private readonly fetch;
43
+ constructor(config: PlivoVoiceProviderConfig);
44
+ /**
45
+ * Verify an incoming Plivo webhook request using HMAC-SHA256 (v3 scheme).
46
+ *
47
+ * Plivo signs the concatenation of the full request URL and the nonce
48
+ * header value. The resulting base64-encoded digest is compared against
49
+ * the `x-plivo-signature-v3` header.
50
+ */
51
+ verifyWebhook(ctx: WebhookContext): WebhookVerificationResult;
52
+ /**
53
+ * Parse a Plivo webhook body into normalized {@link NormalizedCallEvent}s.
54
+ *
55
+ * Supports both URL-encoded and JSON request bodies. Maps `CallStatus`
56
+ * parameter values to call lifecycle events.
57
+ */
58
+ parseWebhookEvent(ctx: WebhookContext): WebhookParseResult;
59
+ /**
60
+ * Initiate an outbound call via the Plivo Call API.
61
+ *
62
+ * POSTs a JSON body to `/Account/{authId}/Call/` with the caller, callee,
63
+ * and answer URL. Returns the `request_uuid` as the provider call ID.
64
+ */
65
+ initiateCall(input: InitiateCallInput): Promise<InitiateCallResult>;
66
+ /**
67
+ * Hang up an active call using the Plivo Call DELETE endpoint.
68
+ */
69
+ hangupCall(input: HangupCallInput): Promise<void>;
70
+ /**
71
+ * Speak text into a live call using the Plivo Speak API.
72
+ *
73
+ * Defaults to `WOMAN` voice and `en-US` language when not specified.
74
+ */
75
+ playTts(input: PlayTtsInput): Promise<void>;
76
+ }
77
+ //# sourceMappingURL=plivo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plivo.d.ts","sourceRoot":"","sources":["../../../src/voice/providers/plivo.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACb,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EACV,cAAc,EACd,yBAAyB,EACzB,kBAAkB,EAEnB,MAAM,aAAa,CAAC;AAMrB,oDAAoD;AACpD,MAAM,WAAW,wBAAwB;IACvC,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAMD;;;;;;;;;;;;;GAaG;AACH,qBAAa,kBAAmB,YAAW,kBAAkB;IAC3D,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IAEjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAClD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;gBAEzB,MAAM,EAAE,wBAAwB;IAU5C;;;;;;OAMG;IACH,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,yBAAyB;IAkB7D;;;;;OAKG;IACH,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,kBAAkB;IA8D1D;;;;;OAKG;IACG,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA0BzE;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvD;;;;OAIG;IACG,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBlD"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * @fileoverview Plivo telephony provider for AgentOS voice calls.
3
+ *
4
+ * Implements {@link IVoiceCallProvider} using the Plivo Voice REST API v1.
5
+ * Webhook verification uses HMAC-SHA256 with the v3 signature scheme.
6
+ *
7
+ * @module @framers/agentos/voice/providers/plivo
8
+ */
9
+ import { createHmac, randomUUID } from 'node:crypto';
10
+ // ============================================================================
11
+ // PlivoVoiceProvider
12
+ // ============================================================================
13
+ /**
14
+ * Plivo voice call provider.
15
+ *
16
+ * Uses the Plivo REST API v1 for outbound call control and HMAC-SHA256
17
+ * for inbound webhook signature verification (v3 signature scheme).
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const provider = new PlivoVoiceProvider({
22
+ * authId: process.env.PLIVO_AUTH_ID!,
23
+ * authToken: process.env.PLIVO_AUTH_TOKEN!,
24
+ * });
25
+ * ```
26
+ */
27
+ export class PlivoVoiceProvider {
28
+ constructor(config) {
29
+ this.name = 'plivo';
30
+ this.config = config;
31
+ this.baseUrl = 'https://api.plivo.com/v1';
32
+ this.authHeader =
33
+ 'Basic ' + Buffer.from(`${config.authId}:${config.authToken}`).toString('base64');
34
+ this.fetch = config.fetchImpl ?? globalThis.fetch;
35
+ }
36
+ // ── Webhook ───────────────────────────────────────────────────────────────
37
+ /**
38
+ * Verify an incoming Plivo webhook request using HMAC-SHA256 (v3 scheme).
39
+ *
40
+ * Plivo signs the concatenation of the full request URL and the nonce
41
+ * header value. The resulting base64-encoded digest is compared against
42
+ * the `x-plivo-signature-v3` header.
43
+ */
44
+ verifyWebhook(ctx) {
45
+ const nonce = ctx.headers['x-plivo-signature-v3-nonce'];
46
+ const signature = ctx.headers['x-plivo-signature-v3'];
47
+ if (Array.isArray(nonce) || Array.isArray(signature)) {
48
+ return { valid: false, error: 'Duplicate Plivo signature headers' };
49
+ }
50
+ const nonceStr = nonce ?? '';
51
+ const data = ctx.url + nonceStr;
52
+ const expected = createHmac('sha256', this.config.authToken)
53
+ .update(data)
54
+ .digest('base64');
55
+ const valid = expected === signature;
56
+ return { valid };
57
+ }
58
+ /**
59
+ * Parse a Plivo webhook body into normalized {@link NormalizedCallEvent}s.
60
+ *
61
+ * Supports both URL-encoded and JSON request bodies. Maps `CallStatus`
62
+ * parameter values to call lifecycle events.
63
+ */
64
+ parseWebhookEvent(ctx) {
65
+ const body = ctx.body.toString();
66
+ let params;
67
+ // Plivo sends URL-encoded bodies for most events; try JSON as fallback.
68
+ try {
69
+ if (body.trimStart().startsWith('{')) {
70
+ const obj = JSON.parse(body);
71
+ params = new URLSearchParams(obj);
72
+ }
73
+ else {
74
+ params = new URLSearchParams(body);
75
+ }
76
+ }
77
+ catch {
78
+ params = new URLSearchParams(body);
79
+ }
80
+ const callUuid = params.get('CallUUID') ?? params.get('call_uuid') ?? '';
81
+ const callStatus = params.get('CallStatus') ?? params.get('call_status') ?? '';
82
+ const digits = params.get('Digits');
83
+ const timestamp = Date.now();
84
+ const events = [];
85
+ const base = () => ({
86
+ eventId: randomUUID(),
87
+ providerCallId: callUuid,
88
+ timestamp,
89
+ });
90
+ switch (callStatus) {
91
+ case 'ringing':
92
+ events.push({ ...base(), kind: 'call-ringing' });
93
+ break;
94
+ case 'in-progress':
95
+ events.push({ ...base(), kind: 'call-answered' });
96
+ break;
97
+ case 'completed':
98
+ events.push({ ...base(), kind: 'call-completed' });
99
+ break;
100
+ case 'busy':
101
+ events.push({ ...base(), kind: 'call-busy' });
102
+ break;
103
+ case 'no-answer':
104
+ events.push({ ...base(), kind: 'call-no-answer' });
105
+ break;
106
+ case 'failed':
107
+ events.push({ ...base(), kind: 'call-failed' });
108
+ break;
109
+ default:
110
+ // initiated / queued / etc. — no normalized event emitted
111
+ break;
112
+ }
113
+ if (digits != null && digits !== '') {
114
+ events.push({ ...base(), kind: 'call-dtmf', digit: digits });
115
+ }
116
+ return { events };
117
+ }
118
+ // ── Call Control ──────────────────────────────────────────────────────────
119
+ /**
120
+ * Initiate an outbound call via the Plivo Call API.
121
+ *
122
+ * POSTs a JSON body to `/Account/{authId}/Call/` with the caller, callee,
123
+ * and answer URL. Returns the `request_uuid` as the provider call ID.
124
+ */
125
+ async initiateCall(input) {
126
+ const url = `${this.baseUrl}/Account/${this.config.authId}/Call/`;
127
+ const response = await this.fetch(url, {
128
+ method: 'POST',
129
+ headers: {
130
+ Authorization: this.authHeader,
131
+ 'Content-Type': 'application/json',
132
+ },
133
+ body: JSON.stringify({
134
+ from: input.fromNumber,
135
+ to: input.toNumber,
136
+ answer_url: input.webhookUrl,
137
+ answer_method: 'POST',
138
+ }),
139
+ });
140
+ if (!response.ok) {
141
+ const text = await response.text().catch(() => String(response.status));
142
+ return { providerCallId: '', success: false, error: `Plivo error ${response.status}: ${text}` };
143
+ }
144
+ const data = (await response.json());
145
+ return { providerCallId: data.request_uuid, success: true };
146
+ }
147
+ /**
148
+ * Hang up an active call using the Plivo Call DELETE endpoint.
149
+ */
150
+ async hangupCall(input) {
151
+ const url = `${this.baseUrl}/Account/${this.config.authId}/Call/${input.providerCallId}/`;
152
+ await this.fetch(url, {
153
+ method: 'DELETE',
154
+ headers: {
155
+ Authorization: this.authHeader,
156
+ },
157
+ });
158
+ }
159
+ /**
160
+ * Speak text into a live call using the Plivo Speak API.
161
+ *
162
+ * Defaults to `WOMAN` voice and `en-US` language when not specified.
163
+ */
164
+ async playTts(input) {
165
+ const url = `${this.baseUrl}/Account/${this.config.authId}/Call/${input.providerCallId}/Speak/`;
166
+ await this.fetch(url, {
167
+ method: 'POST',
168
+ headers: {
169
+ Authorization: this.authHeader,
170
+ 'Content-Type': 'application/json',
171
+ },
172
+ body: JSON.stringify({
173
+ text: input.text,
174
+ voice: input.voice ?? 'WOMAN',
175
+ language: 'en-US',
176
+ }),
177
+ });
178
+ }
179
+ }
180
+ //# sourceMappingURL=plivo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plivo.js","sourceRoot":"","sources":["../../../src/voice/providers/plivo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ /**
2
+ * @fileoverview Telnyx telephony provider for AgentOS voice calls.
3
+ *
4
+ * Implements {@link IVoiceCallProvider} using the Telnyx Call Control v2 API.
5
+ * Webhook verification uses Ed25519 public key verification as specified in
6
+ * the Telnyx security documentation.
7
+ *
8
+ * @module @framers/agentos/voice/providers/telnyx
9
+ */
10
+ import type { IVoiceCallProvider, InitiateCallInput, InitiateCallResult, HangupCallInput, PlayTtsInput } from '../IVoiceCallProvider.js';
11
+ import type { WebhookContext, WebhookVerificationResult, WebhookParseResult } from '../types.js';
12
+ /** Configuration for {@link TelnyxVoiceProvider}. */
13
+ export interface TelnyxVoiceProviderConfig {
14
+ /** Telnyx API key (starts with "KEY"). */
15
+ apiKey: string;
16
+ /** Telnyx connection/application ID for call routing. */
17
+ connectionId: string;
18
+ /**
19
+ * Base64-encoded DER-encoded SPKI Ed25519 public key for webhook verification.
20
+ * When omitted, webhook verification is skipped.
21
+ */
22
+ publicKey?: string;
23
+ /**
24
+ * Optional fetch override — inject a mock in tests.
25
+ * Defaults to the global `fetch`.
26
+ */
27
+ fetchImpl?: typeof fetch;
28
+ }
29
+ /**
30
+ * Telnyx voice call provider.
31
+ *
32
+ * Uses the Telnyx Call Control v2 API for outbound call initiation and
33
+ * in-call actions (hangup, speak). Webhook verification uses Ed25519 public
34
+ * key signing.
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const provider = new TelnyxVoiceProvider({
39
+ * apiKey: process.env.TELNYX_API_KEY!,
40
+ * connectionId: process.env.TELNYX_CONNECTION_ID!,
41
+ * publicKey: process.env.TELNYX_PUBLIC_KEY, // optional
42
+ * });
43
+ * ```
44
+ */
45
+ export declare class TelnyxVoiceProvider implements IVoiceCallProvider {
46
+ readonly name: "telnyx";
47
+ private readonly config;
48
+ private readonly baseUrl;
49
+ private readonly authHeader;
50
+ private readonly fetch;
51
+ constructor(config: TelnyxVoiceProviderConfig);
52
+ /**
53
+ * Verify an incoming Telnyx webhook using Ed25519 signature verification.
54
+ *
55
+ * Telnyx signs `{timestamp}|{rawBody}` with the configured Ed25519 private key.
56
+ * The matching public key is provided as a base64-encoded DER SPKI blob.
57
+ *
58
+ * If no public key is configured, the check is skipped and `valid: true`
59
+ * is returned so the provider can operate without cryptographic validation
60
+ * during initial development.
61
+ */
62
+ verifyWebhook(ctx: WebhookContext): WebhookVerificationResult;
63
+ /**
64
+ * Parse a Telnyx webhook JSON body into normalized {@link NormalizedCallEvent}s.
65
+ *
66
+ * Handles Telnyx Call Control event types:
67
+ * - `call.initiated` → `call-ringing`
68
+ * - `call.answered` → `call-answered`
69
+ * - `call.hangup` → `call-completed` or `call-hangup-user` based on hangup_cause
70
+ * - `call.dtmf.received` → `call-dtmf`
71
+ * - `call.machine.detection.ended` with `result === 'machine'` → `call-voicemail`
72
+ */
73
+ parseWebhookEvent(ctx: WebhookContext): WebhookParseResult;
74
+ /**
75
+ * Initiate an outbound call via the Telnyx Call Control v2 API.
76
+ *
77
+ * POSTs to `/calls` with a JSON body. The `mediaStreamUrl` (if provided)
78
+ * is stored internally for use after the call is answered — it is NOT sent
79
+ * in the initial call creation request.
80
+ */
81
+ initiateCall(input: InitiateCallInput): Promise<InitiateCallResult>;
82
+ /**
83
+ * Hang up an active call via the Telnyx Call Control hangup action.
84
+ */
85
+ hangupCall(input: HangupCallInput): Promise<void>;
86
+ /**
87
+ * Speak text into a live call using Telnyx's text-to-speech speak action.
88
+ *
89
+ * Defaults to `female` voice and `en-US` language when not specified.
90
+ */
91
+ playTts(input: PlayTtsInput): Promise<void>;
92
+ }
93
+ //# sourceMappingURL=telnyx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telnyx.d.ts","sourceRoot":"","sources":["../../../src/voice/providers/telnyx.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,YAAY,EACb,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EACV,cAAc,EACd,yBAAyB,EACzB,kBAAkB,EAEnB,MAAM,aAAa,CAAC;AAMrB,qDAAqD;AACrD,MAAM,WAAW,yBAAyB;IACxC,0CAA0C;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC1B;AAyBD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,mBAAoB,YAAW,kBAAkB;IAC5D,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAElC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;gBAEzB,MAAM,EAAE,yBAAyB;IAS7C;;;;;;;;;OASG;IACH,aAAa,CAAC,GAAG,EAAE,cAAc,GAAG,yBAAyB;IAgC7D;;;;;;;;;OASG;IACH,iBAAiB,CAAC,GAAG,EAAE,cAAc,GAAG,kBAAkB;IAyD1D;;;;;;OAMG;IACG,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA0BzE;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAavD;;;;OAIG;IACG,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBlD"}