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,83 @@
1
+ /**
2
+ * SkillManager - Manages skill lifecycle for an agent.
3
+ *
4
+ * Handles loading, unloading, validation, and injection of
5
+ * skill tools, hints, global data, and prompt sections.
6
+ */
7
+ import { SkillBase } from './SkillBase.js';
8
+ /**
9
+ * Manages the lifecycle of skills attached to an agent.
10
+ *
11
+ * Handles loading, unloading, validation, and aggregation of skill tools,
12
+ * hints, global data, and prompt sections.
13
+ */
14
+ export declare class SkillManager {
15
+ private skills;
16
+ /**
17
+ * Add a skill to the manager, validating env vars and calling setup().
18
+ * @param skill - The skill instance to add.
19
+ */
20
+ addSkill(skill: SkillBase): Promise<void>;
21
+ /**
22
+ * Remove a skill by its instance ID, calling cleanup() before removal.
23
+ * @param instanceId - The unique instance ID of the skill to remove.
24
+ * @returns True if the skill was found and removed, false otherwise.
25
+ */
26
+ removeSkill(instanceId: string): Promise<boolean>;
27
+ /**
28
+ * Remove all skill instances matching a given skill name.
29
+ * @param skillName - The skill name to match against.
30
+ * @returns The number of skill instances removed.
31
+ */
32
+ removeSkillByName(skillName: string): Promise<number>;
33
+ /**
34
+ * Check if any skill instance with the given name is currently loaded.
35
+ * @param skillName - The skill name to check for.
36
+ * @returns True if at least one instance with this name is loaded.
37
+ */
38
+ hasSkill(skillName: string): boolean;
39
+ /**
40
+ * Get a skill by its unique instance ID.
41
+ * @param instanceId - The instance ID to look up.
42
+ * @returns The skill instance, or undefined if not found.
43
+ */
44
+ getSkill(instanceId: string): SkillBase | undefined;
45
+ /**
46
+ * List all loaded skill instances with their name, ID, and initialization state.
47
+ * @returns Array of skill summary objects.
48
+ */
49
+ listSkills(): {
50
+ name: string;
51
+ instanceId: string;
52
+ initialized: boolean;
53
+ }[];
54
+ /**
55
+ * Aggregate tool definitions from all loaded skills.
56
+ * @returns Combined array of all skill tool definitions.
57
+ */
58
+ getAllTools(): ReturnType<SkillBase['getTools']>;
59
+ /**
60
+ * Aggregate prompt sections from all loaded skills.
61
+ * @returns Combined array of all skill prompt sections.
62
+ */
63
+ getAllPromptSections(): ReturnType<SkillBase['getPromptSections']>;
64
+ /**
65
+ * Aggregate speech recognition hints from all loaded skills.
66
+ * @returns Combined array of all skill hint strings.
67
+ */
68
+ getAllHints(): string[];
69
+ /**
70
+ * Merge global data from all loaded skills into a single object.
71
+ * @returns Combined global data (later skills override earlier ones on key conflicts).
72
+ */
73
+ getMergedGlobalData(): Record<string, unknown>;
74
+ /**
75
+ * Get the number of currently loaded skill instances.
76
+ * @returns The count of loaded skills.
77
+ */
78
+ get size(): number;
79
+ /**
80
+ * Remove all skills and clean up.
81
+ */
82
+ clear(): Promise<void>;
83
+ }
@@ -0,0 +1,159 @@
1
+ /**
2
+ * SkillManager - Manages skill lifecycle for an agent.
3
+ *
4
+ * Handles loading, unloading, validation, and injection of
5
+ * skill tools, hints, global data, and prompt sections.
6
+ */
7
+ import { getLogger } from '../Logger.js';
8
+ const log = getLogger('SkillManager');
9
+ /**
10
+ * Manages the lifecycle of skills attached to an agent.
11
+ *
12
+ * Handles loading, unloading, validation, and aggregation of skill tools,
13
+ * hints, global data, and prompt sections.
14
+ */
15
+ export class SkillManager {
16
+ skills = new Map();
17
+ /**
18
+ * Add a skill to the manager, validating env vars and calling setup().
19
+ * @param skill - The skill instance to add.
20
+ */
21
+ async addSkill(skill) {
22
+ const name = skill.skillName;
23
+ if (this.skills.has(skill.instanceId)) {
24
+ throw new Error(`Skill instance '${skill.instanceId}' is already loaded`);
25
+ }
26
+ // Validate required env vars
27
+ const missingEnvVars = skill.validateEnvVars();
28
+ if (missingEnvVars.length) {
29
+ log.warn(`Skill '${name}' missing env vars: ${missingEnvVars.join(', ')}`);
30
+ }
31
+ // Setup
32
+ await skill.setup();
33
+ skill.markInitialized();
34
+ this.skills.set(skill.instanceId, skill);
35
+ log.debug(`Added skill '${name}' (${skill.instanceId})`);
36
+ }
37
+ /**
38
+ * Remove a skill by its instance ID, calling cleanup() before removal.
39
+ * @param instanceId - The unique instance ID of the skill to remove.
40
+ * @returns True if the skill was found and removed, false otherwise.
41
+ */
42
+ async removeSkill(instanceId) {
43
+ const skill = this.skills.get(instanceId);
44
+ if (!skill)
45
+ return false;
46
+ await skill.cleanup();
47
+ this.skills.delete(instanceId);
48
+ log.debug(`Removed skill '${skill.skillName}' (${instanceId})`);
49
+ return true;
50
+ }
51
+ /**
52
+ * Remove all skill instances matching a given skill name.
53
+ * @param skillName - The skill name to match against.
54
+ * @returns The number of skill instances removed.
55
+ */
56
+ async removeSkillByName(skillName) {
57
+ let count = 0;
58
+ for (const [id, skill] of this.skills) {
59
+ if (skill.skillName === skillName) {
60
+ await skill.cleanup();
61
+ this.skills.delete(id);
62
+ count++;
63
+ }
64
+ }
65
+ return count;
66
+ }
67
+ /**
68
+ * Check if any skill instance with the given name is currently loaded.
69
+ * @param skillName - The skill name to check for.
70
+ * @returns True if at least one instance with this name is loaded.
71
+ */
72
+ hasSkill(skillName) {
73
+ for (const skill of this.skills.values()) {
74
+ if (skill.skillName === skillName)
75
+ return true;
76
+ }
77
+ return false;
78
+ }
79
+ /**
80
+ * Get a skill by its unique instance ID.
81
+ * @param instanceId - The instance ID to look up.
82
+ * @returns The skill instance, or undefined if not found.
83
+ */
84
+ getSkill(instanceId) {
85
+ return this.skills.get(instanceId);
86
+ }
87
+ /**
88
+ * List all loaded skill instances with their name, ID, and initialization state.
89
+ * @returns Array of skill summary objects.
90
+ */
91
+ listSkills() {
92
+ return Array.from(this.skills.values()).map(s => ({
93
+ name: s.skillName,
94
+ instanceId: s.instanceId,
95
+ initialized: s.isInitialized(),
96
+ }));
97
+ }
98
+ /**
99
+ * Aggregate tool definitions from all loaded skills.
100
+ * @returns Combined array of all skill tool definitions.
101
+ */
102
+ getAllTools() {
103
+ const tools = [];
104
+ for (const skill of this.skills.values()) {
105
+ tools.push(...skill.getTools());
106
+ }
107
+ return tools;
108
+ }
109
+ /**
110
+ * Aggregate prompt sections from all loaded skills.
111
+ * @returns Combined array of all skill prompt sections.
112
+ */
113
+ getAllPromptSections() {
114
+ const sections = [];
115
+ for (const skill of this.skills.values()) {
116
+ sections.push(...skill.getPromptSections());
117
+ }
118
+ return sections;
119
+ }
120
+ /**
121
+ * Aggregate speech recognition hints from all loaded skills.
122
+ * @returns Combined array of all skill hint strings.
123
+ */
124
+ getAllHints() {
125
+ const hints = [];
126
+ for (const skill of this.skills.values()) {
127
+ hints.push(...skill.getHints());
128
+ }
129
+ return hints;
130
+ }
131
+ /**
132
+ * Merge global data from all loaded skills into a single object.
133
+ * @returns Combined global data (later skills override earlier ones on key conflicts).
134
+ */
135
+ getMergedGlobalData() {
136
+ const data = {};
137
+ for (const skill of this.skills.values()) {
138
+ Object.assign(data, skill.getGlobalData());
139
+ }
140
+ return data;
141
+ }
142
+ /**
143
+ * Get the number of currently loaded skill instances.
144
+ * @returns The count of loaded skills.
145
+ */
146
+ get size() {
147
+ return this.skills.size;
148
+ }
149
+ /**
150
+ * Remove all skills and clean up.
151
+ */
152
+ async clear() {
153
+ for (const skill of this.skills.values()) {
154
+ await skill.cleanup();
155
+ }
156
+ this.skills.clear();
157
+ }
158
+ }
159
+ //# sourceMappingURL=SkillManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillManager.js","sourceRoot":"","sources":["../../src/skills/SkillManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * SkillRegistry - Global singleton registry for discovering and loading skills.
3
+ *
4
+ * Skills can be registered programmatically or discovered from directories.
5
+ * Supports SIGNALWIRE_SKILL_PATHS env var for custom skill directories.
6
+ */
7
+ import { SkillBase, type SkillConfig, type SkillManifest } from './SkillBase.js';
8
+ /** Factory function that creates a SkillBase instance from optional configuration. */
9
+ export type SkillFactory = (config?: SkillConfig) => SkillBase;
10
+ /**
11
+ * Global singleton registry for discovering and instantiating skills.
12
+ *
13
+ * Skills can be registered programmatically or auto-discovered from directories.
14
+ * Supports the SIGNALWIRE_SKILL_PATHS environment variable for custom skill directories.
15
+ */
16
+ export declare class SkillRegistry {
17
+ private registry;
18
+ private searchPaths;
19
+ constructor();
20
+ /**
21
+ * Get the global singleton instance, creating it on first access.
22
+ * @returns The shared SkillRegistry instance.
23
+ */
24
+ static getInstance(): SkillRegistry;
25
+ /**
26
+ * Reset the global singleton (for testing).
27
+ */
28
+ static resetInstance(): void;
29
+ /**
30
+ * Register a skill factory by name, optionally with a pre-loaded manifest.
31
+ * @param name - The unique skill name.
32
+ * @param factory - Factory function to create skill instances.
33
+ * @param manifest - Optional manifest metadata for the skill.
34
+ */
35
+ register(name: string, factory: SkillFactory, manifest?: SkillManifest): void;
36
+ /**
37
+ * Unregister a skill by name, removing it from the registry.
38
+ * @param name - The skill name to unregister.
39
+ * @returns True if the skill was found and removed.
40
+ */
41
+ unregister(name: string): boolean;
42
+ /**
43
+ * Create a new skill instance by looking up its factory in the registry.
44
+ * @param name - The registered skill name.
45
+ * @param config - Optional configuration to pass to the factory.
46
+ * @returns A new skill instance, or null if the name is not registered.
47
+ */
48
+ create(name: string, config?: SkillConfig): SkillBase | null;
49
+ /**
50
+ * Check if a skill name is registered.
51
+ * @param name - The skill name to check.
52
+ * @returns True if the skill is registered.
53
+ */
54
+ has(name: string): boolean;
55
+ /**
56
+ * Get the manifest for a registered skill, if available.
57
+ * @param name - The skill name to look up.
58
+ * @returns The skill manifest, or undefined if not found or not provided.
59
+ */
60
+ getManifest(name: string): SkillManifest | undefined;
61
+ /**
62
+ * List all registered skill names.
63
+ * @returns Array of registered skill name strings.
64
+ */
65
+ listRegistered(): string[];
66
+ /**
67
+ * List all registered skills with their optional manifests.
68
+ * @returns Array of objects containing skill name and manifest.
69
+ */
70
+ listRegisteredWithManifests(): {
71
+ name: string;
72
+ manifest?: SkillManifest;
73
+ }[];
74
+ /**
75
+ * Add a directory path to search during skill discovery.
76
+ * @param path - Absolute path to a directory containing skill files.
77
+ */
78
+ addSearchPath(path: string): void;
79
+ /**
80
+ * Get all configured search paths for skill discovery.
81
+ * @returns Copy of the search paths array.
82
+ */
83
+ getSearchPaths(): string[];
84
+ /**
85
+ * Discover and register skills from a directory by importing each file.
86
+ * Looks for modules exporting a `createSkill` factory or a SkillBase default export.
87
+ * @param dirPath - Absolute path to the directory to scan.
88
+ * @returns Array of newly discovered skill names.
89
+ */
90
+ discoverFromDirectory(dirPath: string): Promise<string[]>;
91
+ /**
92
+ * Discover and register skills from all configured search paths.
93
+ * @returns Array of all newly discovered skill names.
94
+ */
95
+ discoverAll(): Promise<string[]>;
96
+ /**
97
+ * Get the number of registered skills.
98
+ * @returns The count of registered skills.
99
+ */
100
+ get size(): number;
101
+ /**
102
+ * Clear all registrations.
103
+ */
104
+ clear(): void;
105
+ }
@@ -0,0 +1,195 @@
1
+ /**
2
+ * SkillRegistry - Global singleton registry for discovering and loading skills.
3
+ *
4
+ * Skills can be registered programmatically or discovered from directories.
5
+ * Supports SIGNALWIRE_SKILL_PATHS env var for custom skill directories.
6
+ */
7
+ import { SkillBase } from './SkillBase.js';
8
+ import { getLogger } from '../Logger.js';
9
+ const log = getLogger('SkillRegistry');
10
+ let _instance = null;
11
+ /**
12
+ * Global singleton registry for discovering and instantiating skills.
13
+ *
14
+ * Skills can be registered programmatically or auto-discovered from directories.
15
+ * Supports the SIGNALWIRE_SKILL_PATHS environment variable for custom skill directories.
16
+ */
17
+ export class SkillRegistry {
18
+ registry = new Map();
19
+ searchPaths;
20
+ constructor() {
21
+ const envPaths = process.env['SIGNALWIRE_SKILL_PATHS'];
22
+ this.searchPaths = envPaths ? envPaths.split(':').filter(Boolean) : [];
23
+ }
24
+ /**
25
+ * Get the global singleton instance, creating it on first access.
26
+ * @returns The shared SkillRegistry instance.
27
+ */
28
+ static getInstance() {
29
+ if (!_instance) {
30
+ _instance = new SkillRegistry();
31
+ }
32
+ return _instance;
33
+ }
34
+ /**
35
+ * Reset the global singleton (for testing).
36
+ */
37
+ static resetInstance() {
38
+ _instance = null;
39
+ }
40
+ /**
41
+ * Register a skill factory by name, optionally with a pre-loaded manifest.
42
+ * @param name - The unique skill name.
43
+ * @param factory - Factory function to create skill instances.
44
+ * @param manifest - Optional manifest metadata for the skill.
45
+ */
46
+ register(name, factory, manifest) {
47
+ if (this.registry.has(name)) {
48
+ log.warn(`Overwriting skill registration: ${name}`);
49
+ }
50
+ this.registry.set(name, { name, factory, manifest });
51
+ log.debug(`Registered skill: ${name}`);
52
+ }
53
+ /**
54
+ * Unregister a skill by name, removing it from the registry.
55
+ * @param name - The skill name to unregister.
56
+ * @returns True if the skill was found and removed.
57
+ */
58
+ unregister(name) {
59
+ return this.registry.delete(name);
60
+ }
61
+ /**
62
+ * Create a new skill instance by looking up its factory in the registry.
63
+ * @param name - The registered skill name.
64
+ * @param config - Optional configuration to pass to the factory.
65
+ * @returns A new skill instance, or null if the name is not registered.
66
+ */
67
+ create(name, config) {
68
+ const entry = this.registry.get(name);
69
+ if (!entry) {
70
+ log.warn(`Skill not found in registry: ${name}`);
71
+ return null;
72
+ }
73
+ return entry.factory(config);
74
+ }
75
+ /**
76
+ * Check if a skill name is registered.
77
+ * @param name - The skill name to check.
78
+ * @returns True if the skill is registered.
79
+ */
80
+ has(name) {
81
+ return this.registry.has(name);
82
+ }
83
+ /**
84
+ * Get the manifest for a registered skill, if available.
85
+ * @param name - The skill name to look up.
86
+ * @returns The skill manifest, or undefined if not found or not provided.
87
+ */
88
+ getManifest(name) {
89
+ return this.registry.get(name)?.manifest;
90
+ }
91
+ /**
92
+ * List all registered skill names.
93
+ * @returns Array of registered skill name strings.
94
+ */
95
+ listRegistered() {
96
+ return Array.from(this.registry.keys());
97
+ }
98
+ /**
99
+ * List all registered skills with their optional manifests.
100
+ * @returns Array of objects containing skill name and manifest.
101
+ */
102
+ listRegisteredWithManifests() {
103
+ return Array.from(this.registry.values()).map(e => ({
104
+ name: e.name,
105
+ manifest: e.manifest,
106
+ }));
107
+ }
108
+ /**
109
+ * Add a directory path to search during skill discovery.
110
+ * @param path - Absolute path to a directory containing skill files.
111
+ */
112
+ addSearchPath(path) {
113
+ if (!this.searchPaths.includes(path)) {
114
+ this.searchPaths.push(path);
115
+ }
116
+ }
117
+ /**
118
+ * Get all configured search paths for skill discovery.
119
+ * @returns Copy of the search paths array.
120
+ */
121
+ getSearchPaths() {
122
+ return [...this.searchPaths];
123
+ }
124
+ /**
125
+ * Discover and register skills from a directory by importing each file.
126
+ * Looks for modules exporting a `createSkill` factory or a SkillBase default export.
127
+ * @param dirPath - Absolute path to the directory to scan.
128
+ * @returns Array of newly discovered skill names.
129
+ */
130
+ async discoverFromDirectory(dirPath) {
131
+ const { readdir } = await import('node:fs/promises');
132
+ const { join } = await import('node:path');
133
+ const { pathToFileURL } = await import('node:url');
134
+ const discovered = [];
135
+ let entries;
136
+ try {
137
+ const dirEntries = await readdir(dirPath, { withFileTypes: true });
138
+ entries = dirEntries
139
+ .filter(e => (e.isFile() && (e.name.endsWith('.ts') || e.name.endsWith('.js'))) || e.isDirectory())
140
+ .map(e => e.name);
141
+ }
142
+ catch {
143
+ log.warn(`Cannot read skill directory: ${dirPath}`);
144
+ return discovered;
145
+ }
146
+ for (const entry of entries) {
147
+ const fullPath = join(dirPath, entry);
148
+ try {
149
+ const fileUrl = pathToFileURL(entry.endsWith('.ts') || entry.endsWith('.js') ? fullPath : join(fullPath, 'skill.ts')).href;
150
+ const mod = await import(fileUrl);
151
+ // Look for a factory function or a SkillBase subclass
152
+ if (typeof mod.createSkill === 'function') {
153
+ const name = entry.replace(/\.(ts|js)$/, '');
154
+ this.register(name, mod.createSkill);
155
+ discovered.push(name);
156
+ }
157
+ else if (typeof mod.default === 'function' && mod.default.prototype instanceof SkillBase) {
158
+ const name = entry.replace(/\.(ts|js)$/, '');
159
+ this.register(name, (config) => new mod.default(config));
160
+ discovered.push(name);
161
+ }
162
+ }
163
+ catch (err) {
164
+ log.debug(`Could not load skill from ${fullPath}: ${err}`);
165
+ }
166
+ }
167
+ return discovered;
168
+ }
169
+ /**
170
+ * Discover and register skills from all configured search paths.
171
+ * @returns Array of all newly discovered skill names.
172
+ */
173
+ async discoverAll() {
174
+ const all = [];
175
+ for (const path of this.searchPaths) {
176
+ const found = await this.discoverFromDirectory(path);
177
+ all.push(...found);
178
+ }
179
+ return all;
180
+ }
181
+ /**
182
+ * Get the number of registered skills.
183
+ * @returns The count of registered skills.
184
+ */
185
+ get size() {
186
+ return this.registry.size;
187
+ }
188
+ /**
189
+ * Clear all registrations.
190
+ */
191
+ clear() {
192
+ this.registry.clear();
193
+ }
194
+ }
195
+ //# sourceMappingURL=SkillRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillRegistry.js","sourceRoot":"","sources":["../../src/skills/SkillRegistry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * API Ninjas Trivia Skill - Fetches trivia questions from the API Ninjas service.
3
+ *
4
+ * Tier 2 built-in skill: requires API_NINJAS_KEY environment variable.
5
+ * Uses the API Ninjas Trivia endpoint to retrieve random trivia questions
6
+ * with optional category filtering.
7
+ */
8
+ import { SkillBase } from '../SkillBase.js';
9
+ import type { SkillManifest, SkillToolDefinition, SkillPromptSection, SkillConfig } from '../SkillBase.js';
10
+ /**
11
+ * Fetches trivia questions from the API Ninjas service.
12
+ *
13
+ * Tier 2 built-in skill. Requires the `API_NINJAS_KEY` environment variable.
14
+ * Supports optional `default_category` and `reveal_answer` config options.
15
+ */
16
+ export declare class ApiNinjasTriviaSkill extends SkillBase {
17
+ /**
18
+ * @param config - Optional configuration; supports `default_category` and `reveal_answer`.
19
+ */
20
+ constructor(config?: SkillConfig);
21
+ /** @returns Manifest declaring API_NINJAS_KEY as required and config schema for category/reveal. */
22
+ getManifest(): SkillManifest;
23
+ /** @returns A single `get_trivia` tool that fetches a random trivia question with optional category. */
24
+ getTools(): SkillToolDefinition[];
25
+ /** @returns Prompt section describing trivia capabilities and quiz behavior. */
26
+ getPromptSections(): SkillPromptSection[];
27
+ /** @returns Speech recognition hints for trivia-related keywords. */
28
+ getHints(): string[];
29
+ }
30
+ /**
31
+ * Factory function for creating ApiNinjasTriviaSkill instances.
32
+ * @param config - Optional skill configuration.
33
+ * @returns A new ApiNinjasTriviaSkill instance.
34
+ */
35
+ export declare function createSkill(config?: SkillConfig): ApiNinjasTriviaSkill;