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.
- package/CLAUDE.md +112 -0
- package/README.md +417 -0
- package/dist/AgentBase.d.ts +481 -0
- package/dist/AgentBase.js +1155 -0
- package/dist/AgentBase.js.map +1 -0
- package/dist/AgentServer.d.ts +60 -0
- package/dist/AgentServer.js +128 -0
- package/dist/AgentServer.js.map +1 -0
- package/dist/AuthHandler.d.ts +56 -0
- package/dist/AuthHandler.js +119 -0
- package/dist/AuthHandler.js.map +1 -0
- package/dist/ConfigLoader.d.ts +68 -0
- package/dist/ConfigLoader.js +150 -0
- package/dist/ConfigLoader.js.map +1 -0
- package/dist/ContextBuilder.d.ts +431 -0
- package/dist/ContextBuilder.js +751 -0
- package/dist/ContextBuilder.js.map +1 -0
- package/dist/DataMap.d.ts +179 -0
- package/dist/DataMap.js +321 -0
- package/dist/DataMap.js.map +1 -0
- package/dist/Logger.d.ts +91 -0
- package/dist/Logger.js +191 -0
- package/dist/Logger.js.map +1 -0
- package/dist/PomBuilder.d.ts +144 -0
- package/dist/PomBuilder.js +249 -0
- package/dist/PomBuilder.js.map +1 -0
- package/dist/PromptManager.d.ts +85 -0
- package/dist/PromptManager.js +108 -0
- package/dist/PromptManager.js.map +1 -0
- package/dist/SchemaUtils.d.ts +42 -0
- package/dist/SchemaUtils.js +148 -0
- package/dist/SchemaUtils.js.map +1 -0
- package/dist/ServerlessAdapter.d.ts +100 -0
- package/dist/ServerlessAdapter.js +166 -0
- package/dist/ServerlessAdapter.js.map +1 -0
- package/dist/SessionManager.d.ts +86 -0
- package/dist/SessionManager.js +155 -0
- package/dist/SessionManager.js.map +1 -0
- package/dist/SslConfig.d.ts +77 -0
- package/dist/SslConfig.js +100 -0
- package/dist/SslConfig.js.map +1 -0
- package/dist/SwaigFunction.d.ts +88 -0
- package/dist/SwaigFunction.js +125 -0
- package/dist/SwaigFunction.js.map +1 -0
- package/dist/SwaigFunctionResult.d.ts +442 -0
- package/dist/SwaigFunctionResult.js +735 -0
- package/dist/SwaigFunctionResult.js.map +1 -0
- package/dist/SwmlBuilder.d.ts +37 -0
- package/dist/SwmlBuilder.js +55 -0
- package/dist/SwmlBuilder.js.map +1 -0
- package/dist/cli/agent-loader.d.ts +22 -0
- package/dist/cli/agent-loader.js +106 -0
- package/dist/cli/agent-loader.js.map +1 -0
- package/dist/cli/mock-data.d.ts +37 -0
- package/dist/cli/mock-data.js +79 -0
- package/dist/cli/mock-data.js.map +1 -0
- package/dist/cli/swaig-test.d.ts +32 -0
- package/dist/cli/swaig-test.js +405 -0
- package/dist/cli/swaig-test.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/prefabs/ConciergeAgent.d.ts +64 -0
- package/dist/prefabs/ConciergeAgent.js +188 -0
- package/dist/prefabs/ConciergeAgent.js.map +1 -0
- package/dist/prefabs/FAQBotAgent.d.ts +68 -0
- package/dist/prefabs/FAQBotAgent.js +206 -0
- package/dist/prefabs/FAQBotAgent.js.map +1 -0
- package/dist/prefabs/InfoGathererAgent.d.ts +73 -0
- package/dist/prefabs/InfoGathererAgent.js +202 -0
- package/dist/prefabs/InfoGathererAgent.js.map +1 -0
- package/dist/prefabs/ReceptionistAgent.d.ts +65 -0
- package/dist/prefabs/ReceptionistAgent.js +205 -0
- package/dist/prefabs/ReceptionistAgent.js.map +1 -0
- package/dist/prefabs/SurveyAgent.d.ts +84 -0
- package/dist/prefabs/SurveyAgent.js +324 -0
- package/dist/prefabs/SurveyAgent.js.map +1 -0
- package/dist/prefabs/index.d.ts +13 -0
- package/dist/prefabs/index.js +14 -0
- package/dist/prefabs/index.js.map +1 -0
- package/dist/skills/SkillBase.d.ts +134 -0
- package/dist/skills/SkillBase.js +105 -0
- package/dist/skills/SkillBase.js.map +1 -0
- package/dist/skills/SkillManager.d.ts +83 -0
- package/dist/skills/SkillManager.js +159 -0
- package/dist/skills/SkillManager.js.map +1 -0
- package/dist/skills/SkillRegistry.d.ts +105 -0
- package/dist/skills/SkillRegistry.js +195 -0
- package/dist/skills/SkillRegistry.js.map +1 -0
- package/dist/skills/builtin/api_ninjas_trivia.d.ts +35 -0
- package/dist/skills/builtin/api_ninjas_trivia.js +161 -0
- package/dist/skills/builtin/api_ninjas_trivia.js.map +1 -0
- package/dist/skills/builtin/claude_skills.d.ts +34 -0
- package/dist/skills/builtin/claude_skills.js +156 -0
- package/dist/skills/builtin/claude_skills.js.map +1 -0
- package/dist/skills/builtin/custom_skills.d.ts +59 -0
- package/dist/skills/builtin/custom_skills.js +231 -0
- package/dist/skills/builtin/custom_skills.js.map +1 -0
- package/dist/skills/builtin/datasphere.d.ts +34 -0
- package/dist/skills/builtin/datasphere.js +163 -0
- package/dist/skills/builtin/datasphere.js.map +1 -0
- package/dist/skills/builtin/datasphere_serverless.d.ts +54 -0
- package/dist/skills/builtin/datasphere_serverless.js +155 -0
- package/dist/skills/builtin/datasphere_serverless.js.map +1 -0
- package/dist/skills/builtin/datetime.d.ts +31 -0
- package/dist/skills/builtin/datetime.js +95 -0
- package/dist/skills/builtin/datetime.js.map +1 -0
- package/dist/skills/builtin/google_maps.d.ts +33 -0
- package/dist/skills/builtin/google_maps.js +233 -0
- package/dist/skills/builtin/google_maps.js.map +1 -0
- package/dist/skills/builtin/index.d.ts +28 -0
- package/dist/skills/builtin/index.js +75 -0
- package/dist/skills/builtin/index.js.map +1 -0
- package/dist/skills/builtin/info_gatherer.d.ts +52 -0
- package/dist/skills/builtin/info_gatherer.js +237 -0
- package/dist/skills/builtin/info_gatherer.js.map +1 -0
- package/dist/skills/builtin/joke.d.ts +32 -0
- package/dist/skills/builtin/joke.js +142 -0
- package/dist/skills/builtin/joke.js.map +1 -0
- package/dist/skills/builtin/math.d.ts +33 -0
- package/dist/skills/builtin/math.js +120 -0
- package/dist/skills/builtin/math.js.map +1 -0
- package/dist/skills/builtin/mcp_gateway.d.ts +35 -0
- package/dist/skills/builtin/mcp_gateway.js +85 -0
- package/dist/skills/builtin/mcp_gateway.js.map +1 -0
- package/dist/skills/builtin/native_vector_search.d.ts +44 -0
- package/dist/skills/builtin/native_vector_search.js +248 -0
- package/dist/skills/builtin/native_vector_search.js.map +1 -0
- package/dist/skills/builtin/play_background_file.d.ts +34 -0
- package/dist/skills/builtin/play_background_file.js +135 -0
- package/dist/skills/builtin/play_background_file.js.map +1 -0
- package/dist/skills/builtin/spider.d.ts +34 -0
- package/dist/skills/builtin/spider.js +164 -0
- package/dist/skills/builtin/spider.js.map +1 -0
- package/dist/skills/builtin/swml_transfer.d.ts +44 -0
- package/dist/skills/builtin/swml_transfer.js +204 -0
- package/dist/skills/builtin/swml_transfer.js.map +1 -0
- package/dist/skills/builtin/weather_api.d.ts +34 -0
- package/dist/skills/builtin/weather_api.js +136 -0
- package/dist/skills/builtin/weather_api.js.map +1 -0
- package/dist/skills/builtin/web_search.d.ts +34 -0
- package/dist/skills/builtin/web_search.js +141 -0
- package/dist/skills/builtin/web_search.js.map +1 -0
- package/dist/skills/builtin/wikipedia_search.d.ts +34 -0
- package/dist/skills/builtin/wikipedia_search.js +166 -0
- package/dist/skills/builtin/wikipedia_search.js.map +1 -0
- package/dist/skills/index.d.ts +11 -0
- package/dist/skills/index.js +10 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/types.d.ts +85 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/docs/agent-guide.md +869 -0
- package/docs/api-reference.md +2419 -0
- package/docs/architecture.md +843 -0
- package/docs/cli-guide.md +579 -0
- package/docs/configuration.md +422 -0
- package/docs/contexts-guide.md +787 -0
- package/docs/datamap-guide.md +1141 -0
- package/docs/prefabs-guide.md +830 -0
- package/docs/security.md +436 -0
- package/docs/serverless-guide.md +513 -0
- package/docs/skills-guide.md +845 -0
- package/docs/swaig-reference.md +1627 -0
- package/examples/call-flow.ts +60 -0
- package/examples/contexts-steps.ts +62 -0
- package/examples/datamap-tools.ts +52 -0
- package/examples/dynamic-config.ts +51 -0
- package/examples/multi-agent.ts +67 -0
- package/examples/pom-prompt.ts +68 -0
- package/examples/simple-agent.ts +33 -0
- package/package.json +35 -0
- package/src/AgentBase.ts +1279 -0
- package/src/AgentServer.ts +149 -0
- package/src/AuthHandler.ts +141 -0
- package/src/ConfigLoader.ts +165 -0
- package/src/ContextBuilder.ts +796 -0
- package/src/DataMap.ts +365 -0
- package/src/Logger.ts +197 -0
- package/src/PomBuilder.ts +298 -0
- package/src/PromptManager.ts +133 -0
- package/src/SchemaUtils.ts +170 -0
- package/src/ServerlessAdapter.ts +218 -0
- package/src/SessionManager.ts +161 -0
- package/src/SslConfig.ts +118 -0
- package/src/SwaigFunction.ts +168 -0
- package/src/SwaigFunctionResult.ts +864 -0
- package/src/SwmlBuilder.ts +62 -0
- package/src/cli/agent-loader.ts +122 -0
- package/src/cli/mock-data.ts +110 -0
- package/src/cli/swaig-test.ts +440 -0
- package/src/index.ts +99 -0
- package/src/prefabs/ConciergeAgent.ts +251 -0
- package/src/prefabs/FAQBotAgent.ts +263 -0
- package/src/prefabs/InfoGathererAgent.ts +276 -0
- package/src/prefabs/ReceptionistAgent.ts +277 -0
- package/src/prefabs/SurveyAgent.ts +413 -0
- package/src/prefabs/index.ts +23 -0
- package/src/skills/SkillBase.ts +184 -0
- package/src/skills/SkillManager.ts +177 -0
- package/src/skills/SkillRegistry.ts +231 -0
- package/src/skills/builtin/api_ninjas_trivia.ts +230 -0
- package/src/skills/builtin/claude_skills.ts +239 -0
- package/src/skills/builtin/custom_skills.ts +326 -0
- package/src/skills/builtin/datasphere.ts +225 -0
- package/src/skills/builtin/datasphere_serverless.ts +194 -0
- package/src/skills/builtin/datetime.ts +115 -0
- package/src/skills/builtin/google_maps.ts +347 -0
- package/src/skills/builtin/index.ts +79 -0
- package/src/skills/builtin/info_gatherer.ts +331 -0
- package/src/skills/builtin/joke.ts +180 -0
- package/src/skills/builtin/math.ts +150 -0
- package/src/skills/builtin/mcp_gateway.ts +99 -0
- package/src/skills/builtin/native_vector_search.ts +327 -0
- package/src/skills/builtin/play_background_file.ts +189 -0
- package/src/skills/builtin/spider.ts +232 -0
- package/src/skills/builtin/swml_transfer.ts +285 -0
- package/src/skills/builtin/weather_api.ts +193 -0
- package/src/skills/builtin/web_search.ts +212 -0
- package/src/skills/builtin/wikipedia_search.ts +248 -0
- package/src/skills/index.ts +12 -0
- package/src/types.ts +99 -0
- package/tests/AgentBase.test.ts +693 -0
- package/tests/AgentServer.test.ts +102 -0
- package/tests/AuthHandler.test.ts +121 -0
- package/tests/ConfigLoader.test.ts +121 -0
- package/tests/DataMap.test.ts +286 -0
- package/tests/Logger.test.ts +218 -0
- package/tests/PomBuilder.test.ts +164 -0
- package/tests/ProxyDetection.test.ts +185 -0
- package/tests/SchemaUtils.test.ts +106 -0
- package/tests/ServerlessAdapter.test.ts +200 -0
- package/tests/SessionManager.test.ts +139 -0
- package/tests/SslConfig.test.ts +97 -0
- package/tests/SwaigFunctionResult.test.ts +298 -0
- package/tests/cli/mock-data.test.ts +94 -0
- package/tests/cli/swaig-test.test.ts +96 -0
- package/tests/prefabs/prefabs.test.ts +854 -0
- package/tests/setup.ts +6 -0
- package/tests/skills/SkillBase.test.ts +118 -0
- package/tests/skills/SkillManager.test.ts +164 -0
- package/tests/skills/SkillRegistry.test.ts +124 -0
- package/tests/skills/builtin.test.ts +924 -0
- package/tsconfig.json +18 -0
- package/vitest.config.ts +9 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SwmlBuilder - Builds SWML (SignalWire Markup Language) documents.
|
|
3
|
+
*
|
|
4
|
+
* Produces `{ version: "1.0.0", sections: { main: [...verbs] } }`.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** Builds SWML documents composed of verb instructions organized into named sections. */
|
|
8
|
+
export class SwmlBuilder {
|
|
9
|
+
private document: { version: string; sections: Record<string, unknown[]> };
|
|
10
|
+
|
|
11
|
+
/** Creates a new SwmlBuilder with an empty SWML document. */
|
|
12
|
+
constructor() {
|
|
13
|
+
this.document = this.createEmpty();
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
private createEmpty() {
|
|
17
|
+
return { version: '1.0.0', sections: { main: [] as unknown[] } };
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Resets the document to an empty SWML structure. */
|
|
21
|
+
reset(): void {
|
|
22
|
+
this.document = this.createEmpty();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Appends a verb to the main section.
|
|
27
|
+
* @param verbName - The SWML verb name (e.g., "answer", "ai").
|
|
28
|
+
* @param config - The verb's configuration payload.
|
|
29
|
+
*/
|
|
30
|
+
addVerb(verbName: string, config: unknown): void {
|
|
31
|
+
this.document.sections['main'].push({ [verbName]: config });
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Appends a verb to a named section, creating the section if it does not exist.
|
|
36
|
+
* @param sectionName - The target section name.
|
|
37
|
+
* @param verbName - The SWML verb name.
|
|
38
|
+
* @param config - The verb's configuration payload.
|
|
39
|
+
*/
|
|
40
|
+
addVerbToSection(sectionName: string, verbName: string, config: unknown): void {
|
|
41
|
+
if (!this.document.sections[sectionName]) {
|
|
42
|
+
this.document.sections[sectionName] = [];
|
|
43
|
+
}
|
|
44
|
+
this.document.sections[sectionName].push({ [verbName]: config });
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Returns the raw SWML document object.
|
|
49
|
+
* @returns The document with version and sections.
|
|
50
|
+
*/
|
|
51
|
+
getDocument(): Record<string, unknown> {
|
|
52
|
+
return this.document;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Serializes the SWML document to a JSON string.
|
|
57
|
+
* @returns The JSON-encoded SWML document.
|
|
58
|
+
*/
|
|
59
|
+
renderDocument(): string {
|
|
60
|
+
return JSON.stringify(this.document);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent discovery via dynamic import for swaig-test CLI.
|
|
3
|
+
*
|
|
4
|
+
* Tries multiple strategies to find an AgentBase instance:
|
|
5
|
+
* 1. Named export `agent`
|
|
6
|
+
* 2. Default export
|
|
7
|
+
* 3. Any exported AgentBase instance (duck-typed)
|
|
8
|
+
* 4. Any exported AgentBase subclass (instantiated)
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { resolve } from 'node:path';
|
|
12
|
+
import { pathToFileURL } from 'node:url';
|
|
13
|
+
|
|
14
|
+
function isAgentInstance(obj: unknown): boolean {
|
|
15
|
+
if (!obj || typeof obj !== 'object') return false;
|
|
16
|
+
const a = obj as Record<string, unknown>;
|
|
17
|
+
return (
|
|
18
|
+
typeof a['renderSwml'] === 'function' &&
|
|
19
|
+
typeof a['defineTool'] === 'function' &&
|
|
20
|
+
typeof a['getPrompt'] === 'function'
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function isAgentClass(obj: unknown): boolean {
|
|
25
|
+
if (typeof obj !== 'function') return false;
|
|
26
|
+
const proto = (obj as any).prototype;
|
|
27
|
+
if (!proto) return false;
|
|
28
|
+
return (
|
|
29
|
+
typeof proto['renderSwml'] === 'function' &&
|
|
30
|
+
typeof proto['defineTool'] === 'function' &&
|
|
31
|
+
typeof proto['getPrompt'] === 'function'
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async function importModule(agentPath: string): Promise<Record<string, unknown>> {
|
|
36
|
+
const absPath = resolve(agentPath);
|
|
37
|
+
const fileUrl = pathToFileURL(absPath).href;
|
|
38
|
+
|
|
39
|
+
try {
|
|
40
|
+
return await import(fileUrl);
|
|
41
|
+
} catch (err) {
|
|
42
|
+
throw new Error(`Failed to import agent file: ${absPath}\n${err}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Dynamically import an agent file and resolve an AgentBase instance using duck-typing heuristics.
|
|
48
|
+
* @param agentPath - Path to the agent module file.
|
|
49
|
+
* @param agentClass - Optional name of a specific exported class or instance to use.
|
|
50
|
+
* @returns The resolved AgentBase instance.
|
|
51
|
+
*/
|
|
52
|
+
export async function loadAgent(agentPath: string, agentClass?: string): Promise<unknown> {
|
|
53
|
+
const mod = await importModule(agentPath);
|
|
54
|
+
|
|
55
|
+
// If a specific class name is requested
|
|
56
|
+
if (agentClass) {
|
|
57
|
+
const target = mod[agentClass];
|
|
58
|
+
if (!target) {
|
|
59
|
+
throw new Error(`Export '${agentClass}' not found in ${agentPath}`);
|
|
60
|
+
}
|
|
61
|
+
if (isAgentInstance(target)) return target;
|
|
62
|
+
if (isAgentClass(target)) {
|
|
63
|
+
const Cls = target as new (opts: { name: string }) => unknown;
|
|
64
|
+
return new Cls({ name: agentClass.toLowerCase() });
|
|
65
|
+
}
|
|
66
|
+
throw new Error(`Export '${agentClass}' is not an AgentBase instance or class`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// 1. Named export `agent`
|
|
70
|
+
if (mod['agent'] && isAgentInstance(mod['agent'])) {
|
|
71
|
+
return mod['agent'];
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// 2. Default export (instance)
|
|
75
|
+
if (mod['default'] && isAgentInstance(mod['default'])) {
|
|
76
|
+
return mod['default'];
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// 3. Any exported AgentBase instance
|
|
80
|
+
for (const key of Object.keys(mod)) {
|
|
81
|
+
if (isAgentInstance(mod[key])) {
|
|
82
|
+
return mod[key];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// 4. Default export (class) - instantiate
|
|
87
|
+
if (mod['default'] && isAgentClass(mod['default'])) {
|
|
88
|
+
const Cls = mod['default'] as new (opts: { name: string }) => unknown;
|
|
89
|
+
return new Cls({ name: 'cli-agent' });
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// 5. Any exported AgentBase subclass
|
|
93
|
+
for (const key of Object.keys(mod)) {
|
|
94
|
+
if (isAgentClass(mod[key])) {
|
|
95
|
+
const Cls = mod[key] as new (opts: { name: string }) => unknown;
|
|
96
|
+
return new Cls({ name: 'cli-agent' });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
throw new Error(
|
|
101
|
+
`Could not find an AgentBase instance or subclass in ${resolve(agentPath)}.\n` +
|
|
102
|
+
'Export your agent as `export const agent = new AgentBase(...)` or as default export.',
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* List all exported agent instances and classes in a module.
|
|
108
|
+
* @param agentPath - Path to the agent module file.
|
|
109
|
+
* @returns Array of export names that are AgentBase instances or subclasses.
|
|
110
|
+
*/
|
|
111
|
+
export async function listAgents(agentPath: string): Promise<string[]> {
|
|
112
|
+
const mod = await importModule(agentPath);
|
|
113
|
+
const agents: string[] = [];
|
|
114
|
+
|
|
115
|
+
for (const key of Object.keys(mod)) {
|
|
116
|
+
if (isAgentInstance(mod[key]) || isAgentClass(mod[key])) {
|
|
117
|
+
agents.push(key);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return agents;
|
|
122
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mock call data generation for swaig-test CLI.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { randomBytes } from 'node:crypto';
|
|
6
|
+
|
|
7
|
+
/** Options for generating mock call data in CLI testing. */
|
|
8
|
+
export interface MockCallOptions {
|
|
9
|
+
/** Call transport type. */
|
|
10
|
+
callType?: 'sip' | 'webrtc';
|
|
11
|
+
/** Direction of the call. */
|
|
12
|
+
callDirection?: 'inbound' | 'outbound';
|
|
13
|
+
/** Current call state (e.g. "active", "ringing", "hold"). */
|
|
14
|
+
callState?: string;
|
|
15
|
+
/** Override the auto-generated call ID. */
|
|
16
|
+
callId?: string;
|
|
17
|
+
/** Caller's phone number. */
|
|
18
|
+
fromNumber?: string;
|
|
19
|
+
/** Destination extension or agent name. */
|
|
20
|
+
toExtension?: string;
|
|
21
|
+
/** Additional key-value overrides merged into the post data. */
|
|
22
|
+
overrides?: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function randomId(): string {
|
|
26
|
+
return randomBytes(16).toString('hex');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function randomUuid(): string {
|
|
30
|
+
const hex = randomBytes(16).toString('hex');
|
|
31
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Generate a full mock POST body simulating an inbound SignalWire call request.
|
|
36
|
+
* @param opts - Optional overrides for call metadata fields.
|
|
37
|
+
* @returns A record representing the simulated call POST data.
|
|
38
|
+
*/
|
|
39
|
+
export function generateFakePostData(opts?: MockCallOptions): Record<string, unknown> {
|
|
40
|
+
const callType = opts?.callType ?? 'webrtc';
|
|
41
|
+
const callDirection = opts?.callDirection ?? 'inbound';
|
|
42
|
+
const callState = opts?.callState ?? 'active';
|
|
43
|
+
const fromNumber = opts?.fromNumber ?? '+15551234567';
|
|
44
|
+
const toExtension = opts?.toExtension ?? 'test-agent';
|
|
45
|
+
const callId = opts?.callId ?? randomUuid();
|
|
46
|
+
const nodeId = randomUuid();
|
|
47
|
+
const projectId = randomUuid();
|
|
48
|
+
const spaceId = randomUuid();
|
|
49
|
+
|
|
50
|
+
const data: Record<string, unknown> = {
|
|
51
|
+
call_id: callId,
|
|
52
|
+
call_type: callType,
|
|
53
|
+
call_direction: callDirection,
|
|
54
|
+
call_state: callState,
|
|
55
|
+
node_id: nodeId,
|
|
56
|
+
project_id: projectId,
|
|
57
|
+
space_id: spaceId,
|
|
58
|
+
caller_id_name: callType === 'sip' ? fromNumber : 'WebRTC User',
|
|
59
|
+
caller_id_number: fromNumber,
|
|
60
|
+
call_start_time: new Date().toISOString(),
|
|
61
|
+
channel_type: callType === 'sip' ? 'phone' : 'web',
|
|
62
|
+
from: fromNumber,
|
|
63
|
+
to: toExtension,
|
|
64
|
+
sip_headers: callType === 'sip' ? {
|
|
65
|
+
'X-SignalWire-Agent': 'swaig-test-cli',
|
|
66
|
+
} : undefined,
|
|
67
|
+
vars: {
|
|
68
|
+
call_type: callType,
|
|
69
|
+
direction: callDirection,
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
// Apply overrides
|
|
74
|
+
if (opts?.overrides) {
|
|
75
|
+
Object.assign(data, opts.overrides);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return data;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Generate a minimal mock POST body for executing a single SWAIG function.
|
|
83
|
+
* @param fnName - Name of the SWAIG function to invoke.
|
|
84
|
+
* @param args - Arguments to pass to the function.
|
|
85
|
+
* @param opts - Optional call ID and field overrides.
|
|
86
|
+
* @returns A record representing the minimal POST data for function execution.
|
|
87
|
+
*/
|
|
88
|
+
export function generateMinimalPostData(
|
|
89
|
+
fnName: string,
|
|
90
|
+
args?: Record<string, unknown>,
|
|
91
|
+
opts?: { callId?: string; overrides?: Record<string, unknown> },
|
|
92
|
+
): Record<string, unknown> {
|
|
93
|
+
const data: Record<string, unknown> = {
|
|
94
|
+
function: fnName,
|
|
95
|
+
argument: args ?? {},
|
|
96
|
+
call_id: opts?.callId ?? randomUuid(),
|
|
97
|
+
call_type: 'webrtc',
|
|
98
|
+
call_direction: 'inbound',
|
|
99
|
+
caller_id_name: 'CLI Test',
|
|
100
|
+
caller_id_number: '+15551234567',
|
|
101
|
+
from: '+15551234567',
|
|
102
|
+
to: 'test-agent',
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
if (opts?.overrides) {
|
|
106
|
+
Object.assign(data, opts.overrides);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return data;
|
|
110
|
+
}
|