dexto 1.6.16 → 1.6.18
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/cloud-chat.d.ts +18 -0
- package/dist/cli/cloud-chat.d.ts.map +1 -0
- package/dist/cli/cloud-chat.js +697 -0
- package/dist/cli/commands/deploy/client.d.ts +92 -0
- package/dist/cli/commands/deploy/client.d.ts.map +1 -1
- package/dist/cli/commands/deploy/client.js +260 -4
- package/dist/cli/commands/deploy/index.d.ts +1 -0
- package/dist/cli/commands/deploy/index.d.ts.map +1 -1
- package/dist/cli/commands/deploy/index.js +73 -0
- package/dist/cli/commands/deploy/register.d.ts.map +1 -1
- package/dist/cli/commands/deploy/register.js +19 -0
- package/dist/cli/commands/init.d.ts +8 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +259 -8
- package/dist/index-main.js +30 -3
- package/dist/utils/graceful-shutdown.d.ts +5 -2
- package/dist/utils/graceful-shutdown.d.ts.map +1 -1
- package/dist/utils/graceful-shutdown.js +9 -3
- package/dist/webui/assets/{index-UDAdxmci.js → index-COTVlYsv.js} +1 -1
- package/dist/webui/index.html +1 -1
- package/package.json +15 -14
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { StreamingEvent } from '@dexto/core';
|
|
1
2
|
import { z } from 'zod';
|
|
2
3
|
import type { DeployAgent } from './config.js';
|
|
3
4
|
declare const CloudAgentStateSchema: z.ZodObject<{
|
|
@@ -7,6 +8,43 @@ declare const CloudAgentStateSchema: z.ZodObject<{
|
|
|
7
8
|
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
8
9
|
status: z.ZodString;
|
|
9
10
|
}, z.ZodTypeAny, "passthrough">>;
|
|
11
|
+
declare const CloudChatContentPartSchema: z.ZodDiscriminatedUnion<"type", [z.ZodObject<{
|
|
12
|
+
type: z.ZodLiteral<"text">;
|
|
13
|
+
text: z.ZodString;
|
|
14
|
+
}, "strict", z.ZodTypeAny, {
|
|
15
|
+
type: "text";
|
|
16
|
+
text: string;
|
|
17
|
+
}, {
|
|
18
|
+
type: "text";
|
|
19
|
+
text: string;
|
|
20
|
+
}>, z.ZodObject<{
|
|
21
|
+
type: z.ZodLiteral<"image">;
|
|
22
|
+
image: z.ZodString;
|
|
23
|
+
mimeType: z.ZodOptional<z.ZodString>;
|
|
24
|
+
}, "strict", z.ZodTypeAny, {
|
|
25
|
+
type: "image";
|
|
26
|
+
image: string;
|
|
27
|
+
mimeType?: string | undefined;
|
|
28
|
+
}, {
|
|
29
|
+
type: "image";
|
|
30
|
+
image: string;
|
|
31
|
+
mimeType?: string | undefined;
|
|
32
|
+
}>, z.ZodObject<{
|
|
33
|
+
type: z.ZodLiteral<"file">;
|
|
34
|
+
data: z.ZodString;
|
|
35
|
+
mimeType: z.ZodString;
|
|
36
|
+
filename: z.ZodOptional<z.ZodString>;
|
|
37
|
+
}, "strict", z.ZodTypeAny, {
|
|
38
|
+
type: "file";
|
|
39
|
+
data: string;
|
|
40
|
+
mimeType: string;
|
|
41
|
+
filename?: string | undefined;
|
|
42
|
+
}, {
|
|
43
|
+
type: "file";
|
|
44
|
+
data: string;
|
|
45
|
+
mimeType: string;
|
|
46
|
+
filename?: string | undefined;
|
|
47
|
+
}>]>;
|
|
10
48
|
export interface DeployCloudAgentResult {
|
|
11
49
|
cloudAgentId: string;
|
|
12
50
|
agentUrl: string;
|
|
@@ -35,6 +73,40 @@ export interface CloudAgentDeleteResult {
|
|
|
35
73
|
cloudAgentId: string;
|
|
36
74
|
agentUrl: string;
|
|
37
75
|
}
|
|
76
|
+
export interface CloudChatSessionResult {
|
|
77
|
+
id: string;
|
|
78
|
+
createdAt: number | null;
|
|
79
|
+
lastActivity: number | null;
|
|
80
|
+
messageCount: number;
|
|
81
|
+
title: string | null;
|
|
82
|
+
workspaceId: string | null;
|
|
83
|
+
parentSessionId: string | null;
|
|
84
|
+
}
|
|
85
|
+
export interface CloudChatHistoryMessageResult {
|
|
86
|
+
role: 'user' | 'assistant' | 'system' | 'tool';
|
|
87
|
+
content: z.output<typeof CloudChatContentPartSchema>[];
|
|
88
|
+
timestamp?: number;
|
|
89
|
+
name?: string;
|
|
90
|
+
toolCallId?: string;
|
|
91
|
+
success?: boolean;
|
|
92
|
+
reasoning?: string;
|
|
93
|
+
model?: string;
|
|
94
|
+
provider?: string;
|
|
95
|
+
}
|
|
96
|
+
export interface CloudChatHistoryResult {
|
|
97
|
+
history: CloudChatHistoryMessageResult[];
|
|
98
|
+
isBusy: boolean;
|
|
99
|
+
stale: boolean;
|
|
100
|
+
}
|
|
101
|
+
export interface CloudChatApprovalDecision {
|
|
102
|
+
status: 'approved' | 'denied' | 'cancelled';
|
|
103
|
+
formData?: Record<string, unknown>;
|
|
104
|
+
rememberChoice?: boolean;
|
|
105
|
+
rememberPattern?: string;
|
|
106
|
+
rememberDirectory?: boolean;
|
|
107
|
+
reason?: string;
|
|
108
|
+
message?: string;
|
|
109
|
+
}
|
|
38
110
|
export declare function resolveSandboxBaseUrl(): string;
|
|
39
111
|
export declare function createDeployClient(): {
|
|
40
112
|
deployWorkspace(input: {
|
|
@@ -46,6 +118,26 @@ export declare function createDeployClient(): {
|
|
|
46
118
|
listCloudAgents(): Promise<CloudAgentListItemResult[]>;
|
|
47
119
|
stopCloudAgent(cloudAgentId: string): Promise<CloudAgentStopResult>;
|
|
48
120
|
deleteCloudAgent(cloudAgentId: string): Promise<CloudAgentDeleteResult>;
|
|
121
|
+
listCloudAgentSessions(cloudAgentId: string): Promise<CloudChatSessionResult[]>;
|
|
122
|
+
createCloudAgentSession(cloudAgentId: string, input?: {
|
|
123
|
+
sessionId?: string;
|
|
124
|
+
}): Promise<CloudChatSessionResult>;
|
|
125
|
+
getCloudAgentSessionHistory(cloudAgentId: string, sessionId: string): Promise<CloudChatHistoryResult>;
|
|
126
|
+
resetCloudAgentSession(cloudAgentId: string, sessionId: string): Promise<void>;
|
|
127
|
+
clearCloudAgentSessionContext(cloudAgentId: string, sessionId: string): Promise<void>;
|
|
128
|
+
deleteCloudAgentSession(cloudAgentId: string, sessionId: string): Promise<void>;
|
|
129
|
+
generateCloudAgentSessionTitle(cloudAgentId: string, sessionId: string): Promise<{
|
|
130
|
+
title: string | null;
|
|
131
|
+
sessionId: string;
|
|
132
|
+
} | null>;
|
|
133
|
+
cancelCloudAgentSessionRun(cloudAgentId: string, sessionId: string): Promise<void>;
|
|
134
|
+
listCloudAgentApprovals(cloudAgentId: string, sessionId: string): Promise<unknown[]>;
|
|
135
|
+
submitCloudAgentApproval(cloudAgentId: string, approvalId: string, decision: CloudChatApprovalDecision): Promise<void>;
|
|
136
|
+
streamCloudAgentMessage(cloudAgentId: string, input: {
|
|
137
|
+
sessionId: string;
|
|
138
|
+
content: string;
|
|
139
|
+
signal?: AbortSignal;
|
|
140
|
+
}): Promise<AsyncIterableIterator<StreamingEvent>>;
|
|
49
141
|
};
|
|
50
142
|
export {};
|
|
51
143
|
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/deploy/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/deploy/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { promises as fs } from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
|
+
import { createMessageStream } from '@dexto/client-sdk';
|
|
3
4
|
import { z } from 'zod';
|
|
4
|
-
import { getAuthToken, getDextoApiKey } from '../../auth/service.js';
|
|
5
|
+
import { getAuthToken, getDextoApiKey, loadAuth } from '../../auth/service.js';
|
|
5
6
|
const SANDBOX_URL_ENV_VAR = 'DEXTO_SANDBOX_URL';
|
|
6
7
|
const DEFAULT_SANDBOX_URL = 'https://sandbox.dexto.ai';
|
|
7
8
|
const CloudAgentStateSchema = z
|
|
@@ -96,6 +97,90 @@ const DeleteResponseSchema = z
|
|
|
96
97
|
.optional(),
|
|
97
98
|
})
|
|
98
99
|
.passthrough();
|
|
100
|
+
const CloudChatContentPartSchema = z
|
|
101
|
+
.discriminatedUnion('type', [
|
|
102
|
+
z
|
|
103
|
+
.object({
|
|
104
|
+
type: z.literal('text'),
|
|
105
|
+
text: z.string(),
|
|
106
|
+
})
|
|
107
|
+
.strict(),
|
|
108
|
+
z
|
|
109
|
+
.object({
|
|
110
|
+
type: z.literal('image'),
|
|
111
|
+
image: z.string(),
|
|
112
|
+
mimeType: z.string().optional(),
|
|
113
|
+
})
|
|
114
|
+
.strict(),
|
|
115
|
+
z
|
|
116
|
+
.object({
|
|
117
|
+
type: z.literal('file'),
|
|
118
|
+
data: z.string(),
|
|
119
|
+
mimeType: z.string(),
|
|
120
|
+
filename: z.string().optional(),
|
|
121
|
+
})
|
|
122
|
+
.strict(),
|
|
123
|
+
])
|
|
124
|
+
.describe('Cloud chat content part');
|
|
125
|
+
const CloudChatSessionSchema = z
|
|
126
|
+
.object({
|
|
127
|
+
id: z.string(),
|
|
128
|
+
createdAt: z.number().nullable().optional(),
|
|
129
|
+
lastActivity: z.number().nullable().optional(),
|
|
130
|
+
messageCount: z.number().int().nonnegative().optional(),
|
|
131
|
+
title: z.string().nullable().optional(),
|
|
132
|
+
workspaceId: z.string().nullable().optional(),
|
|
133
|
+
parentSessionId: z.string().nullable().optional(),
|
|
134
|
+
})
|
|
135
|
+
.passthrough();
|
|
136
|
+
const CloudChatSessionListResponseSchema = z
|
|
137
|
+
.object({
|
|
138
|
+
sessions: z.array(CloudChatSessionSchema),
|
|
139
|
+
})
|
|
140
|
+
.passthrough();
|
|
141
|
+
const CloudChatSessionResponseSchema = z
|
|
142
|
+
.object({
|
|
143
|
+
session: CloudChatSessionSchema,
|
|
144
|
+
})
|
|
145
|
+
.passthrough();
|
|
146
|
+
const CloudChatHistoryMessageSchema = z
|
|
147
|
+
.object({
|
|
148
|
+
role: z.enum(['user', 'assistant', 'system', 'tool']),
|
|
149
|
+
content: z.array(CloudChatContentPartSchema),
|
|
150
|
+
timestamp: z.number().optional(),
|
|
151
|
+
name: z.string().optional(),
|
|
152
|
+
toolCallId: z.string().optional(),
|
|
153
|
+
success: z.boolean().optional(),
|
|
154
|
+
reasoning: z.string().optional(),
|
|
155
|
+
model: z.string().optional(),
|
|
156
|
+
provider: z.string().optional(),
|
|
157
|
+
displayData: z.unknown().optional(),
|
|
158
|
+
presentationSnapshot: z.unknown().optional(),
|
|
159
|
+
})
|
|
160
|
+
.passthrough();
|
|
161
|
+
const CloudChatHistoryResponseSchema = z
|
|
162
|
+
.object({
|
|
163
|
+
history: z.array(CloudChatHistoryMessageSchema),
|
|
164
|
+
isBusy: z.boolean().optional(),
|
|
165
|
+
stale: z.boolean().optional(),
|
|
166
|
+
})
|
|
167
|
+
.passthrough();
|
|
168
|
+
const CloudChatApprovalsResponseSchema = z
|
|
169
|
+
.object({
|
|
170
|
+
approvals: z.array(z.unknown()).default([]),
|
|
171
|
+
})
|
|
172
|
+
.passthrough();
|
|
173
|
+
function normalizeCloudChatSession(session) {
|
|
174
|
+
return {
|
|
175
|
+
id: session.id,
|
|
176
|
+
createdAt: session.createdAt ?? null,
|
|
177
|
+
lastActivity: session.lastActivity ?? null,
|
|
178
|
+
messageCount: session.messageCount ?? 0,
|
|
179
|
+
title: session.title ?? null,
|
|
180
|
+
workspaceId: session.workspaceId ?? null,
|
|
181
|
+
parentSessionId: session.parentSessionId ?? null,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
99
184
|
class SandboxApiError extends Error {
|
|
100
185
|
status;
|
|
101
186
|
constructor(message, status) {
|
|
@@ -117,14 +202,19 @@ export function resolveSandboxBaseUrl() {
|
|
|
117
202
|
return DEFAULT_SANDBOX_URL;
|
|
118
203
|
}
|
|
119
204
|
async function resolveAccessToken() {
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
205
|
+
const auth = await loadAuth();
|
|
206
|
+
const storedDextoApiKey = auth?.dextoApiKey?.trim();
|
|
207
|
+
if (storedDextoApiKey && storedDextoApiKey.length > 0) {
|
|
208
|
+
return storedDextoApiKey;
|
|
123
209
|
}
|
|
124
210
|
const authToken = await getAuthToken();
|
|
125
211
|
if (authToken && authToken.trim().length > 0) {
|
|
126
212
|
return authToken.trim();
|
|
127
213
|
}
|
|
214
|
+
const dextoApiKey = await getDextoApiKey();
|
|
215
|
+
if (dextoApiKey && dextoApiKey.trim().length > 0) {
|
|
216
|
+
return dextoApiKey.trim();
|
|
217
|
+
}
|
|
128
218
|
throw new Error('Authentication required. Run `dexto login` before using `dexto deploy`.');
|
|
129
219
|
}
|
|
130
220
|
async function parseJsonResponse(response) {
|
|
@@ -265,5 +355,171 @@ export function createDeployClient() {
|
|
|
265
355
|
agentUrl: data.agentUrl,
|
|
266
356
|
};
|
|
267
357
|
},
|
|
358
|
+
async listCloudAgentSessions(cloudAgentId) {
|
|
359
|
+
const response = await request(`/cloud-agents/${encodeURIComponent(cloudAgentId)}/agent/sessions`, {
|
|
360
|
+
method: 'GET',
|
|
361
|
+
});
|
|
362
|
+
if (!response.ok) {
|
|
363
|
+
await throwApiError(response);
|
|
364
|
+
}
|
|
365
|
+
const payload = CloudChatSessionListResponseSchema.parse(await response.json());
|
|
366
|
+
return payload.sessions.map(normalizeCloudChatSession);
|
|
367
|
+
},
|
|
368
|
+
async createCloudAgentSession(cloudAgentId, input) {
|
|
369
|
+
const response = await request(`/cloud-agents/${encodeURIComponent(cloudAgentId)}/agent/sessions`, {
|
|
370
|
+
method: 'POST',
|
|
371
|
+
headers: {
|
|
372
|
+
'Content-Type': 'application/json',
|
|
373
|
+
},
|
|
374
|
+
body: JSON.stringify(input ?? {}),
|
|
375
|
+
});
|
|
376
|
+
if (!response.ok) {
|
|
377
|
+
await throwApiError(response);
|
|
378
|
+
}
|
|
379
|
+
const payload = CloudChatSessionResponseSchema.parse(await response.json());
|
|
380
|
+
return normalizeCloudChatSession(payload.session);
|
|
381
|
+
},
|
|
382
|
+
async getCloudAgentSessionHistory(cloudAgentId, sessionId) {
|
|
383
|
+
const response = await request(`/cloud-agents/${encodeURIComponent(cloudAgentId)}/agent/sessions/${encodeURIComponent(sessionId)}/history`, {
|
|
384
|
+
method: 'GET',
|
|
385
|
+
});
|
|
386
|
+
if (!response.ok) {
|
|
387
|
+
await throwApiError(response);
|
|
388
|
+
}
|
|
389
|
+
const payload = CloudChatHistoryResponseSchema.parse(await response.json());
|
|
390
|
+
return {
|
|
391
|
+
history: payload.history.map((entry) => ({
|
|
392
|
+
role: entry.role,
|
|
393
|
+
content: entry.content,
|
|
394
|
+
...(entry.timestamp !== undefined ? { timestamp: entry.timestamp } : {}),
|
|
395
|
+
...(entry.name !== undefined ? { name: entry.name } : {}),
|
|
396
|
+
...(entry.toolCallId !== undefined ? { toolCallId: entry.toolCallId } : {}),
|
|
397
|
+
...(entry.success !== undefined ? { success: entry.success } : {}),
|
|
398
|
+
...(entry.reasoning !== undefined ? { reasoning: entry.reasoning } : {}),
|
|
399
|
+
...(entry.model !== undefined ? { model: entry.model } : {}),
|
|
400
|
+
...(entry.provider !== undefined ? { provider: entry.provider } : {}),
|
|
401
|
+
})),
|
|
402
|
+
isBusy: payload.isBusy ?? false,
|
|
403
|
+
stale: payload.stale === true,
|
|
404
|
+
};
|
|
405
|
+
},
|
|
406
|
+
async resetCloudAgentSession(cloudAgentId, sessionId) {
|
|
407
|
+
const response = await request(`/cloud-agents/${encodeURIComponent(cloudAgentId)}/agent/sessions/${encodeURIComponent(sessionId)}/reset`, {
|
|
408
|
+
method: 'POST',
|
|
409
|
+
});
|
|
410
|
+
if (!response.ok) {
|
|
411
|
+
await throwApiError(response);
|
|
412
|
+
}
|
|
413
|
+
},
|
|
414
|
+
async clearCloudAgentSessionContext(cloudAgentId, sessionId) {
|
|
415
|
+
const response = await request(`/cloud-agents/${encodeURIComponent(cloudAgentId)}/agent/sessions/${encodeURIComponent(sessionId)}/clear-context`, {
|
|
416
|
+
method: 'POST',
|
|
417
|
+
});
|
|
418
|
+
if (!response.ok) {
|
|
419
|
+
await throwApiError(response);
|
|
420
|
+
}
|
|
421
|
+
},
|
|
422
|
+
async deleteCloudAgentSession(cloudAgentId, sessionId) {
|
|
423
|
+
const response = await request(`/cloud-agents/${encodeURIComponent(cloudAgentId)}/agent/sessions/${encodeURIComponent(sessionId)}`, {
|
|
424
|
+
method: 'DELETE',
|
|
425
|
+
});
|
|
426
|
+
if (!response.ok) {
|
|
427
|
+
await throwApiError(response);
|
|
428
|
+
}
|
|
429
|
+
},
|
|
430
|
+
async generateCloudAgentSessionTitle(cloudAgentId, sessionId) {
|
|
431
|
+
const response = await request(`/cloud-agents/${encodeURIComponent(cloudAgentId)}/agent/sessions/${encodeURIComponent(sessionId)}/generate-title`, {
|
|
432
|
+
method: 'POST',
|
|
433
|
+
});
|
|
434
|
+
if (!response.ok) {
|
|
435
|
+
await throwApiError(response);
|
|
436
|
+
}
|
|
437
|
+
const payload = z
|
|
438
|
+
.object({
|
|
439
|
+
title: z.string().nullable().optional(),
|
|
440
|
+
sessionId: z.string().optional(),
|
|
441
|
+
})
|
|
442
|
+
.passthrough()
|
|
443
|
+
.parse(await response.json());
|
|
444
|
+
return {
|
|
445
|
+
title: payload.title ?? null,
|
|
446
|
+
sessionId: payload.sessionId ?? sessionId,
|
|
447
|
+
};
|
|
448
|
+
},
|
|
449
|
+
async cancelCloudAgentSessionRun(cloudAgentId, sessionId) {
|
|
450
|
+
const response = await request(`/cloud-agents/${encodeURIComponent(cloudAgentId)}/agent/sessions/${encodeURIComponent(sessionId)}/cancel`, {
|
|
451
|
+
method: 'POST',
|
|
452
|
+
});
|
|
453
|
+
if (!response.ok) {
|
|
454
|
+
await throwApiError(response);
|
|
455
|
+
}
|
|
456
|
+
},
|
|
457
|
+
async listCloudAgentApprovals(cloudAgentId, sessionId) {
|
|
458
|
+
const response = await request(`/cloud-agents/${encodeURIComponent(cloudAgentId)}/agent/approvals?sessionId=${encodeURIComponent(sessionId)}`, {
|
|
459
|
+
method: 'GET',
|
|
460
|
+
});
|
|
461
|
+
if (!response.ok) {
|
|
462
|
+
await throwApiError(response);
|
|
463
|
+
}
|
|
464
|
+
const payload = CloudChatApprovalsResponseSchema.parse(await response.json());
|
|
465
|
+
return payload.approvals;
|
|
466
|
+
},
|
|
467
|
+
async submitCloudAgentApproval(cloudAgentId, approvalId, decision) {
|
|
468
|
+
const response = await request(`/cloud-agents/${encodeURIComponent(cloudAgentId)}/agent/approvals/${encodeURIComponent(approvalId)}`, {
|
|
469
|
+
method: 'POST',
|
|
470
|
+
headers: {
|
|
471
|
+
'Content-Type': 'application/json',
|
|
472
|
+
},
|
|
473
|
+
body: JSON.stringify({
|
|
474
|
+
status: decision.status,
|
|
475
|
+
...(decision.formData !== undefined ? { formData: decision.formData } : {}),
|
|
476
|
+
...(decision.rememberChoice !== undefined
|
|
477
|
+
? { rememberChoice: decision.rememberChoice }
|
|
478
|
+
: {}),
|
|
479
|
+
...(decision.rememberPattern !== undefined
|
|
480
|
+
? { rememberPattern: decision.rememberPattern }
|
|
481
|
+
: {}),
|
|
482
|
+
...(decision.rememberDirectory !== undefined
|
|
483
|
+
? { rememberDirectory: decision.rememberDirectory }
|
|
484
|
+
: {}),
|
|
485
|
+
...(decision.reason !== undefined ? { reason: decision.reason } : {}),
|
|
486
|
+
...(decision.message !== undefined ? { message: decision.message } : {}),
|
|
487
|
+
}),
|
|
488
|
+
});
|
|
489
|
+
if (!response.ok) {
|
|
490
|
+
await throwApiError(response);
|
|
491
|
+
}
|
|
492
|
+
},
|
|
493
|
+
async streamCloudAgentMessage(cloudAgentId, input) {
|
|
494
|
+
const responsePromise = request(`/cloud-agents/${encodeURIComponent(cloudAgentId)}/agent/message-stream`, {
|
|
495
|
+
method: 'POST',
|
|
496
|
+
headers: {
|
|
497
|
+
'Content-Type': 'application/json',
|
|
498
|
+
Accept: 'text/event-stream',
|
|
499
|
+
},
|
|
500
|
+
body: JSON.stringify({
|
|
501
|
+
sessionId: input.sessionId,
|
|
502
|
+
content: input.content,
|
|
503
|
+
}),
|
|
504
|
+
...(input.signal ? { signal: input.signal } : {}),
|
|
505
|
+
});
|
|
506
|
+
const response = await responsePromise;
|
|
507
|
+
if (response.status === 202 &&
|
|
508
|
+
response.headers.get('content-type')?.includes('application/json')) {
|
|
509
|
+
const busyPayload = await response.json().catch(() => null);
|
|
510
|
+
const parsed = z
|
|
511
|
+
.object({
|
|
512
|
+
hint: z.string().optional(),
|
|
513
|
+
})
|
|
514
|
+
.passthrough()
|
|
515
|
+
.safeParse(busyPayload);
|
|
516
|
+
throw new Error(parsed.success
|
|
517
|
+
? (parsed.data.hint ?? 'Cloud session is busy')
|
|
518
|
+
: 'Cloud session is busy');
|
|
519
|
+
}
|
|
520
|
+
return createMessageStream(Promise.resolve(response), {
|
|
521
|
+
...(input.signal ? { signal: input.signal } : {}),
|
|
522
|
+
});
|
|
523
|
+
},
|
|
268
524
|
};
|
|
269
525
|
}
|
|
@@ -7,5 +7,6 @@ export declare function handleDeployOpenCommand(): Promise<void>;
|
|
|
7
7
|
export declare function handleDeployStatusCommand(): Promise<void>;
|
|
8
8
|
export declare function handleDeployStopCommand(): Promise<void>;
|
|
9
9
|
export declare function handleDeployDeleteCommand(options?: InteractiveOptions): Promise<void>;
|
|
10
|
+
export declare function handleDeployChatCommand(cloudAgentId?: string): Promise<void>;
|
|
10
11
|
export {};
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -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":"AA6BA,UAAU,kBAAkB;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AA4MD,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;AAED,wBAAsB,uBAAuB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOlF"}
|
|
@@ -12,6 +12,7 @@ import { discoverPrimaryWorkspaceAgent, isAgentYamlPath } from './entry-agent.js
|
|
|
12
12
|
import { getCloudAgentDashboardUrl } from './links.js';
|
|
13
13
|
import { loadWorkspaceDeployLink, removeWorkspaceDeployLink, saveWorkspaceDeployLink, } from './state.js';
|
|
14
14
|
import { createWorkspaceSnapshot } from './snapshot.js';
|
|
15
|
+
import { startCloudChatCli } from '../../cloud-chat.js';
|
|
15
16
|
function isInteractive(options) {
|
|
16
17
|
return options?.interactive !== false;
|
|
17
18
|
}
|
|
@@ -58,6 +59,70 @@ function formatCloudAgentListItem(cloudAgent, linkedToWorkspace) {
|
|
|
58
59
|
}
|
|
59
60
|
return lines.join('\n');
|
|
60
61
|
}
|
|
62
|
+
function formatCloudAgentSelectionLabel(cloudAgent) {
|
|
63
|
+
const trimmedName = cloudAgent.name?.trim();
|
|
64
|
+
const heading = trimmedName && trimmedName !== cloudAgent.cloudAgentId
|
|
65
|
+
? `${trimmedName} (${cloudAgent.cloudAgentId})`
|
|
66
|
+
: cloudAgent.cloudAgentId;
|
|
67
|
+
return `${heading} ${chalk.gray('[')}${formatCloudAgentStatus(cloudAgent.state.status)}${chalk.gray(']')}`;
|
|
68
|
+
}
|
|
69
|
+
function sortCloudAgentsForChat(cloudAgents, linkedCloudAgentId) {
|
|
70
|
+
return cloudAgents.slice().sort((left, right) => {
|
|
71
|
+
const leftIsLinked = linkedCloudAgentId !== null && left.cloudAgentId === linkedCloudAgentId;
|
|
72
|
+
const rightIsLinked = linkedCloudAgentId !== null && right.cloudAgentId === linkedCloudAgentId;
|
|
73
|
+
if (leftIsLinked !== rightIsLinked) {
|
|
74
|
+
return leftIsLinked ? -1 : 1;
|
|
75
|
+
}
|
|
76
|
+
const leftReady = left.state.status === 'ready';
|
|
77
|
+
const rightReady = right.state.status === 'ready';
|
|
78
|
+
if (leftReady !== rightReady) {
|
|
79
|
+
return leftReady ? -1 : 1;
|
|
80
|
+
}
|
|
81
|
+
const leftName = (left.name?.trim() || left.cloudAgentId).toLowerCase();
|
|
82
|
+
const rightName = (right.name?.trim() || right.cloudAgentId).toLowerCase();
|
|
83
|
+
return leftName.localeCompare(rightName);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
async function selectCloudAgentForChat(workspaceRoot) {
|
|
87
|
+
const deployLink = await loadWorkspaceDeployLink(workspaceRoot);
|
|
88
|
+
const spinner = p.spinner();
|
|
89
|
+
spinner.start('Loading cloud agents...');
|
|
90
|
+
const client = createDeployClient();
|
|
91
|
+
let cloudAgents;
|
|
92
|
+
try {
|
|
93
|
+
cloudAgents = await client.listCloudAgents();
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
spinner.stop(chalk.red('✗ Failed to load cloud agents'));
|
|
97
|
+
throw error;
|
|
98
|
+
}
|
|
99
|
+
spinner.stop(chalk.green('✓ Cloud agents loaded'));
|
|
100
|
+
if (cloudAgents.length === 0) {
|
|
101
|
+
throw new Error('No cloud agents available yet. Run `dexto deploy` first, or pass a cloud agent ID explicitly.');
|
|
102
|
+
}
|
|
103
|
+
const linkedCloudAgentId = deployLink?.cloudAgentId ?? null;
|
|
104
|
+
const sortedCloudAgents = sortCloudAgentsForChat(cloudAgents, linkedCloudAgentId);
|
|
105
|
+
const selected = await p.select({
|
|
106
|
+
message: 'Choose a cloud agent to chat with',
|
|
107
|
+
options: sortedCloudAgents.map((cloudAgent) => {
|
|
108
|
+
const isLinked = linkedCloudAgentId !== null && cloudAgent.cloudAgentId === linkedCloudAgentId;
|
|
109
|
+
const hintParts = [cloudAgent.agentUrl];
|
|
110
|
+
if (isLinked) {
|
|
111
|
+
hintParts.unshift('Linked to this workspace');
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
value: cloudAgent.cloudAgentId,
|
|
115
|
+
label: formatCloudAgentSelectionLabel(cloudAgent),
|
|
116
|
+
hint: hintParts.join(' • '),
|
|
117
|
+
};
|
|
118
|
+
}),
|
|
119
|
+
});
|
|
120
|
+
if (p.isCancel(selected)) {
|
|
121
|
+
p.cancel('Cloud chat cancelled');
|
|
122
|
+
process.exit(0);
|
|
123
|
+
}
|
|
124
|
+
return selected;
|
|
125
|
+
}
|
|
61
126
|
function resolveWorkspaceRoot() {
|
|
62
127
|
return findDextoProjectRoot(process.cwd()) ?? process.cwd();
|
|
63
128
|
}
|
|
@@ -295,3 +360,11 @@ export async function handleDeployDeleteCommand(options) {
|
|
|
295
360
|
throw error;
|
|
296
361
|
}
|
|
297
362
|
}
|
|
363
|
+
export async function handleDeployChatCommand(cloudAgentId) {
|
|
364
|
+
const workspaceRoot = resolveWorkspaceRoot();
|
|
365
|
+
const selectedCloudAgentId = cloudAgentId ?? (await selectCloudAgentForChat(workspaceRoot));
|
|
366
|
+
await startCloudChatCli({
|
|
367
|
+
cloudAgentId: selectedCloudAgentId,
|
|
368
|
+
workspaceRoot,
|
|
369
|
+
});
|
|
370
|
+
}
|
|
@@ -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,CA4IrF"}
|
|
@@ -7,6 +7,8 @@ export function registerDeployCommand({ program }) {
|
|
|
7
7
|
Examples:
|
|
8
8
|
$ dexto deploy
|
|
9
9
|
$ dexto deploy list
|
|
10
|
+
$ dexto deploy chat
|
|
11
|
+
$ dexto deploy chat sbx_123
|
|
10
12
|
$ dexto deploy open
|
|
11
13
|
$ dexto deploy status
|
|
12
14
|
$ dexto deploy stop
|
|
@@ -25,6 +27,23 @@ Examples:
|
|
|
25
27
|
safeExit('deploy', 1, 'error');
|
|
26
28
|
}
|
|
27
29
|
}));
|
|
30
|
+
deployCommand
|
|
31
|
+
.command('chat')
|
|
32
|
+
.description('Start Ink CLI chat against a selected or explicit cloud agent')
|
|
33
|
+
.argument('[cloudAgentId]', 'Cloud agent ID (omit to choose from your available cloud agents)')
|
|
34
|
+
.action(withAnalytics('deploy chat', async (cloudAgentId) => {
|
|
35
|
+
try {
|
|
36
|
+
const { handleDeployChatCommand } = await import('./index.js');
|
|
37
|
+
await handleDeployChatCommand(cloudAgentId);
|
|
38
|
+
safeExit('deploy chat', 0);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
if (err instanceof ExitSignal)
|
|
42
|
+
throw err;
|
|
43
|
+
console.error(`❌ dexto deploy chat command failed: ${err}`);
|
|
44
|
+
safeExit('deploy chat', 1, 'error');
|
|
45
|
+
}
|
|
46
|
+
}));
|
|
28
47
|
deployCommand
|
|
29
48
|
.command('list')
|
|
30
49
|
.description('List cloud deployments for your account')
|
|
@@ -34,6 +34,14 @@ export interface WorkspaceSkillScaffoldResult {
|
|
|
34
34
|
path: string;
|
|
35
35
|
status: ScaffoldEntryStatus;
|
|
36
36
|
};
|
|
37
|
+
resourceDirectories: Array<{
|
|
38
|
+
path: string;
|
|
39
|
+
status: ScaffoldEntryStatus;
|
|
40
|
+
}>;
|
|
41
|
+
extraFiles: Array<{
|
|
42
|
+
path: string;
|
|
43
|
+
status: ScaffoldEntryStatus;
|
|
44
|
+
}>;
|
|
37
45
|
}
|
|
38
46
|
export interface WorkspacePrimaryAgentResult {
|
|
39
47
|
workspace: WorkspaceScaffoldResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAe,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAezE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
|