@sprinterai/runtime 0.2.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 (266) hide show
  1. package/LICENSE +21 -0
  2. package/dist/adapters/a2a-adapter.d.ts +24 -0
  3. package/dist/adapters/a2a-adapter.d.ts.map +1 -0
  4. package/dist/adapters/a2a-adapter.js +13 -0
  5. package/dist/adapters/a2a-adapter.js.map +1 -0
  6. package/dist/adapters/http-agent-adapter.d.ts +22 -0
  7. package/dist/adapters/http-agent-adapter.d.ts.map +1 -0
  8. package/dist/adapters/http-agent-adapter.js +13 -0
  9. package/dist/adapters/http-agent-adapter.js.map +1 -0
  10. package/dist/adapters/index.d.ts +9 -0
  11. package/dist/adapters/index.d.ts.map +1 -0
  12. package/dist/adapters/index.js +5 -0
  13. package/dist/adapters/index.js.map +1 -0
  14. package/dist/adapters/mcp-adapter.d.ts +19 -0
  15. package/dist/adapters/mcp-adapter.d.ts.map +1 -0
  16. package/dist/adapters/mcp-adapter.js +13 -0
  17. package/dist/adapters/mcp-adapter.js.map +1 -0
  18. package/dist/adapters/openclaw-adapter.d.ts +20 -0
  19. package/dist/adapters/openclaw-adapter.d.ts.map +1 -0
  20. package/dist/adapters/openclaw-adapter.js +13 -0
  21. package/dist/adapters/openclaw-adapter.js.map +1 -0
  22. package/dist/agent/agent-registry.d.ts +25 -0
  23. package/dist/agent/agent-registry.d.ts.map +1 -0
  24. package/dist/agent/agent-registry.js +42 -0
  25. package/dist/agent/agent-registry.js.map +1 -0
  26. package/dist/agent/agent-registry.test.d.ts +2 -0
  27. package/dist/agent/agent-registry.test.d.ts.map +1 -0
  28. package/dist/agent/agent-registry.test.js +55 -0
  29. package/dist/agent/agent-registry.test.js.map +1 -0
  30. package/dist/agent/agent-resolver.d.ts +41 -0
  31. package/dist/agent/agent-resolver.d.ts.map +1 -0
  32. package/dist/agent/agent-resolver.js +76 -0
  33. package/dist/agent/agent-resolver.js.map +1 -0
  34. package/dist/agent/agent-resolver.test.d.ts +2 -0
  35. package/dist/agent/agent-resolver.test.d.ts.map +1 -0
  36. package/dist/agent/agent-resolver.test.js +116 -0
  37. package/dist/agent/agent-resolver.test.js.map +1 -0
  38. package/dist/agent/delegate.d.ts +14 -0
  39. package/dist/agent/delegate.d.ts.map +1 -0
  40. package/dist/agent/delegate.js +35 -0
  41. package/dist/agent/delegate.js.map +1 -0
  42. package/dist/agent/delegate.test.d.ts +2 -0
  43. package/dist/agent/delegate.test.d.ts.map +1 -0
  44. package/dist/agent/delegate.test.js +64 -0
  45. package/dist/agent/delegate.test.js.map +1 -0
  46. package/dist/agent/execute-agent.d.ts +43 -0
  47. package/dist/agent/execute-agent.d.ts.map +1 -0
  48. package/dist/agent/execute-agent.js +43 -0
  49. package/dist/agent/execute-agent.js.map +1 -0
  50. package/dist/agent/index.d.ts +10 -0
  51. package/dist/agent/index.d.ts.map +1 -0
  52. package/dist/agent/index.js +6 -0
  53. package/dist/agent/index.js.map +1 -0
  54. package/dist/agent/prompt-builder.d.ts +16 -0
  55. package/dist/agent/prompt-builder.d.ts.map +1 -0
  56. package/dist/agent/prompt-builder.js +17 -0
  57. package/dist/agent/prompt-builder.js.map +1 -0
  58. package/dist/agent/prompt-builder.test.d.ts +2 -0
  59. package/dist/agent/prompt-builder.test.d.ts.map +1 -0
  60. package/dist/agent/prompt-builder.test.js +60 -0
  61. package/dist/agent/prompt-builder.test.js.map +1 -0
  62. package/dist/chat/chat-handler.d.ts +63 -0
  63. package/dist/chat/chat-handler.d.ts.map +1 -0
  64. package/dist/chat/chat-handler.js +74 -0
  65. package/dist/chat/chat-handler.js.map +1 -0
  66. package/dist/chat/chat-handler.test.d.ts +2 -0
  67. package/dist/chat/chat-handler.test.d.ts.map +1 -0
  68. package/dist/chat/chat-handler.test.js +112 -0
  69. package/dist/chat/chat-handler.test.js.map +1 -0
  70. package/dist/chat/index.d.ts +4 -0
  71. package/dist/chat/index.d.ts.map +1 -0
  72. package/dist/chat/index.js +3 -0
  73. package/dist/chat/index.js.map +1 -0
  74. package/dist/chat/message-utils.d.ts +26 -0
  75. package/dist/chat/message-utils.d.ts.map +1 -0
  76. package/dist/chat/message-utils.js +65 -0
  77. package/dist/chat/message-utils.js.map +1 -0
  78. package/dist/chat/message-utils.test.d.ts +2 -0
  79. package/dist/chat/message-utils.test.d.ts.map +1 -0
  80. package/dist/chat/message-utils.test.js +85 -0
  81. package/dist/chat/message-utils.test.js.map +1 -0
  82. package/dist/eval/eval-runner.d.ts +22 -0
  83. package/dist/eval/eval-runner.d.ts.map +1 -0
  84. package/dist/eval/eval-runner.js +56 -0
  85. package/dist/eval/eval-runner.js.map +1 -0
  86. package/dist/eval/eval-runner.test.d.ts +2 -0
  87. package/dist/eval/eval-runner.test.d.ts.map +1 -0
  88. package/dist/eval/eval-runner.test.js +89 -0
  89. package/dist/eval/eval-runner.test.js.map +1 -0
  90. package/dist/eval/index.d.ts +4 -0
  91. package/dist/eval/index.d.ts.map +1 -0
  92. package/dist/eval/index.js +3 -0
  93. package/dist/eval/index.js.map +1 -0
  94. package/dist/eval/scorers.d.ts +26 -0
  95. package/dist/eval/scorers.d.ts.map +1 -0
  96. package/dist/eval/scorers.js +76 -0
  97. package/dist/eval/scorers.js.map +1 -0
  98. package/dist/eval/scorers.test.d.ts +2 -0
  99. package/dist/eval/scorers.test.d.ts.map +1 -0
  100. package/dist/eval/scorers.test.js +91 -0
  101. package/dist/eval/scorers.test.js.map +1 -0
  102. package/dist/guardrail/guardrail-pipeline.d.ts +37 -0
  103. package/dist/guardrail/guardrail-pipeline.d.ts.map +1 -0
  104. package/dist/guardrail/guardrail-pipeline.js +63 -0
  105. package/dist/guardrail/guardrail-pipeline.js.map +1 -0
  106. package/dist/guardrail/guardrail-pipeline.test.d.ts +2 -0
  107. package/dist/guardrail/guardrail-pipeline.test.d.ts.map +1 -0
  108. package/dist/guardrail/guardrail-pipeline.test.js +74 -0
  109. package/dist/guardrail/guardrail-pipeline.test.js.map +1 -0
  110. package/dist/guardrail/index.d.ts +3 -0
  111. package/dist/guardrail/index.d.ts.map +1 -0
  112. package/dist/guardrail/index.js +2 -0
  113. package/dist/guardrail/index.js.map +1 -0
  114. package/dist/index.d.ts +46 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.js +39 -0
  117. package/dist/index.js.map +1 -0
  118. package/dist/memory/index.d.ts +4 -0
  119. package/dist/memory/index.d.ts.map +1 -0
  120. package/dist/memory/index.js +3 -0
  121. package/dist/memory/index.js.map +1 -0
  122. package/dist/memory/memory-manager.d.ts +28 -0
  123. package/dist/memory/memory-manager.d.ts.map +1 -0
  124. package/dist/memory/memory-manager.js +34 -0
  125. package/dist/memory/memory-manager.js.map +1 -0
  126. package/dist/memory/memory-prompt.d.ts +10 -0
  127. package/dist/memory/memory-prompt.d.ts.map +1 -0
  128. package/dist/memory/memory-prompt.js +29 -0
  129. package/dist/memory/memory-prompt.js.map +1 -0
  130. package/dist/module/create-runtime.d.ts +65 -0
  131. package/dist/module/create-runtime.d.ts.map +1 -0
  132. package/dist/module/create-runtime.js +75 -0
  133. package/dist/module/create-runtime.js.map +1 -0
  134. package/dist/module/create-runtime.test.d.ts +2 -0
  135. package/dist/module/create-runtime.test.d.ts.map +1 -0
  136. package/dist/module/create-runtime.test.js +144 -0
  137. package/dist/module/create-runtime.test.js.map +1 -0
  138. package/dist/module/index.d.ts +5 -0
  139. package/dist/module/index.d.ts.map +1 -0
  140. package/dist/module/index.js +3 -0
  141. package/dist/module/index.js.map +1 -0
  142. package/dist/module/module-loader.d.ts +32 -0
  143. package/dist/module/module-loader.d.ts.map +1 -0
  144. package/dist/module/module-loader.js +123 -0
  145. package/dist/module/module-loader.js.map +1 -0
  146. package/dist/module/module-loader.test.d.ts +2 -0
  147. package/dist/module/module-loader.test.d.ts.map +1 -0
  148. package/dist/module/module-loader.test.js +96 -0
  149. package/dist/module/module-loader.test.js.map +1 -0
  150. package/dist/scoring/compute-score.d.ts +32 -0
  151. package/dist/scoring/compute-score.d.ts.map +1 -0
  152. package/dist/scoring/compute-score.js +54 -0
  153. package/dist/scoring/compute-score.js.map +1 -0
  154. package/dist/scoring/compute-score.test.d.ts +2 -0
  155. package/dist/scoring/compute-score.test.d.ts.map +1 -0
  156. package/dist/scoring/compute-score.test.js +99 -0
  157. package/dist/scoring/compute-score.test.js.map +1 -0
  158. package/dist/scoring/index.d.ts +3 -0
  159. package/dist/scoring/index.d.ts.map +1 -0
  160. package/dist/scoring/index.js +2 -0
  161. package/dist/scoring/index.js.map +1 -0
  162. package/dist/testing/in-memory-agent-store.d.ts +16 -0
  163. package/dist/testing/in-memory-agent-store.d.ts.map +1 -0
  164. package/dist/testing/in-memory-agent-store.js +37 -0
  165. package/dist/testing/in-memory-agent-store.js.map +1 -0
  166. package/dist/testing/in-memory-agent-store.test.d.ts +2 -0
  167. package/dist/testing/in-memory-agent-store.test.d.ts.map +1 -0
  168. package/dist/testing/in-memory-agent-store.test.js +111 -0
  169. package/dist/testing/in-memory-agent-store.test.js.map +1 -0
  170. package/dist/testing/in-memory-chat-store.d.ts +28 -0
  171. package/dist/testing/in-memory-chat-store.d.ts.map +1 -0
  172. package/dist/testing/in-memory-chat-store.js +87 -0
  173. package/dist/testing/in-memory-chat-store.js.map +1 -0
  174. package/dist/testing/in-memory-entity-store.d.ts +34 -0
  175. package/dist/testing/in-memory-entity-store.d.ts.map +1 -0
  176. package/dist/testing/in-memory-entity-store.js +134 -0
  177. package/dist/testing/in-memory-entity-store.js.map +1 -0
  178. package/dist/testing/in-memory-entity-store.test.d.ts +2 -0
  179. package/dist/testing/in-memory-entity-store.test.d.ts.map +1 -0
  180. package/dist/testing/in-memory-entity-store.test.js +341 -0
  181. package/dist/testing/in-memory-entity-store.test.js.map +1 -0
  182. package/dist/testing/in-memory-memory-store.d.ts +25 -0
  183. package/dist/testing/in-memory-memory-store.d.ts.map +1 -0
  184. package/dist/testing/in-memory-memory-store.js +59 -0
  185. package/dist/testing/in-memory-memory-store.js.map +1 -0
  186. package/dist/testing/in-memory-task-store.d.ts +20 -0
  187. package/dist/testing/in-memory-task-store.d.ts.map +1 -0
  188. package/dist/testing/in-memory-task-store.js +59 -0
  189. package/dist/testing/in-memory-task-store.js.map +1 -0
  190. package/dist/testing/in-memory-tenant-store.d.ts +16 -0
  191. package/dist/testing/in-memory-tenant-store.d.ts.map +1 -0
  192. package/dist/testing/in-memory-tenant-store.js +46 -0
  193. package/dist/testing/in-memory-tenant-store.js.map +1 -0
  194. package/dist/testing/in-memory-tool-store.d.ts +17 -0
  195. package/dist/testing/in-memory-tool-store.d.ts.map +1 -0
  196. package/dist/testing/in-memory-tool-store.js +39 -0
  197. package/dist/testing/in-memory-tool-store.js.map +1 -0
  198. package/dist/testing/index.d.ts +8 -0
  199. package/dist/testing/index.d.ts.map +1 -0
  200. package/dist/testing/index.js +8 -0
  201. package/dist/testing/index.js.map +1 -0
  202. package/dist/tool/ai-bridge.d.ts +13 -0
  203. package/dist/tool/ai-bridge.d.ts.map +1 -0
  204. package/dist/tool/ai-bridge.js +27 -0
  205. package/dist/tool/ai-bridge.js.map +1 -0
  206. package/dist/tool/ai-bridge.test.d.ts +2 -0
  207. package/dist/tool/ai-bridge.test.d.ts.map +1 -0
  208. package/dist/tool/ai-bridge.test.js +40 -0
  209. package/dist/tool/ai-bridge.test.js.map +1 -0
  210. package/dist/tool/entity-tools-factory.d.ts +7 -0
  211. package/dist/tool/entity-tools-factory.d.ts.map +1 -0
  212. package/dist/tool/entity-tools-factory.js +160 -0
  213. package/dist/tool/entity-tools-factory.js.map +1 -0
  214. package/dist/tool/entity-tools-factory.test.d.ts +2 -0
  215. package/dist/tool/entity-tools-factory.test.d.ts.map +1 -0
  216. package/dist/tool/entity-tools-factory.test.js +160 -0
  217. package/dist/tool/entity-tools-factory.test.js.map +1 -0
  218. package/dist/tool/index.d.ts +8 -0
  219. package/dist/tool/index.d.ts.map +1 -0
  220. package/dist/tool/index.js +6 -0
  221. package/dist/tool/index.js.map +1 -0
  222. package/dist/tool/resolve-tools.d.ts +28 -0
  223. package/dist/tool/resolve-tools.d.ts.map +1 -0
  224. package/dist/tool/resolve-tools.js +54 -0
  225. package/dist/tool/resolve-tools.js.map +1 -0
  226. package/dist/tool/resolve-tools.test.d.ts +2 -0
  227. package/dist/tool/resolve-tools.test.d.ts.map +1 -0
  228. package/dist/tool/resolve-tools.test.js +111 -0
  229. package/dist/tool/resolve-tools.test.js.map +1 -0
  230. package/dist/tool/tool-executor.d.ts +30 -0
  231. package/dist/tool/tool-executor.d.ts.map +1 -0
  232. package/dist/tool/tool-executor.js +64 -0
  233. package/dist/tool/tool-executor.js.map +1 -0
  234. package/dist/tool/tool-executor.test.d.ts +2 -0
  235. package/dist/tool/tool-executor.test.d.ts.map +1 -0
  236. package/dist/tool/tool-executor.test.js +105 -0
  237. package/dist/tool/tool-executor.test.js.map +1 -0
  238. package/dist/tool/tool-registry.d.ts +29 -0
  239. package/dist/tool/tool-registry.d.ts.map +1 -0
  240. package/dist/tool/tool-registry.js +59 -0
  241. package/dist/tool/tool-registry.js.map +1 -0
  242. package/dist/tool/tool-registry.test.d.ts +2 -0
  243. package/dist/tool/tool-registry.test.d.ts.map +1 -0
  244. package/dist/tool/tool-registry.test.js +76 -0
  245. package/dist/tool/tool-registry.test.js.map +1 -0
  246. package/dist/workflow/compile.d.ts +17 -0
  247. package/dist/workflow/compile.d.ts.map +1 -0
  248. package/dist/workflow/compile.js +83 -0
  249. package/dist/workflow/compile.js.map +1 -0
  250. package/dist/workflow/compile.test.d.ts +2 -0
  251. package/dist/workflow/compile.test.d.ts.map +1 -0
  252. package/dist/workflow/compile.test.js +154 -0
  253. package/dist/workflow/compile.test.js.map +1 -0
  254. package/dist/workflow/index.d.ts +4 -0
  255. package/dist/workflow/index.d.ts.map +1 -0
  256. package/dist/workflow/index.js +3 -0
  257. package/dist/workflow/index.js.map +1 -0
  258. package/dist/workflow/status.d.ts +21 -0
  259. package/dist/workflow/status.d.ts.map +1 -0
  260. package/dist/workflow/status.js +55 -0
  261. package/dist/workflow/status.js.map +1 -0
  262. package/dist/workflow/status.test.d.ts +2 -0
  263. package/dist/workflow/status.test.d.ts.map +1 -0
  264. package/dist/workflow/status.test.js +176 -0
  265. package/dist/workflow/status.test.js.map +1 -0
  266. package/package.json +100 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Sprinter AI
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,24 @@
1
+ /** Configuration for an A2A (Agent-to-Agent) connection. */
2
+ export interface A2AAdapterConfig {
3
+ /** The A2A endpoint URL. */
4
+ endpointUrl: string;
5
+ /** Authentication token. */
6
+ authToken?: string;
7
+ /** Agent card metadata if known. */
8
+ agentCard?: {
9
+ name: string;
10
+ description: string;
11
+ skills: string[];
12
+ };
13
+ }
14
+ /**
15
+ * Adapter for A2A protocol connections.
16
+ *
17
+ * A2A enables cross-platform agent communication using a standard protocol.
18
+ * This adapter wraps an A2A endpoint as a callable agent.
19
+ *
20
+ * Note: A2A support requires the @google/a2a-sdk or compatible library.
21
+ * Throws if not configured.
22
+ */
23
+ export declare function createA2AAgent(_config: A2AAdapterConfig): Promise<never>;
24
+ //# sourceMappingURL=a2a-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/a2a-adapter.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAC5D,MAAM,WAAW,gBAAgB;IAC/B,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,SAAS,CAAC,EAAE;QACV,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,KAAK,CAAC,CAIhB"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Adapter for A2A protocol connections.
3
+ *
4
+ * A2A enables cross-platform agent communication using a standard protocol.
5
+ * This adapter wraps an A2A endpoint as a callable agent.
6
+ *
7
+ * Note: A2A support requires the @google/a2a-sdk or compatible library.
8
+ * Throws if not configured.
9
+ */
10
+ export async function createA2AAgent(_config) {
11
+ throw new Error("A2A adapter not configured. Install an A2A client library and provide it to the adapter.");
12
+ }
13
+ //# sourceMappingURL=a2a-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-adapter.js","sourceRoot":"","sources":["../../src/adapters/a2a-adapter.ts"],"names":[],"mappings":"AAcA;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAyB;IAEzB,MAAM,IAAI,KAAK,CACb,0FAA0F,CAC3F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /** Configuration for a generic HTTP agent endpoint. */
2
+ export interface HTTPAgentAdapterConfig {
3
+ /** The HTTP endpoint URL. */
4
+ endpointUrl: string;
5
+ /** HTTP method (default: POST). */
6
+ method?: "GET" | "POST";
7
+ /** Custom headers. */
8
+ headers?: Record<string, string>;
9
+ /** Authentication token (added as Bearer token). */
10
+ authToken?: string;
11
+ }
12
+ /**
13
+ * Adapter for generic HTTP agent endpoints.
14
+ *
15
+ * Wraps any HTTP endpoint that accepts JSON and returns JSON
16
+ * as a callable agent interface.
17
+ *
18
+ * Note: This is a stub. Implement with your preferred HTTP client.
19
+ * Throws if not configured.
20
+ */
21
+ export declare function createHTTPAgent(_config: HTTPAgentAdapterConfig): Promise<never>;
22
+ //# sourceMappingURL=http-agent-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-agent-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/http-agent-adapter.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,MAAM,WAAW,sBAAsB;IACrC,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,sBAAsB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,KAAK,CAAC,CAIhB"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Adapter for generic HTTP agent endpoints.
3
+ *
4
+ * Wraps any HTTP endpoint that accepts JSON and returns JSON
5
+ * as a callable agent interface.
6
+ *
7
+ * Note: This is a stub. Implement with your preferred HTTP client.
8
+ * Throws if not configured.
9
+ */
10
+ export async function createHTTPAgent(_config) {
11
+ throw new Error("HTTP agent adapter not configured. Provide an HTTP client implementation.");
12
+ }
13
+ //# sourceMappingURL=http-agent-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-agent-adapter.js","sourceRoot":"","sources":["../../src/adapters/http-agent-adapter.ts"],"names":[],"mappings":"AAYA;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAA+B;IAE/B,MAAM,IAAI,KAAK,CACb,2EAA2E,CAC5E,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { discoverMCPTools } from "./mcp-adapter";
2
+ export type { MCPAdapterConfig } from "./mcp-adapter";
3
+ export { createA2AAgent } from "./a2a-adapter";
4
+ export type { A2AAdapterConfig } from "./a2a-adapter";
5
+ export { createOpenClawModel } from "./openclaw-adapter";
6
+ export type { OpenClawAdapterConfig } from "./openclaw-adapter";
7
+ export { createHTTPAgent } from "./http-agent-adapter";
8
+ export type { HTTPAgentAdapterConfig } from "./http-agent-adapter";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { discoverMCPTools } from "./mcp-adapter";
2
+ export { createA2AAgent } from "./a2a-adapter";
3
+ export { createOpenClawModel } from "./openclaw-adapter";
4
+ export { createHTTPAgent } from "./http-agent-adapter";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { ToolDefinition } from "@sprinterai/core";
2
+ /** Configuration for an MCP server connection. */
3
+ export interface MCPAdapterConfig {
4
+ /** MCP server URL. */
5
+ serverUrl: string;
6
+ /** Authentication token if required. */
7
+ authToken?: string;
8
+ }
9
+ /**
10
+ * Adapter to convert MCP server tools into platform ToolDefinitions.
11
+ *
12
+ * MCP (Model Context Protocol) servers expose tools via a standard protocol.
13
+ * This adapter discovers and wraps them as platform tools.
14
+ *
15
+ * Note: Requires an MCP client library at runtime.
16
+ * Throws if the adapter is not configured with a client.
17
+ */
18
+ export declare function discoverMCPTools(_config: MCPAdapterConfig): Promise<ToolDefinition[]>;
19
+ //# sourceMappingURL=mcp-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/mcp-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,kDAAkD;AAClD,MAAM,WAAW,gBAAgB;IAC/B,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,cAAc,EAAE,CAAC,CAI3B"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Adapter to convert MCP server tools into platform ToolDefinitions.
3
+ *
4
+ * MCP (Model Context Protocol) servers expose tools via a standard protocol.
5
+ * This adapter discovers and wraps them as platform tools.
6
+ *
7
+ * Note: Requires an MCP client library at runtime.
8
+ * Throws if the adapter is not configured with a client.
9
+ */
10
+ export async function discoverMCPTools(_config) {
11
+ throw new Error("MCP adapter not configured. Install an MCP client library and provide it to the adapter.");
12
+ }
13
+ //# sourceMappingURL=mcp-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-adapter.js","sourceRoot":"","sources":["../../src/adapters/mcp-adapter.ts"],"names":[],"mappings":"AAUA;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAyB;IAEzB,MAAM,IAAI,KAAK,CACb,0FAA0F,CAC3F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ /** Configuration for an OpenClaw connection. */
2
+ export interface OpenClawAdapterConfig {
3
+ /** OpenClaw base URL. */
4
+ baseUrl: string;
5
+ /** API key for authentication. */
6
+ apiKey: string;
7
+ /** Model identifier on the OpenClaw endpoint. */
8
+ modelId?: string;
9
+ }
10
+ /**
11
+ * Adapter for OpenClaw-compatible endpoints.
12
+ *
13
+ * OpenClaw provides an OpenAI-compatible API for accessing various models.
14
+ * This adapter wraps an OpenClaw endpoint as a LanguageModelV1 provider.
15
+ *
16
+ * Note: Use @ai-sdk/openai-compatible to create the model provider.
17
+ * Throws if not configured.
18
+ */
19
+ export declare function createOpenClawModel(_config: OpenClawAdapterConfig): Promise<never>;
20
+ //# sourceMappingURL=openclaw-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/openclaw-adapter.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,MAAM,WAAW,qBAAqB;IACpC,yBAAyB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,KAAK,CAAC,CAIhB"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Adapter for OpenClaw-compatible endpoints.
3
+ *
4
+ * OpenClaw provides an OpenAI-compatible API for accessing various models.
5
+ * This adapter wraps an OpenClaw endpoint as a LanguageModelV1 provider.
6
+ *
7
+ * Note: Use @ai-sdk/openai-compatible to create the model provider.
8
+ * Throws if not configured.
9
+ */
10
+ export async function createOpenClawModel(_config) {
11
+ throw new Error("OpenClaw adapter not configured. Use @ai-sdk/openai-compatible to create a model provider.");
12
+ }
13
+ //# sourceMappingURL=openclaw-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openclaw-adapter.js","sourceRoot":"","sources":["../../src/adapters/openclaw-adapter.ts"],"names":[],"mappings":"AAUA;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAA8B;IAE9B,MAAM,IAAI,KAAK,CACb,4FAA4F,CAC7F,CAAC;AACJ,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { AgentDefinition } from "@sprinterai/core";
2
+ /**
3
+ * Map-based agent registry for code-defined agents.
4
+ * Agents are registered at startup time.
5
+ */
6
+ export declare class AgentRegistry {
7
+ private agents;
8
+ /** Register an agent definition. Overwrites if id already exists. */
9
+ register(agent: AgentDefinition): void;
10
+ /** Register multiple agents at once. */
11
+ registerAll(agents: AgentDefinition[]): void;
12
+ /** Get an agent by id (slug). */
13
+ get(id: string): AgentDefinition | undefined;
14
+ /** Check if an agent is registered. */
15
+ has(id: string): boolean;
16
+ /** List all registered agents. */
17
+ list(): AgentDefinition[];
18
+ /** Get count of registered agents. */
19
+ get size(): number;
20
+ /** Remove an agent. */
21
+ remove(id: string): boolean;
22
+ /** Clear all registered agents. */
23
+ clear(): void;
24
+ }
25
+ //# sourceMappingURL=agent-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry.d.ts","sourceRoot":"","sources":["../../src/agent/agent-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAsC;IAEpD,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAItC,wCAAwC;IACxC,WAAW,CAAC,MAAM,EAAE,eAAe,EAAE,GAAG,IAAI;IAM5C,iCAAiC;IACjC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI5C,uCAAuC;IACvC,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIxB,kCAAkC;IAClC,IAAI,IAAI,eAAe,EAAE;IAIzB,sCAAsC;IACtC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,uBAAuB;IACvB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI3B,mCAAmC;IACnC,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Map-based agent registry for code-defined agents.
3
+ * Agents are registered at startup time.
4
+ */
5
+ export class AgentRegistry {
6
+ agents = new Map();
7
+ /** Register an agent definition. Overwrites if id already exists. */
8
+ register(agent) {
9
+ this.agents.set(agent.id, agent);
10
+ }
11
+ /** Register multiple agents at once. */
12
+ registerAll(agents) {
13
+ for (const agent of agents) {
14
+ this.register(agent);
15
+ }
16
+ }
17
+ /** Get an agent by id (slug). */
18
+ get(id) {
19
+ return this.agents.get(id);
20
+ }
21
+ /** Check if an agent is registered. */
22
+ has(id) {
23
+ return this.agents.has(id);
24
+ }
25
+ /** List all registered agents. */
26
+ list() {
27
+ return Array.from(this.agents.values());
28
+ }
29
+ /** Get count of registered agents. */
30
+ get size() {
31
+ return this.agents.size;
32
+ }
33
+ /** Remove an agent. */
34
+ remove(id) {
35
+ return this.agents.delete(id);
36
+ }
37
+ /** Clear all registered agents. */
38
+ clear() {
39
+ this.agents.clear();
40
+ }
41
+ }
42
+ //# sourceMappingURL=agent-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry.js","sourceRoot":"","sources":["../../src/agent/agent-registry.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAEpD,qEAAqE;IACrE,QAAQ,CAAC,KAAsB;QAC7B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAED,wCAAwC;IACxC,WAAW,CAAC,MAAyB;QACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,uCAAuC;IACvC,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,kCAAkC;IAClC,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,sCAAsC;IACtC,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1B,CAAC;IAED,uBAAuB;IACvB,MAAM,CAAC,EAAU;QACf,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,mCAAmC;IACnC,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACtB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-registry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry.test.d.ts","sourceRoot":"","sources":["../../src/agent/agent-registry.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,55 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { AgentRegistry } from './agent-registry';
3
+ function makeAgent(id) {
4
+ return {
5
+ id,
6
+ name: `Agent ${id}`,
7
+ description: `Description for ${id}`,
8
+ icon: 'bot',
9
+ systemPrompt: `You are ${id}`,
10
+ toolGroups: ['entity'],
11
+ customTools: [],
12
+ };
13
+ }
14
+ describe('AgentRegistry', () => {
15
+ let registry;
16
+ beforeEach(() => {
17
+ registry = new AgentRegistry();
18
+ });
19
+ it('registers and retrieves an agent', () => {
20
+ const agent = makeAgent('analyst');
21
+ registry.register(agent);
22
+ expect(registry.get('analyst')).toBe(agent);
23
+ });
24
+ it('returns undefined for unknown id', () => {
25
+ expect(registry.get('missing')).toBeUndefined();
26
+ });
27
+ it('registers multiple with registerAll', () => {
28
+ registry.registerAll([makeAgent('a'), makeAgent('b')]);
29
+ expect(registry.size).toBe(2);
30
+ expect(registry.has('a')).toBe(true);
31
+ expect(registry.has('b')).toBe(true);
32
+ });
33
+ it('overwrites on re-register', () => {
34
+ registry.register(makeAgent('x'));
35
+ const updated = { ...makeAgent('x'), name: 'Updated' };
36
+ registry.register(updated);
37
+ expect(registry.get('x')?.name).toBe('Updated');
38
+ expect(registry.size).toBe(1);
39
+ });
40
+ it('list returns all agents', () => {
41
+ registry.registerAll([makeAgent('a'), makeAgent('b'), makeAgent('c')]);
42
+ expect(registry.list()).toHaveLength(3);
43
+ });
44
+ it('remove deletes an agent', () => {
45
+ registry.register(makeAgent('del'));
46
+ expect(registry.remove('del')).toBe(true);
47
+ expect(registry.has('del')).toBe(false);
48
+ });
49
+ it('clear empties the registry', () => {
50
+ registry.registerAll([makeAgent('a'), makeAgent('b')]);
51
+ registry.clear();
52
+ expect(registry.size).toBe(0);
53
+ });
54
+ });
55
+ //# sourceMappingURL=agent-registry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-registry.test.js","sourceRoot":"","sources":["../../src/agent/agent-registry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { AgentStore, AgentRecord, AgentConfig } from '@sprinterai/core';
2
+ import type { AgentRegistry } from './agent-registry';
3
+ /** A resolved agent, combining definition fields with optional DB record. */
4
+ export interface ResolvedAgent {
5
+ /** Agent ID/slug. */
6
+ id: string;
7
+ name: string;
8
+ description: string;
9
+ icon: string;
10
+ systemPrompt: string;
11
+ /** Effective agent config (merged from code + DB). */
12
+ config: AgentConfig;
13
+ /** Model override from DB record, if any. */
14
+ model: string | null;
15
+ /** Source of the resolution. */
16
+ source: 'prefetch' | 'code' | 'store' | 'default';
17
+ /** Original DB record if resolved from store. */
18
+ record?: AgentRecord;
19
+ /** Suggestions for the user. */
20
+ suggestions?: string[];
21
+ }
22
+ /** Options for resolving an agent. */
23
+ export interface ResolveAgentOptions {
24
+ /** Optional code registry to check. */
25
+ agentRegistry?: AgentRegistry;
26
+ /** Optional DB store to check. */
27
+ agentStore?: AgentStore;
28
+ /** Pre-fetched agent records (avoids DB call). */
29
+ prefetched?: Map<string, AgentRecord>;
30
+ /** Config parser for DB records. */
31
+ parseConfig?: (config: unknown) => AgentConfig;
32
+ }
33
+ /**
34
+ * 4-step agent resolution:
35
+ * 1. Check prefetched map (avoids DB call during batch operations)
36
+ * 2. Check code registry (agents defined in code)
37
+ * 3. Check DB store (agents created via admin UI)
38
+ * 4. Fall back to default agent
39
+ */
40
+ export declare function resolveAgent(slug: string, options?: ResolveAgentOptions): Promise<ResolvedAgent>;
41
+ //# sourceMappingURL=agent-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-resolver.d.ts","sourceRoot":"","sources":["../../src/agent/agent-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE9F,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,6EAA6E;AAC7E,MAAM,WAAW,aAAa;IAC5B,qBAAqB;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,sDAAsD;IACtD,MAAM,EAAE,WAAW,CAAC;IACpB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gCAAgC;IAChC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAClD,iDAAiD;IACjD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gCAAgC;IAChC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,sCAAsC;AACtC,MAAM,WAAW,mBAAmB;IAClC,uCAAuC;IACvC,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,kCAAkC;IAClC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,kDAAkD;IAClD,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACtC,oCAAoC;IACpC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,WAAW,CAAC;CAChD;AAaD;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,aAAa,CAAC,CA6BxB"}
@@ -0,0 +1,76 @@
1
+ const DEFAULT_AGENT = {
2
+ id: 'assistant',
3
+ name: 'Assistant',
4
+ description: 'A general-purpose AI assistant.',
5
+ icon: 'bot',
6
+ systemPrompt: 'You are a helpful assistant.',
7
+ config: {},
8
+ model: null,
9
+ source: 'default',
10
+ };
11
+ /**
12
+ * 4-step agent resolution:
13
+ * 1. Check prefetched map (avoids DB call during batch operations)
14
+ * 2. Check code registry (agents defined in code)
15
+ * 3. Check DB store (agents created via admin UI)
16
+ * 4. Fall back to default agent
17
+ */
18
+ export async function resolveAgent(slug, options = {}) {
19
+ const { agentRegistry, agentStore, prefetched, parseConfig } = options;
20
+ // 1. Prefetched
21
+ if (prefetched) {
22
+ const record = prefetched.get(slug);
23
+ if (record) {
24
+ return recordToResolved(record, 'prefetch', parseConfig);
25
+ }
26
+ }
27
+ // 2. Code registry
28
+ if (agentRegistry) {
29
+ const def = agentRegistry.get(slug);
30
+ if (def) {
31
+ return definitionToResolved(def);
32
+ }
33
+ }
34
+ // 3. DB store
35
+ if (agentStore) {
36
+ const record = await agentStore.getAgentBySlug(slug);
37
+ if (record) {
38
+ return recordToResolved(record, 'store', parseConfig);
39
+ }
40
+ }
41
+ // 4. Default
42
+ return { ...DEFAULT_AGENT };
43
+ }
44
+ function definitionToResolved(def) {
45
+ return {
46
+ id: def.id,
47
+ name: def.name,
48
+ description: def.description,
49
+ icon: def.icon,
50
+ systemPrompt: def.systemPrompt,
51
+ config: {
52
+ toolGroups: def.toolGroups,
53
+ customTools: def.customTools,
54
+ suggestions: def.suggestions,
55
+ },
56
+ model: null,
57
+ source: 'code',
58
+ suggestions: def.suggestions,
59
+ };
60
+ }
61
+ function recordToResolved(record, source, parseConfig) {
62
+ const config = parseConfig ? parseConfig(record.config) : (record.config ?? {});
63
+ return {
64
+ id: record.slug,
65
+ name: record.name,
66
+ description: record.description,
67
+ icon: record.icon,
68
+ systemPrompt: record.system_prompt,
69
+ config,
70
+ model: record.model,
71
+ source,
72
+ record,
73
+ suggestions: config.suggestions,
74
+ };
75
+ }
76
+ //# sourceMappingURL=agent-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-resolver.js","sourceRoot":"","sources":["../../src/agent/agent-resolver.ts"],"names":[],"mappings":"AAoCA,MAAM,aAAa,GAAkB;IACnC,EAAE,EAAE,WAAW;IACf,IAAI,EAAE,WAAW;IACjB,WAAW,EAAE,iCAAiC;IAC9C,IAAI,EAAE,KAAK;IACX,YAAY,EAAE,8BAA8B;IAC5C,MAAM,EAAE,EAAE;IACV,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,SAAS;CAClB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAY,EACZ,UAA+B,EAAE;IAEjC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAEvE,gBAAgB;IAChB,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,gBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,cAAc;IACd,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,aAAa;IACb,OAAO,EAAE,GAAG,aAAa,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAoB;IAChD,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,MAAM,EAAE;YACN,UAAU,EAAE,GAAG,CAAC,UAAU;YAC1B,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,WAAW,EAAE,GAAG,CAAC,WAAW;SAC7B;QACD,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,MAAM;QACd,WAAW,EAAE,GAAG,CAAC,WAAW;KAC7B,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,MAAmB,EACnB,MAA4B,EAC5B,WAA8C;IAE9C,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAEhF,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,IAAI;QACf,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,YAAY,EAAE,MAAM,CAAC,aAAa;QAClC,MAAM;QACN,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM;QACN,MAAM;QACN,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-resolver.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-resolver.test.d.ts","sourceRoot":"","sources":["../../src/agent/agent-resolver.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,116 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { InMemoryAgentStore } from '../testing/in-memory-agent-store';
3
+ import { AgentRegistry } from './agent-registry';
4
+ import { resolveAgent } from './agent-resolver';
5
+ function makeAgentRecord(slug, overrides) {
6
+ return {
7
+ id: `agent-${slug}`,
8
+ tenant_id: 't1',
9
+ slug,
10
+ name: `Agent ${slug}`,
11
+ description: `Desc for ${slug}`,
12
+ icon: 'bot',
13
+ system_prompt: `You are ${slug}`,
14
+ model: null,
15
+ role_id: null,
16
+ config: null,
17
+ is_enabled: true,
18
+ created_at: new Date().toISOString(),
19
+ updated_at: new Date().toISOString(),
20
+ ...overrides,
21
+ };
22
+ }
23
+ describe('resolveAgent', () => {
24
+ let registry;
25
+ let store;
26
+ beforeEach(() => {
27
+ registry = new AgentRegistry();
28
+ store = new InMemoryAgentStore();
29
+ });
30
+ it('resolves from code registry', async () => {
31
+ registry.register({
32
+ id: 'analyst',
33
+ name: 'Analyst',
34
+ description: 'Data analyst',
35
+ icon: 'chart',
36
+ systemPrompt: 'Analyze data',
37
+ toolGroups: ['entity'],
38
+ customTools: [],
39
+ });
40
+ const agent = await resolveAgent('analyst', { agentRegistry: registry });
41
+ expect(agent.id).toBe('analyst');
42
+ expect(agent.source).toBe('code');
43
+ expect(agent.config.toolGroups).toEqual(['entity']);
44
+ });
45
+ it('resolves from DB store', async () => {
46
+ const record = makeAgentRecord('researcher', { model: 'gpt-4o' });
47
+ store.seedAgent(record);
48
+ const agent = await resolveAgent('researcher', { agentStore: store });
49
+ expect(agent.id).toBe('researcher');
50
+ expect(agent.source).toBe('store');
51
+ expect(agent.model).toBe('gpt-4o');
52
+ expect(agent.record).toBe(record);
53
+ });
54
+ it('resolves from prefetched map first', async () => {
55
+ const record = makeAgentRecord('fast');
56
+ const prefetched = new Map([['fast', record]]);
57
+ // Also add to registry and store to prove prefetch wins
58
+ registry.register({
59
+ id: 'fast',
60
+ name: 'Different',
61
+ description: '',
62
+ icon: '',
63
+ systemPrompt: '',
64
+ });
65
+ store.seedAgent(makeAgentRecord('fast', { name: 'Also different' }));
66
+ const agent = await resolveAgent('fast', {
67
+ prefetched,
68
+ agentRegistry: registry,
69
+ agentStore: store,
70
+ });
71
+ expect(agent.source).toBe('prefetch');
72
+ expect(agent.name).toBe('Agent fast');
73
+ });
74
+ it('falls back to default for unknown slug', async () => {
75
+ const agent = await resolveAgent('nonexistent', {
76
+ agentRegistry: registry,
77
+ agentStore: store,
78
+ });
79
+ expect(agent.source).toBe('default');
80
+ expect(agent.id).toBe('assistant');
81
+ expect(agent.systemPrompt).toBe('You are a helpful assistant.');
82
+ });
83
+ it('code registry takes priority over store', async () => {
84
+ registry.register({
85
+ id: 'shared',
86
+ name: 'Code Version',
87
+ description: '',
88
+ icon: 'a',
89
+ systemPrompt: 'from code',
90
+ });
91
+ store.seedAgent(makeAgentRecord('shared', { name: 'Store Version' }));
92
+ const agent = await resolveAgent('shared', {
93
+ agentRegistry: registry,
94
+ agentStore: store,
95
+ });
96
+ expect(agent.source).toBe('code');
97
+ expect(agent.name).toBe('Code Version');
98
+ });
99
+ it('uses parseConfig for DB records', async () => {
100
+ const record = makeAgentRecord('configed', {
101
+ config: { toolGroups: ['entity', 'web'] },
102
+ });
103
+ store.seedAgent(record);
104
+ const agent = await resolveAgent('configed', {
105
+ agentStore: store,
106
+ parseConfig: (raw) => {
107
+ const c = raw;
108
+ return {
109
+ toolGroups: Array.isArray(c.toolGroups) ? c.toolGroups : undefined,
110
+ };
111
+ },
112
+ });
113
+ expect(agent.config.toolGroups).toEqual(['entity', 'web']);
114
+ });
115
+ });
116
+ //# sourceMappingURL=agent-resolver.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-resolver.test.js","sourceRoot":"","sources":["../../src/agent/agent-resolver.test.ts"],"names":[],"mappings":"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"}