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,248 @@
1
+ /**
2
+ * Native Vector Search Skill - In-memory document search using TF-IDF-like scoring.
3
+ *
4
+ * Tier 3 built-in skill: no external dependencies or API keys required.
5
+ * Implements a simple text-matching algorithm based on word overlap scoring
6
+ * (TF-IDF inspired) to search through a set of in-memory documents.
7
+ * Suitable for small to medium document collections.
8
+ */
9
+ import { SkillBase } from '../SkillBase.js';
10
+ import { SwaigFunctionResult } from '../../SwaigFunctionResult.js';
11
+ /**
12
+ * Tokenize text into lowercase words, removing punctuation and common stop words.
13
+ * @param text - Raw text to tokenize.
14
+ * @returns Array of meaningful word tokens.
15
+ */
16
+ function tokenize(text) {
17
+ const stopWords = new Set([
18
+ 'a', 'an', 'the', 'is', 'are', 'was', 'were', 'be', 'been', 'being',
19
+ 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would', 'could',
20
+ 'should', 'may', 'might', 'shall', 'can', 'to', 'of', 'in', 'for',
21
+ 'on', 'with', 'at', 'by', 'from', 'as', 'into', 'through', 'during',
22
+ 'before', 'after', 'above', 'below', 'between', 'and', 'but', 'or',
23
+ 'nor', 'not', 'so', 'yet', 'both', 'either', 'neither', 'each',
24
+ 'every', 'all', 'any', 'few', 'more', 'most', 'other', 'some',
25
+ 'such', 'no', 'only', 'own', 'same', 'than', 'too', 'very',
26
+ 'just', 'because', 'if', 'when', 'where', 'how', 'what', 'which',
27
+ 'who', 'whom', 'this', 'that', 'these', 'those', 'i', 'me', 'my',
28
+ 'we', 'our', 'you', 'your', 'he', 'him', 'his', 'she', 'her',
29
+ 'it', 'its', 'they', 'them', 'their', 'about', 'up', 'out',
30
+ ]);
31
+ return text
32
+ .toLowerCase()
33
+ .replace(/[^a-z0-9\s]/g, ' ')
34
+ .split(/\s+/)
35
+ .filter((word) => word.length > 1 && !stopWords.has(word));
36
+ }
37
+ /**
38
+ * Compute normalized term frequency for a list of tokens.
39
+ * @param tokens - Array of tokenized words.
40
+ * @returns Map from token to its normalized frequency.
41
+ */
42
+ function termFrequency(tokens) {
43
+ const tf = new Map();
44
+ for (const token of tokens) {
45
+ tf.set(token, (tf.get(token) ?? 0) + 1);
46
+ }
47
+ // Normalize by document length
48
+ const len = tokens.length || 1;
49
+ for (const [term, count] of tf) {
50
+ tf.set(term, count / len);
51
+ }
52
+ return tf;
53
+ }
54
+ /**
55
+ * Compute inverse document frequency weights for a tokenized corpus.
56
+ * @param corpus - Array of token arrays, one per document.
57
+ * @returns Map from token to its IDF weight.
58
+ */
59
+ function inverseDocumentFrequency(corpus) {
60
+ const idf = new Map();
61
+ const numDocs = corpus.length || 1;
62
+ // Count how many documents contain each term
63
+ const docFreq = new Map();
64
+ for (const tokens of corpus) {
65
+ const uniqueTokens = new Set(tokens);
66
+ for (const token of uniqueTokens) {
67
+ docFreq.set(token, (docFreq.get(token) ?? 0) + 1);
68
+ }
69
+ }
70
+ for (const [term, freq] of docFreq) {
71
+ idf.set(term, Math.log((numDocs + 1) / (freq + 1)) + 1);
72
+ }
73
+ return idf;
74
+ }
75
+ /**
76
+ * Score a query against a document using TF-IDF cosine-like similarity.
77
+ * @param queryTokens - Tokenized query words.
78
+ * @param docTf - Pre-computed term frequency map for the document.
79
+ * @param idf - Pre-computed inverse document frequency map.
80
+ * @returns Similarity score (higher is more relevant).
81
+ */
82
+ function scoreTfIdf(queryTokens, docTf, idf) {
83
+ if (queryTokens.length === 0)
84
+ return 0;
85
+ let score = 0;
86
+ const queryTf = termFrequency(queryTokens);
87
+ for (const [term, qWeight] of queryTf) {
88
+ const docWeight = docTf.get(term) ?? 0;
89
+ const idfWeight = idf.get(term) ?? 1;
90
+ score += qWeight * docWeight * idfWeight * idfWeight;
91
+ }
92
+ return score;
93
+ }
94
+ /**
95
+ * In-memory document search using TF-IDF-like word overlap scoring.
96
+ *
97
+ * Tier 3 built-in skill with no external dependencies or API keys required.
98
+ * Documents are provided via the `documents` config array and indexed at
99
+ * construction time. Suitable for small to medium document collections.
100
+ */
101
+ export class NativeVectorSearchSkill extends SkillBase {
102
+ _documents = [];
103
+ _tokenizedDocs = [];
104
+ _docTfs = [];
105
+ _idf = new Map();
106
+ _indexed = false;
107
+ /**
108
+ * @param config - Optional configuration; supports `documents` array of {id, text, metadata?}.
109
+ */
110
+ constructor(config) {
111
+ super('native_vector_search', config);
112
+ this._loadDocuments();
113
+ }
114
+ /** @returns Manifest with config schema for the documents array. */
115
+ getManifest() {
116
+ return {
117
+ name: 'native_vector_search',
118
+ description: 'In-memory document search using TF-IDF-like word overlap scoring. No external dependencies or API keys required.',
119
+ version: '1.0.0',
120
+ author: 'SignalWire',
121
+ tags: ['search', 'vector', 'tfidf', 'documents', 'local', 'knowledge'],
122
+ configSchema: {
123
+ documents: {
124
+ type: 'array',
125
+ description: 'Array of documents to index: [{ id: string, text: string, metadata?: object }].',
126
+ },
127
+ },
128
+ };
129
+ }
130
+ /**
131
+ * Load and index documents from configuration.
132
+ */
133
+ _loadDocuments() {
134
+ const docs = this.getConfig('documents', []);
135
+ if (!Array.isArray(docs) || docs.length === 0) {
136
+ this._documents = [];
137
+ this._indexed = false;
138
+ return;
139
+ }
140
+ this._documents = docs.filter((d) => d && typeof d.id === 'string' && typeof d.text === 'string' && d.text.trim().length > 0);
141
+ // Tokenize all documents
142
+ this._tokenizedDocs = this._documents.map((doc) => tokenize(doc.text));
143
+ // Compute TF for each document
144
+ this._docTfs = this._tokenizedDocs.map((tokens) => termFrequency(tokens));
145
+ // Compute IDF across the corpus
146
+ this._idf = inverseDocumentFrequency(this._tokenizedDocs);
147
+ this._indexed = true;
148
+ }
149
+ /** @returns A single `search_documents` tool that searches indexed documents by text similarity. */
150
+ getTools() {
151
+ return [
152
+ {
153
+ name: 'search_documents',
154
+ description: 'Search through the indexed documents for the most relevant results matching your query. Uses text similarity scoring to rank results.',
155
+ parameters: {
156
+ query: {
157
+ type: 'string',
158
+ description: 'The search query or question.',
159
+ },
160
+ top_k: {
161
+ type: 'number',
162
+ description: 'Number of top results to return (1-20). Defaults to 3.',
163
+ },
164
+ },
165
+ required: ['query'],
166
+ handler: (args) => {
167
+ const query = args.query;
168
+ const topK = args.top_k;
169
+ if (!query || typeof query !== 'string' || query.trim().length === 0) {
170
+ return new SwaigFunctionResult('Please provide a search query.');
171
+ }
172
+ if (!this._indexed || this._documents.length === 0) {
173
+ return new SwaigFunctionResult('No documents are loaded for searching. Configure the skill with a "documents" array.');
174
+ }
175
+ const k = Math.max(1, Math.min(20, topK ?? 3));
176
+ const queryTokens = tokenize(query);
177
+ if (queryTokens.length === 0) {
178
+ return new SwaigFunctionResult('The search query did not contain any meaningful search terms. Please try a more specific query.');
179
+ }
180
+ // Score all documents
181
+ const scored = this._documents.map((doc, i) => ({
182
+ document: doc,
183
+ score: scoreTfIdf(queryTokens, this._docTfs[i], this._idf),
184
+ }));
185
+ // Sort by score descending
186
+ scored.sort((a, b) => b.score - a.score);
187
+ // Filter out zero-score results and take top k
188
+ const results = scored.filter((s) => s.score > 0).slice(0, k);
189
+ if (results.length === 0) {
190
+ return new SwaigFunctionResult(`No relevant documents found for "${query}". Try different search terms.`);
191
+ }
192
+ const parts = [
193
+ `Found ${results.length} relevant document(s) for "${query}":`,
194
+ '',
195
+ ];
196
+ for (let i = 0; i < results.length; i++) {
197
+ const { document, score } = results[i];
198
+ const relevance = score.toFixed(4);
199
+ parts.push(`--- Result ${i + 1} (ID: ${document.id}, relevance: ${relevance}) ---`);
200
+ // Truncate long texts for readability
201
+ const maxLen = 500;
202
+ const text = document.text.trim();
203
+ if (text.length > maxLen) {
204
+ parts.push(text.slice(0, maxLen) + '...');
205
+ }
206
+ else {
207
+ parts.push(text);
208
+ }
209
+ if (document.metadata && Object.keys(document.metadata).length > 0) {
210
+ const metaStr = Object.entries(document.metadata)
211
+ .map(([k, v]) => `${k}: ${String(v)}`)
212
+ .join(', ');
213
+ parts.push(`[Metadata: ${metaStr}]`);
214
+ }
215
+ parts.push('');
216
+ }
217
+ return new SwaigFunctionResult(parts.join('\n').trim());
218
+ },
219
+ },
220
+ ];
221
+ }
222
+ /** @returns Prompt section describing the local document search capabilities. */
223
+ getPromptSections() {
224
+ const docCount = this._documents.length;
225
+ return [
226
+ {
227
+ title: 'Document Search',
228
+ body: `You have access to a local collection of ${docCount} document(s) that can be searched for relevant information.`,
229
+ bullets: [
230
+ 'Use the search_documents tool when the user asks about topics that may be covered in the indexed documents.',
231
+ 'You can specify how many results to return with the top_k parameter.',
232
+ 'Results are ranked by text relevance using word overlap scoring.',
233
+ 'Synthesize information from multiple results when appropriate.',
234
+ 'If no results are found, the query terms may not match the document content. Try different wording.',
235
+ ],
236
+ },
237
+ ];
238
+ }
239
+ }
240
+ /**
241
+ * Factory function for creating NativeVectorSearchSkill instances.
242
+ * @param config - Optional skill configuration.
243
+ * @returns A new NativeVectorSearchSkill instance.
244
+ */
245
+ export function createSkill(config) {
246
+ return new NativeVectorSearchSkill(config);
247
+ }
248
+ //# sourceMappingURL=native_vector_search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native_vector_search.js","sourceRoot":"","sources":["../../../src/skills/builtin/native_vector_search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Play Background File Skill - Controls background audio playback during calls.
3
+ *
4
+ * Tier 2 built-in skill: no external dependencies required.
5
+ * Provides tools to play and stop background audio files (e.g., hold music,
6
+ * ambient sounds) during a call using SWML playback actions.
7
+ */
8
+ import { SkillBase } from '../SkillBase.js';
9
+ import type { SkillManifest, SkillToolDefinition, SkillPromptSection, SkillConfig } from '../SkillBase.js';
10
+ /**
11
+ * Controls background audio playback during calls via SWML actions.
12
+ *
13
+ * Tier 2 built-in skill with no external dependencies. Provides tools to play
14
+ * and stop background audio files (e.g., hold music, ambient sounds). Supports
15
+ * `default_file_url` and `allowed_domains` config options.
16
+ */
17
+ export declare class PlayBackgroundFileSkill extends SkillBase {
18
+ /**
19
+ * @param config - Optional configuration; supports `default_file_url` and `allowed_domains`.
20
+ */
21
+ constructor(config?: SkillConfig);
22
+ /** @returns Manifest with config schema for default_file_url and allowed_domains. */
23
+ getManifest(): SkillManifest;
24
+ /** @returns Two tools: `play_background` to start audio and `stop_background` to stop it. */
25
+ getTools(): SkillToolDefinition[];
26
+ /** @returns Prompt section describing background audio playback capabilities. */
27
+ getPromptSections(): SkillPromptSection[];
28
+ }
29
+ /**
30
+ * Factory function for creating PlayBackgroundFileSkill instances.
31
+ * @param config - Optional skill configuration.
32
+ * @returns A new PlayBackgroundFileSkill instance.
33
+ */
34
+ export declare function createSkill(config?: SkillConfig): PlayBackgroundFileSkill;
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Play Background File Skill - Controls background audio playback during calls.
3
+ *
4
+ * Tier 2 built-in skill: no external dependencies required.
5
+ * Provides tools to play and stop background audio files (e.g., hold music,
6
+ * ambient sounds) during a call using SWML playback actions.
7
+ */
8
+ import { SkillBase } from '../SkillBase.js';
9
+ import { SwaigFunctionResult } from '../../SwaigFunctionResult.js';
10
+ /**
11
+ * Controls background audio playback during calls via SWML actions.
12
+ *
13
+ * Tier 2 built-in skill with no external dependencies. Provides tools to play
14
+ * and stop background audio files (e.g., hold music, ambient sounds). Supports
15
+ * `default_file_url` and `allowed_domains` config options.
16
+ */
17
+ export class PlayBackgroundFileSkill extends SkillBase {
18
+ /**
19
+ * @param config - Optional configuration; supports `default_file_url` and `allowed_domains`.
20
+ */
21
+ constructor(config) {
22
+ super('play_background_file', config);
23
+ }
24
+ /** @returns Manifest with config schema for default_file_url and allowed_domains. */
25
+ getManifest() {
26
+ return {
27
+ name: 'play_background_file',
28
+ description: 'Controls background audio playback during calls. Play hold music, ambient sounds, or any audio file in the background.',
29
+ version: '1.0.0',
30
+ author: 'SignalWire',
31
+ tags: ['audio', 'playback', 'background', 'music', 'call-control'],
32
+ configSchema: {
33
+ default_file_url: {
34
+ type: 'string',
35
+ description: 'Default audio file URL to use when no URL is specified.',
36
+ },
37
+ allowed_domains: {
38
+ type: 'array',
39
+ description: 'List of allowed domains for audio file URLs. If set, only URLs from these domains are accepted.',
40
+ },
41
+ },
42
+ };
43
+ }
44
+ /** @returns Two tools: `play_background` to start audio and `stop_background` to stop it. */
45
+ getTools() {
46
+ const defaultFileUrl = this.getConfig('default_file_url', undefined);
47
+ const allowedDomains = this.getConfig('allowed_domains', undefined);
48
+ return [
49
+ {
50
+ name: 'play_background',
51
+ description: 'Play an audio file in the background during the call. The audio will loop continuously unless stopped. Useful for hold music, ambient sounds, or background audio.',
52
+ parameters: {
53
+ file_url: {
54
+ type: 'string',
55
+ description: 'The URL of the audio file to play (MP3, WAV, or other supported format). Must be a publicly accessible URL.',
56
+ },
57
+ wait: {
58
+ type: 'boolean',
59
+ description: 'If true, wait for the audio file to finish playing before continuing. Defaults to false (play in background).',
60
+ },
61
+ },
62
+ required: defaultFileUrl ? [] : ['file_url'],
63
+ handler: (args) => {
64
+ let fileUrl = args.file_url ?? defaultFileUrl;
65
+ const wait = args.wait ?? false;
66
+ if (!fileUrl || typeof fileUrl !== 'string' || fileUrl.trim().length === 0) {
67
+ return new SwaigFunctionResult('Please provide a file URL for the audio to play in the background.');
68
+ }
69
+ fileUrl = fileUrl.trim();
70
+ // Validate URL format
71
+ try {
72
+ const parsed = new URL(fileUrl);
73
+ if (!['http:', 'https:'].includes(parsed.protocol)) {
74
+ return new SwaigFunctionResult('Invalid file URL. Only HTTP and HTTPS URLs are supported.');
75
+ }
76
+ // Check allowed domains if configured
77
+ if (allowedDomains && allowedDomains.length > 0) {
78
+ const hostname = parsed.hostname.toLowerCase();
79
+ const isAllowed = allowedDomains.some((domain) => hostname === domain.toLowerCase() ||
80
+ hostname.endsWith(`.${domain.toLowerCase()}`));
81
+ if (!isAllowed) {
82
+ return new SwaigFunctionResult(`Audio files from "${parsed.hostname}" are not allowed. Allowed domains: ${allowedDomains.join(', ')}.`);
83
+ }
84
+ }
85
+ }
86
+ catch {
87
+ return new SwaigFunctionResult(`Invalid file URL: "${fileUrl}". Please provide a valid HTTP or HTTPS URL.`);
88
+ }
89
+ const result = new SwaigFunctionResult(`Now playing background audio: ${fileUrl}${wait ? ' (waiting for completion)' : ''}.`);
90
+ result.playBackgroundFile(fileUrl, wait);
91
+ return result;
92
+ },
93
+ },
94
+ {
95
+ name: 'stop_background',
96
+ description: 'Stop any audio file currently playing in the background. Use this when the caller is ready to resume the conversation or when background audio is no longer needed.',
97
+ parameters: {},
98
+ handler: () => {
99
+ const result = new SwaigFunctionResult('Background audio playback has been stopped.');
100
+ result.stopBackgroundFile();
101
+ return result;
102
+ },
103
+ },
104
+ ];
105
+ }
106
+ /** @returns Prompt section describing background audio playback capabilities. */
107
+ getPromptSections() {
108
+ const defaultFileUrl = this.getConfig('default_file_url', undefined);
109
+ const bullets = [
110
+ 'Use the play_background tool to start playing audio in the background during a call.',
111
+ 'Use the stop_background tool to stop any currently playing background audio.',
112
+ 'Background audio is useful for hold music, ambient sounds, or playing announcements.',
113
+ 'The audio will continue playing until explicitly stopped with stop_background.',
114
+ ];
115
+ if (defaultFileUrl) {
116
+ bullets.push(`A default audio file is configured. You can call play_background without specifying a file URL to use the default.`);
117
+ }
118
+ return [
119
+ {
120
+ title: 'Background Audio Playback',
121
+ body: 'You can control background audio playback during the call.',
122
+ bullets,
123
+ },
124
+ ];
125
+ }
126
+ }
127
+ /**
128
+ * Factory function for creating PlayBackgroundFileSkill instances.
129
+ * @param config - Optional skill configuration.
130
+ * @returns A new PlayBackgroundFileSkill instance.
131
+ */
132
+ export function createSkill(config) {
133
+ return new PlayBackgroundFileSkill(config);
134
+ }
135
+ //# sourceMappingURL=play_background_file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"play_background_file.js","sourceRoot":"","sources":["../../../src/skills/builtin/play_background_file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Spider Skill - Scrapes webpage content using the Spider API.
3
+ *
4
+ * Tier 3 built-in skill: requires SPIDER_API_KEY environment variable.
5
+ * Uses the Spider API to fetch and extract content from web pages,
6
+ * optionally filtering by CSS selector.
7
+ */
8
+ import { SkillBase } from '../SkillBase.js';
9
+ import type { SkillManifest, SkillToolDefinition, SkillPromptSection, SkillConfig } from '../SkillBase.js';
10
+ /**
11
+ * Scrapes webpage content using the Spider API.
12
+ *
13
+ * Tier 3 built-in skill. Requires the `SPIDER_API_KEY` environment variable.
14
+ * Extracts text, markdown, or HTML from any public URL, with optional CSS
15
+ * selector filtering. Supports `max_content_length` config option.
16
+ */
17
+ export declare class SpiderSkill extends SkillBase {
18
+ /**
19
+ * @param config - Optional configuration; supports `max_content_length`.
20
+ */
21
+ constructor(config?: SkillConfig);
22
+ /** @returns Manifest declaring SPIDER_API_KEY as required and config schema for max_content_length. */
23
+ getManifest(): SkillManifest;
24
+ /** @returns A single `scrape_url` tool that extracts content from a web page. */
25
+ getTools(): SkillToolDefinition[];
26
+ /** @returns Prompt section describing web scraping capabilities and content limits. */
27
+ getPromptSections(): SkillPromptSection[];
28
+ }
29
+ /**
30
+ * Factory function for creating SpiderSkill instances.
31
+ * @param config - Optional skill configuration.
32
+ * @returns A new SpiderSkill instance.
33
+ */
34
+ export declare function createSkill(config?: SkillConfig): SpiderSkill;
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Spider Skill - Scrapes webpage content using the Spider API.
3
+ *
4
+ * Tier 3 built-in skill: requires SPIDER_API_KEY environment variable.
5
+ * Uses the Spider API to fetch and extract content from web pages,
6
+ * optionally filtering by CSS selector.
7
+ */
8
+ import { SkillBase } from '../SkillBase.js';
9
+ import { SwaigFunctionResult } from '../../SwaigFunctionResult.js';
10
+ /**
11
+ * Scrapes webpage content using the Spider API.
12
+ *
13
+ * Tier 3 built-in skill. Requires the `SPIDER_API_KEY` environment variable.
14
+ * Extracts text, markdown, or HTML from any public URL, with optional CSS
15
+ * selector filtering. Supports `max_content_length` config option.
16
+ */
17
+ export class SpiderSkill extends SkillBase {
18
+ /**
19
+ * @param config - Optional configuration; supports `max_content_length`.
20
+ */
21
+ constructor(config) {
22
+ super('spider', config);
23
+ }
24
+ /** @returns Manifest declaring SPIDER_API_KEY as required and config schema for max_content_length. */
25
+ getManifest() {
26
+ return {
27
+ name: 'spider',
28
+ description: 'Scrapes webpage content using the Spider API. Extracts text, markdown, or HTML from any public URL.',
29
+ version: '1.0.0',
30
+ author: 'SignalWire',
31
+ tags: ['scraping', 'web', 'spider', 'content', 'extraction', 'external'],
32
+ requiredEnvVars: ['SPIDER_API_KEY'],
33
+ configSchema: {
34
+ max_content_length: {
35
+ type: 'number',
36
+ description: 'Maximum length of returned content in characters. Defaults to 5000.',
37
+ default: 5000,
38
+ },
39
+ },
40
+ };
41
+ }
42
+ /** @returns A single `scrape_url` tool that extracts content from a web page. */
43
+ getTools() {
44
+ const maxContentLength = this.getConfig('max_content_length', 5000);
45
+ return [
46
+ {
47
+ name: 'scrape_url',
48
+ description: 'Scrape and extract content from a web page URL. Returns the page text or markdown content.',
49
+ parameters: {
50
+ url: {
51
+ type: 'string',
52
+ description: 'The full URL of the web page to scrape (must start with http:// or https://).',
53
+ },
54
+ selector: {
55
+ type: 'string',
56
+ description: 'Optional CSS selector to extract specific content from the page (e.g., "article", ".main-content", "#body").',
57
+ },
58
+ },
59
+ required: ['url'],
60
+ handler: async (args) => {
61
+ const url = args.url;
62
+ const selector = args.selector;
63
+ if (!url || typeof url !== 'string' || url.trim().length === 0) {
64
+ return new SwaigFunctionResult('Please provide a URL to scrape.');
65
+ }
66
+ const trimmedUrl = url.trim();
67
+ if (!trimmedUrl.startsWith('http://') && !trimmedUrl.startsWith('https://')) {
68
+ return new SwaigFunctionResult('Invalid URL. Please provide a full URL starting with http:// or https://.');
69
+ }
70
+ const apiKey = process.env['SPIDER_API_KEY'];
71
+ if (!apiKey) {
72
+ return new SwaigFunctionResult('Spider scraping is not configured. The SPIDER_API_KEY environment variable is required.');
73
+ }
74
+ try {
75
+ const requestBody = {
76
+ url: trimmedUrl,
77
+ return_format: 'markdown',
78
+ };
79
+ if (selector && typeof selector === 'string' && selector.trim().length > 0) {
80
+ requestBody['css_selector'] = selector.trim();
81
+ }
82
+ const response = await fetch('https://api.spider.cloud/crawl', {
83
+ method: 'POST',
84
+ headers: {
85
+ 'Content-Type': 'application/json',
86
+ 'Authorization': `Bearer ${apiKey}`,
87
+ },
88
+ body: JSON.stringify(requestBody),
89
+ });
90
+ if (!response.ok) {
91
+ const errorText = await response.text();
92
+ return new SwaigFunctionResult(`Spider API returned an error (HTTP ${response.status}): ${errorText.slice(0, 300)}`);
93
+ }
94
+ const data = (await response.json());
95
+ // Handle error responses
96
+ if (!Array.isArray(data) && 'error' in data) {
97
+ return new SwaigFunctionResult(`Spider scraping failed: ${data.error}`);
98
+ }
99
+ // Extract content from result
100
+ let content = '';
101
+ const result = Array.isArray(data) ? data[0] : data;
102
+ if (!result) {
103
+ return new SwaigFunctionResult(`No content could be extracted from "${trimmedUrl}".`);
104
+ }
105
+ if (result.error) {
106
+ return new SwaigFunctionResult(`Error scraping "${trimmedUrl}": ${result.error}`);
107
+ }
108
+ // Prefer markdown > text > content
109
+ content = result.markdown ?? result.text ?? result.content ?? '';
110
+ if (content.trim().length === 0) {
111
+ return new SwaigFunctionResult(`The page at "${trimmedUrl}" returned no extractable content.`);
112
+ }
113
+ // Truncate if necessary
114
+ let truncated = false;
115
+ if (content.length > maxContentLength) {
116
+ content = content.slice(0, maxContentLength);
117
+ truncated = true;
118
+ }
119
+ const parts = [
120
+ `Content from ${trimmedUrl}:`,
121
+ '',
122
+ content.trim(),
123
+ ];
124
+ if (truncated) {
125
+ parts.push('');
126
+ parts.push(`[Content truncated to ${maxContentLength} characters]`);
127
+ }
128
+ return new SwaigFunctionResult(parts.join('\n'));
129
+ }
130
+ catch (err) {
131
+ const message = err instanceof Error ? err.message : String(err);
132
+ return new SwaigFunctionResult(`Failed to scrape "${trimmedUrl}": ${message}`);
133
+ }
134
+ },
135
+ },
136
+ ];
137
+ }
138
+ /** @returns Prompt section describing web scraping capabilities and content limits. */
139
+ getPromptSections() {
140
+ return [
141
+ {
142
+ title: 'Web Page Scraping',
143
+ body: 'You can scrape and extract content from web pages.',
144
+ bullets: [
145
+ 'Use the scrape_url tool to fetch content from any public web page.',
146
+ 'Provide a full URL starting with http:// or https://.',
147
+ 'Optionally specify a CSS selector to extract specific parts of the page.',
148
+ 'Content is returned as markdown text for easy reading.',
149
+ `Content is limited to ${this.getConfig('max_content_length', 5000)} characters.`,
150
+ 'Summarize the scraped content for the user rather than reading it verbatim.',
151
+ ],
152
+ },
153
+ ];
154
+ }
155
+ }
156
+ /**
157
+ * Factory function for creating SpiderSkill instances.
158
+ * @param config - Optional skill configuration.
159
+ * @returns A new SpiderSkill instance.
160
+ */
161
+ export function createSkill(config) {
162
+ return new SpiderSkill(config);
163
+ }
164
+ //# sourceMappingURL=spider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spider.js","sourceRoot":"","sources":["../../../src/skills/builtin/spider.ts"],"names":[],"mappings":"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"}