@yuaone/cli 0.1.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/LICENSE +663 -0
- package/dist/auth.d.ts +71 -0
- package/dist/auth.d.ts.map +1 -0
- package/dist/auth.js +240 -0
- package/dist/auth.js.map +1 -0
- package/dist/cli.d.ts +16 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +212 -0
- package/dist/cli.js.map +1 -0
- package/dist/cloud-client.d.ts +179 -0
- package/dist/cloud-client.d.ts.map +1 -0
- package/dist/cloud-client.js +369 -0
- package/dist/cloud-client.js.map +1 -0
- package/dist/config.d.ts +59 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +214 -0
- package/dist/config.js.map +1 -0
- package/dist/design-renderer.d.ts +16 -0
- package/dist/design-renderer.d.ts.map +1 -0
- package/dist/design-renderer.js +78 -0
- package/dist/design-renderer.js.map +1 -0
- package/dist/design.d.ts +18 -0
- package/dist/design.d.ts.map +1 -0
- package/dist/design.js +190 -0
- package/dist/design.js.map +1 -0
- package/dist/diff-renderer.d.ts +56 -0
- package/dist/diff-renderer.d.ts.map +1 -0
- package/dist/diff-renderer.js +133 -0
- package/dist/diff-renderer.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/interactive.d.ts +73 -0
- package/dist/interactive.d.ts.map +1 -0
- package/dist/interactive.js +638 -0
- package/dist/interactive.js.map +1 -0
- package/dist/oneshot.d.ts +17 -0
- package/dist/oneshot.d.ts.map +1 -0
- package/dist/oneshot.js +281 -0
- package/dist/oneshot.js.map +1 -0
- package/dist/progress-renderer.d.ts +116 -0
- package/dist/progress-renderer.d.ts.map +1 -0
- package/dist/progress-renderer.js +249 -0
- package/dist/progress-renderer.js.map +1 -0
- package/dist/renderer.d.ts +67 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +182 -0
- package/dist/renderer.js.map +1 -0
- package/dist/session.d.ts +71 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +246 -0
- package/dist/session.js.map +1 -0
- package/dist/y-spinner.d.ts +34 -0
- package/dist/y-spinner.d.ts.map +1 -0
- package/dist/y-spinner.js +93 -0
- package/dist/y-spinner.js.map +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YUAN CLI — One-shot Mode
|
|
3
|
+
*
|
|
4
|
+
* Executes a single coding task and exits.
|
|
5
|
+
* Usage: yuan code "Add error handling to auth.ts"
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Run a one-shot coding task.
|
|
9
|
+
*
|
|
10
|
+
* @param prompt - The coding task prompt
|
|
11
|
+
* @param options - Command options (model override, etc.)
|
|
12
|
+
* @returns Exit code (0 = success, 1 = failure)
|
|
13
|
+
*/
|
|
14
|
+
export declare function runOneshot(prompt: string, options?: {
|
|
15
|
+
model?: string;
|
|
16
|
+
}): Promise<number>;
|
|
17
|
+
//# sourceMappingURL=oneshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneshot.d.ts","sourceRoot":"","sources":["../src/oneshot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAqBH;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,MAAM,CAAC,CAqLjB"}
|
package/dist/oneshot.js
ADDED
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YUAN CLI — One-shot Mode
|
|
3
|
+
*
|
|
4
|
+
* Executes a single coding task and exits.
|
|
5
|
+
* Usage: yuan code "Add error handling to auth.ts"
|
|
6
|
+
*/
|
|
7
|
+
import { TerminalRenderer } from "./renderer.js";
|
|
8
|
+
import { SessionManager } from "./session.js";
|
|
9
|
+
import { ConfigManager } from "./config.js";
|
|
10
|
+
import { AgentLoop, DEFAULT_LOOP_CONFIG, } from "@yuaone/core";
|
|
11
|
+
import { createDefaultRegistry } from "@yuaone/tools";
|
|
12
|
+
import { CloudClient } from "./cloud-client.js";
|
|
13
|
+
const ESC = "\x1b[";
|
|
14
|
+
function c(color, text) {
|
|
15
|
+
return `${color}${text}${ESC}0m`;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Run a one-shot coding task.
|
|
19
|
+
*
|
|
20
|
+
* @param prompt - The coding task prompt
|
|
21
|
+
* @param options - Command options (model override, etc.)
|
|
22
|
+
* @returns Exit code (0 = success, 1 = failure)
|
|
23
|
+
*/
|
|
24
|
+
export async function runOneshot(prompt, options = {}) {
|
|
25
|
+
const renderer = new TerminalRenderer();
|
|
26
|
+
const configManager = new ConfigManager();
|
|
27
|
+
const sessionManager = new SessionManager();
|
|
28
|
+
// Check if API key is configured
|
|
29
|
+
if (!configManager.isConfigured()) {
|
|
30
|
+
renderer.error("No API key configured. Run `yuan config` to set up.");
|
|
31
|
+
return 1;
|
|
32
|
+
}
|
|
33
|
+
const config = configManager.get();
|
|
34
|
+
const model = options.model ?? configManager.getModel();
|
|
35
|
+
renderer.banner();
|
|
36
|
+
renderer.info(`Provider: ${config.provider} | Model: ${model}`);
|
|
37
|
+
renderer.info(`Task: ${prompt}`);
|
|
38
|
+
renderer.separator();
|
|
39
|
+
// Cloud mode — delegate to remote server
|
|
40
|
+
if (configManager.isCloudMode()) {
|
|
41
|
+
return runOneshotCloud(prompt, config, renderer, options);
|
|
42
|
+
}
|
|
43
|
+
// Create a session for this one-shot
|
|
44
|
+
const session = sessionManager.create(process.cwd(), config.provider, model);
|
|
45
|
+
sessionManager.addMessage(session, "user", prompt);
|
|
46
|
+
// Build BYOK config
|
|
47
|
+
const byokConfig = {
|
|
48
|
+
provider: config.provider,
|
|
49
|
+
apiKey: config.apiKey,
|
|
50
|
+
model: options.model ?? config.model,
|
|
51
|
+
baseUrl: config.baseUrl,
|
|
52
|
+
};
|
|
53
|
+
// Create tool registry and executor
|
|
54
|
+
const registry = createDefaultRegistry();
|
|
55
|
+
const workDir = process.cwd();
|
|
56
|
+
const toolExecutor = registry.toExecutor(workDir);
|
|
57
|
+
// Build agent config
|
|
58
|
+
const agentConfig = {
|
|
59
|
+
byok: byokConfig,
|
|
60
|
+
loop: {
|
|
61
|
+
model: "coding",
|
|
62
|
+
maxIterations: DEFAULT_LOOP_CONFIG.maxIterations,
|
|
63
|
+
maxTokensPerIteration: DEFAULT_LOOP_CONFIG.maxTokensPerIteration,
|
|
64
|
+
totalTokenBudget: DEFAULT_LOOP_CONFIG.totalTokenBudget,
|
|
65
|
+
tools: toolExecutor.definitions,
|
|
66
|
+
systemPrompt: "You are YUAN, an autonomous coding agent. " +
|
|
67
|
+
"You have access to tools for reading, writing, editing files, running shell commands, and searching code. " +
|
|
68
|
+
"Complete the user's coding task efficiently and correctly, then stop.",
|
|
69
|
+
projectPath: workDir,
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
// Create and run AgentLoop
|
|
73
|
+
const loop = new AgentLoop({
|
|
74
|
+
config: agentConfig,
|
|
75
|
+
toolExecutor,
|
|
76
|
+
governorConfig: { planTier: "FREE" },
|
|
77
|
+
});
|
|
78
|
+
// Handle SIGINT gracefully — restore cursor and exit
|
|
79
|
+
const sigintHandler = () => {
|
|
80
|
+
process.stdout.write("\x1b[?25h"); // restore cursor
|
|
81
|
+
renderer.info("\nInterrupted.");
|
|
82
|
+
process.exit(130);
|
|
83
|
+
};
|
|
84
|
+
process.on("SIGINT", sigintHandler);
|
|
85
|
+
const spinner = renderer.thinking();
|
|
86
|
+
let isStreaming = false;
|
|
87
|
+
loop.on("event", (event) => {
|
|
88
|
+
switch (event.kind) {
|
|
89
|
+
case "agent:thinking":
|
|
90
|
+
if (!isStreaming) {
|
|
91
|
+
spinner.update(event.content);
|
|
92
|
+
}
|
|
93
|
+
break;
|
|
94
|
+
case "agent:text_delta":
|
|
95
|
+
if (!isStreaming) {
|
|
96
|
+
spinner.stop();
|
|
97
|
+
isStreaming = true;
|
|
98
|
+
console.log();
|
|
99
|
+
}
|
|
100
|
+
renderer.streamToken(event.text);
|
|
101
|
+
break;
|
|
102
|
+
case "agent:tool_call":
|
|
103
|
+
if (isStreaming) {
|
|
104
|
+
renderer.endStream();
|
|
105
|
+
isStreaming = false;
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
spinner.stop();
|
|
109
|
+
}
|
|
110
|
+
renderer.toolCall(event.tool, typeof event.input === "string"
|
|
111
|
+
? event.input.slice(0, 100)
|
|
112
|
+
: JSON.stringify(event.input, null, 0).slice(0, 100));
|
|
113
|
+
break;
|
|
114
|
+
case "agent:tool_result":
|
|
115
|
+
renderer.toolResult(event.output);
|
|
116
|
+
break;
|
|
117
|
+
case "agent:error":
|
|
118
|
+
if (isStreaming) {
|
|
119
|
+
renderer.endStream();
|
|
120
|
+
isStreaming = false;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
spinner.stop();
|
|
124
|
+
}
|
|
125
|
+
renderer.error(event.message);
|
|
126
|
+
break;
|
|
127
|
+
case "agent:completed": {
|
|
128
|
+
const wasStreaming = isStreaming;
|
|
129
|
+
if (isStreaming) {
|
|
130
|
+
renderer.endStream();
|
|
131
|
+
isStreaming = false;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
spinner.stop();
|
|
135
|
+
}
|
|
136
|
+
if (!wasStreaming) {
|
|
137
|
+
console.log();
|
|
138
|
+
}
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
default:
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
try {
|
|
146
|
+
const result = await loop.run(prompt);
|
|
147
|
+
if (isStreaming) {
|
|
148
|
+
renderer.endStream();
|
|
149
|
+
isStreaming = false;
|
|
150
|
+
}
|
|
151
|
+
spinner.stop();
|
|
152
|
+
if (result.reason === "GOAL_ACHIEVED") {
|
|
153
|
+
renderer.success("Task completed.");
|
|
154
|
+
sessionManager.addMessage(session, "assistant", result.summary);
|
|
155
|
+
return 0;
|
|
156
|
+
}
|
|
157
|
+
// Non-success termination
|
|
158
|
+
switch (result.reason) {
|
|
159
|
+
case "MAX_ITERATIONS":
|
|
160
|
+
renderer.warn(`Reached iteration limit: ${result.lastState}`);
|
|
161
|
+
break;
|
|
162
|
+
case "BUDGET_EXHAUSTED":
|
|
163
|
+
renderer.warn(`Token budget exhausted: ${result.tokensUsed} tokens used`);
|
|
164
|
+
break;
|
|
165
|
+
case "ERROR":
|
|
166
|
+
renderer.error(`Agent error: ${result.error}`);
|
|
167
|
+
break;
|
|
168
|
+
default:
|
|
169
|
+
renderer.warn(`Agent terminated: ${result.reason}`);
|
|
170
|
+
}
|
|
171
|
+
renderer.info(`Session ${session.id.slice(0, 8)} saved. Run \`yuan resume\` to continue.`);
|
|
172
|
+
return 1;
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
if (isStreaming) {
|
|
176
|
+
renderer.endStream();
|
|
177
|
+
}
|
|
178
|
+
spinner.stop();
|
|
179
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
180
|
+
renderer.error(`Unexpected error: ${errorMsg}`);
|
|
181
|
+
return 1;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Run a one-shot task via CloudClient (cloud mode).
|
|
186
|
+
*/
|
|
187
|
+
async function runOneshotCloud(prompt, config, renderer, options) {
|
|
188
|
+
const client = new CloudClient(config.serverUrl, config.apiKey);
|
|
189
|
+
const abortController = new AbortController();
|
|
190
|
+
const sigintHandler = () => {
|
|
191
|
+
abortController.abort();
|
|
192
|
+
};
|
|
193
|
+
process.on("SIGINT", sigintHandler);
|
|
194
|
+
const spinner = renderer.thinking();
|
|
195
|
+
let isStreaming = false;
|
|
196
|
+
let cloudSessionId;
|
|
197
|
+
let hasError = false;
|
|
198
|
+
try {
|
|
199
|
+
const { sessionId } = await client.startSession(prompt, {
|
|
200
|
+
workDir: process.cwd(),
|
|
201
|
+
model: options.model ?? config.model,
|
|
202
|
+
});
|
|
203
|
+
cloudSessionId = sessionId;
|
|
204
|
+
await client.streamEvents(sessionId, (event) => {
|
|
205
|
+
switch (event.kind) {
|
|
206
|
+
case "thinking":
|
|
207
|
+
if (!isStreaming)
|
|
208
|
+
spinner.update(event.content);
|
|
209
|
+
break;
|
|
210
|
+
case "text_delta":
|
|
211
|
+
if (!isStreaming) {
|
|
212
|
+
spinner.stop();
|
|
213
|
+
isStreaming = true;
|
|
214
|
+
console.log();
|
|
215
|
+
}
|
|
216
|
+
renderer.streamToken(event.text);
|
|
217
|
+
break;
|
|
218
|
+
case "tool_call":
|
|
219
|
+
if (isStreaming) {
|
|
220
|
+
renderer.endStream();
|
|
221
|
+
isStreaming = false;
|
|
222
|
+
}
|
|
223
|
+
else
|
|
224
|
+
spinner.stop();
|
|
225
|
+
renderer.toolCall(event.tool, typeof event.input === "string"
|
|
226
|
+
? event.input.slice(0, 100)
|
|
227
|
+
: JSON.stringify(event.input, null, 0).slice(0, 100));
|
|
228
|
+
break;
|
|
229
|
+
case "tool_result":
|
|
230
|
+
renderer.toolResult(event.output);
|
|
231
|
+
break;
|
|
232
|
+
case "error":
|
|
233
|
+
if (isStreaming) {
|
|
234
|
+
renderer.endStream();
|
|
235
|
+
isStreaming = false;
|
|
236
|
+
}
|
|
237
|
+
else
|
|
238
|
+
spinner.stop();
|
|
239
|
+
renderer.error(event.message);
|
|
240
|
+
hasError = true;
|
|
241
|
+
break;
|
|
242
|
+
case "done":
|
|
243
|
+
if (isStreaming) {
|
|
244
|
+
renderer.endStream();
|
|
245
|
+
isStreaming = false;
|
|
246
|
+
}
|
|
247
|
+
else
|
|
248
|
+
spinner.stop();
|
|
249
|
+
break;
|
|
250
|
+
default:
|
|
251
|
+
break;
|
|
252
|
+
}
|
|
253
|
+
}, { signal: abortController.signal });
|
|
254
|
+
spinner.stop();
|
|
255
|
+
if (isStreaming)
|
|
256
|
+
renderer.endStream();
|
|
257
|
+
if (!hasError) {
|
|
258
|
+
renderer.success("Task completed.");
|
|
259
|
+
return 0;
|
|
260
|
+
}
|
|
261
|
+
return 1;
|
|
262
|
+
}
|
|
263
|
+
catch (err) {
|
|
264
|
+
spinner.stop();
|
|
265
|
+
if (isStreaming)
|
|
266
|
+
renderer.endStream();
|
|
267
|
+
if (err instanceof DOMException && err.name === "AbortError") {
|
|
268
|
+
if (cloudSessionId)
|
|
269
|
+
await client.stop(cloudSessionId).catch(() => { });
|
|
270
|
+
renderer.info("Interrupted.");
|
|
271
|
+
return 130;
|
|
272
|
+
}
|
|
273
|
+
const errorMsg = err instanceof Error ? err.message : String(err);
|
|
274
|
+
renderer.error(`Cloud error: ${errorMsg}`);
|
|
275
|
+
return 1;
|
|
276
|
+
}
|
|
277
|
+
finally {
|
|
278
|
+
process.removeListener("SIGINT", sigintHandler);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=oneshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oneshot.js","sourceRoot":"","sources":["../src/oneshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module progress-renderer
|
|
3
|
+
* @description Real-time agent execution progress display for CLI.
|
|
4
|
+
*
|
|
5
|
+
* Shows:
|
|
6
|
+
* - Agent status (planning/coding/reviewing/testing)
|
|
7
|
+
* - Current tool execution (file, command, etc.)
|
|
8
|
+
* - Token usage bar
|
|
9
|
+
* - Iteration progress
|
|
10
|
+
* - Thinking stream (reasoning deltas)
|
|
11
|
+
*/
|
|
12
|
+
/** Agent execution phase. */
|
|
13
|
+
export type AgentPhase = "planning" | "coding" | "reviewing" | "testing" | "waiting";
|
|
14
|
+
/** Status change event consumed by `onStatus`. */
|
|
15
|
+
export interface StatusEvent {
|
|
16
|
+
phase: AgentPhase;
|
|
17
|
+
detail?: string;
|
|
18
|
+
}
|
|
19
|
+
/** Tool call event consumed by `onToolCall`. */
|
|
20
|
+
export interface ToolCallEvent {
|
|
21
|
+
tool: string;
|
|
22
|
+
input: string;
|
|
23
|
+
}
|
|
24
|
+
/** Tool result event consumed by `onToolResult`. */
|
|
25
|
+
export interface ToolResultEvent {
|
|
26
|
+
tool: string;
|
|
27
|
+
success: boolean;
|
|
28
|
+
summary: string;
|
|
29
|
+
}
|
|
30
|
+
/** Approval request shown by `onApprovalNeeded`. */
|
|
31
|
+
export interface ApprovalEvent {
|
|
32
|
+
id: string;
|
|
33
|
+
tool: string;
|
|
34
|
+
description: string;
|
|
35
|
+
risk: "low" | "medium" | "high";
|
|
36
|
+
}
|
|
37
|
+
/** Completion summary shown by `onDone`. */
|
|
38
|
+
export interface DoneResult {
|
|
39
|
+
filesChanged: string[];
|
|
40
|
+
iterations: number;
|
|
41
|
+
tokensUsed: number;
|
|
42
|
+
durationMs: number;
|
|
43
|
+
summary: string;
|
|
44
|
+
}
|
|
45
|
+
/** Configuration for `ProgressRenderer`. */
|
|
46
|
+
export interface ProgressRendererConfig {
|
|
47
|
+
/** Maximum iterations the agent will attempt. */
|
|
48
|
+
maxIterations: number;
|
|
49
|
+
/** Maximum token budget for the run. */
|
|
50
|
+
maxTokens: number;
|
|
51
|
+
/** Whether to display the thinking (reasoning) stream. */
|
|
52
|
+
showThinking: boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Render a Unicode progress bar.
|
|
56
|
+
*
|
|
57
|
+
* @param current - Current value.
|
|
58
|
+
* @param max - Maximum value.
|
|
59
|
+
* @param width - Character width of the bar (filled + empty).
|
|
60
|
+
* @returns Colored bar string, e.g. `████████░░░░░░░░`.
|
|
61
|
+
*/
|
|
62
|
+
export declare function renderBar(current: number, max: number, width?: number): string;
|
|
63
|
+
/**
|
|
64
|
+
* Real-time CLI renderer for agent execution progress.
|
|
65
|
+
*
|
|
66
|
+
* Usage:
|
|
67
|
+
* ```ts
|
|
68
|
+
* const pr = new ProgressRenderer({ maxIterations: 25, maxTokens: 200_000, showThinking: true });
|
|
69
|
+
* pr.onStatus({ phase: "planning", detail: "analyzing codebase" });
|
|
70
|
+
* pr.onToolCall({ tool: "file_read", input: "src/index.ts" });
|
|
71
|
+
* pr.onToolResult({ tool: "file_read", success: true, summary: "42 lines" });
|
|
72
|
+
* pr.onIterationEnd(3, 25, 12400, 200000);
|
|
73
|
+
* pr.onDone({ filesChanged: ["a.ts"], iterations: 3, tokensUsed: 12400, durationMs: 8200, summary: "Done" });
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare class ProgressRenderer {
|
|
77
|
+
private readonly config;
|
|
78
|
+
private thinkingBuffer;
|
|
79
|
+
private thinkingTimer;
|
|
80
|
+
private currentPhase;
|
|
81
|
+
constructor(config: ProgressRendererConfig);
|
|
82
|
+
/** Display an agent phase transition. */
|
|
83
|
+
onStatus(event: StatusEvent): void;
|
|
84
|
+
/** Display a tool invocation line. */
|
|
85
|
+
onToolCall(event: ToolCallEvent): void;
|
|
86
|
+
/** Display a tool result line (success or error). */
|
|
87
|
+
onToolResult(event: ToolResultEvent): void;
|
|
88
|
+
/**
|
|
89
|
+
* Stream a reasoning delta.
|
|
90
|
+
* Output is debounced (200 ms) and rendered in dim gray,
|
|
91
|
+
* word-wrapped to the terminal width.
|
|
92
|
+
*/
|
|
93
|
+
onThinking(delta: string): void;
|
|
94
|
+
/** Flush any buffered thinking text to stdout. */
|
|
95
|
+
private flushThinking;
|
|
96
|
+
/** Word-wrap text to a given width. */
|
|
97
|
+
private wrapText;
|
|
98
|
+
/**
|
|
99
|
+
* Render an iteration progress line with bar and token usage.
|
|
100
|
+
*
|
|
101
|
+
* Example output:
|
|
102
|
+
* ```
|
|
103
|
+
* [3/25] ████████░░░░░░░░ 32% | tokens: 12.4k/200k
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
onIterationEnd(iteration: number, maxIteration: number, tokensUsed: number, maxTokens: number): void;
|
|
107
|
+
/** Display an approval-needed prompt box. */
|
|
108
|
+
onApprovalNeeded(approval: ApprovalEvent): void;
|
|
109
|
+
/** Display a completion summary. */
|
|
110
|
+
onDone(result: DoneResult): void;
|
|
111
|
+
/** Display an error message in red. */
|
|
112
|
+
onError(error: string): void;
|
|
113
|
+
/** Clear the current progress display area. */
|
|
114
|
+
clear(): void;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=progress-renderer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-renderer.d.ts","sourceRoot":"","sources":["../src/progress-renderer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA6BH,6BAA6B;AAC7B,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;AAErF,kDAAkD;AAClD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,UAAU,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,gDAAgD;AAChD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,oDAAoD;AACpD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,oDAAoD;AACpD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;CACjC;AAED,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,4CAA4C;AAC5C,MAAM,WAAW,sBAAsB;IACrC,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,YAAY,EAAE,OAAO,CAAC;CACvB;AAcD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAY1E;AAID;;;;;;;;;;;;GAYG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,cAAc,CAAM;IAC5B,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,YAAY,CAA2B;gBAEnC,MAAM,EAAE,sBAAsB;IAM1C,yCAAyC;IACzC,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IASlC,sCAAsC;IACtC,UAAU,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAWtC,qDAAqD;IACrD,YAAY,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAmB1C;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAW/B,kDAAkD;IAClD,OAAO,CAAC,aAAa;IAarB,uCAAuC;IACvC,OAAO,CAAC,QAAQ;IAoBhB;;;;;;;OAOG;IACH,cAAc,CACZ,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,IAAI;IAiBP,6CAA6C;IAC7C,gBAAgB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IA4C/C,oCAAoC;IACpC,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAgChC,uCAAuC;IACvC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAO5B,+CAA+C;IAC/C,KAAK,IAAI,IAAI;CAId"}
|