dexto 1.6.12 → 1.6.13
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 +10 -2
- package/dist/analytics/events.d.ts +1 -1
- package/dist/analytics/events.d.ts.map +1 -1
- package/dist/cli/commands/agents/install.d.ts.map +1 -0
- package/dist/cli/commands/{install.js → agents/install.js} +4 -4
- package/dist/cli/commands/{list-agents.d.ts → agents/list.d.ts} +1 -1
- package/dist/cli/commands/agents/list.d.ts.map +1 -0
- package/dist/cli/commands/{list-agents.js → agents/list.js} +2 -2
- package/dist/cli/commands/agents/register.js +5 -5
- package/dist/cli/commands/{sync-agents.d.ts → agents/sync.d.ts} +10 -2
- package/dist/cli/commands/agents/sync.d.ts.map +1 -0
- package/dist/cli/commands/{sync-agents.js → agents/sync.js} +54 -5
- package/dist/cli/commands/agents/uninstall.d.ts +18 -0
- package/dist/cli/commands/agents/uninstall.d.ts.map +1 -0
- package/dist/cli/commands/agents/uninstall.js +141 -0
- package/dist/cli/commands/deploy/client.d.ts +44 -0
- package/dist/cli/commands/deploy/client.d.ts.map +1 -0
- package/dist/cli/commands/deploy/client.js +232 -0
- package/dist/cli/commands/deploy/config.d.ts +81 -0
- package/dist/cli/commands/deploy/config.d.ts.map +1 -0
- package/dist/cli/commands/deploy/config.js +144 -0
- package/dist/cli/commands/deploy/entry-agent.d.ts +3 -0
- package/dist/cli/commands/deploy/entry-agent.d.ts.map +1 -0
- package/dist/cli/commands/deploy/entry-agent.js +22 -0
- package/dist/cli/commands/deploy/index.d.ts +9 -0
- package/dist/cli/commands/deploy/index.d.ts.map +1 -0
- package/dist/cli/commands/deploy/index.js +204 -0
- package/dist/cli/commands/deploy/links.d.ts +3 -0
- package/dist/cli/commands/deploy/links.d.ts.map +1 -0
- package/dist/cli/commands/deploy/links.js +53 -0
- package/dist/cli/commands/deploy/register.d.ts +6 -0
- package/dist/cli/commands/deploy/register.d.ts.map +1 -0
- package/dist/cli/commands/deploy/register.js +75 -0
- package/dist/cli/commands/deploy/snapshot.d.ts +12 -0
- package/dist/cli/commands/deploy/snapshot.d.ts.map +1 -0
- package/dist/cli/commands/deploy/snapshot.js +76 -0
- package/dist/cli/commands/deploy/state.d.ts +21 -0
- package/dist/cli/commands/deploy/state.d.ts.map +1 -0
- package/dist/cli/commands/deploy/state.js +122 -0
- package/dist/cli/commands/index.d.ts +6 -4
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +6 -4
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +304 -31
- package/dist/cli/commands/uninstall.d.ts +9 -12
- package/dist/cli/commands/uninstall.d.ts.map +1 -1
- package/dist/cli/commands/uninstall.js +99 -113
- package/dist/cli/commands/upgrade.d.ts +15 -0
- package/dist/cli/commands/upgrade.d.ts.map +1 -0
- package/dist/cli/commands/upgrade.js +106 -0
- package/dist/cli/modes/cli.d.ts.map +1 -1
- package/dist/cli/modes/cli.js +0 -12
- package/dist/cli/utils/config-validation.d.ts.map +1 -1
- package/dist/cli/utils/config-validation.js +34 -20
- package/dist/cli/utils/self-management.d.ts +93 -0
- package/dist/cli/utils/self-management.d.ts.map +1 -0
- package/dist/cli/utils/self-management.js +423 -0
- package/dist/cli/utils/version-check.d.ts +1 -1
- package/dist/cli/utils/version-check.d.ts.map +1 -1
- package/dist/cli/utils/version-check.js +53 -19
- package/dist/index-main.js +59 -2
- package/dist/webui/assets/{index-CNiOYnOb.js → index-UDAdxmci.js} +187 -187
- package/dist/webui/index.html +1 -1
- package/package.json +13 -11
- package/dist/cli/commands/install.d.ts.map +0 -1
- package/dist/cli/commands/list-agents.d.ts.map +0 -1
- package/dist/cli/commands/sync-agents.d.ts.map +0 -1
- /package/dist/cli/commands/{install.d.ts → agents/install.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -98,14 +98,21 @@ The coding agent is just one example of what you can build. Create your own agen
|
|
|
98
98
|
### Install
|
|
99
99
|
|
|
100
100
|
```bash
|
|
101
|
-
#
|
|
102
|
-
|
|
101
|
+
# macOS / Linux / WSL (native installer, recommended)
|
|
102
|
+
curl -fsSL https://dexto.ai/install | bash
|
|
103
|
+
|
|
104
|
+
# Windows PowerShell
|
|
105
|
+
irm https://dexto.ai/install.ps1 | iex
|
|
103
106
|
|
|
104
107
|
# Or build from source
|
|
105
108
|
git clone https://github.com/truffle-ai/dexto.git
|
|
106
109
|
cd dexto && pnpm install && pnpm install-cli
|
|
107
110
|
```
|
|
108
111
|
|
|
112
|
+
Upgrade/uninstall and migration troubleshooting live in docs:
|
|
113
|
+
- Installation guide: https://docs.dexto.ai/docs/getting-started/installation
|
|
114
|
+
- CLI command reference: https://docs.dexto.ai/docs/guides/cli/overview
|
|
115
|
+
|
|
109
116
|
### Run
|
|
110
117
|
|
|
111
118
|
```bash
|
|
@@ -606,6 +613,7 @@ Options:
|
|
|
606
613
|
|
|
607
614
|
Commands:
|
|
608
615
|
setup Configure global preferences
|
|
616
|
+
deploy Deploy current workspace to cloud
|
|
609
617
|
agents install <agents...> Install agents from registry
|
|
610
618
|
agents list List available agents
|
|
611
619
|
session list|history Manage sessions
|
|
@@ -55,7 +55,7 @@ export interface SetupEvent {
|
|
|
55
55
|
model: string;
|
|
56
56
|
hadApiKeyBefore?: boolean;
|
|
57
57
|
setupMode: 'interactive' | 'non-interactive';
|
|
58
|
-
setupVariant?: 'quick-start' | 'custom' | 'dexto-nova';
|
|
58
|
+
setupVariant?: 'quick-start' | 'custom' | 'dexto-nova' | 'codex-chatgpt';
|
|
59
59
|
defaultMode?: string;
|
|
60
60
|
hasBaseURL?: boolean;
|
|
61
61
|
apiKeySkipped?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/analytics/events.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAEhE,MAAM,WAAW,gBAAgB;IAC7B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iBAAiB,CAAC,EAAE,gBAAgB,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;CAClD;AAED,MAAM,MAAM,oBAAoB,GAC1B,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAEzB,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;AAE1D,UAAU,mBAAmB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,eAAe,CAAC;IACvB,IAAI,CAAC,EAAE,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC7D,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,kBAAmB,SAAQ,mBAAmB;IAC3D,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IAC/D,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG,kBAAkB,GAAG,sBAAsB,CAAC;AAEjG,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,KAAK,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,aAAa,GAAG,iBAAiB,CAAC;IAC7C,YAAY,CAAC,EAAE,aAAa,GAAG,QAAQ,GAAG,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/analytics/events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/agents/install.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,QAAA,MAAM,oBAAoB;;;;;;;;;;;;EAMb,CAAC;AAEd,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAwK1E,wBAAsB,oBAAoB,CACtC,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACxC,OAAO,CAAC,IAAI,CAAC,CAuKf"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
// packages/cli/src/cli/commands/install.ts
|
|
1
|
+
// packages/cli/src/cli/commands/agents/install.ts
|
|
2
2
|
import { existsSync, statSync } from 'fs';
|
|
3
3
|
import path from 'path';
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import * as p from '@clack/prompts';
|
|
6
6
|
import { getDextoGlobalPath, loadBundledRegistryAgents } from '@dexto/agent-management';
|
|
7
|
-
import { textOrExit } from '
|
|
8
|
-
import { installBundledAgent, installCustomAgent } from '
|
|
9
|
-
import { capture } from '
|
|
7
|
+
import { textOrExit } from '../../utils/prompt-helpers.js';
|
|
8
|
+
import { installBundledAgent, installCustomAgent } from '../../../utils/agent-helpers.js';
|
|
9
|
+
import { capture } from '../../../analytics/index.js';
|
|
10
10
|
// Zod schema for install command validation
|
|
11
11
|
const InstallCommandSchema = z
|
|
12
12
|
.object({
|
|
@@ -19,4 +19,4 @@ export type ListAgentsCommandOptionsInput = z.input<typeof ListAgentsCommandSche
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function handleListAgentsCommand(options: ListAgentsCommandOptionsInput): Promise<void>;
|
|
21
21
|
export {};
|
|
22
|
-
//# sourceMappingURL=list
|
|
22
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/agents/list.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,QAAA,MAAM,uBAAuB;;;;;;;;;;;;EAMhB,CAAC;AAEd,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAChF,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAiIpF;;GAEG;AACH,wBAAsB,uBAAuB,CACzC,OAAO,EAAE,6BAA6B,GACvC,OAAO,CAAC,IAAI,CAAC,CAmIf"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
// packages/cli/src/cli/commands/list
|
|
1
|
+
// packages/cli/src/cli/commands/agents/list.ts
|
|
2
2
|
import { existsSync } from 'fs';
|
|
3
3
|
import { promises as fs } from 'fs';
|
|
4
4
|
import path from 'path';
|
|
5
5
|
import chalk from 'chalk';
|
|
6
6
|
import { z } from 'zod';
|
|
7
7
|
import { getDextoGlobalPath, globalPreferencesExist, loadGlobalPreferences, loadBundledRegistryAgents, } from '@dexto/agent-management';
|
|
8
|
-
import { getProviderDisplayName } from '
|
|
8
|
+
import { getProviderDisplayName } from '../../utils/provider-setup.js';
|
|
9
9
|
// Zod schema for list-agents command validation
|
|
10
10
|
const ListAgentsCommandSchema = z
|
|
11
11
|
.object({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { withAnalytics, safeExit, ExitSignal } from '../../../analytics/wrapper.js';
|
|
2
2
|
export function registerAgentsCommand({ program }) {
|
|
3
|
-
const agentsCommand = program.command('agents').description('Manage agents');
|
|
3
|
+
const agentsCommand = program.command('agents').alias('agent').description('Manage agents');
|
|
4
4
|
agentsCommand
|
|
5
5
|
.command('install [agents...]')
|
|
6
6
|
.description('Install agents from registry or custom YAML files/directories')
|
|
@@ -16,7 +16,7 @@ Examples:
|
|
|
16
16
|
$ dexto agents install ./my-agent-dir/ Install custom agent from directory (interactive)`)
|
|
17
17
|
.action(withAnalytics('agents install', async (agents = [], options) => {
|
|
18
18
|
try {
|
|
19
|
-
const { handleInstallCommand } = await import('
|
|
19
|
+
const { handleInstallCommand } = await import('./install.js');
|
|
20
20
|
await handleInstallCommand(agents, options);
|
|
21
21
|
safeExit('agents install', 0);
|
|
22
22
|
}
|
|
@@ -34,7 +34,7 @@ Examples:
|
|
|
34
34
|
.option('--force', 'Force uninstall even if agent is protected (e.g., coding-agent)')
|
|
35
35
|
.action(withAnalytics('agents uninstall', async (agents, options) => {
|
|
36
36
|
try {
|
|
37
|
-
const { handleUninstallCommand } = await import('
|
|
37
|
+
const { handleUninstallCommand } = await import('./uninstall.js');
|
|
38
38
|
await handleUninstallCommand(agents, options);
|
|
39
39
|
safeExit('agents uninstall', 0);
|
|
40
40
|
}
|
|
@@ -53,7 +53,7 @@ Examples:
|
|
|
53
53
|
.option('--available', 'Show only available agents')
|
|
54
54
|
.action(withAnalytics('agents list', async (options) => {
|
|
55
55
|
try {
|
|
56
|
-
const { handleListAgentsCommand } = await import('
|
|
56
|
+
const { handleListAgentsCommand } = await import('./list.js');
|
|
57
57
|
await handleListAgentsCommand(options);
|
|
58
58
|
safeExit('agents list', 0);
|
|
59
59
|
}
|
|
@@ -71,7 +71,7 @@ Examples:
|
|
|
71
71
|
.option('--force', 'Update all agents without prompting')
|
|
72
72
|
.action(withAnalytics('agents sync', async (options) => {
|
|
73
73
|
try {
|
|
74
|
-
const { handleSyncAgentsCommand } = await import('
|
|
74
|
+
const { handleSyncAgentsCommand } = await import('./sync.js');
|
|
75
75
|
await handleSyncAgentsCommand(options);
|
|
76
76
|
safeExit('agents sync', 0);
|
|
77
77
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type AgentRegistryEntry } from '@dexto/agent-management';
|
|
1
2
|
/**
|
|
2
3
|
* Options for the sync-agents command
|
|
3
4
|
*/
|
|
@@ -8,7 +9,14 @@ export interface SyncAgentsCommandOptions {
|
|
|
8
9
|
force?: boolean;
|
|
9
10
|
/** Minimal output - used when called from startup prompt */
|
|
10
11
|
quiet?: boolean;
|
|
12
|
+
/** Restrict sync to specific bundled agent IDs */
|
|
13
|
+
agentIds?: string[];
|
|
11
14
|
}
|
|
15
|
+
export interface BundledSyncTarget {
|
|
16
|
+
agentId: string;
|
|
17
|
+
agentEntry: AgentRegistryEntry;
|
|
18
|
+
}
|
|
19
|
+
export declare function getBundledSyncTargetForAgentPath(agentPath: string): BundledSyncTarget | null;
|
|
12
20
|
/**
|
|
13
21
|
* Quick check if any installed agents have updates available
|
|
14
22
|
*
|
|
@@ -17,7 +25,7 @@ export interface SyncAgentsCommandOptions {
|
|
|
17
25
|
*
|
|
18
26
|
* @returns true if should prompt for sync
|
|
19
27
|
*/
|
|
20
|
-
export declare function shouldPromptForSync(): Promise<boolean>;
|
|
28
|
+
export declare function shouldPromptForSync(agentPath?: string): Promise<boolean>;
|
|
21
29
|
/**
|
|
22
30
|
* Main handler for the sync-agents command
|
|
23
31
|
*
|
|
@@ -31,4 +39,4 @@ export declare function shouldPromptForSync(): Promise<boolean>;
|
|
|
31
39
|
* ```
|
|
32
40
|
*/
|
|
33
41
|
export declare function handleSyncAgentsCommand(options: SyncAgentsCommandOptions): Promise<void>;
|
|
34
|
-
//# sourceMappingURL=sync
|
|
42
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/agents/sync.ts"],"names":[],"mappings":"AASA,OAAO,EAKH,KAAK,kBAAkB,EAC1B,MAAM,yBAAyB,CAAC;AAEjC;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACrC,wCAAwC;IACxC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,mCAAmC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAoBD,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,kBAAkB,CAAC;CAClC;AA0BD,wBAAgB,gCAAgC,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAuB5F;AAwLD;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyC9E;AAoDD;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqO9F"}
|
|
@@ -1,11 +1,50 @@
|
|
|
1
|
-
// packages/cli/src/cli/commands/sync
|
|
1
|
+
// packages/cli/src/cli/commands/agents/sync.ts
|
|
2
2
|
import { promises as fs } from 'fs';
|
|
3
3
|
import { createHash } from 'crypto';
|
|
4
4
|
import path from 'path';
|
|
5
|
+
import { realpathSync } from 'fs';
|
|
5
6
|
import chalk from 'chalk';
|
|
6
7
|
import * as p from '@clack/prompts';
|
|
7
8
|
import { logger } from '@dexto/core';
|
|
8
9
|
import { getDextoGlobalPath, resolveBundledScript, copyDirectory, loadBundledRegistryAgents, } from '@dexto/agent-management';
|
|
10
|
+
function normalizeComparablePath(filePath) {
|
|
11
|
+
try {
|
|
12
|
+
return realpathSync(filePath);
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return path.resolve(filePath);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function getInstalledMainConfigPath(agentId, agentEntry) {
|
|
19
|
+
const installedRoot = path.join(getDextoGlobalPath('agents'), agentId);
|
|
20
|
+
if (agentEntry.source.endsWith('/')) {
|
|
21
|
+
if (!agentEntry.main) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return path.join(installedRoot, agentEntry.main);
|
|
25
|
+
}
|
|
26
|
+
return path.join(installedRoot, path.basename(agentEntry.source));
|
|
27
|
+
}
|
|
28
|
+
export function getBundledSyncTargetForAgentPath(agentPath) {
|
|
29
|
+
try {
|
|
30
|
+
const normalizedAgentPath = normalizeComparablePath(agentPath);
|
|
31
|
+
const bundledAgents = loadBundledRegistryAgents();
|
|
32
|
+
for (const [agentId, agentEntry] of Object.entries(bundledAgents)) {
|
|
33
|
+
const installedMainConfigPath = getInstalledMainConfigPath(agentId, agentEntry);
|
|
34
|
+
if (!installedMainConfigPath) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
if (normalizeComparablePath(installedMainConfigPath) === normalizedAgentPath) {
|
|
38
|
+
return { agentId, agentEntry };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
logger.debug(`Failed to resolve sync target for agent path '${agentPath}': ${error instanceof Error ? error.message : String(error)}`);
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
9
48
|
/**
|
|
10
49
|
* Calculate SHA256 hash of a file
|
|
11
50
|
*/
|
|
@@ -177,9 +216,18 @@ async function getAgentStatus(agentId, agentEntry) {
|
|
|
177
216
|
*
|
|
178
217
|
* @returns true if should prompt for sync
|
|
179
218
|
*/
|
|
180
|
-
export async function shouldPromptForSync() {
|
|
219
|
+
export async function shouldPromptForSync(agentPath) {
|
|
181
220
|
try {
|
|
182
221
|
const bundledAgents = loadBundledRegistryAgents();
|
|
222
|
+
if (agentPath) {
|
|
223
|
+
const syncTarget = getBundledSyncTargetForAgentPath(agentPath);
|
|
224
|
+
if (!syncTarget) {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
const bundledHash = await getBundledAgentHash(syncTarget.agentEntry);
|
|
228
|
+
const installedHash = await getInstalledAgentHash(syncTarget.agentId, syncTarget.agentEntry);
|
|
229
|
+
return Boolean(bundledHash && installedHash && bundledHash !== installedHash);
|
|
230
|
+
}
|
|
183
231
|
const installedAgentIds = await getInstalledAgentIds();
|
|
184
232
|
for (const agentId of installedAgentIds) {
|
|
185
233
|
const agentEntry = bundledAgents[agentId];
|
|
@@ -258,7 +306,7 @@ function formatStatus(status) {
|
|
|
258
306
|
* ```
|
|
259
307
|
*/
|
|
260
308
|
export async function handleSyncAgentsCommand(options) {
|
|
261
|
-
const { list = false, force = false, quiet = false } = options;
|
|
309
|
+
const { list = false, force = false, quiet = false, agentIds = [] } = options;
|
|
262
310
|
if (!quiet) {
|
|
263
311
|
p.intro(chalk.cyan('Agent Sync'));
|
|
264
312
|
}
|
|
@@ -267,11 +315,12 @@ export async function handleSyncAgentsCommand(options) {
|
|
|
267
315
|
try {
|
|
268
316
|
// Load bundled registry (uses existing function from agent-management)
|
|
269
317
|
const bundledAgents = loadBundledRegistryAgents();
|
|
270
|
-
const
|
|
318
|
+
const targetAgentIds = new Set(agentIds);
|
|
319
|
+
const bundledAgentIds = Object.keys(bundledAgents).filter((agentId) => targetAgentIds.size === 0 || targetAgentIds.has(agentId));
|
|
271
320
|
// Get installed agents
|
|
272
321
|
const installedAgentIds = await getInstalledAgentIds();
|
|
273
322
|
// Find custom agents (installed but not in bundled registry)
|
|
274
|
-
const customAgentIds = installedAgentIds.filter((id) => !bundledAgents[id]);
|
|
323
|
+
const customAgentIds = targetAgentIds.size === 0 ? installedAgentIds.filter((id) => !bundledAgents[id]) : [];
|
|
275
324
|
// Check status of all bundled agents
|
|
276
325
|
const agentInfos = [];
|
|
277
326
|
for (const agentId of bundledAgentIds) {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
declare const UninstallCommandSchema: z.ZodObject<{
|
|
3
|
+
agents: z.ZodArray<z.ZodString, "many">;
|
|
4
|
+
all: z.ZodDefault<z.ZodBoolean>;
|
|
5
|
+
force: z.ZodDefault<z.ZodBoolean>;
|
|
6
|
+
}, "strict", z.ZodTypeAny, {
|
|
7
|
+
agents: string[];
|
|
8
|
+
force: boolean;
|
|
9
|
+
all: boolean;
|
|
10
|
+
}, {
|
|
11
|
+
agents: string[];
|
|
12
|
+
force?: boolean | undefined;
|
|
13
|
+
all?: boolean | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
export type UninstallCommandOptions = z.output<typeof UninstallCommandSchema>;
|
|
16
|
+
export declare function handleUninstallCommand(agents: string[], options: Partial<UninstallCommandOptions>): Promise<void>;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=uninstall.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/agents/uninstall.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,QAAA,MAAM,sBAAsB;;;;;;;;;;;;EAMf,CAAC;AAEd,MAAM,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAiC9E,wBAAsB,sBAAsB,CACxC,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAC1C,OAAO,CAAC,IAAI,CAAC,CAkHf"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// packages/cli/src/cli/commands/agents/uninstall.ts
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { getAgentRegistry } from '@dexto/agent-management';
|
|
4
|
+
import { capture } from '../../../analytics/index.js';
|
|
5
|
+
// Zod schema for uninstall command validation
|
|
6
|
+
const UninstallCommandSchema = z
|
|
7
|
+
.object({
|
|
8
|
+
agents: z.array(z.string().min(1, 'Agent name cannot be empty')),
|
|
9
|
+
all: z.boolean().default(false),
|
|
10
|
+
force: z.boolean().default(false),
|
|
11
|
+
})
|
|
12
|
+
.strict();
|
|
13
|
+
/**
|
|
14
|
+
* Validate uninstall command arguments
|
|
15
|
+
*/
|
|
16
|
+
async function validateUninstallCommand(agents, options) {
|
|
17
|
+
const registry = getAgentRegistry();
|
|
18
|
+
// Basic structure validation
|
|
19
|
+
const validated = UninstallCommandSchema.parse({
|
|
20
|
+
...options,
|
|
21
|
+
agents,
|
|
22
|
+
});
|
|
23
|
+
// Business logic validation
|
|
24
|
+
const installedAgents = await registry.getInstalledAgents();
|
|
25
|
+
if (installedAgents.length === 0) {
|
|
26
|
+
throw new Error('No agents are currently installed.');
|
|
27
|
+
}
|
|
28
|
+
if (!validated.all && validated.agents.length === 0) {
|
|
29
|
+
throw new Error(`No agents specified. Use agent names or --all flag. Installed agents: ${installedAgents.join(', ')}`);
|
|
30
|
+
}
|
|
31
|
+
return validated;
|
|
32
|
+
}
|
|
33
|
+
export async function handleUninstallCommand(agents, options) {
|
|
34
|
+
const registry = getAgentRegistry();
|
|
35
|
+
// Validate command with Zod
|
|
36
|
+
const validated = await validateUninstallCommand(agents, options);
|
|
37
|
+
const installedAgents = await registry.getInstalledAgents();
|
|
38
|
+
if (installedAgents.length === 0) {
|
|
39
|
+
console.log('📋 No agents are currently installed.');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// Determine which agents to uninstall
|
|
43
|
+
let agentsToUninstall;
|
|
44
|
+
if (validated.all) {
|
|
45
|
+
agentsToUninstall = installedAgents;
|
|
46
|
+
console.log(`📋 Uninstalling all ${agentsToUninstall.length} installed agents...`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
agentsToUninstall = validated.agents;
|
|
50
|
+
// Validate all specified agents are actually installed
|
|
51
|
+
const notInstalled = agentsToUninstall.filter((agent) => !installedAgents.includes(agent));
|
|
52
|
+
if (notInstalled.length > 0) {
|
|
53
|
+
throw new Error(`Agents not installed: ${notInstalled.join(', ')}. ` +
|
|
54
|
+
`Installed agents: ${installedAgents.join(', ')}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
console.log(`🗑️ Uninstalling ${agentsToUninstall.length} agents...`);
|
|
58
|
+
let successCount = 0;
|
|
59
|
+
let errorCount = 0;
|
|
60
|
+
const errors = [];
|
|
61
|
+
const uninstalled = [];
|
|
62
|
+
const failed = [];
|
|
63
|
+
// Uninstall each agent
|
|
64
|
+
for (const agentName of agentsToUninstall) {
|
|
65
|
+
try {
|
|
66
|
+
console.log(`\n🗑️ Uninstalling ${agentName}...`);
|
|
67
|
+
await registry.uninstallAgent(agentName, validated.force);
|
|
68
|
+
successCount++;
|
|
69
|
+
console.log(`✅ ${agentName} uninstalled successfully`);
|
|
70
|
+
uninstalled.push(agentName);
|
|
71
|
+
// Per-agent analytics for successful uninstall
|
|
72
|
+
try {
|
|
73
|
+
capture('dexto_uninstall_agent', {
|
|
74
|
+
agent: agentName,
|
|
75
|
+
status: 'uninstalled',
|
|
76
|
+
force: validated.force,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Analytics failures should not block CLI execution.
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
errorCount++;
|
|
85
|
+
const errorMsg = `Failed to uninstall ${agentName}: ${error instanceof Error ? error.message : String(error)}`;
|
|
86
|
+
errors.push(errorMsg);
|
|
87
|
+
failed.push(agentName);
|
|
88
|
+
console.error(`❌ ${errorMsg}`);
|
|
89
|
+
// Per-agent analytics for failed uninstall
|
|
90
|
+
try {
|
|
91
|
+
capture('dexto_uninstall_agent', {
|
|
92
|
+
agent: agentName,
|
|
93
|
+
status: 'failed',
|
|
94
|
+
error_message: error instanceof Error ? error.message : String(error),
|
|
95
|
+
force: validated.force,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Analytics failures should not block CLI execution.
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Emit analytics for both single- and multi-agent cases
|
|
104
|
+
try {
|
|
105
|
+
capture('dexto_uninstall', {
|
|
106
|
+
requested: agentsToUninstall,
|
|
107
|
+
uninstalled,
|
|
108
|
+
failed,
|
|
109
|
+
successCount,
|
|
110
|
+
errorCount,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Analytics failures should not block CLI execution.
|
|
115
|
+
}
|
|
116
|
+
// For single agent operations, throw error if it failed (after emitting analytics)
|
|
117
|
+
if (agentsToUninstall.length === 1) {
|
|
118
|
+
if (errorCount > 0) {
|
|
119
|
+
throw new Error(errors[0]);
|
|
120
|
+
}
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
// Show summary if more than 1 agent uninstalled
|
|
124
|
+
console.log(`\n📊 Uninstallation Summary:`);
|
|
125
|
+
console.log(`✅ Successfully uninstalled: ${successCount}`);
|
|
126
|
+
if (errorCount > 0) {
|
|
127
|
+
console.log(`❌ Failed to uninstall: ${errorCount}`);
|
|
128
|
+
errors.forEach((error) => {
|
|
129
|
+
console.log(` • ${error}`);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
if (errorCount > 0 && successCount === 0) {
|
|
133
|
+
throw new Error('All uninstallations failed');
|
|
134
|
+
}
|
|
135
|
+
else if (errorCount > 0) {
|
|
136
|
+
console.log(`⚠️ Some uninstallations failed, but ${successCount} succeeded.`);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
console.log(`🎉 All agents uninstalled successfully!`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { DeployAgent } from './config.js';
|
|
3
|
+
declare const CloudAgentStateSchema: z.ZodObject<{
|
|
4
|
+
status: z.ZodString;
|
|
5
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
6
|
+
status: z.ZodString;
|
|
7
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
8
|
+
status: z.ZodString;
|
|
9
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
10
|
+
export interface DeployCloudAgentResult {
|
|
11
|
+
cloudAgentId: string;
|
|
12
|
+
agentUrl: string;
|
|
13
|
+
state: z.output<typeof CloudAgentStateSchema>;
|
|
14
|
+
}
|
|
15
|
+
export interface CloudAgentStatusResult {
|
|
16
|
+
cloudAgentId: string;
|
|
17
|
+
agentUrl: string;
|
|
18
|
+
state: z.output<typeof CloudAgentStateSchema>;
|
|
19
|
+
stale: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface CloudAgentStopResult {
|
|
22
|
+
cloudAgentId: string;
|
|
23
|
+
agentUrl: string;
|
|
24
|
+
stopped: boolean;
|
|
25
|
+
alreadyStopped: boolean;
|
|
26
|
+
snapshotStatus: string;
|
|
27
|
+
}
|
|
28
|
+
export interface CloudAgentDeleteResult {
|
|
29
|
+
cloudAgentId: string;
|
|
30
|
+
agentUrl: string;
|
|
31
|
+
}
|
|
32
|
+
export declare function resolveSandboxBaseUrl(): string;
|
|
33
|
+
export declare function createDeployClient(): {
|
|
34
|
+
deployWorkspace(input: {
|
|
35
|
+
agent: DeployAgent;
|
|
36
|
+
snapshotPath: string;
|
|
37
|
+
cloudAgentId?: string;
|
|
38
|
+
}): Promise<DeployCloudAgentResult>;
|
|
39
|
+
getCloudAgent(cloudAgentId: string): Promise<CloudAgentStatusResult>;
|
|
40
|
+
stopCloudAgent(cloudAgentId: string): Promise<CloudAgentStopResult>;
|
|
41
|
+
deleteCloudAgent(cloudAgentId: string): Promise<CloudAgentDeleteResult>;
|
|
42
|
+
};
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/deploy/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO/C,QAAA,MAAM,qBAAqB;;;;;;gCAIT,CAAC;AAyEnB,MAAM,WAAW,sBAAsB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,sBAAsB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;IAC9C,KAAK,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAaD,wBAAgB,qBAAqB,IAAI,MAAM,CAY9C;AAuED,wBAAgB,kBAAkB;2BAEG;QACzB,KAAK,EAAE,WAAW,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACzB,GAAG,OAAO,CAAC,sBAAsB,CAAC;gCAsCD,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;iCAkBvC,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;mCA0BpC,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;EAgBpF"}
|