dexto 1.1.10 → 1.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 (181) hide show
  1. package/README.md +222 -84
  2. package/dist/agents/agent-registry.json +39 -1
  3. package/dist/agents/agent-template.yml +1 -1
  4. package/dist/agents/coding-agent/README.md +188 -0
  5. package/dist/agents/coding-agent/coding-agent.yml +203 -0
  6. package/dist/agents/database-agent/database-agent.yml +44 -2
  7. package/dist/agents/default-agent.yml +137 -13
  8. package/dist/agents/github-agent/github-agent.yml +42 -0
  9. package/dist/agents/image-editor-agent/image-editor-agent.yml +9 -2
  10. package/dist/agents/music-agent/README.md +1 -1
  11. package/dist/agents/music-agent/music-agent.yml +36 -2
  12. package/dist/agents/nano-banana-agent/nano-banana-agent.yml +35 -1
  13. package/dist/agents/podcast-agent/README.md +1 -1
  14. package/dist/agents/podcast-agent/podcast-agent.yml +37 -3
  15. package/dist/agents/product-name-researcher/product-name-researcher.yml +37 -1
  16. package/dist/agents/sora-video-agent/README.md +122 -0
  17. package/dist/agents/sora-video-agent/sora-video-agent.yml +98 -0
  18. package/dist/agents/talk2pdf-agent/talk2pdf-agent.yml +17 -2
  19. package/dist/agents/triage-demo/README.md +6 -6
  20. package/dist/agents/triage-demo/billing-agent.yml +1 -1
  21. package/dist/agents/triage-demo/escalation-agent.yml +1 -1
  22. package/dist/agents/triage-demo/product-info-agent.yml +1 -1
  23. package/dist/agents/triage-demo/technical-support-agent.yml +1 -1
  24. package/dist/agents/triage-demo/triage-agent.yml +16 -1
  25. package/dist/analytics/wrapper.d.ts.map +1 -1
  26. package/dist/analytics/wrapper.js +5 -3
  27. package/dist/api/a2a.d.ts +2 -2
  28. package/dist/api/a2a.d.ts.map +1 -1
  29. package/dist/api/a2a.js +3 -2
  30. package/dist/api/mcp/mcp_handler.d.ts +3 -3
  31. package/dist/api/mcp/mcp_handler.d.ts.map +1 -1
  32. package/dist/api/mcp/mcp_handler.js +7 -4
  33. package/dist/api/mcp/tool-aggregation-handler.d.ts.map +1 -1
  34. package/dist/api/mcp/tool-aggregation-handler.js +34 -42
  35. package/dist/api/memory/memory-handler.d.ts +18 -0
  36. package/dist/api/memory/memory-handler.d.ts.map +1 -0
  37. package/dist/api/memory/memory-handler.js +137 -0
  38. package/dist/api/middleware/errorHandler.d.ts.map +1 -1
  39. package/dist/api/middleware/errorHandler.js +2 -0
  40. package/dist/api/server.d.ts +2 -2
  41. package/dist/api/server.d.ts.map +1 -1
  42. package/dist/api/server.js +1129 -257
  43. package/dist/api/webhook-subscriber.d.ts.map +1 -1
  44. package/dist/api/webhook-subscriber.js +2 -1
  45. package/dist/api/websocket-subscriber.d.ts.map +1 -1
  46. package/dist/api/websocket-subscriber.js +67 -10
  47. package/dist/cli/cli-subscriber.d.ts +2 -1
  48. package/dist/cli/cli-subscriber.d.ts.map +1 -1
  49. package/dist/cli/cli-subscriber.js +11 -3
  50. package/dist/cli/cli.d.ts.map +1 -1
  51. package/dist/cli/cli.js +1 -0
  52. package/dist/cli/commands/install.d.ts +3 -3
  53. package/dist/cli/commands/install.d.ts.map +1 -1
  54. package/dist/cli/commands/install.js +223 -41
  55. package/dist/cli/commands/interactive-commands/model/model-commands.js +2 -2
  56. package/dist/cli/commands/interactive-commands/prompt-commands.d.ts +8 -1
  57. package/dist/cli/commands/interactive-commands/prompt-commands.d.ts.map +1 -1
  58. package/dist/cli/commands/interactive-commands/prompt-commands.js +252 -4
  59. package/dist/cli/commands/list-agents.d.ts.map +1 -1
  60. package/dist/cli/commands/list-agents.js +22 -3
  61. package/dist/cli/commands/setup.d.ts +4 -4
  62. package/dist/cli/commands/uninstall.d.ts +1 -1
  63. package/dist/cli/tool-confirmation/cli-confirmation-handler.d.ts +36 -7
  64. package/dist/cli/tool-confirmation/cli-confirmation-handler.d.ts.map +1 -1
  65. package/dist/cli/tool-confirmation/cli-confirmation-handler.js +314 -34
  66. package/dist/cli/utils/options.js +2 -2
  67. package/dist/index.js +117 -64
  68. package/dist/webui/.next/standalone/.next/static/chunks/419-6d449dcb2b056299.js +1 -0
  69. package/dist/webui/.next/standalone/.next/static/chunks/614-3519f8a6051e0088.js +1 -0
  70. package/dist/webui/.next/standalone/.next/static/chunks/656-5a9f6405badf66a8.js +25 -0
  71. package/dist/webui/.next/standalone/.next/static/chunks/765-755286dc586b1a51.js +1 -0
  72. package/dist/webui/.next/standalone/.next/static/chunks/804-f40df92a3adffcc0.js +1 -0
  73. package/dist/webui/.next/standalone/.next/static/chunks/854-232126f3c77e6c0b.js +1 -0
  74. package/dist/webui/.next/standalone/.next/static/chunks/app/chat/[sessionId]/page-a695b09e6bac5274.js +1 -0
  75. package/dist/webui/.next/standalone/.next/static/chunks/app/layout-f4a6ee5a028899d1.js +1 -0
  76. package/dist/webui/.next/standalone/.next/static/chunks/app/page-d1f127a0cac96246.js +1 -0
  77. package/dist/webui/.next/standalone/.next/static/chunks/app/playground/page-6f8d2abe76e51dfc.js +1 -0
  78. package/dist/webui/.next/standalone/.next/static/chunks/main-7decd42f62688419.js +1 -0
  79. package/dist/webui/.next/standalone/.next/static/chunks/{webpack-7c234e7e7e272295.js → webpack-7229fd0786f0483c.js} +1 -1
  80. package/dist/webui/.next/standalone/.next/static/css/c3c26ec984df1deb.css +1 -0
  81. package/dist/webui/.next/standalone/.next/static/css/de70bee13400563f.css +1 -0
  82. package/dist/webui/.next/standalone/.next/static/uqfH8SY_uhwdc0ZkpMwCO/_buildManifest.js +1 -0
  83. package/dist/webui/.next/standalone/package.json +7 -2
  84. package/dist/webui/.next/standalone/packages/webui/.next/BUILD_ID +1 -1
  85. package/dist/webui/.next/standalone/packages/webui/.next/app-build-manifest.json +30 -15
  86. package/dist/webui/.next/standalone/packages/webui/.next/app-path-routes-manifest.json +1 -0
  87. package/dist/webui/.next/standalone/packages/webui/.next/build-manifest.json +7 -7
  88. package/dist/webui/.next/standalone/packages/webui/.next/prerender-manifest.json +3 -3
  89. package/dist/webui/.next/standalone/packages/webui/.next/required-server-files.json +1 -11
  90. package/dist/webui/.next/standalone/packages/webui/.next/routes-manifest.json +11 -8
  91. package/dist/webui/.next/standalone/packages/webui/.next/server/app/_not-found/page.js +1 -1
  92. package/dist/webui/.next/standalone/packages/webui/.next/server/app/_not-found/page.js.nft.json +1 -1
  93. package/dist/webui/.next/standalone/packages/webui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  94. package/dist/webui/.next/standalone/packages/webui/.next/server/app/chat/[sessionId]/page.js +2 -0
  95. package/dist/webui/.next/standalone/packages/webui/.next/server/app/chat/[sessionId]/page.js.nft.json +1 -0
  96. package/dist/webui/.next/standalone/packages/webui/.next/server/app/chat/[sessionId]/page_client-reference-manifest.js +1 -0
  97. package/dist/webui/.next/standalone/packages/webui/.next/server/app/page.js +2 -11
  98. package/dist/webui/.next/standalone/packages/webui/.next/server/app/page.js.nft.json +1 -1
  99. package/dist/webui/.next/standalone/packages/webui/.next/server/app/page_client-reference-manifest.js +1 -1
  100. package/dist/webui/.next/standalone/packages/webui/.next/server/app/playground/page.js +4 -8
  101. package/dist/webui/.next/standalone/packages/webui/.next/server/app/playground/page.js.nft.json +1 -1
  102. package/dist/webui/.next/standalone/packages/webui/.next/server/app/playground/page_client-reference-manifest.js +1 -1
  103. package/dist/webui/.next/standalone/packages/webui/.next/server/app-paths-manifest.json +1 -0
  104. package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/1.js +12 -0
  105. package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/102.js +25 -0
  106. package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/383.js +1 -0
  107. package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/{619.js → 426.js} +2 -2
  108. package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/43.js +1 -1
  109. package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/985.js +5 -0
  110. package/dist/webui/.next/standalone/packages/webui/.next/server/middleware-build-manifest.js +1 -1
  111. package/dist/webui/.next/standalone/packages/webui/.next/server/pages/500.html +1 -1
  112. package/dist/webui/.next/standalone/packages/webui/.next/server/server-reference-manifest.json +1 -1
  113. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/419-6d449dcb2b056299.js +1 -0
  114. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/614-3519f8a6051e0088.js +1 -0
  115. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/656-5a9f6405badf66a8.js +25 -0
  116. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/765-755286dc586b1a51.js +1 -0
  117. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/804-f40df92a3adffcc0.js +1 -0
  118. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/854-232126f3c77e6c0b.js +1 -0
  119. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/chat/[sessionId]/page-a695b09e6bac5274.js +1 -0
  120. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/layout-f4a6ee5a028899d1.js +1 -0
  121. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/page-d1f127a0cac96246.js +1 -0
  122. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/playground/page-6f8d2abe76e51dfc.js +1 -0
  123. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/main-7decd42f62688419.js +1 -0
  124. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/{webpack-7c234e7e7e272295.js → webpack-7229fd0786f0483c.js} +1 -1
  125. package/dist/webui/.next/standalone/packages/webui/.next/static/css/c3c26ec984df1deb.css +1 -0
  126. package/dist/webui/.next/standalone/packages/webui/.next/static/css/de70bee13400563f.css +1 -0
  127. package/dist/webui/.next/standalone/packages/webui/.next/static/uqfH8SY_uhwdc0ZkpMwCO/_buildManifest.js +1 -0
  128. package/dist/webui/.next/standalone/packages/webui/package.json +11 -4
  129. package/dist/webui/.next/standalone/packages/webui/server.js +1 -1
  130. package/dist/webui/.next/static/chunks/419-6d449dcb2b056299.js +1 -0
  131. package/dist/webui/.next/static/chunks/614-3519f8a6051e0088.js +1 -0
  132. package/dist/webui/.next/static/chunks/656-5a9f6405badf66a8.js +25 -0
  133. package/dist/webui/.next/static/chunks/765-755286dc586b1a51.js +1 -0
  134. package/dist/webui/.next/static/chunks/804-f40df92a3adffcc0.js +1 -0
  135. package/dist/webui/.next/static/chunks/854-232126f3c77e6c0b.js +1 -0
  136. package/dist/webui/.next/static/chunks/app/chat/[sessionId]/page-a695b09e6bac5274.js +1 -0
  137. package/dist/webui/.next/static/chunks/app/layout-f4a6ee5a028899d1.js +1 -0
  138. package/dist/webui/.next/static/chunks/app/page-d1f127a0cac96246.js +1 -0
  139. package/dist/webui/.next/static/chunks/app/playground/page-6f8d2abe76e51dfc.js +1 -0
  140. package/dist/webui/.next/static/chunks/main-7decd42f62688419.js +1 -0
  141. package/dist/webui/.next/static/chunks/{webpack-7c234e7e7e272295.js → webpack-7229fd0786f0483c.js} +1 -1
  142. package/dist/webui/.next/static/css/c3c26ec984df1deb.css +1 -0
  143. package/dist/webui/.next/static/css/de70bee13400563f.css +1 -0
  144. package/dist/webui/.next/static/uqfH8SY_uhwdc0ZkpMwCO/_buildManifest.js +1 -0
  145. package/dist/webui/package.json +11 -4
  146. package/package.json +5 -4
  147. package/dist/webui/.next/standalone/.next/static/PvkEd_BO6ZXxX99T_gUvs/_buildManifest.js +0 -1
  148. package/dist/webui/.next/standalone/.next/static/chunks/179-78abc2eacbc41da9.js +0 -1
  149. package/dist/webui/.next/standalone/.next/static/chunks/442-b1916bec348454b3.js +0 -1
  150. package/dist/webui/.next/standalone/.next/static/chunks/544-c4a8f278ed1a25d7.js +0 -1
  151. package/dist/webui/.next/standalone/.next/static/chunks/854-2a6d5a5297a15d52.js +0 -1
  152. package/dist/webui/.next/standalone/.next/static/chunks/app/layout-dde711766eda096b.js +0 -1
  153. package/dist/webui/.next/standalone/.next/static/chunks/app/page-5e94d5a49dc718d0.js +0 -1
  154. package/dist/webui/.next/standalone/.next/static/chunks/app/playground/page-9ae40e0b219583e3.js +0 -1
  155. package/dist/webui/.next/standalone/.next/static/chunks/main-b65ece3506a2355c.js +0 -1
  156. package/dist/webui/.next/standalone/.next/static/css/045cc65741e38fbd.css +0 -3
  157. package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/549.js +0 -1
  158. package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/950.js +0 -5
  159. package/dist/webui/.next/standalone/packages/webui/.next/static/PvkEd_BO6ZXxX99T_gUvs/_buildManifest.js +0 -1
  160. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/179-78abc2eacbc41da9.js +0 -1
  161. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/442-b1916bec348454b3.js +0 -1
  162. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/544-c4a8f278ed1a25d7.js +0 -1
  163. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/854-2a6d5a5297a15d52.js +0 -1
  164. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/layout-dde711766eda096b.js +0 -1
  165. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/page-5e94d5a49dc718d0.js +0 -1
  166. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/playground/page-9ae40e0b219583e3.js +0 -1
  167. package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/main-b65ece3506a2355c.js +0 -1
  168. package/dist/webui/.next/standalone/packages/webui/.next/static/css/045cc65741e38fbd.css +0 -3
  169. package/dist/webui/.next/static/PvkEd_BO6ZXxX99T_gUvs/_buildManifest.js +0 -1
  170. package/dist/webui/.next/static/chunks/179-78abc2eacbc41da9.js +0 -1
  171. package/dist/webui/.next/static/chunks/442-b1916bec348454b3.js +0 -1
  172. package/dist/webui/.next/static/chunks/544-c4a8f278ed1a25d7.js +0 -1
  173. package/dist/webui/.next/static/chunks/854-2a6d5a5297a15d52.js +0 -1
  174. package/dist/webui/.next/static/chunks/app/layout-dde711766eda096b.js +0 -1
  175. package/dist/webui/.next/static/chunks/app/page-5e94d5a49dc718d0.js +0 -1
  176. package/dist/webui/.next/static/chunks/app/playground/page-9ae40e0b219583e3.js +0 -1
  177. package/dist/webui/.next/static/chunks/main-b65ece3506a2355c.js +0 -1
  178. package/dist/webui/.next/static/css/045cc65741e38fbd.css +0 -3
  179. /package/dist/webui/.next/standalone/.next/static/{PvkEd_BO6ZXxX99T_gUvs → uqfH8SY_uhwdc0ZkpMwCO}/_ssgManifest.js +0 -0
  180. /package/dist/webui/.next/standalone/packages/webui/.next/static/{PvkEd_BO6ZXxX99T_gUvs → uqfH8SY_uhwdc0ZkpMwCO}/_ssgManifest.js +0 -0
  181. /package/dist/webui/.next/static/{PvkEd_BO6ZXxX99T_gUvs → uqfH8SY_uhwdc0ZkpMwCO}/_ssgManifest.js +0 -0
package/dist/api/a2a.js CHANGED
@@ -2,10 +2,11 @@ import { logger } from '@dexto/core';
2
2
  /**
3
3
  * Sets up the A2A Agent Card endpoint.
4
4
  * @param app Express application instance.
5
- * @param agentCardData The agent card data object.
5
+ * @param getAgentCard Getter function that returns the current agent card.
6
6
  */
7
- export function setupA2ARoutes(app, agentCardData) {
7
+ export function setupA2ARoutes(app, getAgentCard) {
8
8
  app.get('/.well-known/agent.json', (_req, res) => {
9
+ const agentCardData = getAgentCard();
9
10
  res.setHeader('Content-Type', 'application/json');
10
11
  res.status(200).send(JSON.stringify(agentCardData, null, 2));
11
12
  });
@@ -6,13 +6,13 @@ import { DextoAgent } from '@dexto/core';
6
6
  export type McpTransportType = 'stdio' | 'sse' | 'http';
7
7
  export declare function createMcpTransport(transportType?: McpTransportType): Promise<Transport>;
8
8
  /** Initializes MCP server, its tools, resources, and connects to the transport */
9
- export declare function initializeMcpServer(agent: DextoAgent, agentCardData: AgentCard, mcpTransport: Transport): Promise<McpServer>;
9
+ export declare function initializeMcpServer(getAgent: () => DextoAgent, getAgentCard: () => AgentCard, mcpTransport: Transport): Promise<McpServer>;
10
10
  /**
11
11
  * Initializes the Agent Card resource for the MCP server.
12
12
  * @param mcpServer - The MCP server instance.
13
- * @param agentCardData - The agent card data to be registered as an MCP resource.
13
+ * @param getAgentCard - Getter function that returns the current agent card.
14
14
  */
15
- export declare function initializeAgentCardResource(mcpServer: McpServer, agentCardData: AgentCard): Promise<void>;
15
+ export declare function initializeAgentCardResource(mcpServer: McpServer, getAgentCard: () => AgentCard): Promise<void>;
16
16
  /**
17
17
  * Initializes and sets up the MCP HTTP endpoints.
18
18
  */
@@ -1 +1 @@
1
- {"version":3,"file":"mcp_handler.d.ts","sourceRoot":"","sources":["../../../src/api/mcp/mcp_handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAExD,wBAAsB,kBAAkB,CACpC,aAAa,GAAE,gBAAyB,GACzC,OAAO,CAAC,SAAS,CAAC,CAsBpB;AAED,kFAAkF;AAClF,wBAAsB,mBAAmB,CACrC,KAAK,EAAE,UAAU,EACjB,aAAa,EAAE,SAAS,EACxB,YAAY,EAAE,SAAS,GACxB,OAAO,CAAC,SAAS,CAAC,CAyCpB;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC7C,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,SAAS,GACzB,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED;;GAEG;AACH,wBAAsB,+BAA+B,CACjD,GAAG,EAAE,OAAO,EACZ,YAAY,EAAE,SAAS,GACxB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
1
+ {"version":3,"file":"mcp_handler.d.ts","sourceRoot":"","sources":["../../../src/api/mcp/mcp_handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAExD,wBAAsB,kBAAkB,CACpC,aAAa,GAAE,gBAAyB,GACzC,OAAO,CAAC,SAAS,CAAC,CAsBpB;AAED,kFAAkF;AAClF,wBAAsB,mBAAmB,CACrC,QAAQ,EAAE,MAAM,UAAU,EAC1B,YAAY,EAAE,MAAM,SAAS,EAC7B,YAAY,EAAE,SAAS,GACxB,OAAO,CAAC,SAAS,CAAC,CA2CpB;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC7C,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,MAAM,SAAS,GAC9B,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED;;GAEG;AACH,wBAAsB,+BAA+B,CACjD,GAAG,EAAE,OAAO,EACZ,YAAY,EAAE,SAAS,GACxB,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -24,7 +24,8 @@ export async function createMcpTransport(transportType = 'http') {
24
24
  }
25
25
  }
26
26
  /** Initializes MCP server, its tools, resources, and connects to the transport */
27
- export async function initializeMcpServer(agent, agentCardData, mcpTransport) {
27
+ export async function initializeMcpServer(getAgent, getAgentCard, mcpTransport) {
28
+ const agentCardData = getAgentCard();
28
29
  const mcpServer = new McpServer({ name: agentCardData.name, version: agentCardData.version }, {
29
30
  capabilities: {
30
31
  resources: {}, // Declare resource capability
@@ -35,6 +36,7 @@ export async function initializeMcpServer(agent, agentCardData, mcpTransport) {
35
36
  const toolDescription = 'Allows you to chat with the an AI agent. Send a message to interact.';
36
37
  mcpServer.tool(toolName, toolDescription, { message: z.string() }, // Input schema for the tool
37
38
  async ({ message }) => {
39
+ const agent = getAgent();
38
40
  logger.info(`MCP tool '${toolName}' received message: ${message.substring(0, 100)}${message.length > 100 ? '...' : ''}`);
39
41
  const text = await agent.run(message);
40
42
  logger.info(`MCP tool '${toolName}' sending response: ${text?.substring(0, 100)}${(text?.length ?? 0) > 100 ? '...' : ''}`);
@@ -42,7 +44,7 @@ export async function initializeMcpServer(agent, agentCardData, mcpTransport) {
42
44
  });
43
45
  logger.info(`Registered MCP tool: '${toolName}' with description: "${toolDescription.substring(0, 70)}..."`);
44
46
  // Register Agent Card data as an MCP Resource
45
- await initializeAgentCardResource(mcpServer, agentCardData);
47
+ await initializeAgentCardResource(mcpServer, getAgentCard);
46
48
  // Connect server to transport AFTER all registrations
47
49
  logger.info(`Initializing MCP protocol server connection...`);
48
50
  await mcpServer.connect(mcpTransport);
@@ -52,13 +54,14 @@ export async function initializeMcpServer(agent, agentCardData, mcpTransport) {
52
54
  /**
53
55
  * Initializes the Agent Card resource for the MCP server.
54
56
  * @param mcpServer - The MCP server instance.
55
- * @param agentCardData - The agent card data to be registered as an MCP resource.
57
+ * @param getAgentCard - Getter function that returns the current agent card.
56
58
  */
57
- export async function initializeAgentCardResource(mcpServer, agentCardData) {
59
+ export async function initializeAgentCardResource(mcpServer, getAgentCard) {
58
60
  const agentCardResourceProgrammaticName = 'agentCard';
59
61
  const agentCardResourceUri = 'dexto://agent/card';
60
62
  try {
61
63
  const readCallback = async (uri, _extra) => {
64
+ const agentCardData = getAgentCard();
62
65
  logger.info(`MCP client requesting resource at ${uri.href}`);
63
66
  return {
64
67
  contents: [
@@ -1 +1 @@
1
- {"version":3,"file":"tool-aggregation-handler.d.ts","sourceRoot":"","sources":["../../../src/api/mcp/tool-aggregation-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAAsB,KAAK,sBAAsB,EAAwB,MAAM,aAAa,CAAC;AAEpG;;;GAGG;AACH,wBAAsB,kCAAkC,CACpD,aAAa,EAAE,sBAAsB,EACrC,YAAY,EAAE,SAAS,EACvB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,OAAO,GACjB,OAAO,CAAC,SAAS,CAAC,CAmHpB"}
1
+ {"version":3,"file":"tool-aggregation-handler.d.ts","sourceRoot":"","sources":["../../../src/api/mcp/tool-aggregation-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+CAA+C,CAAC;AAC/E,OAAO,EAAsB,KAAK,sBAAsB,EAAwB,MAAM,aAAa,CAAC;AAGpG;;;GAGG;AACH,wBAAsB,kCAAkC,CACpD,aAAa,EAAE,sBAAsB,EACrC,YAAY,EAAE,SAAS,EACvB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,OAAO,GACjB,OAAO,CAAC,SAAS,CAAC,CAgGpB"}
@@ -1,5 +1,6 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import { MCPManager, logger, jsonSchemaToZodShape } from '@dexto/core';
3
+ import { z } from 'zod';
3
4
  /**
4
5
  * Initializes MCP server for tool aggregation mode.
5
6
  * Instead of exposing an AI agent, this directly exposes all tools from connected MCP servers.
@@ -18,54 +19,42 @@ export async function initializeMcpToolAggregationServer(serverConfigs, mcpTrans
18
19
  prompts: {},
19
20
  },
20
21
  });
21
- // Get all tools from connected servers and register them
22
- // TODO: Temporary hacky solution to get the tools from the connected servers, directly using the MCP Client to preserve types
23
- // TODO: We should use the MCPManager or MCPClient instead of directly interacting with the raw client to get the tools, but we lose type information and it becomes any type which is hard to work with
24
- const mcpClientsMap = mcpManager.getClients();
22
+ const toolDefinitions = await mcpManager.getAllTools();
25
23
  let toolCount = 0;
26
- for (const [clientName, client] of mcpClientsMap.entries()) {
27
- // Get the actual MCP Client
28
- const connectedClient = await client.getConnectedClient();
29
- // Get the tools from the MCP client
30
- const mcpTools = await connectedClient.listTools({});
31
- logger.debug(`MCP client name: ${clientName}`);
32
- logger.debug(`MCP client tools: ${JSON.stringify(mcpTools, null, 2)}`);
33
- // TODO: Handle tool name/server name/prompt name collisions properly
34
- for (const tool of mcpTools.tools) {
35
- toolCount++;
36
- logger.debug(`Registering tool: ${tool.name}`);
37
- // Convert JSON Schema to Zod raw shape
38
- const zodShape = jsonSchemaToZodShape(tool.inputSchema);
39
- // Log the tool schema to debug the issue (safely handle Zod schema circular references)
40
- logger.debug(`Tool ${tool.name} original inputSchema: ${JSON.stringify(tool.inputSchema, null, 2)}`);
41
- mcpServer.tool(tool.name, tool.description || `Tool: ${tool.name}`, zodShape, async (args) => {
42
- logger.info(`Tool aggregation: executing ${tool.name} with args: ${JSON.stringify(args)}`);
43
- try {
44
- const result = await mcpManager.executeTool(tool.name, args);
45
- logger.info(`Tool aggregation: ${tool.name} completed successfully`);
46
- return result;
47
- }
48
- catch (error) {
49
- logger.error(`Tool aggregation: ${tool.name} failed: ${error}`);
50
- throw error;
51
- }
52
- });
53
- }
24
+ for (const [toolName, toolDef] of Object.entries(toolDefinitions)) {
25
+ toolCount++;
26
+ const jsonSchema = toolDef.parameters ?? { type: 'object', properties: {} };
27
+ const paramsShape = jsonSchemaToZodShape(jsonSchema);
28
+ const _paramsSchema = z.object(paramsShape);
29
+ logger.debug(`Registering tool '${toolName}' with schema: ${JSON.stringify(jsonSchema)}`);
30
+ mcpServer.tool(toolName, toolDef.description || `Tool: ${toolName}`, paramsShape, async (args) => {
31
+ logger.info(`Tool aggregation: executing ${toolName}`);
32
+ try {
33
+ const result = await mcpManager.executeTool(toolName, args);
34
+ logger.info(`Tool aggregation: ${toolName} completed successfully`);
35
+ return result;
36
+ }
37
+ catch (error) {
38
+ logger.error(`Tool aggregation: ${toolName} failed: ${error}`);
39
+ throw error;
40
+ }
41
+ });
54
42
  }
55
43
  logger.info(`Registered ${toolCount} tools from connected MCP servers`);
56
44
  // Register resources if available
57
45
  try {
58
46
  const allResources = await mcpManager.listAllResources();
59
47
  logger.info(`Registering ${allResources.length} resources from connected MCP servers`);
60
- // TODO: Properly handle resource name collisions by prefixing with client name
61
- let resourceIndex = 0;
62
- for (const resourceUri of allResources) {
63
- mcpServer.resource(`resource_${resourceIndex}_${resourceUri.replace(/[^a-zA-Z0-9]/g, '_')}`, resourceUri, async (uri) => {
64
- logger.info(`Resource aggregation: reading ${uri.href}`);
65
- return await mcpManager.readResource(uri.href);
48
+ // Collision handling verified:
49
+ // - Tools/Prompts: Names come from mcpManager which handles collisions at source
50
+ // - Resources: Index prefix ensures uniqueness even if multiple clients have same key
51
+ allResources.forEach((resource, index) => {
52
+ const safeId = resource.key.replace(/[^a-zA-Z0-9]/g, '_');
53
+ mcpServer.resource(`resource_${index}_${safeId}`, resource.key, async () => {
54
+ logger.info(`Resource aggregation: reading ${resource.key}`);
55
+ return await mcpManager.readResource(resource.key);
66
56
  });
67
- resourceIndex++;
68
- }
57
+ });
69
58
  }
70
59
  catch (error) {
71
60
  logger.debug(`Skipping resource aggregation: ${error}`);
@@ -76,8 +65,11 @@ export async function initializeMcpToolAggregationServer(serverConfigs, mcpTrans
76
65
  logger.info(`Registering ${allPrompts.length} prompts from connected MCP servers`);
77
66
  for (const promptName of allPrompts) {
78
67
  mcpServer.prompt(promptName, `Prompt: ${promptName}`, async (extra) => {
79
- logger.info(`Prompt aggregation: getting ${promptName} with args: ${JSON.stringify(extra)}`);
80
- return await mcpManager.getPrompt(promptName, {});
68
+ logger.info(`Prompt aggregation: resolving ${promptName}`);
69
+ const promptArgs = extra && 'arguments' in extra
70
+ ? extra.arguments
71
+ : undefined;
72
+ return await mcpManager.getPrompt(promptName, promptArgs);
81
73
  });
82
74
  }
83
75
  }
@@ -0,0 +1,18 @@
1
+ import { Router } from 'express';
2
+ import type { DextoAgent } from '@dexto/core';
3
+ /**
4
+ * Setup memory API routes
5
+ * Provides CRUD operations for user memories
6
+ *
7
+ * Uses a getter function to ensure memory operations always use the current agent,
8
+ * even after agent switches in web/server modes.
9
+ *
10
+ * Routes:
11
+ * - POST /api/memory - Create a new memory
12
+ * - GET /api/memory - List all memories (with optional filters)
13
+ * - GET /api/memory/:id - Get a specific memory
14
+ * - PUT /api/memory/:id - Update a memory
15
+ * - DELETE /api/memory/:id - Delete a memory
16
+ */
17
+ export declare function setupMemoryRoutes(getAgent: () => DextoAgent): Router;
18
+ //# sourceMappingURL=memory-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-handler.d.ts","sourceRoot":"","sources":["../../../src/api/memory/memory-handler.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,MAAM,EAAkD,MAAM,SAAS,CAAC;AAE1F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA8B9C;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,UAAU,GAAG,MAAM,CA0FpE"}
@@ -0,0 +1,137 @@
1
+ import express, { Router } from 'express';
2
+ import { z } from 'zod';
3
+ import { CreateMemoryInputSchema, UpdateMemoryInputSchema } from '@dexto/core';
4
+ // Schema for memory ID parameter
5
+ const MemoryIdParamsSchema = z.object({
6
+ id: z.string().min(1, 'Memory ID is required'),
7
+ });
8
+ // Schema for list query parameters (from query string)
9
+ const ListMemoriesQuerySchema = z.object({
10
+ tags: z
11
+ .string()
12
+ .optional()
13
+ .transform((val) => (val ? val.split(',').map((t) => t.trim()) : undefined)),
14
+ source: z.enum(['user', 'system']).optional(),
15
+ pinned: z
16
+ .string()
17
+ .optional()
18
+ .transform((val) => (val === 'true' ? true : val === 'false' ? false : undefined)),
19
+ limit: z
20
+ .string()
21
+ .optional()
22
+ .transform((val) => (val ? parseInt(val, 10) : undefined)),
23
+ offset: z
24
+ .string()
25
+ .optional()
26
+ .transform((val) => (val ? parseInt(val, 10) : undefined)),
27
+ });
28
+ /**
29
+ * Setup memory API routes
30
+ * Provides CRUD operations for user memories
31
+ *
32
+ * Uses a getter function to ensure memory operations always use the current agent,
33
+ * even after agent switches in web/server modes.
34
+ *
35
+ * Routes:
36
+ * - POST /api/memory - Create a new memory
37
+ * - GET /api/memory - List all memories (with optional filters)
38
+ * - GET /api/memory/:id - Get a specific memory
39
+ * - PUT /api/memory/:id - Update a memory
40
+ * - DELETE /api/memory/:id - Delete a memory
41
+ */
42
+ export function setupMemoryRoutes(getAgent) {
43
+ const router = Router();
44
+ // Create a new memory
45
+ router.post('/', express.json(), async (req, res, next) => {
46
+ try {
47
+ const input = CreateMemoryInputSchema.parse(req.body);
48
+ const memory = await getAgent().memoryManager.create(input);
49
+ return res.status(201).json({ ok: true, memory });
50
+ }
51
+ catch (error) {
52
+ return next(error);
53
+ }
54
+ });
55
+ // List all memories with optional filtering
56
+ router.get('/', async (req, res, next) => {
57
+ try {
58
+ const agent = getAgent();
59
+ const queryOptions = ListMemoriesQuerySchema.parse(req.query);
60
+ // Build options object, removing undefined values
61
+ const options = {};
62
+ if (queryOptions.tags !== undefined)
63
+ options.tags = queryOptions.tags;
64
+ if (queryOptions.source !== undefined)
65
+ options.source = queryOptions.source;
66
+ if (queryOptions.pinned !== undefined)
67
+ options.pinned = queryOptions.pinned;
68
+ if (queryOptions.limit !== undefined)
69
+ options.limit = queryOptions.limit;
70
+ if (queryOptions.offset !== undefined)
71
+ options.offset = queryOptions.offset;
72
+ const memories = await agent.memoryManager.list(options);
73
+ return res.status(200).json({ ok: true, memories, count: memories.length });
74
+ }
75
+ catch (error) {
76
+ return next(error);
77
+ }
78
+ });
79
+ // Get memory count (with optional filtering)
80
+ // NOTE: Must be declared before /:id route to avoid route shadowing
81
+ router.get('/count', async (req, res, next) => {
82
+ try {
83
+ const agent = getAgent();
84
+ const queryOptions = ListMemoriesQuerySchema.parse(req.query);
85
+ const options = {};
86
+ if (queryOptions.tags !== undefined)
87
+ options.tags = queryOptions.tags;
88
+ if (queryOptions.source !== undefined)
89
+ options.source = queryOptions.source;
90
+ if (queryOptions.pinned !== undefined)
91
+ options.pinned = queryOptions.pinned;
92
+ const count = await agent.memoryManager.count(options);
93
+ return res.status(200).json({ ok: true, count });
94
+ }
95
+ catch (error) {
96
+ return next(error);
97
+ }
98
+ });
99
+ // Get a specific memory by ID
100
+ router.get('/:id', async (req, res, next) => {
101
+ try {
102
+ const agent = getAgent();
103
+ const { id } = MemoryIdParamsSchema.parse(req.params);
104
+ const memory = await agent.memoryManager.get(id);
105
+ return res.status(200).json({ ok: true, memory });
106
+ }
107
+ catch (error) {
108
+ return next(error);
109
+ }
110
+ });
111
+ // Update a memory
112
+ router.put('/:id', express.json(), async (req, res, next) => {
113
+ try {
114
+ const agent = getAgent();
115
+ const { id } = MemoryIdParamsSchema.parse(req.params);
116
+ const updates = UpdateMemoryInputSchema.parse(req.body);
117
+ const memory = await agent.memoryManager.update(id, updates);
118
+ return res.status(200).json({ ok: true, memory });
119
+ }
120
+ catch (error) {
121
+ return next(error);
122
+ }
123
+ });
124
+ // Delete a memory
125
+ router.delete('/:id', async (req, res, next) => {
126
+ try {
127
+ const agent = getAgent();
128
+ const { id } = MemoryIdParamsSchema.parse(req.params);
129
+ await agent.memoryManager.delete(id);
130
+ return res.status(200).json({ ok: true, message: 'Memory deleted successfully' });
131
+ }
132
+ catch (error) {
133
+ return next(error);
134
+ }
135
+ });
136
+ return router;
137
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../../src/api/middleware/errorHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAwC/D;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAuC9F"}
1
+ {"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../../src/api/middleware/errorHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AA0C/D;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAuC9F"}
@@ -14,6 +14,8 @@ const mapErrorTypeToStatus = (type) => {
14
14
  return 403;
15
15
  case ErrorType.TIMEOUT:
16
16
  return 408;
17
+ case ErrorType.CONFLICT:
18
+ return 409;
17
19
  case ErrorType.RATE_LIMIT:
18
20
  return 429;
19
21
  case ErrorType.SYSTEM:
@@ -5,14 +5,14 @@ import { WebSocketEventSubscriber } from './websocket-subscriber.js';
5
5
  import { WebhookEventSubscriber } from './webhook-subscriber.js';
6
6
  import { type AgentCard } from '@dexto/core';
7
7
  import { DextoAgent } from '@dexto/core';
8
- export declare function initializeApi(agent: DextoAgent, agentCardOverride?: Partial<AgentCard>, listenPort?: number, agentName?: string): Promise<{
8
+ export declare function initializeApi(agent: DextoAgent, agentCardOverride?: Partial<AgentCard>, listenPort?: number, agentId?: string): Promise<{
9
9
  app: Express;
10
10
  server: http.Server;
11
11
  wss: WebSocketServer;
12
12
  webSubscriber: WebSocketEventSubscriber;
13
13
  webhookSubscriber: WebhookEventSubscriber;
14
14
  }>;
15
- export declare function startApiServer(agent: DextoAgent, port?: number, agentCardOverride?: Partial<AgentCard>, agentName?: string): Promise<{
15
+ export declare function startApiServer(agent: DextoAgent, port?: number, agentCardOverride?: Partial<AgentCard>, agentId?: string): Promise<{
16
16
  server: http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>;
17
17
  wss: WebSocketServer;
18
18
  webSubscriber: WebSocketEventSubscriber;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAErC,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAQ1E,OAAO,EAAmB,UAAU,EAAE,MAAM,aAAa,CAAC;AAqH1D,wBAAsB,aAAa,CAC/B,KAAK,EAAE,UAAU,EACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EACtC,UAAU,CAAC,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC;IACP,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,GAAG,EAAE,eAAe,CAAC;IACrB,aAAa,EAAE,wBAAwB,CAAC;IACxC,iBAAiB,EAAE,sBAAsB,CAAC;CAC7C,CAAC,CAiwCD;AAED,wBAAsB,cAAc,CAChC,KAAK,EAAE,UAAU,EACjB,IAAI,SAAO,EACX,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EACtC,SAAS,CAAC,EAAE,MAAM;;;;;GA6BrB"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAY,MAAM,SAAS,CAAC;AACjD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAErC,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAAkD,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAS7F,OAAO,EAA0B,UAAU,EAAmB,MAAM,aAAa,CAAC;AA8DlF,wBAAsB,aAAa,CAC/B,KAAK,EAAE,UAAU,EACjB,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EACtC,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;IACP,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IACpB,GAAG,EAAE,eAAe,CAAC;IACrB,aAAa,EAAE,wBAAwB,CAAC;IACxC,iBAAiB,EAAE,sBAAsB,CAAC;CAC7C,CAAC,CAmxED;AAED,wBAAsB,cAAc,CAChC,KAAK,EAAE,UAAU,EACjB,IAAI,SAAO,EACX,iBAAiB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EACtC,OAAO,CAAC,EAAE,MAAM;;;;;GA6BnB"}