signalwire-agents 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 (245) hide show
  1. package/CLAUDE.md +112 -0
  2. package/README.md +417 -0
  3. package/dist/AgentBase.d.ts +481 -0
  4. package/dist/AgentBase.js +1155 -0
  5. package/dist/AgentBase.js.map +1 -0
  6. package/dist/AgentServer.d.ts +60 -0
  7. package/dist/AgentServer.js +128 -0
  8. package/dist/AgentServer.js.map +1 -0
  9. package/dist/AuthHandler.d.ts +56 -0
  10. package/dist/AuthHandler.js +119 -0
  11. package/dist/AuthHandler.js.map +1 -0
  12. package/dist/ConfigLoader.d.ts +68 -0
  13. package/dist/ConfigLoader.js +150 -0
  14. package/dist/ConfigLoader.js.map +1 -0
  15. package/dist/ContextBuilder.d.ts +431 -0
  16. package/dist/ContextBuilder.js +751 -0
  17. package/dist/ContextBuilder.js.map +1 -0
  18. package/dist/DataMap.d.ts +179 -0
  19. package/dist/DataMap.js +321 -0
  20. package/dist/DataMap.js.map +1 -0
  21. package/dist/Logger.d.ts +91 -0
  22. package/dist/Logger.js +191 -0
  23. package/dist/Logger.js.map +1 -0
  24. package/dist/PomBuilder.d.ts +144 -0
  25. package/dist/PomBuilder.js +249 -0
  26. package/dist/PomBuilder.js.map +1 -0
  27. package/dist/PromptManager.d.ts +85 -0
  28. package/dist/PromptManager.js +108 -0
  29. package/dist/PromptManager.js.map +1 -0
  30. package/dist/SchemaUtils.d.ts +42 -0
  31. package/dist/SchemaUtils.js +148 -0
  32. package/dist/SchemaUtils.js.map +1 -0
  33. package/dist/ServerlessAdapter.d.ts +100 -0
  34. package/dist/ServerlessAdapter.js +166 -0
  35. package/dist/ServerlessAdapter.js.map +1 -0
  36. package/dist/SessionManager.d.ts +86 -0
  37. package/dist/SessionManager.js +155 -0
  38. package/dist/SessionManager.js.map +1 -0
  39. package/dist/SslConfig.d.ts +77 -0
  40. package/dist/SslConfig.js +100 -0
  41. package/dist/SslConfig.js.map +1 -0
  42. package/dist/SwaigFunction.d.ts +88 -0
  43. package/dist/SwaigFunction.js +125 -0
  44. package/dist/SwaigFunction.js.map +1 -0
  45. package/dist/SwaigFunctionResult.d.ts +442 -0
  46. package/dist/SwaigFunctionResult.js +735 -0
  47. package/dist/SwaigFunctionResult.js.map +1 -0
  48. package/dist/SwmlBuilder.d.ts +37 -0
  49. package/dist/SwmlBuilder.js +55 -0
  50. package/dist/SwmlBuilder.js.map +1 -0
  51. package/dist/cli/agent-loader.d.ts +22 -0
  52. package/dist/cli/agent-loader.js +106 -0
  53. package/dist/cli/agent-loader.js.map +1 -0
  54. package/dist/cli/mock-data.d.ts +37 -0
  55. package/dist/cli/mock-data.js +79 -0
  56. package/dist/cli/mock-data.js.map +1 -0
  57. package/dist/cli/swaig-test.d.ts +32 -0
  58. package/dist/cli/swaig-test.js +405 -0
  59. package/dist/cli/swaig-test.js.map +1 -0
  60. package/dist/index.d.ts +36 -0
  61. package/dist/index.js +44 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/prefabs/ConciergeAgent.d.ts +64 -0
  64. package/dist/prefabs/ConciergeAgent.js +188 -0
  65. package/dist/prefabs/ConciergeAgent.js.map +1 -0
  66. package/dist/prefabs/FAQBotAgent.d.ts +68 -0
  67. package/dist/prefabs/FAQBotAgent.js +206 -0
  68. package/dist/prefabs/FAQBotAgent.js.map +1 -0
  69. package/dist/prefabs/InfoGathererAgent.d.ts +73 -0
  70. package/dist/prefabs/InfoGathererAgent.js +202 -0
  71. package/dist/prefabs/InfoGathererAgent.js.map +1 -0
  72. package/dist/prefabs/ReceptionistAgent.d.ts +65 -0
  73. package/dist/prefabs/ReceptionistAgent.js +205 -0
  74. package/dist/prefabs/ReceptionistAgent.js.map +1 -0
  75. package/dist/prefabs/SurveyAgent.d.ts +84 -0
  76. package/dist/prefabs/SurveyAgent.js +324 -0
  77. package/dist/prefabs/SurveyAgent.js.map +1 -0
  78. package/dist/prefabs/index.d.ts +13 -0
  79. package/dist/prefabs/index.js +14 -0
  80. package/dist/prefabs/index.js.map +1 -0
  81. package/dist/skills/SkillBase.d.ts +134 -0
  82. package/dist/skills/SkillBase.js +105 -0
  83. package/dist/skills/SkillBase.js.map +1 -0
  84. package/dist/skills/SkillManager.d.ts +83 -0
  85. package/dist/skills/SkillManager.js +159 -0
  86. package/dist/skills/SkillManager.js.map +1 -0
  87. package/dist/skills/SkillRegistry.d.ts +105 -0
  88. package/dist/skills/SkillRegistry.js +195 -0
  89. package/dist/skills/SkillRegistry.js.map +1 -0
  90. package/dist/skills/builtin/api_ninjas_trivia.d.ts +35 -0
  91. package/dist/skills/builtin/api_ninjas_trivia.js +161 -0
  92. package/dist/skills/builtin/api_ninjas_trivia.js.map +1 -0
  93. package/dist/skills/builtin/claude_skills.d.ts +34 -0
  94. package/dist/skills/builtin/claude_skills.js +156 -0
  95. package/dist/skills/builtin/claude_skills.js.map +1 -0
  96. package/dist/skills/builtin/custom_skills.d.ts +59 -0
  97. package/dist/skills/builtin/custom_skills.js +231 -0
  98. package/dist/skills/builtin/custom_skills.js.map +1 -0
  99. package/dist/skills/builtin/datasphere.d.ts +34 -0
  100. package/dist/skills/builtin/datasphere.js +163 -0
  101. package/dist/skills/builtin/datasphere.js.map +1 -0
  102. package/dist/skills/builtin/datasphere_serverless.d.ts +54 -0
  103. package/dist/skills/builtin/datasphere_serverless.js +155 -0
  104. package/dist/skills/builtin/datasphere_serverless.js.map +1 -0
  105. package/dist/skills/builtin/datetime.d.ts +31 -0
  106. package/dist/skills/builtin/datetime.js +95 -0
  107. package/dist/skills/builtin/datetime.js.map +1 -0
  108. package/dist/skills/builtin/google_maps.d.ts +33 -0
  109. package/dist/skills/builtin/google_maps.js +233 -0
  110. package/dist/skills/builtin/google_maps.js.map +1 -0
  111. package/dist/skills/builtin/index.d.ts +28 -0
  112. package/dist/skills/builtin/index.js +75 -0
  113. package/dist/skills/builtin/index.js.map +1 -0
  114. package/dist/skills/builtin/info_gatherer.d.ts +52 -0
  115. package/dist/skills/builtin/info_gatherer.js +237 -0
  116. package/dist/skills/builtin/info_gatherer.js.map +1 -0
  117. package/dist/skills/builtin/joke.d.ts +32 -0
  118. package/dist/skills/builtin/joke.js +142 -0
  119. package/dist/skills/builtin/joke.js.map +1 -0
  120. package/dist/skills/builtin/math.d.ts +33 -0
  121. package/dist/skills/builtin/math.js +120 -0
  122. package/dist/skills/builtin/math.js.map +1 -0
  123. package/dist/skills/builtin/mcp_gateway.d.ts +35 -0
  124. package/dist/skills/builtin/mcp_gateway.js +85 -0
  125. package/dist/skills/builtin/mcp_gateway.js.map +1 -0
  126. package/dist/skills/builtin/native_vector_search.d.ts +44 -0
  127. package/dist/skills/builtin/native_vector_search.js +248 -0
  128. package/dist/skills/builtin/native_vector_search.js.map +1 -0
  129. package/dist/skills/builtin/play_background_file.d.ts +34 -0
  130. package/dist/skills/builtin/play_background_file.js +135 -0
  131. package/dist/skills/builtin/play_background_file.js.map +1 -0
  132. package/dist/skills/builtin/spider.d.ts +34 -0
  133. package/dist/skills/builtin/spider.js +164 -0
  134. package/dist/skills/builtin/spider.js.map +1 -0
  135. package/dist/skills/builtin/swml_transfer.d.ts +44 -0
  136. package/dist/skills/builtin/swml_transfer.js +204 -0
  137. package/dist/skills/builtin/swml_transfer.js.map +1 -0
  138. package/dist/skills/builtin/weather_api.d.ts +34 -0
  139. package/dist/skills/builtin/weather_api.js +136 -0
  140. package/dist/skills/builtin/weather_api.js.map +1 -0
  141. package/dist/skills/builtin/web_search.d.ts +34 -0
  142. package/dist/skills/builtin/web_search.js +141 -0
  143. package/dist/skills/builtin/web_search.js.map +1 -0
  144. package/dist/skills/builtin/wikipedia_search.d.ts +34 -0
  145. package/dist/skills/builtin/wikipedia_search.js +166 -0
  146. package/dist/skills/builtin/wikipedia_search.js.map +1 -0
  147. package/dist/skills/index.d.ts +11 -0
  148. package/dist/skills/index.js +10 -0
  149. package/dist/skills/index.js.map +1 -0
  150. package/dist/types.d.ts +85 -0
  151. package/dist/types.js +5 -0
  152. package/dist/types.js.map +1 -0
  153. package/docs/agent-guide.md +869 -0
  154. package/docs/api-reference.md +2419 -0
  155. package/docs/architecture.md +843 -0
  156. package/docs/cli-guide.md +579 -0
  157. package/docs/configuration.md +422 -0
  158. package/docs/contexts-guide.md +787 -0
  159. package/docs/datamap-guide.md +1141 -0
  160. package/docs/prefabs-guide.md +830 -0
  161. package/docs/security.md +436 -0
  162. package/docs/serverless-guide.md +513 -0
  163. package/docs/skills-guide.md +845 -0
  164. package/docs/swaig-reference.md +1627 -0
  165. package/examples/call-flow.ts +60 -0
  166. package/examples/contexts-steps.ts +62 -0
  167. package/examples/datamap-tools.ts +52 -0
  168. package/examples/dynamic-config.ts +51 -0
  169. package/examples/multi-agent.ts +67 -0
  170. package/examples/pom-prompt.ts +68 -0
  171. package/examples/simple-agent.ts +33 -0
  172. package/package.json +35 -0
  173. package/src/AgentBase.ts +1279 -0
  174. package/src/AgentServer.ts +149 -0
  175. package/src/AuthHandler.ts +141 -0
  176. package/src/ConfigLoader.ts +165 -0
  177. package/src/ContextBuilder.ts +796 -0
  178. package/src/DataMap.ts +365 -0
  179. package/src/Logger.ts +197 -0
  180. package/src/PomBuilder.ts +298 -0
  181. package/src/PromptManager.ts +133 -0
  182. package/src/SchemaUtils.ts +170 -0
  183. package/src/ServerlessAdapter.ts +218 -0
  184. package/src/SessionManager.ts +161 -0
  185. package/src/SslConfig.ts +118 -0
  186. package/src/SwaigFunction.ts +168 -0
  187. package/src/SwaigFunctionResult.ts +864 -0
  188. package/src/SwmlBuilder.ts +62 -0
  189. package/src/cli/agent-loader.ts +122 -0
  190. package/src/cli/mock-data.ts +110 -0
  191. package/src/cli/swaig-test.ts +440 -0
  192. package/src/index.ts +99 -0
  193. package/src/prefabs/ConciergeAgent.ts +251 -0
  194. package/src/prefabs/FAQBotAgent.ts +263 -0
  195. package/src/prefabs/InfoGathererAgent.ts +276 -0
  196. package/src/prefabs/ReceptionistAgent.ts +277 -0
  197. package/src/prefabs/SurveyAgent.ts +413 -0
  198. package/src/prefabs/index.ts +23 -0
  199. package/src/skills/SkillBase.ts +184 -0
  200. package/src/skills/SkillManager.ts +177 -0
  201. package/src/skills/SkillRegistry.ts +231 -0
  202. package/src/skills/builtin/api_ninjas_trivia.ts +230 -0
  203. package/src/skills/builtin/claude_skills.ts +239 -0
  204. package/src/skills/builtin/custom_skills.ts +326 -0
  205. package/src/skills/builtin/datasphere.ts +225 -0
  206. package/src/skills/builtin/datasphere_serverless.ts +194 -0
  207. package/src/skills/builtin/datetime.ts +115 -0
  208. package/src/skills/builtin/google_maps.ts +347 -0
  209. package/src/skills/builtin/index.ts +79 -0
  210. package/src/skills/builtin/info_gatherer.ts +331 -0
  211. package/src/skills/builtin/joke.ts +180 -0
  212. package/src/skills/builtin/math.ts +150 -0
  213. package/src/skills/builtin/mcp_gateway.ts +99 -0
  214. package/src/skills/builtin/native_vector_search.ts +327 -0
  215. package/src/skills/builtin/play_background_file.ts +189 -0
  216. package/src/skills/builtin/spider.ts +232 -0
  217. package/src/skills/builtin/swml_transfer.ts +285 -0
  218. package/src/skills/builtin/weather_api.ts +193 -0
  219. package/src/skills/builtin/web_search.ts +212 -0
  220. package/src/skills/builtin/wikipedia_search.ts +248 -0
  221. package/src/skills/index.ts +12 -0
  222. package/src/types.ts +99 -0
  223. package/tests/AgentBase.test.ts +693 -0
  224. package/tests/AgentServer.test.ts +102 -0
  225. package/tests/AuthHandler.test.ts +121 -0
  226. package/tests/ConfigLoader.test.ts +121 -0
  227. package/tests/DataMap.test.ts +286 -0
  228. package/tests/Logger.test.ts +218 -0
  229. package/tests/PomBuilder.test.ts +164 -0
  230. package/tests/ProxyDetection.test.ts +185 -0
  231. package/tests/SchemaUtils.test.ts +106 -0
  232. package/tests/ServerlessAdapter.test.ts +200 -0
  233. package/tests/SessionManager.test.ts +139 -0
  234. package/tests/SslConfig.test.ts +97 -0
  235. package/tests/SwaigFunctionResult.test.ts +298 -0
  236. package/tests/cli/mock-data.test.ts +94 -0
  237. package/tests/cli/swaig-test.test.ts +96 -0
  238. package/tests/prefabs/prefabs.test.ts +854 -0
  239. package/tests/setup.ts +6 -0
  240. package/tests/skills/SkillBase.test.ts +118 -0
  241. package/tests/skills/SkillManager.test.ts +164 -0
  242. package/tests/skills/SkillRegistry.test.ts +124 -0
  243. package/tests/skills/builtin.test.ts +924 -0
  244. package/tsconfig.json +18 -0
  245. package/vitest.config.ts +9 -0
@@ -0,0 +1,1627 @@
1
+ # SwaigFunctionResult Reference
2
+
3
+ Complete API reference for the `SwaigFunctionResult` class in the SignalWire AI Agents TypeScript SDK.
4
+
5
+ ---
6
+
7
+ ## Table of Contents
8
+
9
+ - [Overview](#overview)
10
+ - [Core Methods](#core-methods)
11
+ - [constructor](#constructor)
12
+ - [setResponse](#setresponse)
13
+ - [setPostProcess](#setpostprocess)
14
+ - [addAction](#addaction)
15
+ - [addActions](#addactions)
16
+ - [toDict](#todict)
17
+ - [Call Control](#call-control)
18
+ - [connect](#connect)
19
+ - [swmlTransfer](#swmltransfer)
20
+ - [hangup](#hangup)
21
+ - [hold](#hold)
22
+ - [waitForUser](#waitforuser)
23
+ - [stop](#stop)
24
+ - [Audio](#audio)
25
+ - [say](#say)
26
+ - [playBackgroundFile](#playbackgroundfile)
27
+ - [stopBackgroundFile](#stopbackgroundfile)
28
+ - [Speech](#speech)
29
+ - [addDynamicHints](#adddynamichints)
30
+ - [clearDynamicHints](#cleardynamichints)
31
+ - [setEndOfSpeechTimeout](#setendofspeechtimeout)
32
+ - [setSpeechEventTimeout](#setspeecheventtimeout)
33
+ - [Data Management](#data-management)
34
+ - [updateGlobalData](#updateglobaldata)
35
+ - [removeGlobalData](#removeglobaldata)
36
+ - [setMetadata](#setmetadata)
37
+ - [removeMetadata](#removemetadata)
38
+ - [SWML Actions](#swml-actions)
39
+ - [executeSwml](#executeswml)
40
+ - [switchContext](#switchcontext)
41
+ - [swmlChangeStep](#swmlchangestep)
42
+ - [swmlChangeContext](#swmlchangecontext)
43
+ - [swmlUserEvent](#swmluserevent)
44
+ - [Function Control](#function-control)
45
+ - [toggleFunctions](#togglefunctions)
46
+ - [enableFunctionsOnTimeout](#enablefunctionsontimeout)
47
+ - [updateSettings](#updatesettings)
48
+ - [User Input and History](#user-input-and-history)
49
+ - [simulateUserInput](#simulateuserinput)
50
+ - [enableExtensiveData](#enableextensivedata)
51
+ - [replaceInHistory](#replaceinhistory)
52
+ - [Communication](#communication)
53
+ - [sendSms](#sendsms)
54
+ - [recordCall](#recordcall)
55
+ - [stopRecordCall](#stoprecordcall)
56
+ - [tap](#tap)
57
+ - [stopTap](#stoptap)
58
+ - [Rooms and Conferencing](#rooms-and-conferencing)
59
+ - [joinRoom](#joinroom)
60
+ - [sipRefer](#siprefer)
61
+ - [joinConference](#joinconference)
62
+ - [RPC](#rpc)
63
+ - [executeRpc](#executerpc)
64
+ - [rpcDial](#rpcdial)
65
+ - [rpcAiMessage](#rpcaimessage)
66
+ - [rpcAiUnhold](#rpcaiunhold)
67
+ - [Payments](#payments)
68
+ - [pay](#pay)
69
+ - [createPaymentPrompt (static)](#createpaymentprompt-static)
70
+ - [createPaymentAction (static)](#createpaymentaction-static)
71
+ - [createPaymentParameter (static)](#createpaymentparameter-static)
72
+ - [Fluent Chaining](#fluent-chaining)
73
+
74
+ ---
75
+
76
+ ## Overview
77
+
78
+ `SwaigFunctionResult` is the return type for SWAIG tool handlers. It carries two pieces of information back to the SignalWire AI engine:
79
+
80
+ 1. **Response text** -- A string the AI uses as the tool's output. The AI reads this text and incorporates it into its conversation with the caller.
81
+ 2. **Actions** -- An ordered list of structured commands (hangup, connect, play audio, send SMS, etc.) that the platform executes as side effects.
82
+
83
+ When a tool handler runs, it constructs a `SwaigFunctionResult`, optionally adds actions, and returns it. The SDK serializes it via `toDict()` and sends it back to SignalWire.
84
+
85
+ ### Basic usage
86
+
87
+ ```typescript
88
+ import { AgentBase, SwaigFunctionResult } from '@anthropic/signalwire-agents';
89
+
90
+ const agent = new AgentBase({ name: 'my-agent', basicAuth: ['user', 'pass'] });
91
+
92
+ agent.defineTool({
93
+ name: 'transfer_call',
94
+ description: 'Transfer the caller to a human agent',
95
+ parameters: {},
96
+ handler: () => {
97
+ return new SwaigFunctionResult('Transferring you now.')
98
+ .connect('+15551234567');
99
+ },
100
+ });
101
+ ```
102
+
103
+ ### How serialization works
104
+
105
+ When the handler returns, the SDK calls `toDict()` to produce a plain object:
106
+
107
+ ```typescript
108
+ const result = new SwaigFunctionResult('Done').hangup();
109
+ console.log(result.toDict());
110
+ // { response: "Done", action: [{ hangup: true }] }
111
+ ```
112
+
113
+ If both `response` and `action` are empty, `toDict()` returns `{ response: "Action completed." }` as a fallback so the AI always receives a valid response.
114
+
115
+ ### Properties
116
+
117
+ | Property | Type | Description |
118
+ |---------------|-----------------------------|--------------------------------------------------------------|
119
+ | `response` | `string` | Text returned to the AI engine. |
120
+ | `action` | `Record<string, unknown>[]` | Ordered list of action objects to execute. |
121
+ | `postProcess` | `boolean` | When `true`, actions execute after the AI formulates its reply. |
122
+
123
+ ---
124
+
125
+ ## Core Methods
126
+
127
+ ### constructor
128
+
129
+ Create a new `SwaigFunctionResult`.
130
+
131
+ ```typescript
132
+ constructor(response?: string, postProcess?: boolean)
133
+ ```
134
+
135
+ | Parameter | Type | Default | Description |
136
+ |---------------|-----------|---------|------------------------------------------------|
137
+ | `response` | `string` | `''` | Initial response text for the AI. |
138
+ | `postProcess` | `boolean` | `false` | Whether actions should be post-processed. |
139
+
140
+ **Returns:** A new `SwaigFunctionResult` instance.
141
+
142
+ ```typescript
143
+ // Empty result (will serialize as "Action completed.")
144
+ const r1 = new SwaigFunctionResult();
145
+
146
+ // With response text
147
+ const r2 = new SwaigFunctionResult('Order placed successfully.');
148
+
149
+ // With post-processing enabled
150
+ const r3 = new SwaigFunctionResult('Processing payment...', true);
151
+ ```
152
+
153
+ ---
154
+
155
+ ### setResponse
156
+
157
+ Set or replace the response text.
158
+
159
+ ```typescript
160
+ setResponse(response: string): this
161
+ ```
162
+
163
+ | Parameter | Type | Description |
164
+ |------------|----------|---------------------------|
165
+ | `response` | `string` | The new response text. |
166
+
167
+ **Returns:** `this` for chaining.
168
+
169
+ ```typescript
170
+ const result = new SwaigFunctionResult()
171
+ .setResponse('Your balance is $42.50');
172
+ ```
173
+
174
+ ---
175
+
176
+ ### setPostProcess
177
+
178
+ Enable or disable post-processing of actions.
179
+
180
+ When post-processing is enabled, the actions are executed **after** the AI has formulated its spoken response to the caller, rather than before. This is useful when you want the AI to speak first and then perform side effects (like hanging up).
181
+
182
+ ```typescript
183
+ setPostProcess(postProcess: boolean): this
184
+ ```
185
+
186
+ | Parameter | Type | Description |
187
+ |---------------|-----------|------------------------------------------|
188
+ | `postProcess` | `boolean` | Whether to enable post-processing. |
189
+
190
+ **Returns:** `this` for chaining.
191
+
192
+ ```typescript
193
+ const result = new SwaigFunctionResult('Goodbye!')
194
+ .setPostProcess(true)
195
+ .hangup();
196
+ // The AI says "Goodbye!" first, then the hangup executes.
197
+ ```
198
+
199
+ ---
200
+
201
+ ### addAction
202
+
203
+ Append a single named action to the action list. This is the low-level method used internally by most other methods. You can use it directly for custom or undocumented actions.
204
+
205
+ ```typescript
206
+ addAction(name: string, data: unknown): this
207
+ ```
208
+
209
+ | Parameter | Type | Description |
210
+ |-----------|-----------|-----------------------------------------|
211
+ | `name` | `string` | The action name (e.g., `"hangup"`). |
212
+ | `data` | `unknown` | The action payload. |
213
+
214
+ **Returns:** `this` for chaining.
215
+
216
+ ```typescript
217
+ const result = new SwaigFunctionResult('Done')
218
+ .addAction('custom_action', { key: 'value' });
219
+ // action: [{ custom_action: { key: "value" } }]
220
+ ```
221
+
222
+ ---
223
+
224
+ ### addActions
225
+
226
+ Append multiple action objects at once. Each object in the array should be a single-key record mapping an action name to its payload.
227
+
228
+ ```typescript
229
+ addActions(actions: Record<string, unknown>[]): this
230
+ ```
231
+
232
+ | Parameter | Type | Description |
233
+ |-----------|-----------------------------|------------------------------------|
234
+ | `actions` | `Record<string, unknown>[]` | Array of action objects to append. |
235
+
236
+ **Returns:** `this` for chaining.
237
+
238
+ ```typescript
239
+ const result = new SwaigFunctionResult('Multi-step')
240
+ .addActions([
241
+ { say: 'Step one complete.' },
242
+ { say: 'Step two complete.' },
243
+ { hangup: true },
244
+ ]);
245
+ ```
246
+
247
+ ---
248
+
249
+ ### toDict
250
+
251
+ Serialize the result to a plain object for the SWAIG response wire format.
252
+
253
+ ```typescript
254
+ toDict(): Record<string, unknown>
255
+ ```
256
+
257
+ **Returns:** A dictionary with `response`, `action`, and optionally `post_process` fields.
258
+
259
+ **Behavior:**
260
+ - If `response` is non-empty, it is included as `response`.
261
+ - If `action` has entries, they are included as `action`.
262
+ - If `postProcess` is `true` and there are actions, `post_process: true` is included.
263
+ - If both `response` and `action` are empty, the result falls back to `{ response: "Action completed." }`.
264
+
265
+ ```typescript
266
+ const result = new SwaigFunctionResult('Hello').say('Welcome!');
267
+ console.log(result.toDict());
268
+ // {
269
+ // response: "Hello",
270
+ // action: [{ say: "Welcome!" }]
271
+ // }
272
+
273
+ const empty = new SwaigFunctionResult();
274
+ console.log(empty.toDict());
275
+ // { response: "Action completed." }
276
+ ```
277
+
278
+ ---
279
+
280
+ ## Call Control
281
+
282
+ ### connect
283
+
284
+ Connect (transfer) the call to another destination using SWML. This generates an inline SWML document with a `connect` verb.
285
+
286
+ ```typescript
287
+ connect(destination: string, final?: boolean, fromAddr?: string): this
288
+ ```
289
+
290
+ | Parameter | Type | Default | Description |
291
+ |---------------|-----------|---------|----------------------------------------------------------|
292
+ | `destination` | `string` | -- | Phone number or SIP URI to connect to. |
293
+ | `final` | `boolean` | `true` | If `true`, the AI session ends after the transfer. |
294
+ | `fromAddr` | `string` | -- | Optional caller ID for the outbound leg. |
295
+
296
+ **Returns:** `this` for chaining.
297
+
298
+ ```typescript
299
+ // Simple transfer
300
+ const result = new SwaigFunctionResult('Connecting you to support.')
301
+ .connect('+15551234567');
302
+
303
+ // Non-final transfer (AI continues after the connected call ends)
304
+ const result2 = new SwaigFunctionResult('Let me conference in my manager.')
305
+ .connect('+15559876543', false);
306
+
307
+ // Transfer with custom caller ID
308
+ const result3 = new SwaigFunctionResult('Transferring...')
309
+ .connect('+15551234567', true, '+15550001111');
310
+ ```
311
+
312
+ ---
313
+
314
+ ### swmlTransfer
315
+
316
+ Transfer the call to a SWML destination with a custom AI response set before transferring. Unlike `connect`, this uses the SWML `transfer` verb with a `set` verb to inject an AI response.
317
+
318
+ ```typescript
319
+ swmlTransfer(dest: string, aiResponse: string, final?: boolean): this
320
+ ```
321
+
322
+ | Parameter | Type | Default | Description |
323
+ |--------------|-----------|---------|----------------------------------------------------|
324
+ | `dest` | `string` | -- | The transfer destination. |
325
+ | `aiResponse` | `string` | -- | AI response text to set before transferring. |
326
+ | `final` | `boolean` | `true` | Whether this is a final transfer. |
327
+
328
+ **Returns:** `this` for chaining.
329
+
330
+ ```typescript
331
+ const result = new SwaigFunctionResult('Transfer initiated.')
332
+ .swmlTransfer('sip:support@example.com', 'Call is being transferred to support.');
333
+ ```
334
+
335
+ ---
336
+
337
+ ### hangup
338
+
339
+ Hang up the call. Adds a `{ hangup: true }` action.
340
+
341
+ ```typescript
342
+ hangup(): this
343
+ ```
344
+
345
+ **Returns:** `this` for chaining.
346
+
347
+ ```typescript
348
+ const result = new SwaigFunctionResult('Thank you for calling. Goodbye!')
349
+ .setPostProcess(true)
350
+ .hangup();
351
+ ```
352
+
353
+ ---
354
+
355
+ ### hold
356
+
357
+ Place the call on hold for a specified duration. The timeout is clamped between 0 and 900 seconds (15 minutes).
358
+
359
+ ```typescript
360
+ hold(timeout?: number): this
361
+ ```
362
+
363
+ | Parameter | Type | Default | Description |
364
+ |-----------|----------|---------|--------------------------------------|
365
+ | `timeout` | `number` | `300` | Hold duration in seconds (0--900). |
366
+
367
+ **Returns:** `this` for chaining.
368
+
369
+ ```typescript
370
+ // Hold for default 5 minutes
371
+ const result = new SwaigFunctionResult('Please hold.').hold();
372
+
373
+ // Hold for 60 seconds
374
+ const result2 = new SwaigFunctionResult('Brief hold.').hold(60);
375
+ ```
376
+
377
+ ---
378
+
379
+ ### waitForUser
380
+
381
+ Wait for user input before continuing. Supports multiple modes: simple enable/disable, a timeout, or an "answer first" mode.
382
+
383
+ ```typescript
384
+ waitForUser(opts?: {
385
+ enabled?: boolean;
386
+ timeout?: number;
387
+ answerFirst?: boolean;
388
+ }): this
389
+ ```
390
+
391
+ | Parameter | Type | Default | Description |
392
+ |--------------------|-----------|---------|--------------------------------------------------|
393
+ | `opts.enabled` | `boolean` | -- | Enable or disable waiting for user input. |
394
+ | `opts.timeout` | `number` | -- | Timeout in seconds to wait for user input. |
395
+ | `opts.answerFirst` | `boolean` | -- | If `true`, wait for the call to be answered first. |
396
+
397
+ **Priority:** `answerFirst` > `timeout` > `enabled`. If no options are provided, `wait_for_user` is set to `true`.
398
+
399
+ **Returns:** `this` for chaining.
400
+
401
+ ```typescript
402
+ // Simple wait
403
+ const r1 = new SwaigFunctionResult('Go ahead.').waitForUser();
404
+
405
+ // Wait with timeout
406
+ const r2 = new SwaigFunctionResult('I will wait 10 seconds.')
407
+ .waitForUser({ timeout: 10 });
408
+
409
+ // Answer-first mode
410
+ const r3 = new SwaigFunctionResult('Waiting for answer.')
411
+ .waitForUser({ answerFirst: true });
412
+
413
+ // Disable waiting
414
+ const r4 = new SwaigFunctionResult('Continuing.')
415
+ .waitForUser({ enabled: false });
416
+ ```
417
+
418
+ ---
419
+
420
+ ### stop
421
+
422
+ Stop the AI session entirely. Adds a `{ stop: true }` action.
423
+
424
+ ```typescript
425
+ stop(): this
426
+ ```
427
+
428
+ **Returns:** `this` for chaining.
429
+
430
+ ```typescript
431
+ const result = new SwaigFunctionResult('Session ended.').stop();
432
+ ```
433
+
434
+ ---
435
+
436
+ ## Audio
437
+
438
+ ### say
439
+
440
+ Speak text to the caller via text-to-speech (TTS).
441
+
442
+ ```typescript
443
+ say(text: string): this
444
+ ```
445
+
446
+ | Parameter | Type | Description |
447
+ |-----------|----------|--------------------------|
448
+ | `text` | `string` | The text to speak. |
449
+
450
+ **Returns:** `this` for chaining.
451
+
452
+ ```typescript
453
+ const result = new SwaigFunctionResult('Info retrieved.')
454
+ .say('Your order number is 12345.');
455
+ ```
456
+
457
+ ---
458
+
459
+ ### playBackgroundFile
460
+
461
+ Play an audio file in the background during the call. The AI conversation continues while the file plays.
462
+
463
+ ```typescript
464
+ playBackgroundFile(filename: string, wait?: boolean): this
465
+ ```
466
+
467
+ | Parameter | Type | Default | Description |
468
+ |------------|-----------|---------|----------------------------------------------------|
469
+ | `filename` | `string` | -- | URL or path of the audio file. |
470
+ | `wait` | `boolean` | `false` | If `true`, block until playback completes. |
471
+
472
+ **Returns:** `this` for chaining.
473
+
474
+ ```typescript
475
+ // Play background music (non-blocking)
476
+ const result = new SwaigFunctionResult('Playing hold music.')
477
+ .playBackgroundFile('https://example.com/hold-music.mp3');
478
+
479
+ // Play and wait for completion
480
+ const result2 = new SwaigFunctionResult('Listen to this announcement.')
481
+ .playBackgroundFile('https://example.com/announcement.wav', true);
482
+ ```
483
+
484
+ ---
485
+
486
+ ### stopBackgroundFile
487
+
488
+ Stop any currently playing background audio file.
489
+
490
+ ```typescript
491
+ stopBackgroundFile(): this
492
+ ```
493
+
494
+ **Returns:** `this` for chaining.
495
+
496
+ ```typescript
497
+ const result = new SwaigFunctionResult('Stopping music.')
498
+ .stopBackgroundFile();
499
+ ```
500
+
501
+ ---
502
+
503
+ ## Speech
504
+
505
+ ### addDynamicHints
506
+
507
+ Add dynamic speech recognition hints to improve transcription accuracy for specific words or phrases. Hints can be plain strings or pattern-replacement objects.
508
+
509
+ ```typescript
510
+ addDynamicHints(
511
+ hints: (string | { pattern: string; replace: string; ignore_case?: boolean })[]
512
+ ): this
513
+ ```
514
+
515
+ | Parameter | Type | Description |
516
+ |-----------|-----------------------------------------------------------------------------------|------------------------------------------------|
517
+ | `hints` | `(string \| { pattern: string; replace: string; ignore_case?: boolean })[]` | Array of hint strings or pattern objects. |
518
+
519
+ **Returns:** `this` for chaining.
520
+
521
+ ```typescript
522
+ // Simple word hints
523
+ const result = new SwaigFunctionResult('Ready.')
524
+ .addDynamicHints(['SignalWire', 'SWML', 'SWAIG']);
525
+
526
+ // Pattern-replacement hints
527
+ const result2 = new SwaigFunctionResult('Ready.')
528
+ .addDynamicHints([
529
+ { pattern: 'signal wire', replace: 'SignalWire', ignore_case: true },
530
+ { pattern: 'swiggy', replace: 'SWAIG' },
531
+ ]);
532
+ ```
533
+
534
+ ---
535
+
536
+ ### clearDynamicHints
537
+
538
+ Remove all previously added dynamic speech recognition hints.
539
+
540
+ ```typescript
541
+ clearDynamicHints(): this
542
+ ```
543
+
544
+ **Returns:** `this` for chaining.
545
+
546
+ ```typescript
547
+ const result = new SwaigFunctionResult('Hints cleared.')
548
+ .clearDynamicHints();
549
+ ```
550
+
551
+ ---
552
+
553
+ ### setEndOfSpeechTimeout
554
+
555
+ Set the silence duration that marks the end of a user's speech. A shorter timeout makes the AI respond more quickly after the user stops talking; a longer timeout allows for natural pauses.
556
+
557
+ ```typescript
558
+ setEndOfSpeechTimeout(milliseconds: number): this
559
+ ```
560
+
561
+ | Parameter | Type | Description |
562
+ |----------------|----------|-----------------------------------|
563
+ | `milliseconds` | `number` | Timeout in milliseconds. |
564
+
565
+ **Returns:** `this` for chaining.
566
+
567
+ ```typescript
568
+ const result = new SwaigFunctionResult('Adjusted speech timeout.')
569
+ .setEndOfSpeechTimeout(500); // 500ms of silence = end of speech
570
+ ```
571
+
572
+ ---
573
+
574
+ ### setSpeechEventTimeout
575
+
576
+ Set the timeout for speech event detection.
577
+
578
+ ```typescript
579
+ setSpeechEventTimeout(milliseconds: number): this
580
+ ```
581
+
582
+ | Parameter | Type | Description |
583
+ |----------------|----------|-----------------------------------|
584
+ | `milliseconds` | `number` | Timeout in milliseconds. |
585
+
586
+ **Returns:** `this` for chaining.
587
+
588
+ ```typescript
589
+ const result = new SwaigFunctionResult('Event timeout set.')
590
+ .setSpeechEventTimeout(3000);
591
+ ```
592
+
593
+ ---
594
+
595
+ ## Data Management
596
+
597
+ ### updateGlobalData
598
+
599
+ Merge key-value pairs into the global data store. The global data store is shared across all SWAIG functions during a call and persists for the call's lifetime.
600
+
601
+ ```typescript
602
+ updateGlobalData(data: Record<string, unknown>): this
603
+ ```
604
+
605
+ | Parameter | Type | Description |
606
+ |-----------|----------------------------|------------------------------------|
607
+ | `data` | `Record<string, unknown>` | Key-value pairs to set or update. |
608
+
609
+ **Returns:** `this` for chaining.
610
+
611
+ ```typescript
612
+ const result = new SwaigFunctionResult('Data saved.')
613
+ .updateGlobalData({ customer_id: 'C-123', tier: 'premium' });
614
+ ```
615
+
616
+ ---
617
+
618
+ ### removeGlobalData
619
+
620
+ Remove one or more keys from the global data store.
621
+
622
+ ```typescript
623
+ removeGlobalData(keys: string | string[]): this
624
+ ```
625
+
626
+ | Parameter | Type | Description |
627
+ |-----------|----------------------|------------------------------------------|
628
+ | `keys` | `string \| string[]` | A single key or array of keys to remove. |
629
+
630
+ **Returns:** `this` for chaining.
631
+
632
+ ```typescript
633
+ // Remove a single key
634
+ const r1 = new SwaigFunctionResult('Removed.')
635
+ .removeGlobalData('temp_token');
636
+
637
+ // Remove multiple keys
638
+ const r2 = new SwaigFunctionResult('Cleaned up.')
639
+ .removeGlobalData(['temp_token', 'session_cache']);
640
+ ```
641
+
642
+ ---
643
+
644
+ ### setMetadata
645
+
646
+ Set metadata key-value pairs on the current call. Metadata is attached to the call record and can be used for reporting, billing tags, or downstream processing.
647
+
648
+ ```typescript
649
+ setMetadata(data: Record<string, unknown>): this
650
+ ```
651
+
652
+ | Parameter | Type | Description |
653
+ |-----------|----------------------------|-------------------------------|
654
+ | `data` | `Record<string, unknown>` | Metadata key-value pairs. |
655
+
656
+ **Returns:** `this` for chaining.
657
+
658
+ ```typescript
659
+ const result = new SwaigFunctionResult('Metadata set.')
660
+ .setMetadata({ department: 'sales', priority: 'high' });
661
+ ```
662
+
663
+ ---
664
+
665
+ ### removeMetadata
666
+
667
+ Remove metadata keys from the current call.
668
+
669
+ ```typescript
670
+ removeMetadata(keys: string | string[]): this
671
+ ```
672
+
673
+ | Parameter | Type | Description |
674
+ |-----------|----------------------|------------------------------------------|
675
+ | `keys` | `string \| string[]` | A single key or array of keys to remove. |
676
+
677
+ **Returns:** `this` for chaining.
678
+
679
+ ```typescript
680
+ const result = new SwaigFunctionResult('Metadata removed.')
681
+ .removeMetadata(['temp_flag', 'debug_info']);
682
+ ```
683
+
684
+ ---
685
+
686
+ ## SWML Actions
687
+
688
+ ### executeSwml
689
+
690
+ Execute arbitrary SWML content as an action. Accepts either a JSON string or an object. If the string is not valid JSON, it is wrapped in a `{ raw_swml: ... }` object.
691
+
692
+ ```typescript
693
+ executeSwml(
694
+ swmlContent: string | Record<string, unknown>,
695
+ transfer?: boolean
696
+ ): this
697
+ ```
698
+
699
+ | Parameter | Type | Default | Description |
700
+ |---------------|-----------------------------------------|---------|---------------------------------------------------|
701
+ | `swmlContent` | `string \| Record<string, unknown>` | -- | SWML as a JSON string or object. |
702
+ | `transfer` | `boolean` | `false` | If `true`, the SWML execution transfers the call. |
703
+
704
+ **Returns:** `this` for chaining.
705
+
706
+ ```typescript
707
+ // Execute SWML from an object
708
+ const result = new SwaigFunctionResult('Executing custom flow.')
709
+ .executeSwml({
710
+ version: '1.0.0',
711
+ sections: {
712
+ main: [{ play: { url: 'https://example.com/audio.mp3' } }],
713
+ },
714
+ });
715
+
716
+ // Execute with transfer
717
+ const result2 = new SwaigFunctionResult('Transferring via SWML.')
718
+ .executeSwml({
719
+ version: '1.0.0',
720
+ sections: {
721
+ main: [{ connect: { to: '+15551234567' } }],
722
+ },
723
+ }, true);
724
+ ```
725
+
726
+ ---
727
+
728
+ ### switchContext
729
+
730
+ Switch the AI context at runtime. This can change the system prompt, inject a user prompt, consolidate conversation history, or perform a full reset of the AI context.
731
+
732
+ ```typescript
733
+ switchContext(opts?: {
734
+ systemPrompt?: string;
735
+ userPrompt?: string;
736
+ consolidate?: boolean;
737
+ fullReset?: boolean;
738
+ }): this
739
+ ```
740
+
741
+ | Parameter | Type | Description |
742
+ |---------------------|-----------|-------------------------------------------------------------------|
743
+ | `opts.systemPrompt` | `string` | New system prompt to switch to. |
744
+ | `opts.userPrompt` | `string` | User prompt to inject into the new context. |
745
+ | `opts.consolidate` | `boolean` | If `true`, summarize and carry over conversation history. |
746
+ | `opts.fullReset` | `boolean` | If `true`, completely reset the AI context (clear all history). |
747
+
748
+ **Behavior:** If only `systemPrompt` is provided (no other options), the action uses a simple string value. Otherwise, it builds an object with the specified fields.
749
+
750
+ **Returns:** `this` for chaining.
751
+
752
+ ```typescript
753
+ // Simple context switch -- just change the system prompt
754
+ const r1 = new SwaigFunctionResult('Switching to billing mode.')
755
+ .switchContext({ systemPrompt: 'You are a billing specialist.' });
756
+
757
+ // Switch with consolidation (carry over conversation summary)
758
+ const r2 = new SwaigFunctionResult('Escalating to supervisor.')
759
+ .switchContext({
760
+ systemPrompt: 'You are a supervisor handling an escalated call.',
761
+ consolidate: true,
762
+ });
763
+
764
+ // Full reset
765
+ const r3 = new SwaigFunctionResult('Starting fresh.')
766
+ .switchContext({
767
+ systemPrompt: 'You are a general assistant.',
768
+ fullReset: true,
769
+ });
770
+ ```
771
+
772
+ ---
773
+
774
+ ### swmlChangeStep
775
+
776
+ Change the current SWML step. Steps are named blocks within a SWML document that control call flow.
777
+
778
+ ```typescript
779
+ swmlChangeStep(stepName: string): this
780
+ ```
781
+
782
+ | Parameter | Type | Description |
783
+ |------------|----------|------------------------------------|
784
+ | `stepName` | `string` | The name of the step to switch to. |
785
+
786
+ **Returns:** `this` for chaining.
787
+
788
+ ```typescript
789
+ const result = new SwaigFunctionResult('Moving to verification.')
790
+ .swmlChangeStep('verify_identity');
791
+ ```
792
+
793
+ ---
794
+
795
+ ### swmlChangeContext
796
+
797
+ Change the current SWML context. Contexts are separate AI configurations that can be switched during a call.
798
+
799
+ ```typescript
800
+ swmlChangeContext(contextName: string): this
801
+ ```
802
+
803
+ | Parameter | Type | Description |
804
+ |---------------|----------|---------------------------------------|
805
+ | `contextName` | `string` | The name of the context to switch to. |
806
+
807
+ **Returns:** `this` for chaining.
808
+
809
+ ```typescript
810
+ const result = new SwaigFunctionResult('Switching to Spanish.')
811
+ .swmlChangeContext('spanish_support');
812
+ ```
813
+
814
+ ---
815
+
816
+ ### swmlUserEvent
817
+
818
+ Emit a custom user event via SWML. User events can be consumed by external systems listening to the call's event stream.
819
+
820
+ ```typescript
821
+ swmlUserEvent(eventData: Record<string, unknown>): this
822
+ ```
823
+
824
+ | Parameter | Type | Description |
825
+ |-------------|----------------------------|----------------------|
826
+ | `eventData` | `Record<string, unknown>` | The event payload. |
827
+
828
+ **Returns:** `this` for chaining.
829
+
830
+ ```typescript
831
+ const result = new SwaigFunctionResult('Event emitted.')
832
+ .swmlUserEvent({
833
+ type: 'order_placed',
834
+ order_id: 'ORD-456',
835
+ total: 29.99,
836
+ });
837
+ ```
838
+
839
+ ---
840
+
841
+ ## Function Control
842
+
843
+ ### toggleFunctions
844
+
845
+ Enable or disable SWAIG functions by name at runtime. This allows dynamic control over which tools the AI can call based on the conversation state.
846
+
847
+ ```typescript
848
+ toggleFunctions(toggles: { function: string; active: boolean }[]): this
849
+ ```
850
+
851
+ | Parameter | Type | Description |
852
+ |--------------------|-----------|------------------------------------------|
853
+ | `toggles[].function` | `string` | The name of the SWAIG function. |
854
+ | `toggles[].active` | `boolean` | `true` to enable, `false` to disable. |
855
+
856
+ **Returns:** `this` for chaining.
857
+
858
+ ```typescript
859
+ // After authentication, enable account-specific tools
860
+ const result = new SwaigFunctionResult('Identity verified.')
861
+ .toggleFunctions([
862
+ { function: 'check_balance', active: true },
863
+ { function: 'make_payment', active: true },
864
+ { function: 'verify_identity', active: false },
865
+ ]);
866
+ ```
867
+
868
+ ---
869
+
870
+ ### enableFunctionsOnTimeout
871
+
872
+ Control whether SWAIG functions can fire automatically when the speaker timeout triggers (i.e., when the caller is silent).
873
+
874
+ ```typescript
875
+ enableFunctionsOnTimeout(enabled?: boolean): this
876
+ ```
877
+
878
+ | Parameter | Type | Default | Description |
879
+ |-----------|-----------|---------|------------------------------------------------------|
880
+ | `enabled` | `boolean` | `true` | Whether to enable function execution on timeout. |
881
+
882
+ **Returns:** `this` for chaining.
883
+
884
+ ```typescript
885
+ // Enable functions on speaker timeout
886
+ const r1 = new SwaigFunctionResult('Monitoring silence.')
887
+ .enableFunctionsOnTimeout();
888
+
889
+ // Disable functions on speaker timeout
890
+ const r2 = new SwaigFunctionResult('Waiting patiently.')
891
+ .enableFunctionsOnTimeout(false);
892
+ ```
893
+
894
+ ---
895
+
896
+ ### updateSettings
897
+
898
+ Update AI engine settings at runtime. This allows dynamic modification of parameters like temperature, top_p, or any other engine setting.
899
+
900
+ ```typescript
901
+ updateSettings(settings: Record<string, unknown>): this
902
+ ```
903
+
904
+ | Parameter | Type | Description |
905
+ |------------|----------------------------|--------------------------------------|
906
+ | `settings` | `Record<string, unknown>` | Key-value pairs of settings. |
907
+
908
+ **Returns:** `this` for chaining.
909
+
910
+ ```typescript
911
+ const result = new SwaigFunctionResult('Settings updated.')
912
+ .updateSettings({ temperature: 0.3, top_p: 0.9 });
913
+ ```
914
+
915
+ ---
916
+
917
+ ## User Input and History
918
+
919
+ ### simulateUserInput
920
+
921
+ Inject text as if the user had spoken it. This is useful for programmatically driving the conversation flow.
922
+
923
+ ```typescript
924
+ simulateUserInput(text: string): this
925
+ ```
926
+
927
+ | Parameter | Type | Description |
928
+ |-----------|----------|------------------------------------|
929
+ | `text` | `string` | The simulated user input text. |
930
+
931
+ **Returns:** `this` for chaining.
932
+
933
+ ```typescript
934
+ const result = new SwaigFunctionResult('Proceeding with default.')
935
+ .simulateUserInput('Yes, please go ahead.');
936
+ ```
937
+
938
+ ---
939
+
940
+ ### enableExtensiveData
941
+
942
+ Enable or disable extensive data reporting in function calls. When enabled, SWAIG function invocations include additional metadata about the call state.
943
+
944
+ ```typescript
945
+ enableExtensiveData(enabled?: boolean): this
946
+ ```
947
+
948
+ | Parameter | Type | Default | Description |
949
+ |-----------|-----------|---------|------------------------------------------|
950
+ | `enabled` | `boolean` | `true` | Whether to enable extensive data. |
951
+
952
+ **Returns:** `this` for chaining.
953
+
954
+ ```typescript
955
+ const result = new SwaigFunctionResult('Extensive data enabled.')
956
+ .enableExtensiveData();
957
+ ```
958
+
959
+ ---
960
+
961
+ ### replaceInHistory
962
+
963
+ Replace the function call output in the conversation history. This controls what the AI "remembers" about this function invocation.
964
+
965
+ ```typescript
966
+ replaceInHistory(text?: string | boolean): this
967
+ ```
968
+
969
+ | Parameter | Type | Default | Description |
970
+ |-----------|-----------------------|---------|-----------------------------------------------------------|
971
+ | `text` | `string \| boolean` | `true` | Replacement text, or `true` to replace with the response. |
972
+
973
+ **Returns:** `this` for chaining.
974
+
975
+ ```typescript
976
+ // Replace with the response text
977
+ const r1 = new SwaigFunctionResult('Sensitive data redacted.')
978
+ .replaceInHistory();
979
+
980
+ // Replace with custom text
981
+ const r2 = new SwaigFunctionResult('SSN verified.')
982
+ .replaceInHistory('Identity verification completed.');
983
+ ```
984
+
985
+ ---
986
+
987
+ ## Communication
988
+
989
+ ### sendSms
990
+
991
+ Send an SMS or MMS message from within the call flow. At least one of `body` or `media` must be provided.
992
+
993
+ ```typescript
994
+ sendSms(opts: {
995
+ toNumber: string;
996
+ fromNumber: string;
997
+ body?: string;
998
+ media?: string[];
999
+ tags?: string[];
1000
+ region?: string;
1001
+ }): this
1002
+ ```
1003
+
1004
+ | Parameter | Type | Description |
1005
+ |------------------|------------|------------------------------------------------|
1006
+ | `opts.toNumber` | `string` | Recipient phone number. |
1007
+ | `opts.fromNumber` | `string` | Sender phone number (must be a number you own).|
1008
+ | `opts.body` | `string` | SMS text body. |
1009
+ | `opts.media` | `string[]` | Array of media URLs for MMS. |
1010
+ | `opts.tags` | `string[]` | Optional tags for the message. |
1011
+ | `opts.region` | `string` | Optional region for message routing. |
1012
+
1013
+ **Throws:** `Error` if neither `body` nor `media` is provided.
1014
+
1015
+ **Returns:** `this` for chaining.
1016
+
1017
+ ```typescript
1018
+ // Send a text SMS
1019
+ const result = new SwaigFunctionResult('Confirmation sent.')
1020
+ .sendSms({
1021
+ toNumber: '+15551234567',
1022
+ fromNumber: '+15559876543',
1023
+ body: 'Your appointment is confirmed for tomorrow at 2pm.',
1024
+ });
1025
+
1026
+ // Send an MMS with an image
1027
+ const result2 = new SwaigFunctionResult('Receipt sent.')
1028
+ .sendSms({
1029
+ toNumber: '+15551234567',
1030
+ fromNumber: '+15559876543',
1031
+ body: 'Here is your receipt:',
1032
+ media: ['https://example.com/receipt.png'],
1033
+ });
1034
+ ```
1035
+
1036
+ ---
1037
+
1038
+ ### recordCall
1039
+
1040
+ Start recording the call with configurable options.
1041
+
1042
+ ```typescript
1043
+ recordCall(opts?: {
1044
+ controlId?: string;
1045
+ stereo?: boolean;
1046
+ format?: 'wav' | 'mp3';
1047
+ direction?: 'speak' | 'listen' | 'both';
1048
+ terminators?: string;
1049
+ beep?: boolean;
1050
+ inputSensitivity?: number;
1051
+ initialTimeout?: number;
1052
+ endSilenceTimeout?: number;
1053
+ maxLength?: number;
1054
+ statusUrl?: string;
1055
+ }): this
1056
+ ```
1057
+
1058
+ | Parameter | Type | Default | Description |
1059
+ |-------------------------|---------------------------------|----------|-------------------------------------------------|
1060
+ | `opts.controlId` | `string` | -- | Identifier for this recording (for stop/status).|
1061
+ | `opts.stereo` | `boolean` | `false` | Record in stereo (separate channels). |
1062
+ | `opts.format` | `'wav' \| 'mp3'` | `'wav'` | Recording file format. |
1063
+ | `opts.direction` | `'speak' \| 'listen' \| 'both'` | `'both'` | Which audio direction to record. |
1064
+ | `opts.terminators` | `string` | -- | DTMF keys that stop the recording. |
1065
+ | `opts.beep` | `boolean` | `false` | Play a beep when recording starts. |
1066
+ | `opts.inputSensitivity` | `number` | `44.0` | Sensitivity for voice activity detection. |
1067
+ | `opts.initialTimeout` | `number` | -- | Seconds to wait for initial speech. |
1068
+ | `opts.endSilenceTimeout`| `number` | -- | Seconds of silence before stopping. |
1069
+ | `opts.maxLength` | `number` | -- | Maximum recording length in seconds. |
1070
+ | `opts.statusUrl` | `string` | -- | Webhook URL for recording status callbacks. |
1071
+
1072
+ **Returns:** `this` for chaining.
1073
+
1074
+ ```typescript
1075
+ // Simple recording
1076
+ const result = new SwaigFunctionResult('Recording started.')
1077
+ .recordCall();
1078
+
1079
+ // Stereo MP3 recording with a control ID
1080
+ const result2 = new SwaigFunctionResult('Recording...')
1081
+ .recordCall({
1082
+ controlId: 'main-recording',
1083
+ stereo: true,
1084
+ format: 'mp3',
1085
+ maxLength: 3600,
1086
+ statusUrl: 'https://example.com/recording-status',
1087
+ });
1088
+ ```
1089
+
1090
+ ---
1091
+
1092
+ ### stopRecordCall
1093
+
1094
+ Stop an active call recording.
1095
+
1096
+ ```typescript
1097
+ stopRecordCall(controlId?: string): this
1098
+ ```
1099
+
1100
+ | Parameter | Type | Description |
1101
+ |-------------|----------|--------------------------------------------------|
1102
+ | `controlId` | `string` | Optional control ID of the recording to stop. |
1103
+
1104
+ **Returns:** `this` for chaining.
1105
+
1106
+ ```typescript
1107
+ const result = new SwaigFunctionResult('Recording stopped.')
1108
+ .stopRecordCall('main-recording');
1109
+ ```
1110
+
1111
+ ---
1112
+
1113
+ ### tap
1114
+
1115
+ Start a media tap to stream audio to an external URI (e.g., for real-time transcription or monitoring).
1116
+
1117
+ ```typescript
1118
+ tap(opts: {
1119
+ uri: string;
1120
+ controlId?: string;
1121
+ direction?: 'speak' | 'hear' | 'both';
1122
+ codec?: 'PCMU' | 'PCMA';
1123
+ rtpPtime?: number;
1124
+ statusUrl?: string;
1125
+ }): this
1126
+ ```
1127
+
1128
+ | Parameter | Type | Default | Description |
1129
+ |------------------|----------------------------------|----------|----------------------------------------------|
1130
+ | `opts.uri` | `string` | -- | Destination URI for the media stream. |
1131
+ | `opts.controlId` | `string` | -- | Identifier for this tap (for stop/status). |
1132
+ | `opts.direction` | `'speak' \| 'hear' \| 'both'` | `'both'` | Which audio direction to tap. |
1133
+ | `opts.codec` | `'PCMU' \| 'PCMA'` | `'PCMU'` | Audio codec for the stream. |
1134
+ | `opts.rtpPtime` | `number` | `20` | RTP packetization time in milliseconds. |
1135
+ | `opts.statusUrl` | `string` | -- | Webhook URL for tap status callbacks. |
1136
+
1137
+ **Returns:** `this` for chaining.
1138
+
1139
+ ```typescript
1140
+ const result = new SwaigFunctionResult('Tap started.')
1141
+ .tap({
1142
+ uri: 'wss://transcription.example.com/stream',
1143
+ controlId: 'realtime-tap',
1144
+ direction: 'both',
1145
+ });
1146
+ ```
1147
+
1148
+ ---
1149
+
1150
+ ### stopTap
1151
+
1152
+ Stop an active media tap.
1153
+
1154
+ ```typescript
1155
+ stopTap(controlId?: string): this
1156
+ ```
1157
+
1158
+ | Parameter | Type | Description |
1159
+ |-------------|----------|---------------------------------------------|
1160
+ | `controlId` | `string` | Optional control ID of the tap to stop. |
1161
+
1162
+ **Returns:** `this` for chaining.
1163
+
1164
+ ```typescript
1165
+ const result = new SwaigFunctionResult('Tap stopped.')
1166
+ .stopTap('realtime-tap');
1167
+ ```
1168
+
1169
+ ---
1170
+
1171
+ ## Rooms and Conferencing
1172
+
1173
+ ### joinRoom
1174
+
1175
+ Join a SignalWire room by name.
1176
+
1177
+ ```typescript
1178
+ joinRoom(name: string): this
1179
+ ```
1180
+
1181
+ | Parameter | Type | Description |
1182
+ |-----------|----------|-----------------------|
1183
+ | `name` | `string` | The room name. |
1184
+
1185
+ **Returns:** `this` for chaining.
1186
+
1187
+ ```typescript
1188
+ const result = new SwaigFunctionResult('Joining the meeting room.')
1189
+ .joinRoom('team-standup');
1190
+ ```
1191
+
1192
+ ---
1193
+
1194
+ ### sipRefer
1195
+
1196
+ Send a SIP REFER to transfer the call to another SIP endpoint.
1197
+
1198
+ ```typescript
1199
+ sipRefer(toUri: string): this
1200
+ ```
1201
+
1202
+ | Parameter | Type | Description |
1203
+ |-----------|----------|---------------------------------------|
1204
+ | `toUri` | `string` | The SIP URI to refer the call to. |
1205
+
1206
+ **Returns:** `this` for chaining.
1207
+
1208
+ ```typescript
1209
+ const result = new SwaigFunctionResult('Transferring via SIP.')
1210
+ .sipRefer('sip:agent@pbx.example.com');
1211
+ ```
1212
+
1213
+ ---
1214
+
1215
+ ### joinConference
1216
+
1217
+ Join a conference by name with optional configuration parameters.
1218
+
1219
+ ```typescript
1220
+ joinConference(name: string, opts?: {
1221
+ muted?: boolean;
1222
+ beep?: 'true' | 'false' | 'onEnter' | 'onExit';
1223
+ startOnEnter?: boolean;
1224
+ endOnExit?: boolean;
1225
+ waitUrl?: string;
1226
+ maxParticipants?: number;
1227
+ record?: 'do-not-record' | 'record-from-start';
1228
+ region?: string;
1229
+ trim?: 'trim-silence' | 'do-not-trim';
1230
+ coach?: string;
1231
+ statusCallbackEvent?: string;
1232
+ statusCallback?: string;
1233
+ statusCallbackMethod?: 'GET' | 'POST';
1234
+ recordingStatusCallback?: string;
1235
+ recordingStatusCallbackMethod?: 'GET' | 'POST';
1236
+ recordingStatusCallbackEvent?: string;
1237
+ result?: unknown;
1238
+ }): this
1239
+ ```
1240
+
1241
+ | Parameter | Type | Default | Description |
1242
+ |----------------------------------------|---------------------------------------------|---------------------|------------------------------------------------------|
1243
+ | `name` | `string` | -- | Conference name. |
1244
+ | `opts.muted` | `boolean` | -- | Join muted. |
1245
+ | `opts.beep` | `'true' \| 'false' \| 'onEnter' \| 'onExit'` | `'true'` | When to play the beep sound. |
1246
+ | `opts.startOnEnter` | `boolean` | `true` | Start the conference when this participant joins. |
1247
+ | `opts.endOnExit` | `boolean` | -- | End the conference when this participant leaves. |
1248
+ | `opts.waitUrl` | `string` | -- | URL to play while waiting for the conference to start.|
1249
+ | `opts.maxParticipants` | `number` | `250` | Maximum number of participants. |
1250
+ | `opts.record` | `'do-not-record' \| 'record-from-start'` | `'do-not-record'` | Recording mode. |
1251
+ | `opts.region` | `string` | -- | Region for the conference. |
1252
+ | `opts.trim` | `'trim-silence' \| 'do-not-trim'` | `'trim-silence'` | Silence trimming mode for recordings. |
1253
+ | `opts.coach` | `string` | -- | Call SID of participant to coach (whisper to). |
1254
+ | `opts.statusCallbackEvent` | `string` | -- | Events to trigger status callback. |
1255
+ | `opts.statusCallback` | `string` | -- | URL for status callback. |
1256
+ | `opts.statusCallbackMethod` | `'GET' \| 'POST'` | `'POST'` | HTTP method for status callback. |
1257
+ | `opts.recordingStatusCallback` | `string` | -- | URL for recording status callback. |
1258
+ | `opts.recordingStatusCallbackMethod` | `'GET' \| 'POST'` | `'POST'` | HTTP method for recording status callback. |
1259
+ | `opts.recordingStatusCallbackEvent` | `string` | `'completed'` | Events to trigger recording status callback. |
1260
+ | `opts.result` | `unknown` | -- | Custom result data. |
1261
+
1262
+ **Behavior:** When only the `name` is provided (or all options are at their defaults), the `join_conference` action uses the name as a simple string value. When non-default options are specified, it uses an object with all the configured parameters.
1263
+
1264
+ **Returns:** `this` for chaining.
1265
+
1266
+ ```typescript
1267
+ // Simple conference join
1268
+ const result = new SwaigFunctionResult('Joining conference.')
1269
+ .joinConference('support-queue');
1270
+
1271
+ // Conference with options
1272
+ const result2 = new SwaigFunctionResult('Joining as listener.')
1273
+ .joinConference('all-hands', {
1274
+ muted: true,
1275
+ record: 'record-from-start',
1276
+ maxParticipants: 50,
1277
+ beep: 'onEnter',
1278
+ });
1279
+ ```
1280
+
1281
+ ---
1282
+
1283
+ ## RPC
1284
+
1285
+ ### executeRpc
1286
+
1287
+ Execute a SignalWire RPC method via SWML. This is the low-level RPC method; convenience wrappers like `rpcDial`, `rpcAiMessage`, and `rpcAiUnhold` are built on top of it.
1288
+
1289
+ ```typescript
1290
+ executeRpc(opts: {
1291
+ method: string;
1292
+ params?: Record<string, unknown>;
1293
+ callId?: string;
1294
+ nodeId?: string;
1295
+ }): this
1296
+ ```
1297
+
1298
+ | Parameter | Type | Description |
1299
+ |---------------|----------------------------|-------------------------------------|
1300
+ | `opts.method` | `string` | The RPC method name. |
1301
+ | `opts.params` | `Record<string, unknown>` | Optional parameters for the method. |
1302
+ | `opts.callId` | `string` | Optional target call ID. |
1303
+ | `opts.nodeId` | `string` | Optional target node ID. |
1304
+
1305
+ **Returns:** `this` for chaining.
1306
+
1307
+ ```typescript
1308
+ const result = new SwaigFunctionResult('RPC executed.')
1309
+ .executeRpc({
1310
+ method: 'calling.play',
1311
+ callId: 'call-abc-123',
1312
+ params: {
1313
+ url: 'https://example.com/notification.mp3',
1314
+ },
1315
+ });
1316
+ ```
1317
+
1318
+ ---
1319
+
1320
+ ### rpcDial
1321
+
1322
+ Dial a number via RPC. This creates an outbound call using the SignalWire RPC mechanism.
1323
+
1324
+ ```typescript
1325
+ rpcDial(
1326
+ toNumber: string,
1327
+ fromNumber: string,
1328
+ destSwml: string,
1329
+ deviceType?: string
1330
+ ): this
1331
+ ```
1332
+
1333
+ | Parameter | Type | Default | Description |
1334
+ |--------------|----------|-----------|------------------------------------------|
1335
+ | `toNumber` | `string` | -- | Destination phone number. |
1336
+ | `fromNumber` | `string` | -- | Caller ID number. |
1337
+ | `destSwml` | `string` | -- | SWML destination for the dialed call. |
1338
+ | `deviceType` | `string` | `'phone'` | Device type for the outbound leg. |
1339
+
1340
+ **Returns:** `this` for chaining.
1341
+
1342
+ ```typescript
1343
+ const result = new SwaigFunctionResult('Dialing out.')
1344
+ .rpcDial('+15551234567', '+15559876543', 'https://example.com/swml');
1345
+ ```
1346
+
1347
+ ---
1348
+
1349
+ ### rpcAiMessage
1350
+
1351
+ Send an AI message to another call via RPC. This injects a message into the target call's AI conversation.
1352
+
1353
+ ```typescript
1354
+ rpcAiMessage(callId: string, messageText: string, role?: string): this
1355
+ ```
1356
+
1357
+ | Parameter | Type | Default | Description |
1358
+ |---------------|----------|------------|--------------------------------------|
1359
+ | `callId` | `string` | -- | The target call ID. |
1360
+ | `messageText` | `string` | -- | The message text to inject. |
1361
+ | `role` | `string` | `'system'` | The message role. |
1362
+
1363
+ **Returns:** `this` for chaining.
1364
+
1365
+ ```typescript
1366
+ const result = new SwaigFunctionResult('Message sent to other call.')
1367
+ .rpcAiMessage('call-abc-123', 'The customer has been verified.');
1368
+ ```
1369
+
1370
+ ---
1371
+
1372
+ ### rpcAiUnhold
1373
+
1374
+ Unhold a call that was previously placed on hold, via RPC.
1375
+
1376
+ ```typescript
1377
+ rpcAiUnhold(callId: string): this
1378
+ ```
1379
+
1380
+ | Parameter | Type | Description |
1381
+ |-----------|----------|--------------------------------|
1382
+ | `callId` | `string` | The target call ID to unhold. |
1383
+
1384
+ **Returns:** `this` for chaining.
1385
+
1386
+ ```typescript
1387
+ const result = new SwaigFunctionResult('Resuming the held call.')
1388
+ .rpcAiUnhold('call-abc-123');
1389
+ ```
1390
+
1391
+ ---
1392
+
1393
+ ## Payments
1394
+
1395
+ ### pay
1396
+
1397
+ Initiate a payment collection flow on the call. The payment is collected via DTMF or speech and processed by the specified payment connector.
1398
+
1399
+ ```typescript
1400
+ pay(opts: {
1401
+ paymentConnectorUrl: string;
1402
+ inputMethod?: string;
1403
+ statusUrl?: string;
1404
+ paymentMethod?: string;
1405
+ timeout?: number;
1406
+ maxAttempts?: number;
1407
+ securityCode?: boolean;
1408
+ postalCode?: boolean | string;
1409
+ minPostalCodeLength?: number;
1410
+ tokenType?: string;
1411
+ chargeAmount?: string;
1412
+ currency?: string;
1413
+ language?: string;
1414
+ voice?: string;
1415
+ description?: string;
1416
+ validCardTypes?: string;
1417
+ parameters?: PaymentParameter[];
1418
+ prompts?: PaymentPrompt[];
1419
+ aiResponse?: string;
1420
+ }): this
1421
+ ```
1422
+
1423
+ | Parameter | Type | Default | Description |
1424
+ |----------------------------|----------------------|---------------------------------------|-----------------------------------------------------------------|
1425
+ | `opts.paymentConnectorUrl` | `string` | -- | URL of the payment connector endpoint. |
1426
+ | `opts.inputMethod` | `string` | `'dtmf'` | Input method (`'dtmf'` or `'speech'`). |
1427
+ | `opts.statusUrl` | `string` | -- | Webhook URL for payment status callbacks. |
1428
+ | `opts.paymentMethod` | `string` | `'credit-card'` | Payment method type. |
1429
+ | `opts.timeout` | `number` | `5` | Timeout in seconds for each input step. |
1430
+ | `opts.maxAttempts` | `number` | `1` | Maximum number of retry attempts. |
1431
+ | `opts.securityCode` | `boolean` | `true` | Whether to collect the security code (CVV). |
1432
+ | `opts.postalCode` | `boolean \| string` | `true` | Whether to collect postal code, or a fixed postal code string. |
1433
+ | `opts.minPostalCodeLength` | `number` | `0` | Minimum length for postal code input. |
1434
+ | `opts.tokenType` | `string` | `'reusable'` | Token type for tokenized payments. |
1435
+ | `opts.chargeAmount` | `string` | -- | Amount to charge (e.g., `'29.99'`). |
1436
+ | `opts.currency` | `string` | `'usd'` | Currency code. |
1437
+ | `opts.language` | `string` | `'en-US'` | Language for payment prompts. |
1438
+ | `opts.voice` | `string` | `'woman'` | Voice for payment prompts. |
1439
+ | `opts.description` | `string` | -- | Description of the payment. |
1440
+ | `opts.validCardTypes` | `string` | `'visa mastercard amex'` | Space-separated list of accepted card types. |
1441
+ | `opts.parameters` | `PaymentParameter[]` | -- | Custom parameters for the payment connector. |
1442
+ | `opts.prompts` | `PaymentPrompt[]` | -- | Custom prompts for payment steps. |
1443
+ | `opts.aiResponse` | `string` | Template referencing `${pay_result}` | AI response set after payment completes. |
1444
+
1445
+ **Returns:** `this` for chaining.
1446
+
1447
+ ```typescript
1448
+ const result = new SwaigFunctionResult('Collecting payment.')
1449
+ .pay({
1450
+ paymentConnectorUrl: 'https://payments.example.com/connector',
1451
+ chargeAmount: '49.99',
1452
+ currency: 'usd',
1453
+ maxAttempts: 3,
1454
+ timeout: 10,
1455
+ });
1456
+ ```
1457
+
1458
+ ---
1459
+
1460
+ ### createPaymentPrompt (static)
1461
+
1462
+ Create a `PaymentPrompt` configuration object for use with the `pay()` method.
1463
+
1464
+ ```typescript
1465
+ static createPaymentPrompt(
1466
+ forSituation: string,
1467
+ actions: PaymentAction[],
1468
+ cardType?: string,
1469
+ errorType?: string
1470
+ ): PaymentPrompt
1471
+ ```
1472
+
1473
+ | Parameter | Type | Description |
1474
+ |----------------|-------------------|---------------------------------------------------|
1475
+ | `forSituation` | `string` | The situation this prompt applies to. |
1476
+ | `actions` | `PaymentAction[]` | Actions to perform for this prompt. |
1477
+ | `cardType` | `string` | Optional card type filter (e.g., `'visa'`). |
1478
+ | `errorType` | `string` | Optional error type this prompt handles. |
1479
+
1480
+ **Returns:** A `PaymentPrompt` object.
1481
+
1482
+ ```typescript
1483
+ const prompt = SwaigFunctionResult.createPaymentPrompt(
1484
+ 'payment-card-number',
1485
+ [SwaigFunctionResult.createPaymentAction('say', 'Please enter your card number.')],
1486
+ );
1487
+ ```
1488
+
1489
+ ---
1490
+
1491
+ ### createPaymentAction (static)
1492
+
1493
+ Create a `PaymentAction` for use within a `PaymentPrompt`.
1494
+
1495
+ ```typescript
1496
+ static createPaymentAction(actionType: string, phrase: string): PaymentAction
1497
+ ```
1498
+
1499
+ | Parameter | Type | Description |
1500
+ |--------------|----------|------------------------------------------|
1501
+ | `actionType` | `string` | The action type (e.g., `'say'`, `'play'`). |
1502
+ | `phrase` | `string` | The phrase or URL for this action. |
1503
+
1504
+ **Returns:** A `PaymentAction` object.
1505
+
1506
+ ```typescript
1507
+ const action = SwaigFunctionResult.createPaymentAction(
1508
+ 'say',
1509
+ 'Please enter your credit card number followed by the pound sign.',
1510
+ );
1511
+ ```
1512
+
1513
+ ---
1514
+
1515
+ ### createPaymentParameter (static)
1516
+
1517
+ Create a custom `PaymentParameter` for the payment connector.
1518
+
1519
+ ```typescript
1520
+ static createPaymentParameter(name: string, value: string): PaymentParameter
1521
+ ```
1522
+
1523
+ | Parameter | Type | Description |
1524
+ |-----------|----------|------------------------|
1525
+ | `name` | `string` | The parameter name. |
1526
+ | `value` | `string` | The parameter value. |
1527
+
1528
+ **Returns:** A `PaymentParameter` object.
1529
+
1530
+ ```typescript
1531
+ const param = SwaigFunctionResult.createPaymentParameter('merchant_id', 'MERCH-001');
1532
+ ```
1533
+
1534
+ ---
1535
+
1536
+ ### Full payment example
1537
+
1538
+ ```typescript
1539
+ const prompts = [
1540
+ SwaigFunctionResult.createPaymentPrompt(
1541
+ 'payment-card-number',
1542
+ [SwaigFunctionResult.createPaymentAction('say', 'Please enter your card number.')],
1543
+ ),
1544
+ SwaigFunctionResult.createPaymentPrompt(
1545
+ 'payment-expiration-date',
1546
+ [SwaigFunctionResult.createPaymentAction('say', 'Enter the expiration date.')],
1547
+ ),
1548
+ SwaigFunctionResult.createPaymentPrompt(
1549
+ 'payment-security-code',
1550
+ [SwaigFunctionResult.createPaymentAction('say', 'Enter the CVV on the back of your card.')],
1551
+ ),
1552
+ ];
1553
+
1554
+ const params = [
1555
+ SwaigFunctionResult.createPaymentParameter('merchant_id', 'MERCH-001'),
1556
+ ];
1557
+
1558
+ const result = new SwaigFunctionResult('Starting payment collection.')
1559
+ .pay({
1560
+ paymentConnectorUrl: 'https://payments.example.com/connector',
1561
+ chargeAmount: '99.95',
1562
+ currency: 'usd',
1563
+ maxAttempts: 3,
1564
+ timeout: 15,
1565
+ prompts,
1566
+ parameters: params,
1567
+ description: 'Annual subscription',
1568
+ });
1569
+ ```
1570
+
1571
+ ---
1572
+
1573
+ ## Fluent Chaining
1574
+
1575
+ Every mutating method on `SwaigFunctionResult` returns `this`, enabling fluent method chaining. You can compose complex multi-action responses in a single expression.
1576
+
1577
+ ```typescript
1578
+ agent.defineTool({
1579
+ name: 'complete_order',
1580
+ description: 'Complete an order and send confirmation',
1581
+ parameters: {
1582
+ order_id: { type: 'string', description: 'The order ID' },
1583
+ },
1584
+ handler: (args) => {
1585
+ const orderId = args.order_id as string;
1586
+
1587
+ return new SwaigFunctionResult(`Order ${orderId} completed.`)
1588
+ .setPostProcess(true)
1589
+ // Store data for other tools
1590
+ .updateGlobalData({ last_order: orderId, order_status: 'complete' })
1591
+ // Tag the call
1592
+ .setMetadata({ order_id: orderId })
1593
+ // Send SMS confirmation
1594
+ .sendSms({
1595
+ toNumber: '+15551234567',
1596
+ fromNumber: '+15559876543',
1597
+ body: `Your order ${orderId} has been confirmed!`,
1598
+ })
1599
+ // Speak a confirmation
1600
+ .say(`Your order ${orderId} is confirmed.`)
1601
+ // Emit a tracking event
1602
+ .swmlUserEvent({ type: 'order_complete', order_id: orderId })
1603
+ // Disable the order tool, enable the feedback tool
1604
+ .toggleFunctions([
1605
+ { function: 'complete_order', active: false },
1606
+ { function: 'submit_feedback', active: true },
1607
+ ]);
1608
+ },
1609
+ });
1610
+ ```
1611
+
1612
+ The chained calls produce an `action` array in the order they were called. SignalWire executes them sequentially:
1613
+
1614
+ ```json
1615
+ {
1616
+ "response": "Order ORD-789 completed.",
1617
+ "action": [
1618
+ { "set_global_data": { "last_order": "ORD-789", "order_status": "complete" } },
1619
+ { "set_meta_data": { "order_id": "ORD-789" } },
1620
+ { "SWML": { "version": "1.0.0", "sections": { "main": [{ "send_sms": { "to_number": "+15551234567", "from_number": "+15559876543", "body": "Your order ORD-789 has been confirmed!" } }] } } },
1621
+ { "say": "Your order ORD-789 is confirmed." },
1622
+ { "SWML": { "version": "1.0.0", "sections": { "main": [{ "user_event": { "event": { "type": "order_complete", "order_id": "ORD-789" } } }] } } },
1623
+ { "toggle_functions": [{ "function": "complete_order", "active": false }, { "function": "submit_feedback", "active": true }] }
1624
+ ],
1625
+ "post_process": true
1626
+ }
1627
+ ```