@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
@@ -0,0 +1,14 @@
1
+ import type { ToolDefinition, AgentInfo } from '@sprinterai/core';
2
+ /** Options for creating the delegate tool. */
3
+ export interface CreateDelegateToolOptions {
4
+ /** Available agents that can be delegated to. */
5
+ availableAgents: AgentInfo[];
6
+ /** Function to execute a delegated task. */
7
+ executeDelegate: (agentSlug: string, task: string, context?: string) => Promise<string>;
8
+ }
9
+ /**
10
+ * Create a tool that allows an agent to delegate tasks to other agents.
11
+ * The tool presents available agents and routes the task.
12
+ */
13
+ export declare function createDelegateToAgentTool(options: CreateDelegateToolOptions): ToolDefinition;
14
+ //# sourceMappingURL=delegate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegate.d.ts","sourceRoot":"","sources":["../../src/agent/delegate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAGlE,8CAA8C;AAC9C,MAAM,WAAW,yBAAyB;IACxC,iDAAiD;IACjD,eAAe,EAAE,SAAS,EAAE,CAAC;IAC7B,4CAA4C;IAC5C,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACzF;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,yBAAyB,GAAG,cAAc,CAkC5F"}
@@ -0,0 +1,35 @@
1
+ import { defineTool } from '@sprinterai/core';
2
+ import { z } from 'zod';
3
+ /**
4
+ * Create a tool that allows an agent to delegate tasks to other agents.
5
+ * The tool presents available agents and routes the task.
6
+ */
7
+ export function createDelegateToAgentTool(options) {
8
+ const agentSlugs = options.availableAgents.map((a) => a.id);
9
+ const agentDescriptions = options.availableAgents
10
+ .map((a) => `- ${a.id}: ${a.description}`)
11
+ .join('\n');
12
+ return defineTool({
13
+ slug: 'delegateToAgent',
14
+ name: 'Delegate to Agent',
15
+ description: `Delegate a task to another agent. Available agents:\n${agentDescriptions}`,
16
+ category: 'agent',
17
+ icon: 'users',
18
+ inputSchema: z.object({
19
+ agentSlug: z.string().describe(`Agent to delegate to. Options: ${agentSlugs.join(', ')}`),
20
+ task: z.string().describe('The task or question to delegate'),
21
+ context: z.string().optional().describe('Additional context for the agent'),
22
+ }),
23
+ execute: async (input) => {
24
+ const typed = input;
25
+ if (!agentSlugs.includes(typed.agentSlug)) {
26
+ return {
27
+ error: `Unknown agent: ${typed.agentSlug}. Available: ${agentSlugs.join(', ')}`,
28
+ };
29
+ }
30
+ const result = await options.executeDelegate(typed.agentSlug, typed.task, typed.context);
31
+ return { agentSlug: typed.agentSlug, result };
32
+ },
33
+ });
34
+ }
35
+ //# sourceMappingURL=delegate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegate.js","sourceRoot":"","sources":["../../src/agent/delegate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAkC;IAC1E,MAAM,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5D,MAAM,iBAAiB,GAAG,OAAO,CAAC,eAAe;SAC9C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;SACzC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,UAAU,CAAC;QAChB,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,wDAAwD,iBAAiB,EAAE;QACxF,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzF,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;YAC7D,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,kCAAkC,CAAC;SAC5E,CAAC;QACF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACvB,MAAM,KAAK,GAAG,KAIb,CAAC;YAEF,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC1C,OAAO;oBACL,KAAK,EAAE,kBAAkB,KAAK,CAAC,SAAS,gBAAgB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBAChF,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACzF,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAChD,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=delegate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegate.test.d.ts","sourceRoot":"","sources":["../../src/agent/delegate.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,64 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { createDelegateToAgentTool } from './delegate';
3
+ const agents = [
4
+ {
5
+ id: 'analyst',
6
+ name: 'Analyst',
7
+ description: 'Analyzes data',
8
+ icon: 'chart',
9
+ },
10
+ {
11
+ id: 'researcher',
12
+ name: 'Researcher',
13
+ description: 'Searches the web',
14
+ icon: 'search',
15
+ },
16
+ ];
17
+ describe('createDelegateToAgentTool', () => {
18
+ it('creates a tool with correct slug and category', () => {
19
+ const tool = createDelegateToAgentTool({
20
+ availableAgents: agents,
21
+ executeDelegate: async () => 'done',
22
+ });
23
+ expect(tool.slug).toBe('delegateToAgent');
24
+ expect(tool.category).toBe('agent');
25
+ });
26
+ it('description lists available agents', () => {
27
+ const tool = createDelegateToAgentTool({
28
+ availableAgents: agents,
29
+ executeDelegate: async () => 'done',
30
+ });
31
+ expect(tool.description).toContain('analyst');
32
+ expect(tool.description).toContain('researcher');
33
+ });
34
+ it('delegates to the correct agent', async () => {
35
+ const executeFn = vi.fn().mockResolvedValue('result from analyst');
36
+ const tool = createDelegateToAgentTool({
37
+ availableAgents: agents,
38
+ executeDelegate: executeFn,
39
+ });
40
+ const result = await tool.execute({
41
+ agentSlug: 'analyst',
42
+ task: 'analyze this data',
43
+ context: 'some context',
44
+ });
45
+ expect(executeFn).toHaveBeenCalledWith('analyst', 'analyze this data', 'some context');
46
+ expect(result).toEqual({
47
+ agentSlug: 'analyst',
48
+ result: 'result from analyst',
49
+ });
50
+ });
51
+ it('returns error for unknown agent', async () => {
52
+ const tool = createDelegateToAgentTool({
53
+ availableAgents: agents,
54
+ executeDelegate: async () => 'nope',
55
+ });
56
+ const result = (await tool.execute({
57
+ agentSlug: 'unknown',
58
+ task: 'do something',
59
+ }));
60
+ expect(result.error).toContain('Unknown agent: unknown');
61
+ expect(result.error).toContain('analyst');
62
+ });
63
+ });
64
+ //# sourceMappingURL=delegate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delegate.test.js","sourceRoot":"","sources":["../../src/agent/delegate.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,MAAM,GAAgB;IAC1B;QACE,EAAE,EAAE,SAAS;QACb,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,eAAe;QAC5B,IAAI,EAAE,OAAO;KACd;IACD;QACE,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,kBAAkB;QAC/B,IAAI,EAAE,QAAQ;KACf;CACF,CAAC;AAEF,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,IAAI,GAAG,yBAAyB,CAAC;YACrC,eAAe,EAAE,MAAM;YACvB,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM;SACpC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,IAAI,GAAG,yBAAyB,CAAC;YACrC,eAAe,EAAE,MAAM;YACvB,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM;SACpC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,yBAAyB,CAAC;YACrC,eAAe,EAAE,MAAM;YACvB,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC;YAChC,SAAS,EAAE,SAAS;YACpB,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,cAAc;SACxB,CAAC,CAAC;QAEH,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CAAC,SAAS,EAAE,mBAAmB,EAAE,cAAc,CAAC,CAAC;QACvF,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,SAAS,EAAE,SAAS;YACpB,MAAM,EAAE,qBAAqB;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,IAAI,GAAG,yBAAyB,CAAC;YACrC,eAAe,EAAE,MAAM;YACvB,eAAe,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM;SACpC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC;YACjC,SAAS,EAAE,SAAS;YACpB,IAAI,EAAE,cAAc;SACrB,CAAC,CAAsB,CAAC;QAEzB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,43 @@
1
+ import type { ToolDefinition } from '@sprinterai/core';
2
+ import { streamText } from 'ai';
3
+ import type { LanguageModel } from 'ai';
4
+ import type { PromptSection } from './prompt-builder';
5
+ /** Configuration for agent execution. */
6
+ export interface ExecuteAgentConfig {
7
+ /** The language model to use. */
8
+ model: LanguageModel;
9
+ /** System prompt sections that get composed into the final prompt. */
10
+ systemSections: PromptSection[];
11
+ /** Tools available to the agent. */
12
+ tools?: ToolDefinition[];
13
+ /** Conversation messages. */
14
+ messages: Array<{
15
+ role: 'user' | 'assistant' | 'system';
16
+ content: string;
17
+ }>;
18
+ /** Maximum tool call steps (default: 5). */
19
+ maxSteps?: number;
20
+ /** Temperature (0-1). */
21
+ temperature?: number;
22
+ /** Abort signal. */
23
+ abortSignal?: AbortSignal;
24
+ }
25
+ /** Result from a non-streaming agent execution. */
26
+ export interface ExecuteAgentResult {
27
+ text: string;
28
+ usage: {
29
+ inputTokens: number;
30
+ outputTokens: number;
31
+ };
32
+ }
33
+ /** Convenience re-export of the streamText return type. */
34
+ export type AgentStreamResult = ReturnType<typeof streamText>;
35
+ /**
36
+ * Execute an agent with streaming. Returns the AI SDK stream result.
37
+ */
38
+ export declare function executeAgentStream(config: ExecuteAgentConfig): AgentStreamResult;
39
+ /**
40
+ * Execute an agent without streaming. Returns the complete result.
41
+ */
42
+ export declare function executeAgentGenerate(config: ExecuteAgentConfig): Promise<ExecuteAgentResult>;
43
+ //# sourceMappingURL=execute-agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-agent.d.ts","sourceRoot":"","sources":["../../src/agent/execute-agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,UAAU,EAA6B,MAAM,IAAI,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAW,MAAM,IAAI,CAAC;AAKjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,yCAAyC;AACzC,MAAM,WAAW,kBAAkB;IACjC,iCAAiC;IACjC,KAAK,EAAE,aAAa,CAAC;IACrB,sEAAsE;IACtE,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,oCAAoC;IACpC,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,6BAA6B;IAC7B,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;QACtC,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yBAAyB;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oBAAoB;IACpB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,mDAAmD;AACnD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,2DAA2D;AAC3D,MAAM,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;AAE9D;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,GAAG,iBAAiB,CAahF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAqB7B"}
@@ -0,0 +1,43 @@
1
+ import { streamText, generateText, stepCountIs } from 'ai';
2
+ import { toAIToolSet } from '../tool/ai-bridge';
3
+ import { buildAgentPrompt } from './prompt-builder';
4
+ /**
5
+ * Execute an agent with streaming. Returns the AI SDK stream result.
6
+ */
7
+ export function executeAgentStream(config) {
8
+ const systemPrompt = buildAgentPrompt(config.systemSections);
9
+ const toolSet = config.tools ? toAIToolSet(config.tools) : undefined;
10
+ return streamText({
11
+ model: config.model,
12
+ system: systemPrompt,
13
+ messages: config.messages,
14
+ tools: toolSet,
15
+ stopWhen: stepCountIs(config.maxSteps ?? 5),
16
+ temperature: config.temperature,
17
+ abortSignal: config.abortSignal,
18
+ });
19
+ }
20
+ /**
21
+ * Execute an agent without streaming. Returns the complete result.
22
+ */
23
+ export async function executeAgentGenerate(config) {
24
+ const systemPrompt = buildAgentPrompt(config.systemSections);
25
+ const toolSet = config.tools ? toAIToolSet(config.tools) : undefined;
26
+ const result = await generateText({
27
+ model: config.model,
28
+ system: systemPrompt,
29
+ messages: config.messages,
30
+ tools: toolSet,
31
+ stopWhen: stepCountIs(config.maxSteps ?? 5),
32
+ temperature: config.temperature,
33
+ abortSignal: config.abortSignal,
34
+ });
35
+ return {
36
+ text: result.text,
37
+ usage: {
38
+ inputTokens: result.usage?.inputTokens ?? 0,
39
+ outputTokens: result.usage?.outputTokens ?? 0,
40
+ },
41
+ };
42
+ }
43
+ //# sourceMappingURL=execute-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute-agent.js","sourceRoot":"","sources":["../../src/agent/execute-agent.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAG3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAoCpD;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA0B;IAC3D,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAwB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE1F,OAAO,UAAU,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;QAC3C,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAA0B;IAE1B,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAwB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE1F,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QAChC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,YAAY;QACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;QAC3C,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE;YACL,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,IAAI,CAAC;YAC3C,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC;SAC9C;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ export { buildAgentPrompt } from "./prompt-builder";
2
+ export type { PromptSection } from "./prompt-builder";
3
+ export { AgentRegistry } from "./agent-registry";
4
+ export { resolveAgent } from "./agent-resolver";
5
+ export type { ResolvedAgent, ResolveAgentOptions } from "./agent-resolver";
6
+ export { executeAgentStream, executeAgentGenerate } from "./execute-agent";
7
+ export type { ExecuteAgentConfig, ExecuteAgentResult, AgentStreamResult, } from "./execute-agent";
8
+ export { createDelegateToAgentTool } from "./delegate";
9
+ export type { CreateDelegateToolOptions } from "./delegate";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,YAAY,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,YAAY,EACV,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { buildAgentPrompt } from "./prompt-builder";
2
+ export { AgentRegistry } from "./agent-registry";
3
+ export { resolveAgent } from "./agent-resolver";
4
+ export { executeAgentStream, executeAgentGenerate } from "./execute-agent";
5
+ export { createDelegateToAgentTool } from "./delegate";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAM3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,16 @@
1
+ /** A section of an agent's system prompt. */
2
+ export interface PromptSection {
3
+ /** Short label used as a header (e.g. "Context", "Memory"). */
4
+ label: string;
5
+ /** The section content. */
6
+ content: string;
7
+ /** Higher priority sections appear first. Default: 0. */
8
+ priority?: number;
9
+ }
10
+ /**
11
+ * Build a system prompt from composable sections.
12
+ * Sections are sorted by priority (desc), then joined with headers.
13
+ * Empty-content sections are filtered out.
14
+ */
15
+ export declare function buildAgentPrompt(sections: PromptSection[]): string;
16
+ //# sourceMappingURL=prompt-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/agent/prompt-builder.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,CAiBlE"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Build a system prompt from composable sections.
3
+ * Sections are sorted by priority (desc), then joined with headers.
4
+ * Empty-content sections are filtered out.
5
+ */
6
+ export function buildAgentPrompt(sections) {
7
+ const filtered = sections.filter((s) => s.content && s.content.trim().length > 0);
8
+ if (filtered.length === 0)
9
+ return "";
10
+ const sorted = [...filtered].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
11
+ // If there is only one section, return its content without a header
12
+ if (sorted.length === 1) {
13
+ return sorted[0].content.trim();
14
+ }
15
+ return sorted.map((s) => `## ${s.label}\n\n${s.content.trim()}`).join("\n\n");
16
+ }
17
+ //# sourceMappingURL=prompt-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.js","sourceRoot":"","sources":["../../src/agent/prompt-builder.ts"],"names":[],"mappings":"AAUA;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAyB;IACxD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAChD,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAChD,CAAC;IAEF,oEAAoE;IACpE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prompt-builder.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.test.d.ts","sourceRoot":"","sources":["../../src/agent/prompt-builder.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,60 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { buildAgentPrompt } from './prompt-builder';
3
+ describe('buildAgentPrompt', () => {
4
+ it('returns empty string for no sections', () => {
5
+ expect(buildAgentPrompt([])).toBe('');
6
+ });
7
+ it('returns single section content without header', () => {
8
+ const sections = [
9
+ { label: 'Identity', content: 'You are a helpful assistant.' },
10
+ ];
11
+ expect(buildAgentPrompt(sections)).toBe('You are a helpful assistant.');
12
+ });
13
+ it('sorts sections by priority (desc)', () => {
14
+ const sections = [
15
+ { label: 'Low', content: 'Low priority', priority: 1 },
16
+ { label: 'High', content: 'High priority', priority: 10 },
17
+ { label: 'Medium', content: 'Medium priority', priority: 5 },
18
+ ];
19
+ const result = buildAgentPrompt(sections);
20
+ const highIdx = result.indexOf('High priority');
21
+ const medIdx = result.indexOf('Medium priority');
22
+ const lowIdx = result.indexOf('Low priority');
23
+ expect(highIdx).toBeLessThan(medIdx);
24
+ expect(medIdx).toBeLessThan(lowIdx);
25
+ });
26
+ it('uses section labels as headers', () => {
27
+ const sections = [
28
+ { label: 'Identity', content: 'You are an analyst.', priority: 10 },
29
+ { label: 'Memory', content: 'User prefers tables.', priority: 5 },
30
+ ];
31
+ const result = buildAgentPrompt(sections);
32
+ expect(result).toContain('## Identity');
33
+ expect(result).toContain('## Memory');
34
+ });
35
+ it('filters out empty sections', () => {
36
+ const sections = [
37
+ { label: 'A', content: 'Present' },
38
+ { label: 'B', content: '' },
39
+ { label: 'C', content: ' ' },
40
+ ];
41
+ // Only "A" has content, so it returns without header
42
+ const result = buildAgentPrompt(sections);
43
+ expect(result).toBe('Present');
44
+ expect(result).not.toContain('##');
45
+ });
46
+ it('defaults priority to 0', () => {
47
+ const sections = [
48
+ { label: 'Default', content: 'No priority' },
49
+ { label: 'Explicit', content: 'Has priority', priority: 1 },
50
+ ];
51
+ const result = buildAgentPrompt(sections);
52
+ // Explicit (1) should come before Default (0)
53
+ expect(result.indexOf('Has priority')).toBeLessThan(result.indexOf('No priority'));
54
+ });
55
+ it('trims section content', () => {
56
+ const sections = [{ label: 'Padded', content: ' content with spaces ' }];
57
+ expect(buildAgentPrompt(sections)).toBe('content with spaces');
58
+ });
59
+ });
60
+ //# sourceMappingURL=prompt-builder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.test.js","sourceRoot":"","sources":["../../src/agent/prompt-builder.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { AgentStore, EntityStore, ChatStore, TenantStore, MemoryStore, ToolDefinition } from '@sprinterai/core';
2
+ import type { LanguageModel } from 'ai';
3
+ import type { AgentRegistry } from '../agent/agent-registry';
4
+ import type { ResolvedAgent } from '../agent/agent-resolver';
5
+ import { executeAgentStream } from '../agent/execute-agent';
6
+ import type { PromptSection } from '../agent/prompt-builder';
7
+ /** Context passed to handler hooks. */
8
+ export interface ChatContext {
9
+ agent: ResolvedAgent;
10
+ chatId?: string;
11
+ userId?: string;
12
+ tenantId?: string;
13
+ }
14
+ /** Configuration for creating a chat route handler. */
15
+ export interface ChatHandlerConfig {
16
+ stores: {
17
+ agent: AgentStore;
18
+ entity: EntityStore;
19
+ chat: ChatStore;
20
+ tenant: TenantStore;
21
+ memory: MemoryStore;
22
+ };
23
+ defaultAgentSlug: string;
24
+ resolveModel: (modelId: string) => LanguageModel;
25
+ agentRegistry?: AgentRegistry;
26
+ hooks?: {
27
+ buildExtraSections?: (ctx: ChatContext) => Promise<PromptSection[]>;
28
+ buildExtraTools?: (ctx: ChatContext) => Promise<ToolDefinition[]>;
29
+ onToolResult?: (name: string, result: unknown, ctx: ChatContext) => Promise<void>;
30
+ };
31
+ }
32
+ /** Request shape for the chat handler. */
33
+ export interface ChatRequest {
34
+ messages: Array<{
35
+ role?: string;
36
+ content?: string;
37
+ sender_type?: string;
38
+ parts?: unknown[];
39
+ }>;
40
+ agentSlug?: string;
41
+ chatId?: string;
42
+ userId?: string;
43
+ tenantId?: string;
44
+ }
45
+ /** Chat handler returned by the factory. */
46
+ export interface ChatHandler {
47
+ handle(request: ChatRequest): Promise<{
48
+ stream: ReturnType<typeof executeAgentStream>;
49
+ agent: ResolvedAgent;
50
+ }>;
51
+ }
52
+ /**
53
+ * Factory: create a chat route handler with all dependencies injected.
54
+ *
55
+ * Usage:
56
+ * ```ts
57
+ * const handler = createChatRouteHandler(config);
58
+ * const { stream, agent } = await handler.handle(request);
59
+ * return stream.toDataStreamResponse();
60
+ * ```
61
+ */
62
+ export declare function createChatRouteHandler(config: ChatHandlerConfig): ChatHandler;
63
+ //# sourceMappingURL=chat-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-handler.d.ts","sourceRoot":"","sources":["../../src/chat/chat-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,WAAW,EACX,cAAc,EACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAExC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,KAAK,EAAE,aAAa,EAAuB,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAI7D,uCAAuC;AACvC,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE;QACN,KAAK,EAAE,UAAU,CAAC;QAClB,MAAM,EAAE,WAAW,CAAC;QACpB,IAAI,EAAE,SAAS,CAAC;QAChB,MAAM,EAAE,WAAW,CAAC;QACpB,MAAM,EAAE,WAAW,CAAC;KACrB,CAAC;IACF,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,aAAa,CAAC;IACjD,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,KAAK,CAAC,EAAE;QACN,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QACpE,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QAClE,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACnF,CAAC;CACH;AAED,0CAA0C;AAC1C,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;KACnB,CAAC,CAAC;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,4CAA4C;AAC5C,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC;QACpC,MAAM,EAAE,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;QAC9C,KAAK,EAAE,aAAa,CAAC;KACtB,CAAC,CAAC;CACJ;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAqE7E"}
@@ -0,0 +1,74 @@
1
+ import { resolveAgent } from '../agent/agent-resolver';
2
+ import { executeAgentStream } from '../agent/execute-agent';
3
+ import { toAIMessages, validateMessage } from './message-utils';
4
+ /**
5
+ * Factory: create a chat route handler with all dependencies injected.
6
+ *
7
+ * Usage:
8
+ * ```ts
9
+ * const handler = createChatRouteHandler(config);
10
+ * const { stream, agent } = await handler.handle(request);
11
+ * return stream.toDataStreamResponse();
12
+ * ```
13
+ */
14
+ export function createChatRouteHandler(config) {
15
+ return {
16
+ async handle(request) {
17
+ // Validate messages
18
+ if (!request.messages || request.messages.length === 0) {
19
+ throw new Error('Messages are required');
20
+ }
21
+ const lastMsg = request.messages[request.messages.length - 1];
22
+ const validation = validateMessage(lastMsg);
23
+ if (!validation.valid) {
24
+ throw new Error(`Invalid message: ${validation.error}`);
25
+ }
26
+ // Resolve agent
27
+ const agentSlug = request.agentSlug ?? config.defaultAgentSlug;
28
+ const resolveOptions = {
29
+ agentRegistry: config.agentRegistry,
30
+ agentStore: config.stores.agent,
31
+ };
32
+ const agent = await resolveAgent(agentSlug, resolveOptions);
33
+ const ctx = {
34
+ agent,
35
+ chatId: request.chatId,
36
+ userId: request.userId,
37
+ tenantId: request.tenantId,
38
+ };
39
+ // Build system prompt sections
40
+ const systemSections = [
41
+ {
42
+ label: 'Identity',
43
+ content: agent.systemPrompt,
44
+ priority: 100,
45
+ },
46
+ ];
47
+ // Add extra sections from hook
48
+ if (config.hooks?.buildExtraSections) {
49
+ const extra = await config.hooks.buildExtraSections(ctx);
50
+ systemSections.push(...extra);
51
+ }
52
+ // Collect tools
53
+ const tools = [];
54
+ if (config.hooks?.buildExtraTools) {
55
+ const extraTools = await config.hooks.buildExtraTools(ctx);
56
+ tools.push(...extraTools);
57
+ }
58
+ // Resolve model
59
+ const modelId = agent.model ?? 'default';
60
+ const model = config.resolveModel(modelId);
61
+ // Convert messages
62
+ const aiMessages = toAIMessages(request.messages);
63
+ // Execute
64
+ const stream = executeAgentStream({
65
+ model,
66
+ systemSections,
67
+ tools: tools.length > 0 ? tools : undefined,
68
+ messages: aiMessages,
69
+ });
70
+ return { stream, agent };
71
+ },
72
+ };
73
+ }
74
+ //# sourceMappingURL=chat-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-handler.js","sourceRoot":"","sources":["../../src/chat/chat-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chat-handler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-handler.test.d.ts","sourceRoot":"","sources":["../../src/chat/chat-handler.test.ts"],"names":[],"mappings":""}