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.
- package/README.md +222 -84
- package/dist/agents/agent-registry.json +39 -1
- package/dist/agents/agent-template.yml +1 -1
- package/dist/agents/coding-agent/README.md +188 -0
- package/dist/agents/coding-agent/coding-agent.yml +203 -0
- package/dist/agents/database-agent/database-agent.yml +44 -2
- package/dist/agents/default-agent.yml +137 -13
- package/dist/agents/github-agent/github-agent.yml +42 -0
- package/dist/agents/image-editor-agent/image-editor-agent.yml +9 -2
- package/dist/agents/music-agent/README.md +1 -1
- package/dist/agents/music-agent/music-agent.yml +36 -2
- package/dist/agents/nano-banana-agent/nano-banana-agent.yml +35 -1
- package/dist/agents/podcast-agent/README.md +1 -1
- package/dist/agents/podcast-agent/podcast-agent.yml +37 -3
- package/dist/agents/product-name-researcher/product-name-researcher.yml +37 -1
- package/dist/agents/sora-video-agent/README.md +122 -0
- package/dist/agents/sora-video-agent/sora-video-agent.yml +98 -0
- package/dist/agents/talk2pdf-agent/talk2pdf-agent.yml +17 -2
- package/dist/agents/triage-demo/README.md +6 -6
- package/dist/agents/triage-demo/billing-agent.yml +1 -1
- package/dist/agents/triage-demo/escalation-agent.yml +1 -1
- package/dist/agents/triage-demo/product-info-agent.yml +1 -1
- package/dist/agents/triage-demo/technical-support-agent.yml +1 -1
- package/dist/agents/triage-demo/triage-agent.yml +16 -1
- package/dist/analytics/wrapper.d.ts.map +1 -1
- package/dist/analytics/wrapper.js +5 -3
- package/dist/api/a2a.d.ts +2 -2
- package/dist/api/a2a.d.ts.map +1 -1
- package/dist/api/a2a.js +3 -2
- package/dist/api/mcp/mcp_handler.d.ts +3 -3
- package/dist/api/mcp/mcp_handler.d.ts.map +1 -1
- package/dist/api/mcp/mcp_handler.js +7 -4
- package/dist/api/mcp/tool-aggregation-handler.d.ts.map +1 -1
- package/dist/api/mcp/tool-aggregation-handler.js +34 -42
- package/dist/api/memory/memory-handler.d.ts +18 -0
- package/dist/api/memory/memory-handler.d.ts.map +1 -0
- package/dist/api/memory/memory-handler.js +137 -0
- package/dist/api/middleware/errorHandler.d.ts.map +1 -1
- package/dist/api/middleware/errorHandler.js +2 -0
- package/dist/api/server.d.ts +2 -2
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +1129 -257
- package/dist/api/webhook-subscriber.d.ts.map +1 -1
- package/dist/api/webhook-subscriber.js +2 -1
- package/dist/api/websocket-subscriber.d.ts.map +1 -1
- package/dist/api/websocket-subscriber.js +67 -10
- package/dist/cli/cli-subscriber.d.ts +2 -1
- package/dist/cli/cli-subscriber.d.ts.map +1 -1
- package/dist/cli/cli-subscriber.js +11 -3
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +1 -0
- package/dist/cli/commands/install.d.ts +3 -3
- package/dist/cli/commands/install.d.ts.map +1 -1
- package/dist/cli/commands/install.js +223 -41
- package/dist/cli/commands/interactive-commands/model/model-commands.js +2 -2
- package/dist/cli/commands/interactive-commands/prompt-commands.d.ts +8 -1
- package/dist/cli/commands/interactive-commands/prompt-commands.d.ts.map +1 -1
- package/dist/cli/commands/interactive-commands/prompt-commands.js +252 -4
- package/dist/cli/commands/list-agents.d.ts.map +1 -1
- package/dist/cli/commands/list-agents.js +22 -3
- package/dist/cli/commands/setup.d.ts +4 -4
- package/dist/cli/commands/uninstall.d.ts +1 -1
- package/dist/cli/tool-confirmation/cli-confirmation-handler.d.ts +36 -7
- package/dist/cli/tool-confirmation/cli-confirmation-handler.d.ts.map +1 -1
- package/dist/cli/tool-confirmation/cli-confirmation-handler.js +314 -34
- package/dist/cli/utils/options.js +2 -2
- package/dist/index.js +117 -64
- package/dist/webui/.next/standalone/.next/static/chunks/419-6d449dcb2b056299.js +1 -0
- package/dist/webui/.next/standalone/.next/static/chunks/614-3519f8a6051e0088.js +1 -0
- package/dist/webui/.next/standalone/.next/static/chunks/656-5a9f6405badf66a8.js +25 -0
- package/dist/webui/.next/standalone/.next/static/chunks/765-755286dc586b1a51.js +1 -0
- package/dist/webui/.next/standalone/.next/static/chunks/804-f40df92a3adffcc0.js +1 -0
- package/dist/webui/.next/standalone/.next/static/chunks/854-232126f3c77e6c0b.js +1 -0
- package/dist/webui/.next/standalone/.next/static/chunks/app/chat/[sessionId]/page-a695b09e6bac5274.js +1 -0
- package/dist/webui/.next/standalone/.next/static/chunks/app/layout-f4a6ee5a028899d1.js +1 -0
- package/dist/webui/.next/standalone/.next/static/chunks/app/page-d1f127a0cac96246.js +1 -0
- package/dist/webui/.next/standalone/.next/static/chunks/app/playground/page-6f8d2abe76e51dfc.js +1 -0
- package/dist/webui/.next/standalone/.next/static/chunks/main-7decd42f62688419.js +1 -0
- package/dist/webui/.next/standalone/.next/static/chunks/{webpack-7c234e7e7e272295.js → webpack-7229fd0786f0483c.js} +1 -1
- package/dist/webui/.next/standalone/.next/static/css/c3c26ec984df1deb.css +1 -0
- package/dist/webui/.next/standalone/.next/static/css/de70bee13400563f.css +1 -0
- package/dist/webui/.next/standalone/.next/static/uqfH8SY_uhwdc0ZkpMwCO/_buildManifest.js +1 -0
- package/dist/webui/.next/standalone/package.json +7 -2
- package/dist/webui/.next/standalone/packages/webui/.next/BUILD_ID +1 -1
- package/dist/webui/.next/standalone/packages/webui/.next/app-build-manifest.json +30 -15
- package/dist/webui/.next/standalone/packages/webui/.next/app-path-routes-manifest.json +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/build-manifest.json +7 -7
- package/dist/webui/.next/standalone/packages/webui/.next/prerender-manifest.json +3 -3
- package/dist/webui/.next/standalone/packages/webui/.next/required-server-files.json +1 -11
- package/dist/webui/.next/standalone/packages/webui/.next/routes-manifest.json +11 -8
- package/dist/webui/.next/standalone/packages/webui/.next/server/app/_not-found/page.js +1 -1
- package/dist/webui/.next/standalone/packages/webui/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/dist/webui/.next/standalone/packages/webui/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/dist/webui/.next/standalone/packages/webui/.next/server/app/chat/[sessionId]/page.js +2 -0
- package/dist/webui/.next/standalone/packages/webui/.next/server/app/chat/[sessionId]/page.js.nft.json +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/server/app/chat/[sessionId]/page_client-reference-manifest.js +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/server/app/page.js +2 -11
- package/dist/webui/.next/standalone/packages/webui/.next/server/app/page.js.nft.json +1 -1
- package/dist/webui/.next/standalone/packages/webui/.next/server/app/page_client-reference-manifest.js +1 -1
- package/dist/webui/.next/standalone/packages/webui/.next/server/app/playground/page.js +4 -8
- package/dist/webui/.next/standalone/packages/webui/.next/server/app/playground/page.js.nft.json +1 -1
- package/dist/webui/.next/standalone/packages/webui/.next/server/app/playground/page_client-reference-manifest.js +1 -1
- package/dist/webui/.next/standalone/packages/webui/.next/server/app-paths-manifest.json +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/1.js +12 -0
- package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/102.js +25 -0
- package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/383.js +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/{619.js → 426.js} +2 -2
- package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/43.js +1 -1
- package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/985.js +5 -0
- package/dist/webui/.next/standalone/packages/webui/.next/server/middleware-build-manifest.js +1 -1
- package/dist/webui/.next/standalone/packages/webui/.next/server/pages/500.html +1 -1
- package/dist/webui/.next/standalone/packages/webui/.next/server/server-reference-manifest.json +1 -1
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/419-6d449dcb2b056299.js +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/614-3519f8a6051e0088.js +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/656-5a9f6405badf66a8.js +25 -0
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/765-755286dc586b1a51.js +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/804-f40df92a3adffcc0.js +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/854-232126f3c77e6c0b.js +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/chat/[sessionId]/page-a695b09e6bac5274.js +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/layout-f4a6ee5a028899d1.js +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/page-d1f127a0cac96246.js +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/playground/page-6f8d2abe76e51dfc.js +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/main-7decd42f62688419.js +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/{webpack-7c234e7e7e272295.js → webpack-7229fd0786f0483c.js} +1 -1
- package/dist/webui/.next/standalone/packages/webui/.next/static/css/c3c26ec984df1deb.css +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/static/css/de70bee13400563f.css +1 -0
- package/dist/webui/.next/standalone/packages/webui/.next/static/uqfH8SY_uhwdc0ZkpMwCO/_buildManifest.js +1 -0
- package/dist/webui/.next/standalone/packages/webui/package.json +11 -4
- package/dist/webui/.next/standalone/packages/webui/server.js +1 -1
- package/dist/webui/.next/static/chunks/419-6d449dcb2b056299.js +1 -0
- package/dist/webui/.next/static/chunks/614-3519f8a6051e0088.js +1 -0
- package/dist/webui/.next/static/chunks/656-5a9f6405badf66a8.js +25 -0
- package/dist/webui/.next/static/chunks/765-755286dc586b1a51.js +1 -0
- package/dist/webui/.next/static/chunks/804-f40df92a3adffcc0.js +1 -0
- package/dist/webui/.next/static/chunks/854-232126f3c77e6c0b.js +1 -0
- package/dist/webui/.next/static/chunks/app/chat/[sessionId]/page-a695b09e6bac5274.js +1 -0
- package/dist/webui/.next/static/chunks/app/layout-f4a6ee5a028899d1.js +1 -0
- package/dist/webui/.next/static/chunks/app/page-d1f127a0cac96246.js +1 -0
- package/dist/webui/.next/static/chunks/app/playground/page-6f8d2abe76e51dfc.js +1 -0
- package/dist/webui/.next/static/chunks/main-7decd42f62688419.js +1 -0
- package/dist/webui/.next/static/chunks/{webpack-7c234e7e7e272295.js → webpack-7229fd0786f0483c.js} +1 -1
- package/dist/webui/.next/static/css/c3c26ec984df1deb.css +1 -0
- package/dist/webui/.next/static/css/de70bee13400563f.css +1 -0
- package/dist/webui/.next/static/uqfH8SY_uhwdc0ZkpMwCO/_buildManifest.js +1 -0
- package/dist/webui/package.json +11 -4
- package/package.json +5 -4
- package/dist/webui/.next/standalone/.next/static/PvkEd_BO6ZXxX99T_gUvs/_buildManifest.js +0 -1
- package/dist/webui/.next/standalone/.next/static/chunks/179-78abc2eacbc41da9.js +0 -1
- package/dist/webui/.next/standalone/.next/static/chunks/442-b1916bec348454b3.js +0 -1
- package/dist/webui/.next/standalone/.next/static/chunks/544-c4a8f278ed1a25d7.js +0 -1
- package/dist/webui/.next/standalone/.next/static/chunks/854-2a6d5a5297a15d52.js +0 -1
- package/dist/webui/.next/standalone/.next/static/chunks/app/layout-dde711766eda096b.js +0 -1
- package/dist/webui/.next/standalone/.next/static/chunks/app/page-5e94d5a49dc718d0.js +0 -1
- package/dist/webui/.next/standalone/.next/static/chunks/app/playground/page-9ae40e0b219583e3.js +0 -1
- package/dist/webui/.next/standalone/.next/static/chunks/main-b65ece3506a2355c.js +0 -1
- package/dist/webui/.next/standalone/.next/static/css/045cc65741e38fbd.css +0 -3
- package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/549.js +0 -1
- package/dist/webui/.next/standalone/packages/webui/.next/server/chunks/950.js +0 -5
- package/dist/webui/.next/standalone/packages/webui/.next/static/PvkEd_BO6ZXxX99T_gUvs/_buildManifest.js +0 -1
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/179-78abc2eacbc41da9.js +0 -1
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/442-b1916bec348454b3.js +0 -1
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/544-c4a8f278ed1a25d7.js +0 -1
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/854-2a6d5a5297a15d52.js +0 -1
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/layout-dde711766eda096b.js +0 -1
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/page-5e94d5a49dc718d0.js +0 -1
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/app/playground/page-9ae40e0b219583e3.js +0 -1
- package/dist/webui/.next/standalone/packages/webui/.next/static/chunks/main-b65ece3506a2355c.js +0 -1
- package/dist/webui/.next/standalone/packages/webui/.next/static/css/045cc65741e38fbd.css +0 -3
- package/dist/webui/.next/static/PvkEd_BO6ZXxX99T_gUvs/_buildManifest.js +0 -1
- package/dist/webui/.next/static/chunks/179-78abc2eacbc41da9.js +0 -1
- package/dist/webui/.next/static/chunks/442-b1916bec348454b3.js +0 -1
- package/dist/webui/.next/static/chunks/544-c4a8f278ed1a25d7.js +0 -1
- package/dist/webui/.next/static/chunks/854-2a6d5a5297a15d52.js +0 -1
- package/dist/webui/.next/static/chunks/app/layout-dde711766eda096b.js +0 -1
- package/dist/webui/.next/static/chunks/app/page-5e94d5a49dc718d0.js +0 -1
- package/dist/webui/.next/static/chunks/app/playground/page-9ae40e0b219583e3.js +0 -1
- package/dist/webui/.next/static/chunks/main-b65ece3506a2355c.js +0 -1
- package/dist/webui/.next/static/css/045cc65741e38fbd.css +0 -3
- /package/dist/webui/.next/standalone/.next/static/{PvkEd_BO6ZXxX99T_gUvs → uqfH8SY_uhwdc0ZkpMwCO}/_ssgManifest.js +0 -0
- /package/dist/webui/.next/standalone/packages/webui/.next/static/{PvkEd_BO6ZXxX99T_gUvs → uqfH8SY_uhwdc0ZkpMwCO}/_ssgManifest.js +0 -0
- /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;
|
|
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:
|
|
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;
|
|
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
|
|
138
|
-
eventBus.on('dexto:
|
|
147
|
+
// Forward approval request events (including tool confirmations)
|
|
148
|
+
eventBus.on('dexto:approvalRequest', (payload) => {
|
|
139
149
|
this.broadcast({
|
|
140
|
-
event: '
|
|
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,
|
|
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;
|
|
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.
|
|
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,
|
|
80
|
-
|
|
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
|
package/dist/cli/cli.d.ts.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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
|
-
//
|
|
33
|
-
const
|
|
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
|
|
177
|
+
for (const agentInput of agentsToInstall) {
|
|
64
178
|
try {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
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: '
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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:
|
|
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 ${
|
|
287
|
+
const errorMsg = `Failed to install ${agentInput}: ${error instanceof Error ? error.message : String(error)}`;
|
|
102
288
|
errors.push(errorMsg);
|
|
103
|
-
failed.push(
|
|
289
|
+
failed.push(agentInput);
|
|
104
290
|
console.error(`❌ ${errorMsg}`);
|
|
105
|
-
//
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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-
|
|
144
|
-
console.log(` ${chalk.dim('/model switch claude-4-
|
|
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
|
-
* - /
|
|
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
|
|
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"}
|