@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.
Files changed (58) hide show
  1. package/LICENSE +663 -0
  2. package/dist/auth.d.ts +71 -0
  3. package/dist/auth.d.ts.map +1 -0
  4. package/dist/auth.js +240 -0
  5. package/dist/auth.js.map +1 -0
  6. package/dist/cli.d.ts +16 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +212 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/cloud-client.d.ts +179 -0
  11. package/dist/cloud-client.d.ts.map +1 -0
  12. package/dist/cloud-client.js +369 -0
  13. package/dist/cloud-client.js.map +1 -0
  14. package/dist/config.d.ts +59 -0
  15. package/dist/config.d.ts.map +1 -0
  16. package/dist/config.js +214 -0
  17. package/dist/config.js.map +1 -0
  18. package/dist/design-renderer.d.ts +16 -0
  19. package/dist/design-renderer.d.ts.map +1 -0
  20. package/dist/design-renderer.js +78 -0
  21. package/dist/design-renderer.js.map +1 -0
  22. package/dist/design.d.ts +18 -0
  23. package/dist/design.d.ts.map +1 -0
  24. package/dist/design.js +190 -0
  25. package/dist/design.js.map +1 -0
  26. package/dist/diff-renderer.d.ts +56 -0
  27. package/dist/diff-renderer.d.ts.map +1 -0
  28. package/dist/diff-renderer.js +133 -0
  29. package/dist/diff-renderer.js.map +1 -0
  30. package/dist/index.d.ts +16 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +16 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/interactive.d.ts +73 -0
  35. package/dist/interactive.d.ts.map +1 -0
  36. package/dist/interactive.js +638 -0
  37. package/dist/interactive.js.map +1 -0
  38. package/dist/oneshot.d.ts +17 -0
  39. package/dist/oneshot.d.ts.map +1 -0
  40. package/dist/oneshot.js +281 -0
  41. package/dist/oneshot.js.map +1 -0
  42. package/dist/progress-renderer.d.ts +116 -0
  43. package/dist/progress-renderer.d.ts.map +1 -0
  44. package/dist/progress-renderer.js +249 -0
  45. package/dist/progress-renderer.js.map +1 -0
  46. package/dist/renderer.d.ts +67 -0
  47. package/dist/renderer.d.ts.map +1 -0
  48. package/dist/renderer.js +182 -0
  49. package/dist/renderer.js.map +1 -0
  50. package/dist/session.d.ts +71 -0
  51. package/dist/session.d.ts.map +1 -0
  52. package/dist/session.js +246 -0
  53. package/dist/session.js.map +1 -0
  54. package/dist/y-spinner.d.ts +34 -0
  55. package/dist/y-spinner.d.ts.map +1 -0
  56. package/dist/y-spinner.js +93 -0
  57. package/dist/y-spinner.js.map +1 -0
  58. package/package.json +45 -0
@@ -0,0 +1,179 @@
1
+ /**
2
+ * YUAN CLI — Cloud Client
3
+ *
4
+ * API client for YUAN CLI cloud mode.
5
+ * Connects to yua-backend (:4000) via REST + SSE.
6
+ *
7
+ * - Auth via x-api-key header (yua_sk_xxx)
8
+ * - SSE streaming with automatic reconnection
9
+ * - No external dependencies (native fetch)
10
+ */
11
+ export interface TextDeltaEvent {
12
+ kind: "text_delta";
13
+ text: string;
14
+ }
15
+ export interface ToolCallEvent {
16
+ kind: "tool_call";
17
+ tool: string;
18
+ input: unknown;
19
+ }
20
+ export interface ToolResultEvent {
21
+ kind: "tool_result";
22
+ output: string;
23
+ }
24
+ export interface ThinkingEvent {
25
+ kind: "thinking";
26
+ content: string;
27
+ }
28
+ export interface ApprovalNeededEvent {
29
+ kind: "approval_needed";
30
+ actionId: string;
31
+ tool: string;
32
+ description: string;
33
+ risk: string;
34
+ }
35
+ export interface ErrorEvent {
36
+ kind: "error";
37
+ message: string;
38
+ }
39
+ export interface DoneEvent {
40
+ kind: "done";
41
+ status: string;
42
+ }
43
+ export interface StatusChangeEvent {
44
+ kind: "status_change";
45
+ status: string;
46
+ }
47
+ export type AgentEvent = TextDeltaEvent | ToolCallEvent | ToolResultEvent | ThinkingEvent | ApprovalNeededEvent | ErrorEvent | DoneEvent | StatusChangeEvent;
48
+ export interface StartSessionOptions {
49
+ model?: string;
50
+ workDir?: string;
51
+ maxIterations?: number;
52
+ autoApprove?: boolean;
53
+ }
54
+ export interface StartSessionResponse {
55
+ sessionId: string;
56
+ status: string;
57
+ }
58
+ export interface ApprovalResponse {
59
+ approved: boolean;
60
+ message?: string;
61
+ }
62
+ export interface SessionInfo {
63
+ id: string;
64
+ status: string;
65
+ createdAt: string;
66
+ updatedAt: string;
67
+ iteration: number;
68
+ tokenUsage: {
69
+ input: number;
70
+ output: number;
71
+ };
72
+ }
73
+ export interface SessionStatus {
74
+ sessionId: string;
75
+ status: string;
76
+ iteration: number;
77
+ tokenUsage: {
78
+ input: number;
79
+ output: number;
80
+ };
81
+ }
82
+ export interface LlmChatOptions {
83
+ model?: string;
84
+ maxTokens?: number;
85
+ temperature?: number;
86
+ system?: string;
87
+ }
88
+ export interface LlmChatMessage {
89
+ role: "user" | "assistant" | "system";
90
+ content: string;
91
+ }
92
+ export interface LlmChatResponse {
93
+ content: string;
94
+ model: string;
95
+ usage: {
96
+ input: number;
97
+ output: number;
98
+ };
99
+ }
100
+ export interface StreamOptions {
101
+ /** AbortSignal for cancellation */
102
+ signal?: AbortSignal;
103
+ /** Max reconnection attempts (default: 5) */
104
+ maxReconnects?: number;
105
+ /** Base delay between reconnections in ms (default: 1000) */
106
+ reconnectDelay?: number;
107
+ }
108
+ export declare class CloudClientError extends Error {
109
+ readonly status: number;
110
+ readonly body?: string | undefined;
111
+ constructor(message: string, status: number, body?: string | undefined);
112
+ }
113
+ /**
114
+ * CloudClient — API client for YUAN CLI cloud mode.
115
+ *
116
+ * Connects to yua-backend via REST + SSE streaming.
117
+ * Auth via x-api-key header using a stored API key (yua_sk_xxx).
118
+ */
119
+ export declare class CloudClient {
120
+ private serverUrl;
121
+ private apiKey;
122
+ constructor(serverUrl: string, apiKey: string);
123
+ /**
124
+ * Start a new agent session.
125
+ *
126
+ * @param prompt - The user's prompt / task description
127
+ * @param options - Session options (model, workDir, etc.)
128
+ */
129
+ startSession(prompt: string, options?: StartSessionOptions): Promise<StartSessionResponse>;
130
+ /**
131
+ * Stream agent events via SSE.
132
+ *
133
+ * Connects to the SSE endpoint and invokes `onEvent` for each parsed event.
134
+ * Automatically reconnects using Last-Event-Id on transient failures.
135
+ *
136
+ * @param sessionId - The session to stream
137
+ * @param onEvent - Callback invoked for each agent event
138
+ * @param options - Stream options (signal, reconnection settings)
139
+ */
140
+ streamEvents(sessionId: string, onEvent: (event: AgentEvent) => void, options?: StreamOptions): Promise<void>;
141
+ /**
142
+ * Approve or deny a pending action.
143
+ *
144
+ * @param sessionId - The session ID
145
+ * @param actionId - The action to approve/deny
146
+ * @param response - Approval decision
147
+ */
148
+ approve(sessionId: string, actionId: string, response: ApprovalResponse): Promise<void>;
149
+ /**
150
+ * Stop a running session.
151
+ *
152
+ * @param sessionId - The session to stop
153
+ */
154
+ stop(sessionId: string): Promise<void>;
155
+ /**
156
+ * List all sessions for the authenticated user.
157
+ */
158
+ listSessions(): Promise<SessionInfo[]>;
159
+ /**
160
+ * Get the current status of a session.
161
+ *
162
+ * @param sessionId - The session ID
163
+ */
164
+ getStatus(sessionId: string): Promise<SessionStatus>;
165
+ /**
166
+ * Stateless LLM chat call (no agent loop).
167
+ *
168
+ * @param messages - Conversation messages
169
+ * @param options - LLM options (model, maxTokens, temperature, system prompt)
170
+ */
171
+ llmChat(messages: LlmChatMessage[], options?: LlmChatOptions): Promise<LlmChatResponse>;
172
+ /** Build auth headers. */
173
+ private authHeaders;
174
+ /** Send a GET request and parse the JSON response. */
175
+ private get;
176
+ /** Send a POST request with a JSON body and parse the JSON response. */
177
+ private post;
178
+ }
179
+ //# sourceMappingURL=cloud-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-client.d.ts","sourceRoot":"","sources":["../src/cloud-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,369 @@
1
+ /**
2
+ * YUAN CLI — Cloud Client
3
+ *
4
+ * API client for YUAN CLI cloud mode.
5
+ * Connects to yua-backend (:4000) via REST + SSE.
6
+ *
7
+ * - Auth via x-api-key header (yua_sk_xxx)
8
+ * - SSE streaming with automatic reconnection
9
+ * - No external dependencies (native fetch)
10
+ */
11
+ // ─── SSE Event-Type → Kind Mapping ───
12
+ const SSE_EVENT_MAP = {
13
+ "agent:text_delta": "text_delta",
14
+ "agent:tool_call": "tool_call",
15
+ "agent:tool_result": "tool_result",
16
+ "agent:thinking": "thinking",
17
+ "agent:approval_needed": "approval_needed",
18
+ "agent:error": "error",
19
+ "agent:done": "done",
20
+ "agent:status_change": "status_change",
21
+ };
22
+ // ─── Error ───
23
+ export class CloudClientError extends Error {
24
+ status;
25
+ body;
26
+ constructor(message, status, body) {
27
+ super(message);
28
+ this.status = status;
29
+ this.body = body;
30
+ this.name = "CloudClientError";
31
+ }
32
+ }
33
+ // ─── SSE Parser ───
34
+ /**
35
+ * Parses an SSE byte stream into structured events.
36
+ * Handles event:, data:, id: fields, multi-line data, and keep-alive comments.
37
+ */
38
+ class SSEParser {
39
+ buffer = "";
40
+ eventType = "";
41
+ dataLines = [];
42
+ lastEventId = "";
43
+ /** Returns the last received event ID (for reconnection via Last-Event-Id). */
44
+ getLastEventId() {
45
+ return this.lastEventId;
46
+ }
47
+ /**
48
+ * Feed raw text into the parser.
49
+ * Returns an array of parsed events (may be empty if data is incomplete).
50
+ */
51
+ feed(chunk) {
52
+ this.buffer += chunk;
53
+ const events = [];
54
+ // Process complete lines (SSE uses \n, \r\n, or \r as line endings)
55
+ const lines = this.buffer.split(/\r\n|\r|\n/);
56
+ // Last element is incomplete — keep it in the buffer
57
+ this.buffer = lines.pop() ?? "";
58
+ for (const line of lines) {
59
+ // Keep-alive comment
60
+ if (line.startsWith(":")) {
61
+ continue;
62
+ }
63
+ // Empty line = dispatch event
64
+ if (line === "") {
65
+ if (this.dataLines.length > 0) {
66
+ const data = this.dataLines.join("\n");
67
+ events.push({
68
+ event: this.eventType || "message",
69
+ data,
70
+ id: this.lastEventId,
71
+ });
72
+ }
73
+ // Reset for next event
74
+ this.eventType = "";
75
+ this.dataLines = [];
76
+ continue;
77
+ }
78
+ // Parse field
79
+ const colonIdx = line.indexOf(":");
80
+ let field;
81
+ let value;
82
+ if (colonIdx === -1) {
83
+ // Line with no colon — field name is the entire line, value is empty
84
+ field = line;
85
+ value = "";
86
+ }
87
+ else {
88
+ field = line.slice(0, colonIdx);
89
+ // Skip optional single leading space after colon
90
+ value = line[colonIdx + 1] === " "
91
+ ? line.slice(colonIdx + 2)
92
+ : line.slice(colonIdx + 1);
93
+ }
94
+ switch (field) {
95
+ case "event":
96
+ this.eventType = value;
97
+ break;
98
+ case "data":
99
+ this.dataLines.push(value);
100
+ break;
101
+ case "id":
102
+ // Per spec, ignore ids containing null
103
+ if (!value.includes("\0")) {
104
+ this.lastEventId = value;
105
+ }
106
+ break;
107
+ case "retry":
108
+ // Retry field — ignored (we handle reconnection externally)
109
+ break;
110
+ default:
111
+ // Unknown field — ignore per spec
112
+ break;
113
+ }
114
+ }
115
+ return events;
116
+ }
117
+ /** Reset parser state (for reconnection). */
118
+ reset() {
119
+ this.buffer = "";
120
+ this.eventType = "";
121
+ this.dataLines = [];
122
+ // lastEventId is intentionally preserved across resets for reconnection
123
+ }
124
+ }
125
+ // ─── Cloud Client ───
126
+ /**
127
+ * CloudClient — API client for YUAN CLI cloud mode.
128
+ *
129
+ * Connects to yua-backend via REST + SSE streaming.
130
+ * Auth via x-api-key header using a stored API key (yua_sk_xxx).
131
+ */
132
+ export class CloudClient {
133
+ serverUrl;
134
+ apiKey;
135
+ constructor(serverUrl, apiKey) {
136
+ this.serverUrl = serverUrl;
137
+ this.apiKey = apiKey;
138
+ // Strip trailing slash
139
+ if (this.serverUrl.endsWith("/")) {
140
+ this.serverUrl = this.serverUrl.slice(0, -1);
141
+ }
142
+ }
143
+ // ─── Public Methods ───
144
+ /**
145
+ * Start a new agent session.
146
+ *
147
+ * @param prompt - The user's prompt / task description
148
+ * @param options - Session options (model, workDir, etc.)
149
+ */
150
+ async startSession(prompt, options = {}) {
151
+ return this.post("/api/yuan-agent/run", {
152
+ prompt,
153
+ ...options,
154
+ });
155
+ }
156
+ /**
157
+ * Stream agent events via SSE.
158
+ *
159
+ * Connects to the SSE endpoint and invokes `onEvent` for each parsed event.
160
+ * Automatically reconnects using Last-Event-Id on transient failures.
161
+ *
162
+ * @param sessionId - The session to stream
163
+ * @param onEvent - Callback invoked for each agent event
164
+ * @param options - Stream options (signal, reconnection settings)
165
+ */
166
+ async streamEvents(sessionId, onEvent, options = {}) {
167
+ const maxReconnects = options.maxReconnects ?? 5;
168
+ const baseDelay = options.reconnectDelay ?? 1_000;
169
+ const parser = new SSEParser();
170
+ let reconnectCount = 0;
171
+ while (reconnectCount <= maxReconnects) {
172
+ // Check for cancellation before connecting
173
+ if (options.signal?.aborted) {
174
+ throw new DOMException("The operation was aborted.", "AbortError");
175
+ }
176
+ const headers = {
177
+ ...this.authHeaders(),
178
+ Accept: "text/event-stream",
179
+ "Cache-Control": "no-cache",
180
+ };
181
+ // Include Last-Event-Id for reconnection
182
+ const lastId = parser.getLastEventId();
183
+ if (lastId) {
184
+ headers["Last-Event-Id"] = lastId;
185
+ }
186
+ const url = `${this.serverUrl}/api/yuan-agent/stream?sessionId=${encodeURIComponent(sessionId)}`;
187
+ let response;
188
+ try {
189
+ response = await fetch(url, {
190
+ method: "GET",
191
+ headers,
192
+ signal: options.signal,
193
+ });
194
+ }
195
+ catch (err) {
196
+ // Network error — attempt reconnection
197
+ if (isAbortError(err))
198
+ throw err;
199
+ reconnectCount++;
200
+ if (reconnectCount > maxReconnects) {
201
+ throw new CloudClientError(`SSE connection failed after ${maxReconnects} retries: ${errorMessage(err)}`, 0);
202
+ }
203
+ parser.reset();
204
+ await sleep(baseDelay * Math.pow(2, reconnectCount - 1));
205
+ continue;
206
+ }
207
+ if (!response.ok) {
208
+ const body = await response.text().catch(() => "");
209
+ throw new CloudClientError(`SSE stream error: ${response.status} ${response.statusText}`, response.status, body);
210
+ }
211
+ if (!response.body) {
212
+ throw new CloudClientError("SSE response has no body", 0);
213
+ }
214
+ // Read the stream
215
+ const reader = response.body.getReader();
216
+ const decoder = new TextDecoder();
217
+ let done = false;
218
+ let streamEnded = false;
219
+ try {
220
+ while (!done) {
221
+ const result = await reader.read();
222
+ done = result.done;
223
+ if (result.value) {
224
+ const text = decoder.decode(result.value, { stream: !done });
225
+ const sseEvents = parser.feed(text);
226
+ for (const sseEvent of sseEvents) {
227
+ const kind = SSE_EVENT_MAP[sseEvent.event];
228
+ if (!kind)
229
+ continue; // Unknown event type — skip
230
+ try {
231
+ const payload = JSON.parse(sseEvent.data);
232
+ const agentEvent = { kind, ...payload };
233
+ onEvent(agentEvent);
234
+ // If we got a terminal event, mark stream as ended
235
+ if (kind === "done" || kind === "error") {
236
+ streamEnded = true;
237
+ }
238
+ }
239
+ catch {
240
+ // Malformed JSON — skip this event
241
+ }
242
+ }
243
+ }
244
+ }
245
+ }
246
+ catch (err) {
247
+ if (isAbortError(err))
248
+ throw err;
249
+ // Stream read error — attempt reconnection unless stream already ended
250
+ if (streamEnded)
251
+ return;
252
+ reconnectCount++;
253
+ if (reconnectCount > maxReconnects) {
254
+ throw new CloudClientError(`SSE stream read failed after ${maxReconnects} retries: ${errorMessage(err)}`, 0);
255
+ }
256
+ parser.reset();
257
+ await sleep(baseDelay * Math.pow(2, reconnectCount - 1));
258
+ continue;
259
+ }
260
+ // Stream completed normally
261
+ return;
262
+ }
263
+ }
264
+ /**
265
+ * Approve or deny a pending action.
266
+ *
267
+ * @param sessionId - The session ID
268
+ * @param actionId - The action to approve/deny
269
+ * @param response - Approval decision
270
+ */
271
+ async approve(sessionId, actionId, response) {
272
+ await this.post("/api/yuan-agent/approve", {
273
+ sessionId,
274
+ actionId,
275
+ ...response,
276
+ });
277
+ }
278
+ /**
279
+ * Stop a running session.
280
+ *
281
+ * @param sessionId - The session to stop
282
+ */
283
+ async stop(sessionId) {
284
+ await this.post("/api/yuan-agent/stop", { sessionId });
285
+ }
286
+ /**
287
+ * List all sessions for the authenticated user.
288
+ */
289
+ async listSessions() {
290
+ return this.get("/api/yuan-agent/sessions");
291
+ }
292
+ /**
293
+ * Get the current status of a session.
294
+ *
295
+ * @param sessionId - The session ID
296
+ */
297
+ async getStatus(sessionId) {
298
+ return this.get(`/api/yuan-agent/status?sessionId=${encodeURIComponent(sessionId)}`);
299
+ }
300
+ /**
301
+ * Stateless LLM chat call (no agent loop).
302
+ *
303
+ * @param messages - Conversation messages
304
+ * @param options - LLM options (model, maxTokens, temperature, system prompt)
305
+ */
306
+ async llmChat(messages, options = {}) {
307
+ return this.post("/api/yuan-agent/llm/chat", {
308
+ messages,
309
+ ...options,
310
+ });
311
+ }
312
+ // ─── Private Helpers ───
313
+ /** Build auth headers. */
314
+ authHeaders() {
315
+ return {
316
+ "x-api-key": this.apiKey,
317
+ };
318
+ }
319
+ /** Send a GET request and parse the JSON response. */
320
+ async get(path) {
321
+ const url = `${this.serverUrl}${path}`;
322
+ const response = await fetch(url, {
323
+ method: "GET",
324
+ headers: {
325
+ ...this.authHeaders(),
326
+ Accept: "application/json",
327
+ },
328
+ });
329
+ if (!response.ok) {
330
+ const body = await response.text().catch(() => "");
331
+ throw new CloudClientError(`GET ${path} failed: ${response.status} ${response.statusText}`, response.status, body);
332
+ }
333
+ return (await response.json());
334
+ }
335
+ /** Send a POST request with a JSON body and parse the JSON response. */
336
+ async post(path, body) {
337
+ const url = `${this.serverUrl}${path}`;
338
+ const response = await fetch(url, {
339
+ method: "POST",
340
+ headers: {
341
+ ...this.authHeaders(),
342
+ "Content-Type": "application/json",
343
+ Accept: "application/json",
344
+ },
345
+ body: JSON.stringify(body),
346
+ });
347
+ if (!response.ok) {
348
+ const text = await response.text().catch(() => "");
349
+ throw new CloudClientError(`POST ${path} failed: ${response.status} ${response.statusText}`, response.status, text);
350
+ }
351
+ // Some endpoints (stop, approve) may return 204 No Content
352
+ const contentType = response.headers.get("content-type") ?? "";
353
+ if (response.status === 204 || !contentType.includes("application/json")) {
354
+ return undefined;
355
+ }
356
+ return (await response.json());
357
+ }
358
+ }
359
+ // ─── Utilities ───
360
+ function sleep(ms) {
361
+ return new Promise((resolve) => setTimeout(resolve, ms));
362
+ }
363
+ function isAbortError(err) {
364
+ return err instanceof DOMException && err.name === "AbortError";
365
+ }
366
+ function errorMessage(err) {
367
+ return err instanceof Error ? err.message : String(err);
368
+ }
369
+ //# sourceMappingURL=cloud-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-client.js","sourceRoot":"","sources":["../src/cloud-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * YUAN CLI — Configuration Manager
3
+ *
4
+ * Manages BYOK API key storage and CLI settings.
5
+ * Config file: ~/.yuan/config.json
6
+ */
7
+ /** Supported LLM providers */
8
+ export type Provider = "openai" | "anthropic" | "google" | "yua" | "deepseek";
9
+ /** YUAN CLI configuration (stored in ~/.yuan/config.json) */
10
+ export interface YuanConfig {
11
+ provider: Provider;
12
+ apiKey: string;
13
+ model?: string;
14
+ baseUrl?: string;
15
+ theme: "dark" | "light";
16
+ mode: "local" | "cloud";
17
+ serverUrl: string;
18
+ }
19
+ /**
20
+ * ConfigManager — handles reading/writing ~/.yuan/config.json
21
+ */
22
+ export declare class ConfigManager {
23
+ private config;
24
+ constructor();
25
+ /** Load config from disk, falling back to defaults */
26
+ private load;
27
+ /** Save current config to disk */
28
+ private save;
29
+ /** Get current config */
30
+ get(): YuanConfig;
31
+ /** Check if API key is configured */
32
+ isConfigured(): boolean;
33
+ /** Get the effective model name (user override or provider default) */
34
+ getModel(): string;
35
+ /** Set API key for a provider */
36
+ setKey(provider: Provider, apiKey: string): void;
37
+ /** Set model override */
38
+ setModel(model: string): void;
39
+ /** Set base URL override (e.g. for Azure OpenAI) */
40
+ setBaseUrl(baseUrl: string | undefined): void;
41
+ /** Set theme */
42
+ setTheme(theme: "dark" | "light"): void;
43
+ /** Set execution mode (local or cloud) */
44
+ setMode(mode: "local" | "cloud"): void;
45
+ /** Set cloud server URL */
46
+ setServerUrl(url: string): void;
47
+ /** Check if running in cloud mode */
48
+ isCloudMode(): boolean;
49
+ /** Get the effective server URL */
50
+ getServerUrl(): string;
51
+ /** Display current config (masking API key) */
52
+ show(): string;
53
+ /**
54
+ * Interactive setup prompt using readline.
55
+ * Walks the user through provider selection and API key entry.
56
+ */
57
+ interactiveSetup(): Promise<void>;
58
+ }
59
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,8BAA8B;AAC9B,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAC;AAE9E,6DAA6D;AAC7D,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AA0BD;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAa;;IAM3B,sDAAsD;IACtD,OAAO,CAAC,IAAI;IAaZ,kCAAkC;IAClC,OAAO,CAAC,IAAI;IAOZ,yBAAyB;IACzB,GAAG,IAAI,UAAU;IAIjB,qCAAqC;IACrC,YAAY,IAAI,OAAO;IAOvB,uEAAuE;IACvE,QAAQ,IAAI,MAAM;IAIlB,iCAAiC;IACjC,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAMhD,yBAAyB;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7B,oDAAoD;IACpD,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAK7C,gBAAgB;IAChB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAKvC,0CAA0C;IAC1C,OAAO,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI;IAKtC,2BAA2B;IAC3B,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAK/B,qCAAqC;IACrC,WAAW,IAAI,OAAO;IAItB,mCAAmC;IACnC,YAAY,IAAI,MAAM;IAItB,+CAA+C;IAC/C,IAAI,IAAI,MAAM;IAmBd;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CAsFxC"}