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
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-subscriber.d.ts","sourceRoot":"","sources":["../../src/api/webhook-subscriber.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAmD,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EACH,KAAK,aAAa,EAElB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC9B,MAAM,oBAAoB,CAAC;AAW5B;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,eAAe;IAC1D,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,OAAO,CAA0B;gBAE7B,EACR,OAAO,EACP,GAAG,eAAe,EACrB,GAAE,sBAAsB,GAAG;QAAE,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;KAAO;IAOtE;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IA0CxC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAKxC;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAUzC;;OAEG;IACH,WAAW,IAAI,aAAa,EAAE;IAI9B;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIxD;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAoBpE;;OAEG;IACH,OAAO,IAAI,IAAI;IAUf;;OAEG;IACH,WAAW,IAAI,IAAI;IAYnB;;OAEG;YACW,YAAY;IA+C1B;;OAEG;YACW,gBAAgB;IAoD9B;;OAEG;YACW,kBAAkB;IA+DhC;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAK5B"}
1
+ {"version":3,"file":"webhook-subscriber.d.ts","sourceRoot":"","sources":["../../src/api/webhook-subscriber.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAmD,MAAM,aAAa,CAAC;AAC7F,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EACH,KAAK,aAAa,EAElB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC9B,MAAM,oBAAoB,CAAC;AAW5B;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,eAAe;IAC1D,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,eAAe,CAAmC;IAC1D,OAAO,CAAC,OAAO,CAA0B;gBAE7B,EACR,OAAO,EACP,GAAG,eAAe,EACrB,GAAE,sBAAsB,GAAG;QAAE,OAAO,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAA;KAAO;IAOtE;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IA2CxC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAKxC;;OAEG;IACH,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAUzC;;OAEG;IACH,WAAW,IAAI,aAAa,EAAE;IAI9B;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIxD;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAoBpE;;OAEG;IACH,OAAO,IAAI,IAAI;IAUf;;OAEG;IACH,WAAW,IAAI,IAAI;IAYnB;;OAEG;YACW,YAAY;IA+C1B;;OAEG;YACW,gBAAgB;IAoD9B;;OAEG;YACW,kBAAkB;IA+DhC;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAK5B"}
@@ -48,7 +48,8 @@ export class WebhookEventSubscriber {
48
48
  'dexto:conversationReset',
49
49
  'dexto:mcpServerConnected',
50
50
  'dexto:availableToolsUpdated',
51
- 'dexto:toolConfirmationRequest',
51
+ 'dexto:approvalRequest',
52
+ 'dexto:approvalResponse',
52
53
  'dexto:llmSwitched',
53
54
  'dexto:stateChanged',
54
55
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"websocket-subscriber.d.ts","sourceRoot":"","sources":["../../src/api/websocket-subscriber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,IAAI,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C;;GAEG;AACH,qBAAa,wBAAyB,YAAW,eAAe;IAIhD,OAAO,CAAC,GAAG;IAHvB,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,eAAe,CAAC,CAAkB;gBAEtB,GAAG,EAAE,eAAe;IAmBxC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAyKxC;;OAEG;IACH,OAAO,IAAI,IAAI;IAiBf;;;OAGG;IACH,WAAW,IAAI,IAAI;IAYnB,OAAO,CAAC,SAAS;CAUpB"}
1
+ {"version":3,"file":"websocket-subscriber.d.ts","sourceRoot":"","sources":["../../src/api/websocket-subscriber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAa,MAAM,IAAI,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C;;GAEG;AACH,qBAAa,wBAAyB,YAAW,eAAe;IAIhD,OAAO,CAAC,GAAG;IAHvB,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,eAAe,CAAC,CAAkB;gBAEtB,GAAG,EAAE,eAAe;IAmBxC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IA6PxC;;OAEG;IACH,OAAO,IAAI,IAAI;IAiBf;;;OAGG;IACH,WAAW,IAAI,IAAI;IAYnB,OAAO,CAAC,SAAS;CAUpB"}
@@ -70,15 +70,25 @@ export class WebSocketEventSubscriber {
70
70
  });
71
71
  }, { signal });
72
72
  eventBus.on('llmservice:toolResult', (payload) => {
73
+ logger.debug(`[websocket-subscriber]: llmservice:toolResult: ${JSON.stringify({
74
+ toolName: payload.toolName,
75
+ callId: payload.callId,
76
+ success: payload.success,
77
+ sessionId: payload.sessionId,
78
+ })}`);
79
+ const data = {
80
+ toolName: payload.toolName,
81
+ callId: payload.callId,
82
+ success: payload.success,
83
+ sanitized: payload.sanitized,
84
+ sessionId: payload.sessionId,
85
+ };
86
+ if (payload.rawResult !== undefined) {
87
+ data.rawResult = payload.rawResult;
88
+ }
73
89
  this.broadcast({
74
90
  event: 'toolResult',
75
- data: {
76
- toolName: payload.toolName,
77
- result: payload.result,
78
- callId: payload.callId,
79
- success: payload.success,
80
- sessionId: payload.sessionId,
81
- },
91
+ data,
82
92
  });
83
93
  }, { signal });
84
94
  eventBus.on('llmservice:response', (payload) => {
@@ -134,13 +144,60 @@ export class WebSocketEventSubscriber {
134
144
  },
135
145
  });
136
146
  }, { signal });
137
- // Forward pre-execution tool confirmation events
138
- eventBus.on('dexto:toolConfirmationRequest', (payload) => {
147
+ // Forward approval request events (including tool confirmations)
148
+ eventBus.on('dexto:approvalRequest', (payload) => {
139
149
  this.broadcast({
140
- event: 'toolConfirmationRequest',
150
+ event: 'approvalRequest',
141
151
  data: payload,
142
152
  });
143
153
  }, { signal });
154
+ // Forward MCP notification events
155
+ eventBus.on('dexto:mcpResourceUpdated', (payload) => {
156
+ this.broadcast({
157
+ event: 'mcpResourceUpdated',
158
+ data: {
159
+ serverName: payload.serverName,
160
+ resourceUri: payload.resourceUri,
161
+ },
162
+ });
163
+ }, { signal });
164
+ eventBus.on('dexto:mcpPromptsListChanged', (payload) => {
165
+ this.broadcast({
166
+ event: 'mcpPromptsListChanged',
167
+ data: {
168
+ serverName: payload.serverName,
169
+ prompts: payload.prompts,
170
+ },
171
+ });
172
+ }, { signal });
173
+ eventBus.on('dexto:mcpToolsListChanged', (payload) => {
174
+ this.broadcast({
175
+ event: 'mcpToolsListChanged',
176
+ data: {
177
+ serverName: payload.serverName,
178
+ tools: payload.tools,
179
+ },
180
+ });
181
+ }, { signal });
182
+ eventBus.on('dexto:resourceCacheInvalidated', (payload) => {
183
+ this.broadcast({
184
+ event: 'resourceCacheInvalidated',
185
+ data: {
186
+ resourceUri: payload.resourceUri,
187
+ serverName: payload.serverName,
188
+ action: payload.action,
189
+ },
190
+ });
191
+ }, { signal });
192
+ eventBus.on('dexto:sessionTitleUpdated', (payload) => {
193
+ this.broadcast({
194
+ event: 'sessionTitleUpdated',
195
+ data: {
196
+ sessionId: payload.sessionId,
197
+ title: payload.title,
198
+ },
199
+ });
200
+ }, { signal });
144
201
  }
145
202
  /**
146
203
  * Clean up event listeners and resources
@@ -1,5 +1,6 @@
1
1
  import { EventSubscriber } from '../api/types.js';
2
2
  import { AgentEventBus } from '@dexto/core';
3
+ import type { SanitizedToolResult } from '@dexto/core';
3
4
  /**
4
5
  * Wrapper class to store methods describing how the CLI should handle agent events
5
6
  *
@@ -24,7 +25,7 @@ export declare class CLISubscriber implements EventSubscriber {
24
25
  onThinking(): void;
25
26
  onChunk(text: string): void;
26
27
  onToolCall(toolName: string, args: any): void;
27
- onToolResult(toolName: string, result: any): void;
28
+ onToolResult(toolName: string, sanitized: SanitizedToolResult, rawResult?: unknown, success?: boolean): void;
28
29
  onResponse(text: string): void;
29
30
  onError(error: Error): void;
30
31
  onConversationReset(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"cli-subscriber.d.ts","sourceRoot":"","sources":["../../src/cli/cli-subscriber.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;;;;;GAWG;AACH,qBAAa,aAAc,YAAW,eAAe;IACjD,OAAO,CAAC,mBAAmB,CAAc;IACzC,OAAO,CAAC,YAAY,CAAa;IAEjC,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAmBxC;;;OAGG;IACH,OAAO,IAAI,IAAI;IAgBf,UAAU,IAAI,IAAI;IAIlB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA8B3B,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAI7C,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI;IAIjD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAS9B,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IA0B3B,mBAAmB,IAAI,IAAI;CAO9B"}
1
+ {"version":3,"file":"cli-subscriber.d.ts","sourceRoot":"","sources":["../../src/cli/cli-subscriber.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD;;;;;;;;;;;GAWG;AACH,qBAAa,aAAc,YAAW,eAAe;IACjD,OAAO,CAAC,mBAAmB,CAAc;IACzC,OAAO,CAAC,YAAY,CAAa;IAEjC,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAwBxC;;;OAGG;IACH,OAAO,IAAI,IAAI;IAgBf,UAAU,IAAI,IAAI;IAIlB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA8B3B,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAI7C,YAAY,CACR,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,mBAAmB,EAC9B,SAAS,CAAC,EAAE,OAAO,EACnB,OAAO,CAAC,EAAE,OAAO,GAClB,IAAI;IAYP,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAS9B,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IA0B3B,mBAAmB,IAAI,IAAI;CAO9B"}
@@ -25,7 +25,7 @@ export class CLISubscriber {
25
25
  // Ignore reasoning chunks in CLI for now
26
26
  });
27
27
  eventBus.on('llmservice:toolCall', (payload) => this.onToolCall(payload.toolName, payload.args));
28
- eventBus.on('llmservice:toolResult', (payload) => this.onToolResult(payload.toolName, payload.result));
28
+ eventBus.on('llmservice:toolResult', (payload) => this.onToolResult(payload.toolName, payload.sanitized, payload.rawResult, payload.success));
29
29
  eventBus.on('llmservice:response', (payload) => this.onResponse(payload.content));
30
30
  eventBus.on('llmservice:error', (payload) => this.onError(payload.error));
31
31
  eventBus.on('dexto:conversationReset', this.onConversationReset.bind(this));
@@ -76,8 +76,16 @@ export class CLISubscriber {
76
76
  onToolCall(toolName, args) {
77
77
  logger.toolCall(toolName, args);
78
78
  }
79
- onToolResult(toolName, result) {
80
- logger.toolResult(result);
79
+ onToolResult(toolName, sanitized, rawResult, success) {
80
+ const payload = {
81
+ toolName,
82
+ success,
83
+ sanitized,
84
+ };
85
+ if (rawResult !== undefined) {
86
+ payload.raw = rawResult;
87
+ }
88
+ logger.toolResult(payload);
81
89
  }
82
90
  onResponse(text) {
83
91
  // Clear the accumulated state since we got the final response
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASzC;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC5E;AAgFD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,UAAU,iBAoHjD;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CvF"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASzC;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC5E;AAiFD;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,UAAU,iBAoHjD;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0CvF"}
package/dist/cli/cli.js CHANGED
@@ -100,6 +100,7 @@ async function _initCli(agent) {
100
100
  // Show welcome message with slash command instructions
101
101
  console.log(chalk.bold.cyan('\n🚀 Welcome to Dexto CLI!'));
102
102
  console.log(chalk.dim('• Type your message normally to chat with the AI'));
103
+ console.log(chalk.dim('• Reference files with @filename (@ must be at start or after space)'));
103
104
  console.log(chalk.dim('• Use /command for system commands (e.g., /help, /session, /model)'));
104
105
  console.log(chalk.dim('• Type /help to see all available commands'));
105
106
  const logPath = getDextoPath('logs', 'dexto.log');
@@ -5,15 +5,15 @@ declare const InstallCommandSchema: z.ZodObject<{
5
5
  injectPreferences: z.ZodDefault<z.ZodBoolean>;
6
6
  force: z.ZodDefault<z.ZodBoolean>;
7
7
  }, "strict", z.ZodTypeAny, {
8
- agents: string[];
9
8
  force: boolean;
10
- all: boolean;
11
9
  injectPreferences: boolean;
10
+ agents: string[];
11
+ all: boolean;
12
12
  }, {
13
13
  agents: string[];
14
14
  force?: boolean | undefined;
15
- all?: boolean | undefined;
16
15
  injectPreferences?: boolean | undefined;
16
+ all?: boolean | undefined;
17
17
  }>;
18
18
  export type InstallCommandOptions = z.output<typeof InstallCommandSchema>;
19
19
  export declare function handleInstallCommand(agents: string[], options: Partial<InstallCommandOptions>): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/install.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;EAOb,CAAC;AAEd,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAwC1E,wBAAsB,oBAAoB,CACtC,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACxC,OAAO,CAAC,IAAI,CAAC,CAsHf"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/install.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;EAOb,CAAC;AAEd,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAkL1E,wBAAsB,oBAAoB,CACtC,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACxC,OAAO,CAAC,IAAI,CAAC,CAoNf"}
@@ -1,7 +1,8 @@
1
1
  // packages/cli/src/cli/commands/install.ts
2
- import { existsSync } from 'fs';
2
+ import { existsSync, statSync } from 'fs';
3
3
  import path from 'path';
4
4
  import { z } from 'zod';
5
+ import * as p from '@clack/prompts';
5
6
  import { getAgentRegistry, getDextoGlobalPath } from '@dexto/core';
6
7
  import { capture } from '../../analytics/index.js';
7
8
  // Zod schema for install command validation
@@ -13,6 +14,108 @@ const InstallCommandSchema = z
13
14
  force: z.boolean().default(false),
14
15
  })
15
16
  .strict();
17
+ /**
18
+ * Check if a string is a file path (contains path separators or ends with .yml)
19
+ */
20
+ function isFilePath(input) {
21
+ return (input.includes('/') ||
22
+ input.includes('\\') ||
23
+ input.endsWith('.yml') ||
24
+ input.endsWith('.yaml'));
25
+ }
26
+ /**
27
+ * Extract agent name from file path and sanitize for validity
28
+ * Agent names must be lowercase alphanumeric with hyphens only.
29
+ * Examples:
30
+ * './my-agent.yml' -> 'my-agent'
31
+ * './my_agent.yml' -> 'my-agent' (underscore converted)
32
+ * './agents/foo/agent.yml' -> 'agent'
33
+ * './MyAgent.yml' -> 'myagent'
34
+ */
35
+ function extractAgentNameFromPath(filePath) {
36
+ const basename = path.basename(filePath);
37
+ // If it's a file, remove the extension
38
+ let name = basename;
39
+ if (basename.endsWith('.yml') || basename.endsWith('.yaml')) {
40
+ name = basename.replace(/\.(yml|yaml)$/, '');
41
+ }
42
+ // Sanitize: lowercase, replace underscores and invalid chars with hyphens
43
+ name = name
44
+ .toLowerCase()
45
+ .replace(/[_\s]+/g, '-') // Replace underscores and spaces with hyphens
46
+ .replace(/[^a-z0-9-]/g, '') // Remove any other invalid characters
47
+ .replace(/-+/g, '-') // Collapse multiple hyphens
48
+ .replace(/^-|-$/g, ''); // Remove leading/trailing hyphens
49
+ return name;
50
+ }
51
+ /**
52
+ * Prompt user for custom agent metadata
53
+ */
54
+ async function promptForMetadata(suggestedName) {
55
+ p.intro('📝 Custom Agent Installation');
56
+ const agentName = (await p.text({
57
+ message: 'Agent name:',
58
+ placeholder: suggestedName,
59
+ defaultValue: suggestedName,
60
+ validate: (value) => {
61
+ if (!value || value.trim().length === 0) {
62
+ return 'Agent name is required';
63
+ }
64
+ if (!/^[a-z0-9-]+$/.test(value)) {
65
+ return 'Agent name must contain only lowercase letters, numbers, and hyphens';
66
+ }
67
+ return undefined;
68
+ },
69
+ }));
70
+ if (p.isCancel(agentName)) {
71
+ p.cancel('Installation cancelled');
72
+ process.exit(0);
73
+ }
74
+ const description = (await p.text({
75
+ message: 'Description:',
76
+ placeholder: 'A custom agent for...',
77
+ validate: (value) => {
78
+ if (!value || value.trim().length === 0) {
79
+ return 'Description is required';
80
+ }
81
+ return undefined;
82
+ },
83
+ }));
84
+ if (p.isCancel(description)) {
85
+ p.cancel('Installation cancelled');
86
+ process.exit(0);
87
+ }
88
+ const author = (await p.text({
89
+ message: 'Author:',
90
+ placeholder: 'Your Name',
91
+ validate: (value) => {
92
+ if (!value || value.trim().length === 0) {
93
+ return 'Author is required';
94
+ }
95
+ return undefined;
96
+ },
97
+ }));
98
+ if (p.isCancel(author)) {
99
+ p.cancel('Installation cancelled');
100
+ process.exit(0);
101
+ }
102
+ const tagsInput = (await p.text({
103
+ message: 'Tags (comma-separated):',
104
+ placeholder: 'custom, coding, productivity',
105
+ defaultValue: 'custom',
106
+ }));
107
+ if (p.isCancel(tagsInput)) {
108
+ p.cancel('Installation cancelled');
109
+ process.exit(0);
110
+ }
111
+ const tags = tagsInput
112
+ .split(',')
113
+ .map((tag) => tag.trim())
114
+ .filter((tag) => tag.length > 0);
115
+ // Ask about main config file for directory-based agents
116
+ // We'll determine if it's a directory later in the flow
117
+ return { agentName, description, author, tags };
118
+ }
16
119
  /**
17
120
  * Validate install command arguments with registry-aware validation
18
121
  */
@@ -29,12 +132,22 @@ function validateInstallCommand(agents, options) {
29
132
  throw new Error(`No agents specified. Use agent names or --all flag. Available agents: ${Object.keys(availableAgents).join(', ')}`);
30
133
  }
31
134
  if (!validated.all) {
32
- // Validate all specified agents exist in registry
33
- const invalidAgents = validated.agents.filter((agent) => !registry.hasAgent(agent));
135
+ // Separate file paths from registry names
136
+ const filePaths = validated.agents.filter(isFilePath);
137
+ const registryNames = validated.agents.filter((agent) => !isFilePath(agent));
138
+ // Validate registry names exist in registry
139
+ const invalidAgents = registryNames.filter((agent) => !registry.hasAgent(agent));
34
140
  if (invalidAgents.length > 0) {
35
141
  throw new Error(`Unknown agents: ${invalidAgents.join(', ')}. ` +
36
142
  `Available agents: ${Object.keys(availableAgents).join(', ')}`);
37
143
  }
144
+ // Validate file paths exist
145
+ for (const filePath of filePaths) {
146
+ const resolved = path.resolve(filePath);
147
+ if (!existsSync(resolved)) {
148
+ throw new Error(`File not found: ${filePath}`);
149
+ }
150
+ }
38
151
  }
39
152
  return validated;
40
153
  }
@@ -46,6 +159,7 @@ export async function handleInstallCommand(agents, options) {
46
159
  // Determine which agents to install
47
160
  let agentsToInstall;
48
161
  if (validated.all) {
162
+ // --all flag only works with registry agents, not file paths
49
163
  agentsToInstall = Object.keys(registry.getAvailableAgents());
50
164
  console.log(`📋 Installing all ${agentsToInstall.length} available agents...`);
51
165
  }
@@ -60,61 +174,129 @@ export async function handleInstallCommand(agents, options) {
60
174
  const skipped = [];
61
175
  const failed = [];
62
176
  // Install each agent
63
- for (const agentName of agentsToInstall) {
177
+ for (const agentInput of agentsToInstall) {
64
178
  try {
65
- console.log(`\n📦 Installing ${agentName}...`);
66
- // Check if already installed (unless --force)
67
- const globalAgentsDir = getDextoGlobalPath('agents');
68
- const installedPath = path.join(globalAgentsDir, agentName);
69
- if (existsSync(installedPath) && !validated.force) {
70
- console.log(`⏭️ ${agentName} already installed (use --force to reinstall)`);
71
- skipped.push(agentName);
72
- // Per-agent analytics for skipped install
179
+ // Check if this is a file path or registry name
180
+ if (isFilePath(agentInput)) {
181
+ // Custom agent installation from file path
182
+ console.log(`\n📦 Installing custom agent from ${agentInput}...`);
183
+ const resolvedPath = path.resolve(agentInput);
184
+ // Detect if source is directory or file
185
+ const stats = statSync(resolvedPath);
186
+ const isDirectory = stats.isDirectory();
187
+ // Extract suggested name based on whether it's a directory or file
188
+ const suggestedName = isDirectory
189
+ ? path.basename(resolvedPath)
190
+ : extractAgentNameFromPath(resolvedPath);
191
+ // Prompt for metadata
192
+ const metadata = await promptForMetadata(suggestedName);
193
+ // Prompt for main field if installing from directory
194
+ let main;
195
+ if (isDirectory) {
196
+ const mainInput = await p.text({
197
+ message: 'Main config file:',
198
+ placeholder: 'agent.yml',
199
+ defaultValue: 'agent.yml',
200
+ validate: (value) => {
201
+ if (!value || value.trim().length === 0) {
202
+ return 'Main config file is required';
203
+ }
204
+ // Validate it's a YAML file
205
+ if (!value.endsWith('.yml') && !value.endsWith('.yaml')) {
206
+ return 'Main file must be a .yml or .yaml file';
207
+ }
208
+ // Validate that main file exists in source directory
209
+ const mainPath = path.join(resolvedPath, value);
210
+ if (!existsSync(mainPath)) {
211
+ return `File not found: ${value}`;
212
+ }
213
+ return undefined;
214
+ },
215
+ });
216
+ if (p.isCancel(mainInput)) {
217
+ p.cancel('Installation cancelled');
218
+ process.exit(0);
219
+ }
220
+ main = mainInput;
221
+ }
222
+ // Check if already installed (unless --force)
223
+ const globalAgentsDir = getDextoGlobalPath('agents');
224
+ const installedPath = path.join(globalAgentsDir, metadata.agentName);
225
+ if (existsSync(installedPath) && !validated.force) {
226
+ console.log(`⏭️ ${metadata.agentName} already installed (use --force to reinstall)`);
227
+ skipped.push(metadata.agentName);
228
+ capture('dexto_install_agent', {
229
+ agent: metadata.agentName,
230
+ status: 'skipped',
231
+ reason: 'already_installed',
232
+ force: validated.force,
233
+ injectPreferences: validated.injectPreferences,
234
+ });
235
+ continue;
236
+ }
237
+ // Install custom agent
238
+ await registry.installCustomAgentFromPath(metadata.agentName, resolvedPath, {
239
+ description: metadata.description,
240
+ author: metadata.author,
241
+ tags: metadata.tags,
242
+ ...(main ? { main } : {}),
243
+ }, validated.injectPreferences);
244
+ successCount++;
245
+ console.log(`✅ ${metadata.agentName} installed successfully`);
246
+ installed.push(metadata.agentName);
247
+ p.outro('🎉 Custom agent installed successfully!');
73
248
  capture('dexto_install_agent', {
74
- agent: agentName,
75
- status: 'skipped',
76
- reason: 'already_installed',
249
+ agent: metadata.agentName,
250
+ status: 'installed',
77
251
  force: validated.force,
78
252
  injectPreferences: validated.injectPreferences,
79
253
  });
80
- continue;
81
254
  }
82
- await registry.installAgent(agentName, validated.injectPreferences);
83
- successCount++;
84
- console.log(`✅ ${agentName} installed successfully`);
85
- installed.push(agentName);
86
- // Per-agent analytics for successful install
87
- try {
255
+ else {
256
+ // Bundled agent installation from registry
257
+ console.log(`\n📦 Installing ${agentInput}...`);
258
+ // Check if already installed (unless --force)
259
+ const globalAgentsDir = getDextoGlobalPath('agents');
260
+ const installedPath = path.join(globalAgentsDir, agentInput);
261
+ if (existsSync(installedPath) && !validated.force) {
262
+ console.log(`⏭️ ${agentInput} already installed (use --force to reinstall)`);
263
+ skipped.push(agentInput);
264
+ capture('dexto_install_agent', {
265
+ agent: agentInput,
266
+ status: 'skipped',
267
+ reason: 'already_installed',
268
+ force: validated.force,
269
+ injectPreferences: validated.injectPreferences,
270
+ });
271
+ continue;
272
+ }
273
+ await registry.installAgent(agentInput, validated.injectPreferences);
274
+ successCount++;
275
+ console.log(`✅ ${agentInput} installed successfully`);
276
+ installed.push(agentInput);
88
277
  capture('dexto_install_agent', {
89
- agent: agentName,
278
+ agent: agentInput,
90
279
  status: 'installed',
91
280
  force: validated.force,
92
281
  injectPreferences: validated.injectPreferences,
93
282
  });
94
283
  }
95
- catch {
96
- // Analytics failures should not block CLI execution.
97
- }
98
284
  }
99
285
  catch (error) {
100
286
  errorCount++;
101
- const errorMsg = `Failed to install ${agentName}: ${error instanceof Error ? error.message : String(error)}`;
287
+ const errorMsg = `Failed to install ${agentInput}: ${error instanceof Error ? error.message : String(error)}`;
102
288
  errors.push(errorMsg);
103
- failed.push(agentName);
289
+ failed.push(agentInput);
104
290
  console.error(`❌ ${errorMsg}`);
105
- // Per-agent analytics for failed install
106
- try {
107
- capture('dexto_install_agent', {
108
- agent: agentName,
109
- status: 'failed',
110
- error_message: error instanceof Error ? error.message : String(error),
111
- force: validated.force,
112
- injectPreferences: validated.injectPreferences,
113
- });
114
- }
115
- catch {
116
- // Analytics failures should not block CLI execution.
117
- }
291
+ // Sanitize agent identifier for analytics (avoid sending full local paths)
292
+ const safeAgentId = isFilePath(agentInput) ? path.basename(agentInput) : agentInput;
293
+ capture('dexto_install_agent', {
294
+ agent: safeAgentId,
295
+ status: 'failed',
296
+ error_message: error instanceof Error ? error.message : String(error),
297
+ force: validated.force,
298
+ injectPreferences: validated.injectPreferences,
299
+ });
118
300
  }
119
301
  }
120
302
  // Emit analytics for both single- and multi-agent cases
@@ -140,8 +140,8 @@ export const modelCommands = {
140
140
  console.log(` ${chalk.yellow('/model current')} - Display currently active model and configuration`);
141
141
  console.log(` ${chalk.yellow('/model switch')} ${chalk.blue('<model>')} - Switch to a different AI model (provider auto-detected)`);
142
142
  console.log(` Examples:`);
143
- console.log(` ${chalk.dim('/model switch gpt-4o')}`);
144
- console.log(` ${chalk.dim('/model switch claude-4-sonnet-20250514')}`);
143
+ console.log(` ${chalk.dim('/model switch gpt-5')}`);
144
+ console.log(` ${chalk.dim('/model switch claude-sonnet-4-5-20250929')}`);
145
145
  console.log(` ${chalk.dim('/model switch gemini-2.5-pro')}`);
146
146
  console.log(` ${chalk.yellow('/model help')} - Show this help message`);
147
147
  console.log(chalk.dim('\n💡 Switching models allows you to use different AI capabilities'));
@@ -5,11 +5,18 @@
5
5
  * These commands provide functionality for viewing and managing system prompts.
6
6
  *
7
7
  * Available Prompt Commands:
8
- * - /prompt - Display the current system prompt
8
+ * - /sysprompt - Display the current system prompt
9
+ * - /prompts - List all available prompts (MCP + internal)
10
+ * - /<prompt-name> [args] - Direct prompt execution (auto-generated for each prompt)
9
11
  */
12
+ import { type DextoAgent } from '@dexto/core';
10
13
  import type { CommandDefinition } from './command-parser.js';
11
14
  /**
12
15
  * Prompt management commands
13
16
  */
14
17
  export declare const promptCommands: CommandDefinition[];
18
+ /**
19
+ * Get all dynamic prompt commands based on available prompts
20
+ */
21
+ export declare function getDynamicPromptCommands(agent: DextoAgent): Promise<CommandDefinition[]>;
15
22
  //# sourceMappingURL=prompt-commands.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-commands.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/interactive-commands/prompt-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,iBAAiB,EAuB7C,CAAC"}
1
+ {"version":3,"file":"prompt-commands.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/interactive-commands/prompt-commands.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAA+B,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAG7D;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,iBAAiB,EA6N7C,CAAC;AAqEF;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAU9F"}