dexto 1.6.13 → 1.6.15
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/dist/cli/auth/constants.d.ts.map +1 -1
- package/dist/cli/auth/constants.js +1 -1
- package/dist/cli/commands/deploy/client.d.ts +7 -0
- package/dist/cli/commands/deploy/client.d.ts.map +1 -1
- package/dist/cli/commands/deploy/client.js +37 -0
- package/dist/cli/commands/deploy/entry-agent.d.ts +1 -1
- package/dist/cli/commands/deploy/entry-agent.d.ts.map +1 -1
- package/dist/cli/commands/deploy/entry-agent.js +50 -2
- package/dist/cli/commands/deploy/index.d.ts +2 -0
- package/dist/cli/commands/deploy/index.d.ts.map +1 -1
- package/dist/cli/commands/deploy/index.js +95 -2
- package/dist/cli/commands/deploy/register.d.ts.map +1 -1
- package/dist/cli/commands/deploy/register.js +34 -0
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +1 -0
- package/dist/cli/commands/init.d.ts +96 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +834 -0
- package/dist/index-main.js +7 -1
- package/package.json +11 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/constants.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,YAAY,QAAyE,CAAC;AACnG,eAAO,MAAM,iBAAiB,QAEwL,CAAC;AAEvN;;GAEG;AACH,eAAO,MAAM,aAAa,QAAsD,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,kBAAkB,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/constants.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,YAAY,QAAyE,CAAC;AACnG,eAAO,MAAM,iBAAiB,QAEwL,CAAC;AAEvN;;GAEG;AACH,eAAO,MAAM,aAAa,QAAsD,CAAC;AAEjF;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAgE,CAAC;AAEhG;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAC+C,CAAC"}
|
|
@@ -26,7 +26,7 @@ export const DEXTO_API_URL = process.env.DEXTO_API_URL || 'https://api.dexto.ai'
|
|
|
26
26
|
/**
|
|
27
27
|
* Dexto platform URL for auth/key/account control-plane endpoints.
|
|
28
28
|
*/
|
|
29
|
-
export const DEXTO_PLATFORM_URL = process.env.DEXTO_PLATFORM_URL || 'https://
|
|
29
|
+
export const DEXTO_PLATFORM_URL = process.env.DEXTO_PLATFORM_URL || 'https://platform.dexto.ai';
|
|
30
30
|
/**
|
|
31
31
|
* Dexto Nova credits purchase URL
|
|
32
32
|
*/
|
|
@@ -18,6 +18,12 @@ export interface CloudAgentStatusResult {
|
|
|
18
18
|
state: z.output<typeof CloudAgentStateSchema>;
|
|
19
19
|
stale: boolean;
|
|
20
20
|
}
|
|
21
|
+
export interface CloudAgentListItemResult {
|
|
22
|
+
cloudAgentId: string;
|
|
23
|
+
name: string | null;
|
|
24
|
+
agentUrl: string;
|
|
25
|
+
state: z.output<typeof CloudAgentStateSchema>;
|
|
26
|
+
}
|
|
21
27
|
export interface CloudAgentStopResult {
|
|
22
28
|
cloudAgentId: string;
|
|
23
29
|
agentUrl: string;
|
|
@@ -37,6 +43,7 @@ export declare function createDeployClient(): {
|
|
|
37
43
|
cloudAgentId?: string;
|
|
38
44
|
}): Promise<DeployCloudAgentResult>;
|
|
39
45
|
getCloudAgent(cloudAgentId: string): Promise<CloudAgentStatusResult>;
|
|
46
|
+
listCloudAgents(): Promise<CloudAgentListItemResult[]>;
|
|
40
47
|
stopCloudAgent(cloudAgentId: string): Promise<CloudAgentStopResult>;
|
|
41
48
|
deleteCloudAgent(cloudAgentId: string): Promise<CloudAgentDeleteResult>;
|
|
42
49
|
};
|
|
@@ -1 +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;
|
|
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;AAgGnB,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,wBAAwB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;CACjD;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;uBAkBjD,OAAO,CAAC,wBAAwB,EAAE,CAAC;iCAkBzB,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;mCA0BpC,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;EAgBpF"}
|
|
@@ -17,6 +17,15 @@ const CloudAgentSummarySchema = z
|
|
|
17
17
|
state: CloudAgentStateSchema,
|
|
18
18
|
})
|
|
19
19
|
.passthrough();
|
|
20
|
+
const CloudAgentListItemSchema = z
|
|
21
|
+
.object({
|
|
22
|
+
cloudAgentId: z.string(),
|
|
23
|
+
name: z.string().nullable().optional(),
|
|
24
|
+
agentUrl: z.string(),
|
|
25
|
+
hostUrl: z.string().nullable().optional(),
|
|
26
|
+
state: CloudAgentStateSchema,
|
|
27
|
+
})
|
|
28
|
+
.passthrough();
|
|
20
29
|
const DeployResponseSchema = z
|
|
21
30
|
.object({
|
|
22
31
|
success: z.boolean(),
|
|
@@ -46,6 +55,18 @@ const StatusResponseSchema = z
|
|
|
46
55
|
.optional(),
|
|
47
56
|
})
|
|
48
57
|
.passthrough();
|
|
58
|
+
const ListResponseSchema = z
|
|
59
|
+
.object({
|
|
60
|
+
success: z.boolean(),
|
|
61
|
+
error: z.string().optional(),
|
|
62
|
+
data: z
|
|
63
|
+
.object({
|
|
64
|
+
cloudAgents: z.array(CloudAgentListItemSchema),
|
|
65
|
+
})
|
|
66
|
+
.passthrough()
|
|
67
|
+
.optional(),
|
|
68
|
+
})
|
|
69
|
+
.passthrough();
|
|
49
70
|
const StopResponseSchema = z
|
|
50
71
|
.object({
|
|
51
72
|
success: z.boolean(),
|
|
@@ -193,6 +214,22 @@ export function createDeployClient() {
|
|
|
193
214
|
stale: data.stale === true,
|
|
194
215
|
};
|
|
195
216
|
},
|
|
217
|
+
async listCloudAgents() {
|
|
218
|
+
const response = await request('/cloud-agents/list', {
|
|
219
|
+
method: 'GET',
|
|
220
|
+
});
|
|
221
|
+
if (!response.ok) {
|
|
222
|
+
await throwApiError(response);
|
|
223
|
+
}
|
|
224
|
+
const payload = await parseJsonResponse(response);
|
|
225
|
+
const data = requireSuccessData(payload, response, ListResponseSchema);
|
|
226
|
+
return data.cloudAgents.map((cloudAgent) => ({
|
|
227
|
+
cloudAgentId: cloudAgent.cloudAgentId,
|
|
228
|
+
name: cloudAgent.name ?? null,
|
|
229
|
+
agentUrl: cloudAgent.agentUrl,
|
|
230
|
+
state: cloudAgent.state,
|
|
231
|
+
}));
|
|
232
|
+
},
|
|
196
233
|
async stopCloudAgent(cloudAgentId) {
|
|
197
234
|
const response = await request(`/cloud-agents/${encodeURIComponent(cloudAgentId)}/stop`, {
|
|
198
235
|
method: 'POST',
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export declare function isAgentYamlPath(filePath: string): boolean;
|
|
2
|
-
export declare function discoverPrimaryWorkspaceAgent(workspaceRoot: string): string | null
|
|
2
|
+
export declare function discoverPrimaryWorkspaceAgent(workspaceRoot: string): Promise<string | null>;
|
|
3
3
|
//# sourceMappingURL=entry-agent.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entry-agent.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/deploy/entry-agent.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"entry-agent.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/deploy/entry-agent.ts"],"names":[],"mappings":"AAiFA,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAsB,6BAA6B,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuBjG"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { findProjectRegistryPath, getDefaultProjectRegistryEntry, readProjectRegistry, } from '@dexto/agent-management';
|
|
2
|
+
import { existsSync, promises as fs } from 'fs';
|
|
2
3
|
import path from 'path';
|
|
3
4
|
import { normalizeWorkspaceRelativePath } from './config.js';
|
|
4
5
|
const PRIMARY_WORKSPACE_AGENT_PATHS = [
|
|
@@ -7,15 +8,62 @@ const PRIMARY_WORKSPACE_AGENT_PATHS = [
|
|
|
7
8
|
path.join('agents', 'coding-agent.yml'),
|
|
8
9
|
path.join('agents', 'coding-agent.yaml'),
|
|
9
10
|
];
|
|
11
|
+
async function loadWorkspaceProjectRegistry(workspaceRoot) {
|
|
12
|
+
const registryPath = await findProjectRegistryPath(workspaceRoot);
|
|
13
|
+
if (!registryPath) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const registry = await readProjectRegistry(registryPath);
|
|
17
|
+
const defaultEntry = getDefaultProjectRegistryEntry(registry, registryPath);
|
|
18
|
+
if (!defaultEntry) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
registryPath,
|
|
23
|
+
defaultConfigPath: await resolveWorkspaceRegistryConfigPath(workspaceRoot, registryPath, defaultEntry.configPath, defaultEntry.id),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
async function resolveWorkspaceRegistryConfigPath(workspaceRoot, registryPath, configPath, agentId) {
|
|
27
|
+
const normalizedPath = normalizeWorkspaceRelativePath(configPath);
|
|
28
|
+
const absolutePath = path.resolve(path.dirname(registryPath), normalizedPath);
|
|
29
|
+
const relativeToWorkspace = path.relative(workspaceRoot, absolutePath);
|
|
30
|
+
if (relativeToWorkspace.startsWith('..') ||
|
|
31
|
+
path.isAbsolute(relativeToWorkspace) ||
|
|
32
|
+
relativeToWorkspace === '') {
|
|
33
|
+
throw new Error(`Agent '${agentId}' in ${registryPath} has invalid configPath '${configPath}': path must stay inside the workspace root.`);
|
|
34
|
+
}
|
|
35
|
+
let stat;
|
|
36
|
+
try {
|
|
37
|
+
stat = await fs.stat(absolutePath);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (error.code === 'ENOENT') {
|
|
41
|
+
throw new Error(`Agent '${agentId}' in ${registryPath} has invalid configPath '${configPath}': file does not exist.`);
|
|
42
|
+
}
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
if (!stat.isFile()) {
|
|
46
|
+
throw new Error(`Agent '${agentId}' in ${registryPath} has invalid configPath '${configPath}': path must point to a file.`);
|
|
47
|
+
}
|
|
48
|
+
return absolutePath;
|
|
49
|
+
}
|
|
10
50
|
export function isAgentYamlPath(filePath) {
|
|
11
51
|
return /\.(ya?ml)$/i.test(filePath);
|
|
12
52
|
}
|
|
13
|
-
export function discoverPrimaryWorkspaceAgent(workspaceRoot) {
|
|
53
|
+
export async function discoverPrimaryWorkspaceAgent(workspaceRoot) {
|
|
54
|
+
const loadedRegistry = await loadWorkspaceProjectRegistry(workspaceRoot);
|
|
55
|
+
if (loadedRegistry) {
|
|
56
|
+
return normalizeWorkspaceRelativePath(path.relative(workspaceRoot, loadedRegistry.defaultConfigPath).replace(/\\/g, '/'));
|
|
57
|
+
}
|
|
14
58
|
for (const relativePath of PRIMARY_WORKSPACE_AGENT_PATHS) {
|
|
15
59
|
const absolutePath = path.join(workspaceRoot, relativePath);
|
|
16
60
|
if (!existsSync(absolutePath)) {
|
|
17
61
|
continue;
|
|
18
62
|
}
|
|
63
|
+
const stat = await fs.stat(absolutePath);
|
|
64
|
+
if (!stat.isFile()) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
19
67
|
return normalizeWorkspaceRelativePath(relativePath);
|
|
20
68
|
}
|
|
21
69
|
return null;
|
|
@@ -2,6 +2,8 @@ interface InteractiveOptions {
|
|
|
2
2
|
interactive?: boolean;
|
|
3
3
|
}
|
|
4
4
|
export declare function handleDeployCommand(options?: InteractiveOptions): Promise<void>;
|
|
5
|
+
export declare function handleDeployListCommand(): Promise<void>;
|
|
6
|
+
export declare function handleDeployOpenCommand(): Promise<void>;
|
|
5
7
|
export declare function handleDeployStatusCommand(): Promise<void>;
|
|
6
8
|
export declare function handleDeployStopCommand(): Promise<void>;
|
|
7
9
|
export declare function handleDeployDeleteCommand(options?: InteractiveOptions): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/deploy/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/deploy/index.ts"],"names":[],"mappings":"AA4BA,UAAU,kBAAkB;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AAyHD,wBAAsB,mBAAmB,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ErF;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiD7D;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAqB7D;AAED,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CAkB/D;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CA4B7D;AAED,wBAAsB,yBAAyB,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2C3F"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { existsSync } from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
3
|
import * as p from '@clack/prompts';
|
|
4
|
-
import { findDextoProjectRoot } from '@dexto/agent-management';
|
|
4
|
+
import { findDextoProjectRoot, loadAgentConfig } from '@dexto/agent-management';
|
|
5
5
|
import chalk from 'chalk';
|
|
6
|
+
import open from 'open';
|
|
6
7
|
import { confirmOrExit } from '../../utils/prompt-helpers.js';
|
|
8
|
+
import { validateAgentConfig } from '../../utils/config-validation.js';
|
|
7
9
|
import { createCloudDefaultDeployConfig, createWorkspaceDeployConfig, getDeployConfigPath, isWorkspaceDeployAgent, loadDeployConfig, resolveWorkspaceDeployAgentPath, saveDeployConfig, } from './config.js';
|
|
8
10
|
import { createDeployClient } from './client.js';
|
|
9
11
|
import { discoverPrimaryWorkspaceAgent, isAgentYamlPath } from './entry-agent.js';
|
|
@@ -30,6 +32,32 @@ function formatCloudAgentSummary(input) {
|
|
|
30
32
|
function getErrorMessage(error) {
|
|
31
33
|
return error instanceof Error ? error.message : String(error);
|
|
32
34
|
}
|
|
35
|
+
function formatCloudAgentStatus(status) {
|
|
36
|
+
switch (status) {
|
|
37
|
+
case 'ready':
|
|
38
|
+
return chalk.green(status);
|
|
39
|
+
case 'stopped':
|
|
40
|
+
return chalk.yellow(status);
|
|
41
|
+
case 'failed':
|
|
42
|
+
case 'deleted':
|
|
43
|
+
return chalk.red(status);
|
|
44
|
+
default:
|
|
45
|
+
return chalk.cyan(status);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function formatCloudAgentListItem(cloudAgent, linkedToWorkspace) {
|
|
49
|
+
const prefix = linkedToWorkspace ? chalk.green('→') : ' ';
|
|
50
|
+
const trimmedName = cloudAgent.name?.trim();
|
|
51
|
+
const heading = trimmedName && trimmedName !== cloudAgent.cloudAgentId
|
|
52
|
+
? `${chalk.cyan(trimmedName)} ${chalk.gray(`(${cloudAgent.cloudAgentId})`)}`
|
|
53
|
+
: chalk.cyan(cloudAgent.cloudAgentId);
|
|
54
|
+
const status = `${chalk.gray('[')}${formatCloudAgentStatus(cloudAgent.state.status)}${chalk.gray(']')}`;
|
|
55
|
+
const lines = [`${prefix} ${heading} ${status}`];
|
|
56
|
+
if (linkedToWorkspace) {
|
|
57
|
+
lines.push(` ${chalk.green('Linked to this workspace')}`);
|
|
58
|
+
}
|
|
59
|
+
return lines.join('\n');
|
|
60
|
+
}
|
|
33
61
|
function resolveWorkspaceRoot() {
|
|
34
62
|
return findDextoProjectRoot(process.cwd()) ?? process.cwd();
|
|
35
63
|
}
|
|
@@ -59,12 +87,25 @@ function ensureWorkspaceAgentExists(workspaceRoot, config) {
|
|
|
59
87
|
}
|
|
60
88
|
return entryAgentPath;
|
|
61
89
|
}
|
|
90
|
+
async function validateWorkspaceAgent(entryAgentPath, workspaceAgentPath) {
|
|
91
|
+
const config = await loadAgentConfig(entryAgentPath);
|
|
92
|
+
const validation = await validateAgentConfig(config, false, {
|
|
93
|
+
agentPath: workspaceAgentPath,
|
|
94
|
+
credentialPolicy: 'error',
|
|
95
|
+
});
|
|
96
|
+
if (!validation.success) {
|
|
97
|
+
throw new Error(`Workspace agent validation failed for ${workspaceAgentPath}. Fix the issues above before deploying.`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
62
100
|
export async function handleDeployCommand(options) {
|
|
63
101
|
void options;
|
|
64
102
|
p.intro(chalk.inverse('Deploy Workspace'));
|
|
65
103
|
const workspaceRoot = resolveWorkspaceRoot();
|
|
66
104
|
const deployConfig = await resolveDeployConfig(workspaceRoot);
|
|
67
|
-
ensureWorkspaceAgentExists(workspaceRoot, deployConfig);
|
|
105
|
+
const entryAgentPath = ensureWorkspaceAgentExists(workspaceRoot, deployConfig);
|
|
106
|
+
if (entryAgentPath && isWorkspaceDeployAgent(deployConfig.agent)) {
|
|
107
|
+
await validateWorkspaceAgent(entryAgentPath, deployConfig.agent.path);
|
|
108
|
+
}
|
|
68
109
|
const deployLink = await loadWorkspaceDeployLink(workspaceRoot);
|
|
69
110
|
const spinner = p.spinner();
|
|
70
111
|
const client = createDeployClient();
|
|
@@ -130,6 +171,58 @@ export async function handleDeployCommand(options) {
|
|
|
130
171
|
}
|
|
131
172
|
}
|
|
132
173
|
}
|
|
174
|
+
export async function handleDeployListCommand() {
|
|
175
|
+
const workspaceRoot = resolveWorkspaceRoot();
|
|
176
|
+
const deployLink = await loadWorkspaceDeployLink(workspaceRoot);
|
|
177
|
+
const client = createDeployClient();
|
|
178
|
+
const cloudAgents = await client.listCloudAgents();
|
|
179
|
+
if (cloudAgents.length === 0) {
|
|
180
|
+
p.outro('No cloud deployments found.\nRun `dexto deploy` from this workspace to create one.');
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const linkedCloudAgentId = deployLink?.cloudAgentId ?? null;
|
|
184
|
+
const sortedCloudAgents = [...cloudAgents].sort((left, right) => {
|
|
185
|
+
if (left.cloudAgentId === linkedCloudAgentId && right.cloudAgentId !== linkedCloudAgentId) {
|
|
186
|
+
return -1;
|
|
187
|
+
}
|
|
188
|
+
if (right.cloudAgentId === linkedCloudAgentId && left.cloudAgentId !== linkedCloudAgentId) {
|
|
189
|
+
return 1;
|
|
190
|
+
}
|
|
191
|
+
return 0;
|
|
192
|
+
});
|
|
193
|
+
const linkedVisible = linkedCloudAgentId !== null &&
|
|
194
|
+
sortedCloudAgents.some((cloudAgent) => cloudAgent.cloudAgentId === linkedCloudAgentId);
|
|
195
|
+
const lines = [
|
|
196
|
+
'Cloud deployments',
|
|
197
|
+
'',
|
|
198
|
+
...sortedCloudAgents.flatMap((cloudAgent, index) => {
|
|
199
|
+
const entry = formatCloudAgentListItem(cloudAgent, cloudAgent.cloudAgentId === linkedCloudAgentId);
|
|
200
|
+
return index === 0 ? [entry] : ['', entry];
|
|
201
|
+
}),
|
|
202
|
+
];
|
|
203
|
+
if (linkedCloudAgentId && !linkedVisible) {
|
|
204
|
+
lines.push('', chalk.yellow(`This workspace is linked to ${linkedCloudAgentId}, but that deployment was not returned by the cloud API.`));
|
|
205
|
+
}
|
|
206
|
+
p.outro(lines.join('\n'));
|
|
207
|
+
}
|
|
208
|
+
export async function handleDeployOpenCommand() {
|
|
209
|
+
const workspaceRoot = resolveWorkspaceRoot();
|
|
210
|
+
const deployLink = await loadWorkspaceDeployLink(workspaceRoot);
|
|
211
|
+
if (!deployLink) {
|
|
212
|
+
throw new Error('This workspace is not linked to a cloud deployment yet. Run `dexto deploy` first.');
|
|
213
|
+
}
|
|
214
|
+
const dashboardUrl = getCloudAgentDashboardUrl(deployLink.cloudAgentId);
|
|
215
|
+
try {
|
|
216
|
+
await open(dashboardUrl);
|
|
217
|
+
p.outro(`Opened dashboard for ${deployLink.cloudAgentId}\n${dashboardUrl}`);
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
p.outro([
|
|
221
|
+
`Unable to open the dashboard automatically (${getErrorMessage(error)})`,
|
|
222
|
+
dashboardUrl,
|
|
223
|
+
].join('\n'));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
133
226
|
export async function handleDeployStatusCommand() {
|
|
134
227
|
const workspaceRoot = resolveWorkspaceRoot();
|
|
135
228
|
const deployLink = await loadWorkspaceDeployLink(workspaceRoot);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/deploy/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,MAAM,WAAW,4BAA4B;IACzC,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,qBAAqB,CAAC,EAAE,OAAO,EAAE,EAAE,4BAA4B,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/deploy/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,MAAM,WAAW,4BAA4B;IACzC,OAAO,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,qBAAqB,CAAC,EAAE,OAAO,EAAE,EAAE,4BAA4B,GAAG,IAAI,CAqHrF"}
|
|
@@ -6,6 +6,8 @@ export function registerDeployCommand({ program }) {
|
|
|
6
6
|
deployCommand.addHelpText('after', `
|
|
7
7
|
Examples:
|
|
8
8
|
$ dexto deploy
|
|
9
|
+
$ dexto deploy list
|
|
10
|
+
$ dexto deploy open
|
|
9
11
|
$ dexto deploy status
|
|
10
12
|
$ dexto deploy stop
|
|
11
13
|
$ dexto deploy delete
|
|
@@ -23,6 +25,38 @@ Examples:
|
|
|
23
25
|
safeExit('deploy', 1, 'error');
|
|
24
26
|
}
|
|
25
27
|
}));
|
|
28
|
+
deployCommand
|
|
29
|
+
.command('list')
|
|
30
|
+
.description('List cloud deployments for your account')
|
|
31
|
+
.action(withAnalytics('deploy list', async () => {
|
|
32
|
+
try {
|
|
33
|
+
const { handleDeployListCommand } = await import('./index.js');
|
|
34
|
+
await handleDeployListCommand();
|
|
35
|
+
safeExit('deploy list', 0);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
if (err instanceof ExitSignal)
|
|
39
|
+
throw err;
|
|
40
|
+
console.error(`❌ dexto deploy list command failed: ${err}`);
|
|
41
|
+
safeExit('deploy list', 1, 'error');
|
|
42
|
+
}
|
|
43
|
+
}));
|
|
44
|
+
deployCommand
|
|
45
|
+
.command('open')
|
|
46
|
+
.description('Open the linked cloud deployment in the dashboard')
|
|
47
|
+
.action(withAnalytics('deploy open', async () => {
|
|
48
|
+
try {
|
|
49
|
+
const { handleDeployOpenCommand } = await import('./index.js');
|
|
50
|
+
await handleDeployOpenCommand();
|
|
51
|
+
safeExit('deploy open', 0);
|
|
52
|
+
}
|
|
53
|
+
catch (err) {
|
|
54
|
+
if (err instanceof ExitSignal)
|
|
55
|
+
throw err;
|
|
56
|
+
console.error(`❌ dexto deploy open command failed: ${err}`);
|
|
57
|
+
safeExit('deploy open', 1, 'error');
|
|
58
|
+
}
|
|
59
|
+
}));
|
|
26
60
|
deployCommand
|
|
27
61
|
.command('status')
|
|
28
62
|
.description('Show the linked cloud deployment for the current workspace')
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { createDextoProject, type CreateAppOptions } from './create-app.js';
|
|
2
2
|
export { createImage } from './create-image.js';
|
|
3
|
+
export { handleInitCommand, handleInitAgentCommand, handleInitPrimaryCommand, handleInitSkillCommand, } from './init.js';
|
|
3
4
|
export { getUserInputToInitDextoApp, initDexto, postInitDexto } from './init-app.js';
|
|
4
5
|
export { handleSetupCommand, type CLISetupOptions, type CLISetupOptionsInput } from './setup.js';
|
|
5
6
|
export { handleInstallCommand, type InstallCommandOptions } from './agents/install.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE5E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,0BAA0B,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAErF,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,yBAAyB,EAAE,KAAK,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EACH,uBAAuB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,6BAA6B,GACrC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EACH,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,wBAAwB,GAChC,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACH,yBAAyB,EACzB,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,+BAA+B,GACvC,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG/F,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAGhE,OAAO,EACH,uBAAuB,EACvB,0BAA0B,EAC1B,4BAA4B,EAC5B,2BAA2B,EAE3B,2BAA2B,EAC3B,8BAA8B,EAC9B,8BAA8B,EAC9B,4BAA4B,EAC5B,+BAA+B,EAC/B,+BAA+B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,EAChC,KAAK,gCAAgC,EACrC,KAAK,6BAA6B,EAClC,KAAK,kCAAkC,EACvC,KAAK,4BAA4B,EACjC,KAAK,iCAAiC,EAEtC,KAAK,iCAAiC,EACtC,KAAK,oCAAoC,EACzC,KAAK,oCAAoC,EACzC,KAAK,kCAAkC,EACvC,KAAK,qCAAqC,GAC7C,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE5E,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EACH,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,GACzB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,0BAA0B,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAErF,OAAO,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,YAAY,CAAC;AACjG,OAAO,EAAE,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,EAAE,sBAAsB,EAAE,KAAK,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,oBAAoB,EAAE,KAAK,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,yBAAyB,EAAE,KAAK,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAC5F,OAAO,EACH,uBAAuB,EACvB,KAAK,wBAAwB,EAC7B,KAAK,6BAA6B,GACrC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,EACH,uBAAuB,EACvB,mBAAmB,EACnB,KAAK,wBAAwB,GAChC,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACH,yBAAyB,EACzB,sBAAsB,EACtB,qBAAqB,EACrB,wBAAwB,EACxB,wBAAwB,EACxB,KAAK,0BAA0B,EAC/B,KAAK,+BAA+B,GACvC,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG/F,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAGhE,OAAO,EACH,uBAAuB,EACvB,0BAA0B,EAC1B,4BAA4B,EAC5B,2BAA2B,EAE3B,2BAA2B,EAC3B,8BAA8B,EAC9B,8BAA8B,EAC9B,4BAA4B,EAC5B,+BAA+B,EAC/B,+BAA+B,EAC/B,KAAK,wBAAwB,EAC7B,KAAK,6BAA6B,EAClC,KAAK,2BAA2B,EAChC,KAAK,gCAAgC,EACrC,KAAK,6BAA6B,EAClC,KAAK,kCAAkC,EACvC,KAAK,4BAA4B,EACjC,KAAK,iCAAiC,EAEtC,KAAK,iCAAiC,EACtC,KAAK,oCAAoC,EACzC,KAAK,oCAAoC,EACzC,KAAK,kCAAkC,EACvC,KAAK,qCAAqC,GAC7C,MAAM,aAAa,CAAC"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// Project setup commands
|
|
3
3
|
export { createDextoProject } from './create-app.js';
|
|
4
4
|
export { createImage } from './create-image.js';
|
|
5
|
+
export { handleInitCommand, handleInitAgentCommand, handleInitPrimaryCommand, handleInitSkillCommand, } from './init.js';
|
|
5
6
|
export { getUserInputToInitDextoApp, initDexto, postInitDexto } from './init-app.js';
|
|
6
7
|
export { handleSetupCommand } from './setup.js';
|
|
7
8
|
export { handleInstallCommand } from './agents/install.js';
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
type ScaffoldEntryStatus = 'created' | 'existing';
|
|
3
|
+
type RegistryUpdateStatus = 'created' | 'existing' | 'updated';
|
|
4
|
+
export interface WorkspaceScaffoldResult {
|
|
5
|
+
root: string;
|
|
6
|
+
agentsFile: {
|
|
7
|
+
path: string;
|
|
8
|
+
status: ScaffoldEntryStatus;
|
|
9
|
+
};
|
|
10
|
+
directories: Array<{
|
|
11
|
+
path: string;
|
|
12
|
+
status: ScaffoldEntryStatus;
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
15
|
+
export interface WorkspaceAgentScaffoldResult {
|
|
16
|
+
workspace: WorkspaceScaffoldResult;
|
|
17
|
+
registry: {
|
|
18
|
+
path: string;
|
|
19
|
+
status: RegistryUpdateStatus;
|
|
20
|
+
};
|
|
21
|
+
agentConfig: {
|
|
22
|
+
path: string;
|
|
23
|
+
status: ScaffoldEntryStatus;
|
|
24
|
+
};
|
|
25
|
+
primaryAgent: {
|
|
26
|
+
id: string | null;
|
|
27
|
+
status: 'set' | 'unchanged';
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export interface WorkspaceSkillScaffoldResult {
|
|
31
|
+
workspace: WorkspaceScaffoldResult;
|
|
32
|
+
skillFile: {
|
|
33
|
+
path: string;
|
|
34
|
+
status: ScaffoldEntryStatus;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export interface WorkspacePrimaryAgentResult {
|
|
38
|
+
workspace: WorkspaceScaffoldResult;
|
|
39
|
+
registry: {
|
|
40
|
+
path: string;
|
|
41
|
+
status: Exclude<RegistryUpdateStatus, 'created'>;
|
|
42
|
+
};
|
|
43
|
+
primaryAgent: {
|
|
44
|
+
id: string;
|
|
45
|
+
status: 'set' | 'existing';
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export interface WorkspaceSubagentLinkResult {
|
|
49
|
+
workspace: WorkspaceScaffoldResult;
|
|
50
|
+
registry: {
|
|
51
|
+
path: string;
|
|
52
|
+
status: 'updated' | 'existing';
|
|
53
|
+
};
|
|
54
|
+
subagentId: string;
|
|
55
|
+
parentAgentId: string | null;
|
|
56
|
+
status: 'set' | 'existing' | 'no-primary';
|
|
57
|
+
}
|
|
58
|
+
export interface WorkspaceStatusResult {
|
|
59
|
+
workspaceRoot: string;
|
|
60
|
+
agentsFilePresent: boolean;
|
|
61
|
+
agentsDirectoryPresent: boolean;
|
|
62
|
+
skillsDirectoryPresent: boolean;
|
|
63
|
+
registryPath: string | null;
|
|
64
|
+
primaryAgentId: string | null;
|
|
65
|
+
allowGlobalAgents: boolean | null;
|
|
66
|
+
agents: Array<{
|
|
67
|
+
id: string;
|
|
68
|
+
isPrimary: boolean;
|
|
69
|
+
isSubagent: boolean;
|
|
70
|
+
parentAgentId: string | null;
|
|
71
|
+
}>;
|
|
72
|
+
skills: string[];
|
|
73
|
+
deployConfigPath: string | null;
|
|
74
|
+
effectiveDeploySummary: string;
|
|
75
|
+
}
|
|
76
|
+
export interface InitCommandRegisterContext {
|
|
77
|
+
program: Command;
|
|
78
|
+
}
|
|
79
|
+
type InitAgentCommandOptions = {
|
|
80
|
+
subagent?: boolean;
|
|
81
|
+
primary?: boolean;
|
|
82
|
+
};
|
|
83
|
+
export declare function createWorkspaceScaffold(workspaceRoot?: string): Promise<WorkspaceScaffoldResult>;
|
|
84
|
+
export declare function createWorkspaceAgentScaffold(agentIdInput: string, options?: InitAgentCommandOptions, workspaceRoot?: string): Promise<WorkspaceAgentScaffoldResult>;
|
|
85
|
+
export declare function createWorkspaceSkillScaffold(skillIdInput: string, workspaceRoot?: string): Promise<WorkspaceSkillScaffoldResult>;
|
|
86
|
+
export declare function setWorkspacePrimaryAgent(agentIdInput: string, workspaceRoot?: string): Promise<WorkspacePrimaryAgentResult>;
|
|
87
|
+
export declare function linkWorkspaceSubagentToPrimaryAgent(subagentIdInput: string, workspaceRoot?: string): Promise<WorkspaceSubagentLinkResult>;
|
|
88
|
+
export declare function inspectWorkspaceStatus(workspaceRoot?: string): Promise<WorkspaceStatusResult>;
|
|
89
|
+
export declare function handleInitCommand(workspaceRoot?: string): Promise<void>;
|
|
90
|
+
export declare function handleInitAgentCommand(agentIdInput: string | undefined, options?: InitAgentCommandOptions, workspaceRoot?: string): Promise<void>;
|
|
91
|
+
export declare function handleInitSkillCommand(skillId: string, workspaceRoot?: string): Promise<void>;
|
|
92
|
+
export declare function handleInitPrimaryCommand(agentIdInput: string | undefined, workspaceRoot?: string): Promise<void>;
|
|
93
|
+
export declare function handleInitStatusCommand(workspaceRoot?: string): Promise<void>;
|
|
94
|
+
export declare function registerInitCommand({ program }: InitCommandRegisterContext): void;
|
|
95
|
+
export {};
|
|
96
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|