@copado/agentia-cli 0.43.0-alpha.0 → 0.46.0-alpha.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 +506 -113
- package/dist/commands/ai/agent/ask.d.ts +28 -0
- package/dist/commands/ai/agent/ask.js +131 -0
- package/dist/commands/ai/agent/ask.js.map +1 -0
- package/dist/commands/ai/agent/chat.d.ts +29 -0
- package/dist/commands/ai/agent/chat.js +97 -0
- package/dist/commands/ai/agent/chat.js.map +1 -0
- package/dist/commands/ai/quota/get.d.ts +14 -0
- package/dist/commands/ai/quota/get.js +23 -0
- package/dist/commands/ai/quota/get.js.map +1 -0
- package/dist/commands/ai/workspace/create.d.ts +17 -0
- package/dist/commands/ai/workspace/create.js +41 -0
- package/dist/commands/ai/workspace/create.js.map +1 -0
- package/dist/commands/ai/workspace/get.d.ts +17 -0
- package/dist/commands/ai/workspace/get.js +37 -0
- package/dist/commands/ai/workspace/get.js.map +1 -0
- package/dist/commands/ai/workspace/list.d.ts +16 -0
- package/dist/commands/ai/workspace/list.js +28 -0
- package/dist/commands/ai/workspace/list.js.map +1 -0
- package/dist/commands/ai/workspace/member/invite.d.ts +19 -0
- package/dist/commands/ai/workspace/member/invite.js +45 -0
- package/dist/commands/ai/workspace/member/invite.js.map +1 -0
- package/dist/commands/ai/workspace/member/list.d.ts +20 -0
- package/dist/commands/ai/workspace/member/list.js +36 -0
- package/dist/commands/ai/workspace/member/list.js.map +1 -0
- package/dist/commands/ai/workspace/update.d.ts +22 -0
- package/dist/commands/ai/workspace/update.js +62 -0
- package/dist/commands/ai/workspace/update.js.map +1 -0
- package/dist/commands/auth/get.d.ts +3 -0
- package/dist/commands/auth/get.js +46 -1
- package/dist/commands/auth/get.js.map +1 -1
- package/dist/commands/auth/set.d.ts +5 -0
- package/dist/commands/auth/set.js +39 -0
- package/dist/commands/auth/set.js.map +1 -1
- package/dist/commands/auth/unset.d.ts +1 -0
- package/dist/commands/auth/unset.js +4 -0
- package/dist/commands/auth/unset.js.map +1 -1
- package/dist/lib/ai-chat-session.d.ts +17 -0
- package/dist/lib/ai-chat-session.js +149 -0
- package/dist/lib/ai-chat-session.js.map +1 -0
- package/dist/lib/ai-config.d.ts +26 -0
- package/dist/lib/ai-config.js +113 -0
- package/dist/lib/ai-config.js.map +1 -0
- package/dist/lib/ai-flags.d.ts +16 -0
- package/dist/lib/ai-flags.js +28 -0
- package/dist/lib/ai-flags.js.map +1 -0
- package/dist/lib/ai-gateway.d.ts +52 -0
- package/dist/lib/ai-gateway.js +324 -0
- package/dist/lib/ai-gateway.js.map +1 -0
- package/dist/lib/ai-operations.d.ts +26 -0
- package/dist/lib/ai-operations.js +177 -0
- package/dist/lib/ai-operations.js.map +1 -0
- package/dist/lib/ai-stream-parser.d.ts +12 -0
- package/dist/lib/ai-stream-parser.js +59 -0
- package/dist/lib/ai-stream-parser.js.map +1 -0
- package/dist/lib/ai-terminal-renderer.d.ts +17 -0
- package/dist/lib/ai-terminal-renderer.js +83 -0
- package/dist/lib/ai-terminal-renderer.js.map +1 -0
- package/dist/lib/ai-types.d.ts +127 -0
- package/dist/lib/ai-types.js +133 -0
- package/dist/lib/ai-types.js.map +1 -0
- package/dist/lib/auth-config.d.ts +21 -0
- package/dist/lib/auth-config.js +158 -6
- package/dist/lib/auth-config.js.map +1 -1
- package/dist/lib/credential-store.d.ts +13 -1
- package/dist/lib/credential-store.js +47 -2
- package/dist/lib/credential-store.js.map +1 -1
- package/dist/lib/mcp/ai-tools.d.ts +22 -0
- package/dist/lib/mcp/ai-tools.js +45 -0
- package/dist/lib/mcp/ai-tools.js.map +1 -0
- package/dist/lib/mcp/tools.d.ts +16 -2
- package/dist/lib/mcp/tools.js +3 -0
- package/dist/lib/mcp/tools.js.map +1 -1
- package/oclif.manifest.json +1302 -335
- package/package.json +16 -1
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
import { normalizeAiDialogueId, normalizeAiWorkspaceId, resolveAiCredentials } from './ai-config.js';
|
|
3
|
+
import { AiGateway, AiGatewayError } from './ai-gateway.js';
|
|
4
|
+
import { assistantIdForAgent, buildDialogueName, enrichAiPrompt, validateAiContext, } from './ai-types.js';
|
|
5
|
+
function trimOptional(value) {
|
|
6
|
+
if (value === undefined)
|
|
7
|
+
return undefined;
|
|
8
|
+
const trimmed = value.trim();
|
|
9
|
+
return trimmed.length === 0 ? undefined : trimmed;
|
|
10
|
+
}
|
|
11
|
+
function validatePrompt(prompt) {
|
|
12
|
+
const trimmed = prompt.trim();
|
|
13
|
+
if (trimmed.length === 0) {
|
|
14
|
+
throw new Error('AI prompt cannot be empty.');
|
|
15
|
+
}
|
|
16
|
+
return prompt;
|
|
17
|
+
}
|
|
18
|
+
function chunkContent(chunk) {
|
|
19
|
+
return typeof chunk.content === 'string' ? chunk.content : undefined;
|
|
20
|
+
}
|
|
21
|
+
function normalizeFollowup(value) {
|
|
22
|
+
if (typeof value === 'string' && value.trim().length > 0)
|
|
23
|
+
return { content: value };
|
|
24
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
25
|
+
return undefined;
|
|
26
|
+
const record = value;
|
|
27
|
+
for (const candidate of [record.content, record.question, record.text]) {
|
|
28
|
+
if (typeof candidate === 'string' && candidate.trim().length > 0)
|
|
29
|
+
return { content: candidate };
|
|
30
|
+
}
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
function normalizeLink(value) {
|
|
34
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
35
|
+
return undefined;
|
|
36
|
+
const record = value;
|
|
37
|
+
const link = {};
|
|
38
|
+
if (typeof record.summary === 'string')
|
|
39
|
+
link.summary = record.summary;
|
|
40
|
+
if (typeof record.title === 'string')
|
|
41
|
+
link.title = record.title;
|
|
42
|
+
if (typeof record.url === 'string')
|
|
43
|
+
link.url = record.url;
|
|
44
|
+
return Object.keys(link).length === 0 ? undefined : link;
|
|
45
|
+
}
|
|
46
|
+
function createStreamSummary() {
|
|
47
|
+
return {
|
|
48
|
+
completed: false,
|
|
49
|
+
content: '',
|
|
50
|
+
followups: [],
|
|
51
|
+
links: [],
|
|
52
|
+
statuses: [],
|
|
53
|
+
warnings: [],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function isCompletionChunk(type) {
|
|
57
|
+
return type === 'done' || type === 'performance' || type === 'stream_complete';
|
|
58
|
+
}
|
|
59
|
+
function applyMetadataChunk(summary, chunk) {
|
|
60
|
+
if (chunk.type === 'followup') {
|
|
61
|
+
const followup = normalizeFollowup(chunk.content);
|
|
62
|
+
if (followup !== undefined)
|
|
63
|
+
summary.followups.push(followup);
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
if (chunk.type === 'link') {
|
|
67
|
+
const link = normalizeLink(chunk.content);
|
|
68
|
+
if (link !== undefined)
|
|
69
|
+
summary.links.push(link);
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
return chunk.type === 'heartbeat';
|
|
73
|
+
}
|
|
74
|
+
function applyStreamChunk(summary, chunk, callbacks) {
|
|
75
|
+
const content = chunkContent(chunk);
|
|
76
|
+
if (isCompletionChunk(chunk.type)) {
|
|
77
|
+
summary.completed = true;
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (applyMetadataChunk(summary, chunk))
|
|
81
|
+
return;
|
|
82
|
+
if (chunk.type === 'error')
|
|
83
|
+
throw new AiGatewayError(content ?? 'AI stream returned an error.');
|
|
84
|
+
if (chunk.type === 'request_id' && content !== undefined) {
|
|
85
|
+
summary.gatewayRequestId = content;
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (chunk.type === 'status' && content !== undefined) {
|
|
89
|
+
summary.statuses.push(content);
|
|
90
|
+
callbacks.onStatus?.(content);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
if (chunk.type === 'thinking' && content !== undefined) {
|
|
94
|
+
callbacks.onStatus?.(content);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (chunk.type === 'token' && content !== undefined) {
|
|
98
|
+
summary.content += content;
|
|
99
|
+
callbacks.onToken?.(content);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
if (chunk.type === 'warning' && content !== undefined) {
|
|
103
|
+
summary.warnings.push(content);
|
|
104
|
+
callbacks.onWarning?.(content);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export async function bootstrapAiDialogue(options) {
|
|
108
|
+
const assistantId = assistantIdForAgent(options.agent);
|
|
109
|
+
const dialogueId = trimOptional(options.dialogue);
|
|
110
|
+
if (dialogueId !== undefined) {
|
|
111
|
+
const dialogue = await AiGateway.getDialogue(normalizeAiDialogueId(dialogueId), options);
|
|
112
|
+
return { assistantId, dialogue };
|
|
113
|
+
}
|
|
114
|
+
const credentials = resolveAiCredentials(options);
|
|
115
|
+
let workspace;
|
|
116
|
+
if (options.workspace !== undefined) {
|
|
117
|
+
workspace = { id: normalizeAiWorkspaceId(options.workspace) };
|
|
118
|
+
}
|
|
119
|
+
else if (credentials.workspaceId === undefined) {
|
|
120
|
+
workspace = await AiGateway.createWorkspace(undefined, options);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
workspace = { id: credentials.workspaceId };
|
|
124
|
+
}
|
|
125
|
+
const dialogue = await AiGateway.createDialogue({
|
|
126
|
+
assistantId,
|
|
127
|
+
name: buildDialogueName(options.kind, options.agent),
|
|
128
|
+
workspaceId: workspace.id,
|
|
129
|
+
}, options);
|
|
130
|
+
return { assistantId, dialogue, workspace };
|
|
131
|
+
}
|
|
132
|
+
export async function runAiAsk(options, callbacks = {}) {
|
|
133
|
+
validateAiContext({
|
|
134
|
+
component: options.component,
|
|
135
|
+
sfOrg: options.sfOrg,
|
|
136
|
+
userStory: options.userStory,
|
|
137
|
+
workItem: options.workItem,
|
|
138
|
+
});
|
|
139
|
+
const prompt = enrichAiPrompt(validatePrompt(options.prompt), {
|
|
140
|
+
component: trimOptional(options.component),
|
|
141
|
+
sfOrg: trimOptional(options.sfOrg),
|
|
142
|
+
userStory: trimOptional(options.userStory),
|
|
143
|
+
workItem: trimOptional(options.workItem),
|
|
144
|
+
});
|
|
145
|
+
const bootstrap = await bootstrapAiDialogue({
|
|
146
|
+
...options,
|
|
147
|
+
kind: 'ask',
|
|
148
|
+
});
|
|
149
|
+
const requestId = uuidv4();
|
|
150
|
+
const summary = createStreamSummary();
|
|
151
|
+
await AiGateway.sendMessage(bootstrap.dialogue.id, {
|
|
152
|
+
assistantId: bootstrap.assistantId,
|
|
153
|
+
'dev_context': null,
|
|
154
|
+
integrations: null,
|
|
155
|
+
prompt,
|
|
156
|
+
'request_id': requestId,
|
|
157
|
+
'system_prompt': null,
|
|
158
|
+
}, options, (chunk) => applyStreamChunk(summary, chunk, callbacks));
|
|
159
|
+
if (!summary.completed) {
|
|
160
|
+
throw new AiGatewayError('AI stream ended before stream_complete. Response may be incomplete.');
|
|
161
|
+
}
|
|
162
|
+
return {
|
|
163
|
+
agent: options.agent,
|
|
164
|
+
assistantId: bootstrap.assistantId,
|
|
165
|
+
completed: summary.completed,
|
|
166
|
+
content: summary.content,
|
|
167
|
+
dialogueId: bootstrap.dialogue.id,
|
|
168
|
+
followups: summary.followups,
|
|
169
|
+
gatewayRequestId: summary.gatewayRequestId,
|
|
170
|
+
links: summary.links,
|
|
171
|
+
requestId,
|
|
172
|
+
statuses: summary.statuses,
|
|
173
|
+
warnings: summary.warnings,
|
|
174
|
+
workspaceId: bootstrap.workspace?.id ?? bootstrap.dialogue.workspaceId ?? bootstrap.dialogue.workspace_id ?? undefined,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=ai-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-operations.js","sourceRoot":"","sources":["../../src/lib/ai-operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AiStreamChunk } from './ai-types.js';
|
|
2
|
+
export declare class AiStreamProtocolError extends Error {
|
|
3
|
+
constructor(message: string);
|
|
4
|
+
}
|
|
5
|
+
export declare class AiStreamParser {
|
|
6
|
+
private buffer;
|
|
7
|
+
private readonly decoder;
|
|
8
|
+
finish(): AiStreamChunk[];
|
|
9
|
+
push(chunk: Buffer | string): AiStreamChunk[];
|
|
10
|
+
private drainCompleteLines;
|
|
11
|
+
private parseLine;
|
|
12
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { StringDecoder } from 'node:string_decoder';
|
|
2
|
+
export class AiStreamProtocolError extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'AiStreamProtocolError';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export class AiStreamParser {
|
|
9
|
+
buffer = '';
|
|
10
|
+
decoder = new StringDecoder('utf8');
|
|
11
|
+
finish() {
|
|
12
|
+
this.buffer += this.decoder.end();
|
|
13
|
+
const chunks = [];
|
|
14
|
+
const trailing = this.buffer.trim();
|
|
15
|
+
this.buffer = '';
|
|
16
|
+
if (trailing.length > 0) {
|
|
17
|
+
chunks.push(this.parseLine(trailing));
|
|
18
|
+
}
|
|
19
|
+
return chunks;
|
|
20
|
+
}
|
|
21
|
+
push(chunk) {
|
|
22
|
+
this.buffer += typeof chunk === 'string' ? chunk : this.decoder.write(chunk);
|
|
23
|
+
return this.drainCompleteLines();
|
|
24
|
+
}
|
|
25
|
+
drainCompleteLines() {
|
|
26
|
+
const chunks = [];
|
|
27
|
+
while (true) {
|
|
28
|
+
const newlineIndex = this.buffer.search(/\r?\n/u);
|
|
29
|
+
if (newlineIndex === -1)
|
|
30
|
+
break;
|
|
31
|
+
const rawLine = this.buffer.slice(0, newlineIndex);
|
|
32
|
+
const newlineLength = this.buffer[newlineIndex] === '\r' && this.buffer[newlineIndex + 1] === '\n' ? 2 : 1;
|
|
33
|
+
this.buffer = this.buffer.slice(newlineIndex + newlineLength);
|
|
34
|
+
const line = rawLine.trim();
|
|
35
|
+
if (line.length > 0) {
|
|
36
|
+
chunks.push(this.parseLine(line));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return chunks;
|
|
40
|
+
}
|
|
41
|
+
parseLine(line) {
|
|
42
|
+
let parsed;
|
|
43
|
+
try {
|
|
44
|
+
parsed = JSON.parse(line);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
throw new AiStreamProtocolError(`AI stream returned malformed NDJSON: ${line}`);
|
|
48
|
+
}
|
|
49
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
50
|
+
throw new AiStreamProtocolError('AI stream returned a non-object NDJSON record.');
|
|
51
|
+
}
|
|
52
|
+
const { type } = parsed;
|
|
53
|
+
if (typeof type !== 'string' || type.trim().length === 0) {
|
|
54
|
+
throw new AiStreamProtocolError('AI stream record did not include a type.');
|
|
55
|
+
}
|
|
56
|
+
return parsed;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=ai-stream-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-stream-parser.js","sourceRoot":"","sources":["../../src/lib/ai-stream-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type AiTerminalRenderOptions = {
|
|
2
|
+
colors?: boolean;
|
|
3
|
+
};
|
|
4
|
+
export type AiTerminalMessageKind = 'status' | 'warning';
|
|
5
|
+
export declare function streamSupportsColor(stream: NodeJS.WritableStream): boolean;
|
|
6
|
+
export declare function formatAiTerminalMessage(message: string, kind: AiTerminalMessageKind, options?: AiTerminalRenderOptions): string;
|
|
7
|
+
export declare function renderMarkdownLine(line: string, options?: AiTerminalRenderOptions): string;
|
|
8
|
+
export declare function renderMarkdown(text: string, options?: AiTerminalRenderOptions): string;
|
|
9
|
+
export declare class StreamingMarkdownRenderer {
|
|
10
|
+
private readonly options;
|
|
11
|
+
private buffer;
|
|
12
|
+
private wrote;
|
|
13
|
+
constructor(options?: AiTerminalRenderOptions);
|
|
14
|
+
finish(stream: NodeJS.WritableStream): void;
|
|
15
|
+
write(stream: NodeJS.WritableStream, token: string): void;
|
|
16
|
+
wroteOutput(): boolean;
|
|
17
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
const ANSI = {
|
|
2
|
+
bold: '\u001B[1m',
|
|
3
|
+
cyan: '\u001B[36m',
|
|
4
|
+
dim: '\u001B[2m',
|
|
5
|
+
reset: '\u001B[0m',
|
|
6
|
+
yellow: '\u001B[33m',
|
|
7
|
+
};
|
|
8
|
+
function style(value, code, options) {
|
|
9
|
+
return options.colors === true ? `${code}${value}${ANSI.reset}` : value;
|
|
10
|
+
}
|
|
11
|
+
function inlineMarkdown(value, options) {
|
|
12
|
+
return value
|
|
13
|
+
.replaceAll(/`([^`]+)`/gu, (_match, content) => style(content, ANSI.yellow, options))
|
|
14
|
+
.replaceAll(/\*\*([^*]+)\*\*/gu, (_match, content) => style(content, ANSI.bold, options));
|
|
15
|
+
}
|
|
16
|
+
function renderFence(line, options) {
|
|
17
|
+
const language = line.replace(/^```/u, '').trim();
|
|
18
|
+
const label = language.length > 0 ? `code: ${language}` : 'code';
|
|
19
|
+
return style(`--- ${label} ---`, ANSI.dim, options);
|
|
20
|
+
}
|
|
21
|
+
export function streamSupportsColor(stream) {
|
|
22
|
+
return Boolean(stream.isTTY && process.env.NO_COLOR === undefined);
|
|
23
|
+
}
|
|
24
|
+
export function formatAiTerminalMessage(message, kind, options = {}) {
|
|
25
|
+
const trimmed = message.trim();
|
|
26
|
+
if (kind === 'warning')
|
|
27
|
+
return `${style('!', ANSI.yellow, options)} ${style(trimmed, ANSI.yellow, options)}`;
|
|
28
|
+
return `${style('>', ANSI.cyan, options)} ${style(trimmed, ANSI.dim, options)}`;
|
|
29
|
+
}
|
|
30
|
+
export function renderMarkdownLine(line, options = {}) {
|
|
31
|
+
const trimmed = line.trim();
|
|
32
|
+
if (trimmed.length === 0)
|
|
33
|
+
return '';
|
|
34
|
+
if (trimmed.startsWith('```'))
|
|
35
|
+
return renderFence(trimmed, options);
|
|
36
|
+
if (/^---+$/u.test(trimmed))
|
|
37
|
+
return style('────────────────────────────────────────', ANSI.dim, options);
|
|
38
|
+
const heading = /^(#{1,6})\s+(.+)$/u.exec(trimmed);
|
|
39
|
+
if (heading !== null) {
|
|
40
|
+
const level = heading[1].length;
|
|
41
|
+
const marker = level <= 2 ? '◆' : '◇';
|
|
42
|
+
return style(`${marker} ${inlineMarkdown(heading[2], options)}`, level <= 2 ? ANSI.bold : ANSI.cyan, options);
|
|
43
|
+
}
|
|
44
|
+
const bullet = /^[-*]\s+(.+)$/u.exec(trimmed);
|
|
45
|
+
if (bullet !== null)
|
|
46
|
+
return ` • ${inlineMarkdown(bullet[1], options)}`;
|
|
47
|
+
const numbered = /^(\d+\.)\s+(.+)$/u.exec(trimmed);
|
|
48
|
+
if (numbered !== null)
|
|
49
|
+
return ` ${style(numbered[1], ANSI.cyan, options)} ${inlineMarkdown(numbered[2], options)}`;
|
|
50
|
+
return inlineMarkdown(line, options);
|
|
51
|
+
}
|
|
52
|
+
export function renderMarkdown(text, options = {}) {
|
|
53
|
+
const lines = text.split('\n').map((line) => renderMarkdownLine(line, options));
|
|
54
|
+
return lines.join('\n');
|
|
55
|
+
}
|
|
56
|
+
export class StreamingMarkdownRenderer {
|
|
57
|
+
options;
|
|
58
|
+
buffer = '';
|
|
59
|
+
wrote = false;
|
|
60
|
+
constructor(options = {}) {
|
|
61
|
+
this.options = options;
|
|
62
|
+
}
|
|
63
|
+
finish(stream) {
|
|
64
|
+
if (this.buffer.length > 0) {
|
|
65
|
+
stream.write(`${renderMarkdownLine(this.buffer, this.options)}\n`);
|
|
66
|
+
this.buffer = '';
|
|
67
|
+
this.wrote = true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
write(stream, token) {
|
|
71
|
+
this.buffer += token;
|
|
72
|
+
const lines = this.buffer.split('\n');
|
|
73
|
+
this.buffer = lines.pop() ?? '';
|
|
74
|
+
for (const line of lines) {
|
|
75
|
+
stream.write(`${renderMarkdownLine(line, this.options)}\n`);
|
|
76
|
+
this.wrote = true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
wroteOutput() {
|
|
80
|
+
return this.wrote || this.buffer.length > 0;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=ai-terminal-renderer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-terminal-renderer.js","sourceRoot":"","sources":["../../src/lib/ai-terminal-renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
export declare const AI_ASK_AGENTS: readonly ["plan", "build", "test", "release", "operate"];
|
|
2
|
+
export declare const AI_CHAT_AGENTS: readonly ["plan", "build", "test", "release", "operate", "orchestrate"];
|
|
3
|
+
export declare const AI_WORKSPACE_CAPABILITIES: readonly ["AgentFramework", "Artifacts", "CRTKnowledge", "CustomKnowledge", "DeepResearch", "EssentialsKnowledge", "LongTermMemory", "Mermaid", "MetadataFormatKnowledge", "Mindmap", "OtherKnowledge", "Reasoning", "SourceFormatKnowledge", "STEM", "TabularData", "WebSearch"];
|
|
4
|
+
export declare const AI_WORKSPACE_MEMBER_PERMISSIONS: readonly ["Access", "Manage"];
|
|
5
|
+
export type AiAskAgent = (typeof AI_ASK_AGENTS)[number];
|
|
6
|
+
export type AiChatAgent = (typeof AI_CHAT_AGENTS)[number];
|
|
7
|
+
export type AiAgent = AiAskAgent | AiChatAgent;
|
|
8
|
+
export type AiAssistantId = 'build' | 'generalist' | 'operate' | 'plan' | 'release' | 'test';
|
|
9
|
+
export type AiWorkspaceCapability = (typeof AI_WORKSPACE_CAPABILITIES)[number];
|
|
10
|
+
export type AiWorkspaceMemberPermission = (typeof AI_WORKSPACE_MEMBER_PERMISSIONS)[number];
|
|
11
|
+
export type AiContextOptions = {
|
|
12
|
+
component?: string;
|
|
13
|
+
sfOrg?: string;
|
|
14
|
+
userStory?: string;
|
|
15
|
+
workItem?: string;
|
|
16
|
+
};
|
|
17
|
+
export type AiWorkspace = {
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
capabilities?: AiWorkspaceCapability[];
|
|
20
|
+
description?: string;
|
|
21
|
+
id: string;
|
|
22
|
+
members?: AiWorkspaceMember[];
|
|
23
|
+
name?: string;
|
|
24
|
+
organization_id?: number;
|
|
25
|
+
};
|
|
26
|
+
export type AiWorkspaceSummary = {
|
|
27
|
+
[key: string]: unknown;
|
|
28
|
+
description?: string;
|
|
29
|
+
id: string;
|
|
30
|
+
name?: string;
|
|
31
|
+
organization_id?: number;
|
|
32
|
+
};
|
|
33
|
+
export type AiWorkspaceMember = {
|
|
34
|
+
[key: string]: unknown;
|
|
35
|
+
id: string;
|
|
36
|
+
permission?: AiWorkspaceMemberPermission;
|
|
37
|
+
user_id?: number;
|
|
38
|
+
};
|
|
39
|
+
export type AiOrganizationQuota = {
|
|
40
|
+
limit: number;
|
|
41
|
+
usage: number;
|
|
42
|
+
};
|
|
43
|
+
export type AiWorkspaceCreate = {
|
|
44
|
+
capabilities?: AiWorkspaceCapability[];
|
|
45
|
+
description?: string;
|
|
46
|
+
name: string;
|
|
47
|
+
};
|
|
48
|
+
export type AiWorkspaceUpdate = {
|
|
49
|
+
capabilities?: AiWorkspaceCapability[];
|
|
50
|
+
default_dataset_id?: null | string;
|
|
51
|
+
description?: null | string;
|
|
52
|
+
name?: null | string;
|
|
53
|
+
};
|
|
54
|
+
export type AiWorkspaceMemberCreate = {
|
|
55
|
+
permission: AiWorkspaceMemberPermission;
|
|
56
|
+
user_id: number;
|
|
57
|
+
};
|
|
58
|
+
export type AiDialogue = {
|
|
59
|
+
[key: string]: unknown;
|
|
60
|
+
assistantId?: AiAssistantId;
|
|
61
|
+
id: string;
|
|
62
|
+
name?: string;
|
|
63
|
+
workspace_id?: null | string;
|
|
64
|
+
workspaceId?: null | string;
|
|
65
|
+
};
|
|
66
|
+
export type AiMessageCreate = {
|
|
67
|
+
assistantId: AiAssistantId;
|
|
68
|
+
dev_context?: null | Record<string, unknown>;
|
|
69
|
+
integrations?: null | Record<string, unknown>;
|
|
70
|
+
prompt: string;
|
|
71
|
+
request_id: string;
|
|
72
|
+
system_prompt?: null | string;
|
|
73
|
+
};
|
|
74
|
+
export type AiFollowup = {
|
|
75
|
+
content: string;
|
|
76
|
+
};
|
|
77
|
+
export type AiLink = {
|
|
78
|
+
summary?: string;
|
|
79
|
+
title?: string;
|
|
80
|
+
url?: string;
|
|
81
|
+
};
|
|
82
|
+
export type AiAskResult = {
|
|
83
|
+
agent: AiAgent;
|
|
84
|
+
assistantId: AiAssistantId;
|
|
85
|
+
completed: boolean;
|
|
86
|
+
content: string;
|
|
87
|
+
dialogueId: string;
|
|
88
|
+
followups: AiFollowup[];
|
|
89
|
+
gatewayRequestId?: string;
|
|
90
|
+
links: AiLink[];
|
|
91
|
+
requestId: string;
|
|
92
|
+
statuses: string[];
|
|
93
|
+
warnings: string[];
|
|
94
|
+
workspaceId?: string;
|
|
95
|
+
};
|
|
96
|
+
export type AiStreamChunk = {
|
|
97
|
+
[key: string]: unknown;
|
|
98
|
+
content?: unknown;
|
|
99
|
+
type: string;
|
|
100
|
+
};
|
|
101
|
+
export type AiStreamSummary = {
|
|
102
|
+
completed: boolean;
|
|
103
|
+
content: string;
|
|
104
|
+
followups: AiFollowup[];
|
|
105
|
+
gatewayRequestId?: string;
|
|
106
|
+
links: AiLink[];
|
|
107
|
+
statuses: string[];
|
|
108
|
+
warnings: string[];
|
|
109
|
+
};
|
|
110
|
+
export declare function assistantIdForAgent(agent: AiAgent): AiAssistantId;
|
|
111
|
+
export declare function workspacesEndpoint(): string;
|
|
112
|
+
export declare function workspaceEndpoint(workspaceId: string): string;
|
|
113
|
+
export declare function workspaceMembersEndpoint(workspaceId: string): string;
|
|
114
|
+
export declare function quotaEndpoint(): string;
|
|
115
|
+
export declare function dialoguesEndpoint(): string;
|
|
116
|
+
export declare function dialogueEndpoint(dialogueId: string): string;
|
|
117
|
+
export declare function dialogueMessagesEndpoint(dialogueId: string): string;
|
|
118
|
+
export declare function buildDialogueName(kind: 'ask' | 'chat', agent: AiAgent): string;
|
|
119
|
+
export declare function enrichAiPrompt(prompt: string, context?: AiContextOptions): string;
|
|
120
|
+
export declare function normalizeAiWorkspace(value: unknown): AiWorkspace;
|
|
121
|
+
export declare function normalizeAiWorkspaceSummary(value: unknown): AiWorkspaceSummary;
|
|
122
|
+
export declare function normalizeAiWorkspaceList(value: unknown): AiWorkspaceSummary[];
|
|
123
|
+
export declare function normalizeAiWorkspaceMember(value: unknown): AiWorkspaceMember;
|
|
124
|
+
export declare function normalizeAiOrganizationQuota(value: unknown): AiOrganizationQuota;
|
|
125
|
+
export declare function normalizeAiDialogue(value: unknown): AiDialogue;
|
|
126
|
+
export declare function validateAiContext(context: AiContextOptions): void;
|
|
127
|
+
export declare function normalizeAiDatasetId(value: string): string;
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { normalizeAiDialogueId, normalizeAiUuid, normalizeAiWorkspaceId } from './ai-config.js';
|
|
2
|
+
export const AI_ASK_AGENTS = ['plan', 'build', 'test', 'release', 'operate'];
|
|
3
|
+
export const AI_CHAT_AGENTS = [...AI_ASK_AGENTS, 'orchestrate'];
|
|
4
|
+
export const AI_WORKSPACE_CAPABILITIES = [
|
|
5
|
+
'AgentFramework',
|
|
6
|
+
'Artifacts',
|
|
7
|
+
'CRTKnowledge',
|
|
8
|
+
'CustomKnowledge',
|
|
9
|
+
'DeepResearch',
|
|
10
|
+
'EssentialsKnowledge',
|
|
11
|
+
'LongTermMemory',
|
|
12
|
+
'Mermaid',
|
|
13
|
+
'MetadataFormatKnowledge',
|
|
14
|
+
'Mindmap',
|
|
15
|
+
'OtherKnowledge',
|
|
16
|
+
'Reasoning',
|
|
17
|
+
'SourceFormatKnowledge',
|
|
18
|
+
'STEM',
|
|
19
|
+
'TabularData',
|
|
20
|
+
'WebSearch',
|
|
21
|
+
];
|
|
22
|
+
export const AI_WORKSPACE_MEMBER_PERMISSIONS = ['Access', 'Manage'];
|
|
23
|
+
export function assistantIdForAgent(agent) {
|
|
24
|
+
return agent === 'orchestrate' ? 'generalist' : agent;
|
|
25
|
+
}
|
|
26
|
+
export function workspacesEndpoint() {
|
|
27
|
+
return '/workspaces';
|
|
28
|
+
}
|
|
29
|
+
export function workspaceEndpoint(workspaceId) {
|
|
30
|
+
return `/workspaces/${normalizeAiWorkspaceId(workspaceId)}`;
|
|
31
|
+
}
|
|
32
|
+
export function workspaceMembersEndpoint(workspaceId) {
|
|
33
|
+
return `${workspaceEndpoint(workspaceId)}/members`;
|
|
34
|
+
}
|
|
35
|
+
export function quotaEndpoint() {
|
|
36
|
+
return '/quota';
|
|
37
|
+
}
|
|
38
|
+
export function dialoguesEndpoint() {
|
|
39
|
+
return '/dialogues';
|
|
40
|
+
}
|
|
41
|
+
export function dialogueEndpoint(dialogueId) {
|
|
42
|
+
return `/dialogues/${normalizeAiDialogueId(dialogueId)}`;
|
|
43
|
+
}
|
|
44
|
+
export function dialogueMessagesEndpoint(dialogueId) {
|
|
45
|
+
return `/dialogues/${normalizeAiDialogueId(dialogueId)}/messages`;
|
|
46
|
+
}
|
|
47
|
+
export function buildDialogueName(kind, agent) {
|
|
48
|
+
return `cli-${kind}-${agent}`;
|
|
49
|
+
}
|
|
50
|
+
export function enrichAiPrompt(prompt, context = {}) {
|
|
51
|
+
const lines = [];
|
|
52
|
+
if (context.userStory !== undefined)
|
|
53
|
+
lines.push(`- User story: ${context.userStory}`);
|
|
54
|
+
if (context.sfOrg !== undefined)
|
|
55
|
+
lines.push(`- Salesforce environment: ${context.sfOrg}`);
|
|
56
|
+
if (context.component !== undefined)
|
|
57
|
+
lines.push(`- Component: ${context.component}`);
|
|
58
|
+
if (context.workItem !== undefined)
|
|
59
|
+
lines.push(`- Work item: ${context.workItem}`);
|
|
60
|
+
if (lines.length === 0)
|
|
61
|
+
return prompt;
|
|
62
|
+
return `${prompt}\n\n---\nContext:\n${lines.join('\n')}`;
|
|
63
|
+
}
|
|
64
|
+
export function normalizeAiWorkspace(value) {
|
|
65
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
66
|
+
throw new Error('AI workspace response was not an object.');
|
|
67
|
+
}
|
|
68
|
+
const workspace = value;
|
|
69
|
+
if (typeof workspace.id !== 'string' || workspace.id.trim().length === 0) {
|
|
70
|
+
throw new Error('AI workspace response did not include an id.');
|
|
71
|
+
}
|
|
72
|
+
const normalized = { ...value, id: workspace.id.trim() };
|
|
73
|
+
if (Array.isArray(workspace.members)) {
|
|
74
|
+
normalized.members = workspace.members.map((member) => normalizeAiWorkspaceMember(member));
|
|
75
|
+
}
|
|
76
|
+
return normalized;
|
|
77
|
+
}
|
|
78
|
+
export function normalizeAiWorkspaceSummary(value) {
|
|
79
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
80
|
+
throw new Error('AI workspace summary response was not an object.');
|
|
81
|
+
}
|
|
82
|
+
const workspace = value;
|
|
83
|
+
if (typeof workspace.id !== 'string' || workspace.id.trim().length === 0) {
|
|
84
|
+
throw new Error('AI workspace summary response did not include an id.');
|
|
85
|
+
}
|
|
86
|
+
return { ...value, id: workspace.id.trim() };
|
|
87
|
+
}
|
|
88
|
+
export function normalizeAiWorkspaceList(value) {
|
|
89
|
+
if (!Array.isArray(value))
|
|
90
|
+
throw new Error('AI workspace list response was not an array.');
|
|
91
|
+
return value.map((workspace) => normalizeAiWorkspaceSummary(workspace));
|
|
92
|
+
}
|
|
93
|
+
export function normalizeAiWorkspaceMember(value) {
|
|
94
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
95
|
+
throw new Error('AI workspace member response was not an object.');
|
|
96
|
+
}
|
|
97
|
+
const member = value;
|
|
98
|
+
if (typeof member.id !== 'string' || member.id.trim().length === 0) {
|
|
99
|
+
throw new Error('AI workspace member response did not include an id.');
|
|
100
|
+
}
|
|
101
|
+
return { ...value, id: member.id.trim() };
|
|
102
|
+
}
|
|
103
|
+
export function normalizeAiOrganizationQuota(value) {
|
|
104
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
105
|
+
throw new Error('AI quota response was not an object.');
|
|
106
|
+
}
|
|
107
|
+
const quota = value;
|
|
108
|
+
if (typeof quota.usage !== 'number' || typeof quota.limit !== 'number') {
|
|
109
|
+
throw new TypeError('AI quota response did not include numeric usage and limit.');
|
|
110
|
+
}
|
|
111
|
+
return { limit: quota.limit, usage: quota.usage };
|
|
112
|
+
}
|
|
113
|
+
export function normalizeAiDialogue(value) {
|
|
114
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value)) {
|
|
115
|
+
throw new Error('AI dialogue response was not an object.');
|
|
116
|
+
}
|
|
117
|
+
const dialogue = value;
|
|
118
|
+
if (typeof dialogue.id !== 'string' || dialogue.id.trim().length === 0) {
|
|
119
|
+
throw new Error('AI dialogue response did not include an id.');
|
|
120
|
+
}
|
|
121
|
+
return { ...value, id: dialogue.id.trim() };
|
|
122
|
+
}
|
|
123
|
+
export function validateAiContext(context) {
|
|
124
|
+
for (const [label, value] of Object.entries(context)) {
|
|
125
|
+
if (typeof value === 'string' && value.trim().length === 0) {
|
|
126
|
+
throw new Error(`${label} value cannot be empty.`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
export function normalizeAiDatasetId(value) {
|
|
131
|
+
return normalizeAiUuid(value, 'AI default dataset ID');
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=ai-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-types.js","sourceRoot":"","sources":["../../src/lib/ai-types.ts"],"names":[],"mappings":"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"}
|