@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
package/dist/auth.d.ts ADDED
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @module auth
3
+ * @description YUAN CLI authentication — OAuth Device Flow.
4
+ *
5
+ * Flow: yuan login → POST /device-code → open browser → poll /device-token → save token
6
+ */
7
+ /** User info stored in the auth file */
8
+ export interface AuthUser {
9
+ id: number;
10
+ email: string;
11
+ name: string;
12
+ }
13
+ /** Plan info stored in the auth file */
14
+ export interface AuthPlan {
15
+ name: string;
16
+ maxIterations: number;
17
+ maxParallel: number;
18
+ dailyRuns: number;
19
+ }
20
+ /** Persisted auth data (~/.yuan/auth.json) */
21
+ export interface AuthData {
22
+ accessToken: string;
23
+ refreshToken: string;
24
+ expiresAt: number;
25
+ user: AuthUser;
26
+ plan: AuthPlan;
27
+ apiKey: string;
28
+ platformUrl: string;
29
+ }
30
+ /** Verify token response */
31
+ interface VerifyResponse {
32
+ valid: boolean;
33
+ user?: AuthUser;
34
+ plan?: AuthPlan;
35
+ }
36
+ /**
37
+ * Login to YUA Platform using the OAuth Device Flow.
38
+ *
39
+ * 1. Request a device code from the platform.
40
+ * 2. Display the verification URL and user code.
41
+ * 3. Attempt to open the browser automatically.
42
+ * 4. Poll for authorization until the user completes the flow or timeout.
43
+ * 5. Save tokens to ~/.yuan/auth.json.
44
+ *
45
+ * @param platformUrl - Base URL of the YUA Platform (e.g. "https://platform.yuaone.com")
46
+ */
47
+ export declare function login(platformUrl: string): Promise<void>;
48
+ /**
49
+ * Logout from YUA Platform by removing the saved auth file.
50
+ */
51
+ export declare function logout(): Promise<void>;
52
+ /**
53
+ * Get the current authentication data with automatic token refresh.
54
+ *
55
+ * - Reads ~/.yuan/auth.json
56
+ * - If the access token is expired but the refresh token is still valid,
57
+ * attempts to refresh the access token automatically.
58
+ *
59
+ * @returns The auth data or null if not logged in / cannot refresh.
60
+ */
61
+ export declare function getAuth(): Promise<AuthData | null>;
62
+ /**
63
+ * Verify the current access token against the platform.
64
+ *
65
+ * @param platformUrl - Base URL of the YUA Platform. If not provided, uses the
66
+ * URL from the saved auth data.
67
+ * @returns The verify response or null if not authenticated.
68
+ */
69
+ export declare function verifyAuth(platformUrl?: string): Promise<VerifyResponse | null>;
70
+ export {};
71
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAiBH,wCAAwC;AACxC,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wCAAwC;AACxC,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,8CAA8C;AAC9C,MAAM,WAAW,QAAQ;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AA4BD,4BAA4B;AAC5B,UAAU,cAAc;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,QAAQ,CAAC;CACjB;AAuCD;;;;;;;;;;GAUG;AACH,wBAAsB,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA4G9D;AAED;;GAEG;AACH,wBAAsB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAc5C;AAED;;;;;;;;GAQG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAoCxD;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAmBrF"}
package/dist/auth.js ADDED
@@ -0,0 +1,240 @@
1
+ /**
2
+ * @module auth
3
+ * @description YUAN CLI authentication — OAuth Device Flow.
4
+ *
5
+ * Flow: yuan login → POST /device-code → open browser → poll /device-token → save token
6
+ */
7
+ import * as fs from "node:fs";
8
+ import * as path from "node:path";
9
+ import * as os from "node:os";
10
+ import { YSpinner } from "./y-spinner.js";
11
+ // ─── Constants ───
12
+ const YUAN_DIR = path.join(os.homedir(), ".yuan");
13
+ const AUTH_PATH = path.join(YUAN_DIR, "auth.json");
14
+ const CLIENT_ID = "yuan-cli";
15
+ const POLL_INTERVAL_MS = 5_000;
16
+ const TIMEOUT_MS = 15 * 60 * 1_000; // 15 minutes
17
+ // ─── File helpers ───
18
+ /** Ensure ~/.yuan directory exists with secure permissions. */
19
+ function ensureYuanDir() {
20
+ if (!fs.existsSync(YUAN_DIR)) {
21
+ fs.mkdirSync(YUAN_DIR, { recursive: true, mode: 0o700 });
22
+ }
23
+ }
24
+ /** Write auth data to disk with restricted permissions. */
25
+ function saveAuth(data) {
26
+ ensureYuanDir();
27
+ fs.writeFileSync(AUTH_PATH, JSON.stringify(data, null, 2), {
28
+ encoding: "utf-8",
29
+ mode: 0o600,
30
+ });
31
+ }
32
+ /** Read auth data from disk. Returns null if missing or corrupt. */
33
+ function readAuth() {
34
+ try {
35
+ if (!fs.existsSync(AUTH_PATH))
36
+ return null;
37
+ const raw = fs.readFileSync(AUTH_PATH, "utf-8");
38
+ return JSON.parse(raw);
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ // ─── Sleep utility ───
45
+ function sleep(ms) {
46
+ return new Promise((resolve) => setTimeout(resolve, ms));
47
+ }
48
+ // ─── Public API ───
49
+ /**
50
+ * Login to YUA Platform using the OAuth Device Flow.
51
+ *
52
+ * 1. Request a device code from the platform.
53
+ * 2. Display the verification URL and user code.
54
+ * 3. Attempt to open the browser automatically.
55
+ * 4. Poll for authorization until the user completes the flow or timeout.
56
+ * 5. Save tokens to ~/.yuan/auth.json.
57
+ *
58
+ * @param platformUrl - Base URL of the YUA Platform (e.g. "https://platform.yuaone.com")
59
+ */
60
+ export async function login(platformUrl) {
61
+ const spinner = new YSpinner();
62
+ // Step 1: Request device code
63
+ spinner.start("Requesting device code...");
64
+ let deviceCode;
65
+ try {
66
+ const res = await fetch(`${platformUrl}/api/yuan-auth/device-code`, {
67
+ method: "POST",
68
+ headers: { "Content-Type": "application/json" },
69
+ body: JSON.stringify({ clientId: CLIENT_ID }),
70
+ });
71
+ if (!res.ok) {
72
+ const text = await res.text();
73
+ spinner.fail(`Failed to request device code: ${res.status} ${text}`);
74
+ process.exit(1);
75
+ }
76
+ deviceCode = (await res.json());
77
+ }
78
+ catch (err) {
79
+ spinner.fail(`Cannot reach platform at ${platformUrl}: ${err instanceof Error ? err.message : String(err)}`);
80
+ process.exit(1);
81
+ return; // unreachable, helps TS narrowing
82
+ }
83
+ spinner.stop();
84
+ // Step 2: Display verification info
85
+ console.log();
86
+ console.log(` Visit ${deviceCode.verificationUri}`);
87
+ console.log(` and enter code: \x1b[1m${deviceCode.userCode}\x1b[0m`);
88
+ console.log();
89
+ // Step 3: Auto-open browser (best effort)
90
+ try {
91
+ const openModule = await import("open");
92
+ const openFn = openModule.default ?? openModule;
93
+ await openFn(deviceCode.verificationUri);
94
+ }
95
+ catch {
96
+ // Browser auto-open is optional — user can copy the URL manually
97
+ }
98
+ // Step 4: Poll for token
99
+ spinner.start("Waiting for authorization...");
100
+ const interval = Math.max(deviceCode.interval ?? 5, 5) * 1_000;
101
+ const deadline = Date.now() + TIMEOUT_MS;
102
+ while (Date.now() < deadline) {
103
+ await sleep(interval > 0 ? interval : POLL_INTERVAL_MS);
104
+ try {
105
+ const res = await fetch(`${platformUrl}/api/yuan-auth/device-token`, {
106
+ method: "POST",
107
+ headers: { "Content-Type": "application/json" },
108
+ body: JSON.stringify({
109
+ clientId: CLIENT_ID,
110
+ deviceCode: deviceCode.deviceCode,
111
+ }),
112
+ });
113
+ if (!res.ok) {
114
+ // Non-200 might be temporary — keep polling unless explicitly denied
115
+ continue;
116
+ }
117
+ const body = (await res.json());
118
+ if (body.status === "authorized") {
119
+ // Save auth data
120
+ const authData = {
121
+ accessToken: body.accessToken,
122
+ refreshToken: body.refreshToken,
123
+ expiresAt: Date.now() + (body.expiresIn ?? 3600) * 1_000,
124
+ user: body.user,
125
+ plan: body.plan,
126
+ apiKey: body.apiKey ?? "",
127
+ platformUrl,
128
+ };
129
+ saveAuth(authData);
130
+ spinner.success(`Logged in as ${authData.user.email} (${authData.plan.name})`);
131
+ return;
132
+ }
133
+ if (body.status === "denied") {
134
+ spinner.fail("Authorization denied.");
135
+ process.exit(1);
136
+ }
137
+ if (body.status === "expired") {
138
+ spinner.fail("Device code expired. Please try again.");
139
+ process.exit(1);
140
+ }
141
+ // status === "pending" — continue polling
142
+ spinner.update("Waiting for authorization...");
143
+ }
144
+ catch {
145
+ // Network error — keep polling
146
+ }
147
+ }
148
+ spinner.fail("Authorization timed out (15 minutes). Please try again.");
149
+ process.exit(1);
150
+ }
151
+ /**
152
+ * Logout from YUA Platform by removing the saved auth file.
153
+ */
154
+ export async function logout() {
155
+ try {
156
+ if (fs.existsSync(AUTH_PATH)) {
157
+ fs.unlinkSync(AUTH_PATH);
158
+ console.log("Logged out.");
159
+ }
160
+ else {
161
+ console.log("Not logged in.");
162
+ }
163
+ }
164
+ catch (err) {
165
+ console.error(`Failed to remove auth file: ${err instanceof Error ? err.message : String(err)}`);
166
+ process.exit(1);
167
+ }
168
+ }
169
+ /**
170
+ * Get the current authentication data with automatic token refresh.
171
+ *
172
+ * - Reads ~/.yuan/auth.json
173
+ * - If the access token is expired but the refresh token is still valid,
174
+ * attempts to refresh the access token automatically.
175
+ *
176
+ * @returns The auth data or null if not logged in / cannot refresh.
177
+ */
178
+ export async function getAuth() {
179
+ const auth = readAuth();
180
+ if (!auth)
181
+ return null;
182
+ // Token still valid — return as-is
183
+ if (Date.now() < auth.expiresAt) {
184
+ return auth;
185
+ }
186
+ // Token expired — attempt refresh
187
+ if (!auth.refreshToken)
188
+ return null;
189
+ try {
190
+ const res = await fetch(`${auth.platformUrl}/api/yuan-auth/refresh`, {
191
+ method: "POST",
192
+ headers: {
193
+ "Content-Type": "application/json",
194
+ Authorization: `Bearer ${auth.refreshToken}`,
195
+ },
196
+ body: JSON.stringify({ refreshToken: auth.refreshToken }),
197
+ });
198
+ if (!res.ok) {
199
+ // Refresh failed — user needs to re-login
200
+ return null;
201
+ }
202
+ const body = (await res.json());
203
+ auth.accessToken = body.accessToken;
204
+ auth.expiresAt = Date.now() + (body.expiresIn ?? 3600) * 1_000;
205
+ saveAuth(auth);
206
+ return auth;
207
+ }
208
+ catch {
209
+ // Network error during refresh — return null
210
+ return null;
211
+ }
212
+ }
213
+ /**
214
+ * Verify the current access token against the platform.
215
+ *
216
+ * @param platformUrl - Base URL of the YUA Platform. If not provided, uses the
217
+ * URL from the saved auth data.
218
+ * @returns The verify response or null if not authenticated.
219
+ */
220
+ export async function verifyAuth(platformUrl) {
221
+ const auth = await getAuth();
222
+ if (!auth)
223
+ return null;
224
+ const baseUrl = platformUrl ?? auth.platformUrl;
225
+ try {
226
+ const res = await fetch(`${baseUrl}/api/yuan-auth/verify`, {
227
+ method: "GET",
228
+ headers: {
229
+ Authorization: `Bearer ${auth.accessToken}`,
230
+ },
231
+ });
232
+ if (!res.ok)
233
+ return null;
234
+ return (await res.json());
235
+ }
236
+ catch {
237
+ return null;
238
+ }
239
+ }
240
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * YUAN CLI — Main Entry Point
4
+ *
5
+ * Usage:
6
+ * yuan → Interactive agent mode (default)
7
+ * yuan code <prompt> → One-shot coding task
8
+ * yuan config → BYOK key setup (interactive)
9
+ * yuan config set-key → Set API key
10
+ * yuan config show → Show current settings
11
+ * yuan resume → Resume last session
12
+ * yuan --version → Version
13
+ * yuan --help → Help
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;GAYG"}
package/dist/cli.js ADDED
@@ -0,0 +1,212 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * YUAN CLI — Main Entry Point
4
+ *
5
+ * Usage:
6
+ * yuan → Interactive agent mode (default)
7
+ * yuan code <prompt> → One-shot coding task
8
+ * yuan config → BYOK key setup (interactive)
9
+ * yuan config set-key → Set API key
10
+ * yuan config show → Show current settings
11
+ * yuan resume → Resume last session
12
+ * yuan --version → Version
13
+ * yuan --help → Help
14
+ */
15
+ import { Command } from "commander";
16
+ import { ConfigManager } from "./config.js";
17
+ import { TerminalRenderer } from "./renderer.js";
18
+ import { InteractiveSession } from "./interactive.js";
19
+ import { SessionManager } from "./session.js";
20
+ import { runOneshot } from "./oneshot.js";
21
+ import { login, logout, getAuth } from "./auth.js";
22
+ const renderer = new TerminalRenderer();
23
+ const program = new Command();
24
+ program
25
+ .name("yuan")
26
+ .description("YUAN — Autonomous Coding Agent")
27
+ .version("0.1.0");
28
+ // ─── Default: Interactive mode ───
29
+ program
30
+ .action(async () => {
31
+ const configManager = new ConfigManager();
32
+ const sessionManager = new SessionManager();
33
+ if (!configManager.isConfigured()) {
34
+ renderer.banner();
35
+ renderer.warn("No API key configured. Starting setup...");
36
+ await configManager.interactiveSetup();
37
+ console.log();
38
+ }
39
+ const session = new InteractiveSession(renderer, sessionManager, configManager);
40
+ await session.start();
41
+ });
42
+ // ─── yuan code <prompt> / yuan run <prompt> ───
43
+ const oneshotAction = async (prompt, options) => {
44
+ const exitCode = await runOneshot(prompt, options);
45
+ process.exit(exitCode);
46
+ };
47
+ program
48
+ .command("code")
49
+ .description("Run a one-shot coding task")
50
+ .argument("<prompt>", "The coding task to execute")
51
+ .option("-m, --model <model>", "Override the default model")
52
+ .action(oneshotAction);
53
+ program
54
+ .command("run")
55
+ .description("Run a one-shot coding task (alias for 'code')")
56
+ .argument("<prompt>", "The coding task to execute")
57
+ .option("-m, --model <model>", "Override the default model")
58
+ .action(oneshotAction);
59
+ // ─── yuan config ───
60
+ const configCmd = program
61
+ .command("config")
62
+ .description("Manage YUAN configuration");
63
+ configCmd
64
+ .action(async () => {
65
+ const configManager = new ConfigManager();
66
+ await configManager.interactiveSetup();
67
+ });
68
+ configCmd
69
+ .command("set-key")
70
+ .description("Set API key for a provider")
71
+ .argument("<provider>", "Provider: openai, anthropic, or google")
72
+ .argument("<key>", "API key")
73
+ .action((provider, key) => {
74
+ const validProviders = ["openai", "anthropic", "google", "yua", "deepseek"];
75
+ if (!validProviders.includes(provider)) {
76
+ renderer.error(`Invalid provider: ${provider}. Use: openai, anthropic, google, yua, or deepseek`);
77
+ process.exit(1);
78
+ }
79
+ const configManager = new ConfigManager();
80
+ configManager.setKey(provider, key);
81
+ renderer.success(`API key saved for ${provider}`);
82
+ });
83
+ configCmd
84
+ .command("show")
85
+ .description("Show current configuration")
86
+ .action(() => {
87
+ const configManager = new ConfigManager();
88
+ console.log();
89
+ console.log(configManager.show());
90
+ console.log();
91
+ });
92
+ configCmd
93
+ .command("set-mode")
94
+ .description("Set execution mode: local or cloud")
95
+ .argument("<mode>", "Mode: local or cloud")
96
+ .action((mode) => {
97
+ if (mode !== "local" && mode !== "cloud") {
98
+ renderer.error(`Invalid mode: ${mode}. Use: local or cloud`);
99
+ process.exit(1);
100
+ }
101
+ const configManager = new ConfigManager();
102
+ configManager.setMode(mode);
103
+ renderer.success(`Mode set to ${mode}`);
104
+ });
105
+ configCmd
106
+ .command("set-server")
107
+ .description("Set cloud server URL")
108
+ .argument("<url>", "Server URL (e.g. https://api.yuaone.com)")
109
+ .action((url) => {
110
+ const configManager = new ConfigManager();
111
+ configManager.setServerUrl(url);
112
+ renderer.success(`Server URL set to ${url}`);
113
+ });
114
+ // ─── yuan resume ───
115
+ program
116
+ .command("resume")
117
+ .description("Resume the last agent session")
118
+ .option("--id <sessionId>", "Resume a specific session by ID")
119
+ .option("--list", "List recent sessions")
120
+ .action(async (options) => {
121
+ const configManager = new ConfigManager();
122
+ const sessionManager = new SessionManager();
123
+ // List mode
124
+ if (options.list) {
125
+ const sessions = sessionManager.listRecent(10);
126
+ if (sessions.length === 0) {
127
+ renderer.info("No saved sessions found.");
128
+ process.exit(0);
129
+ }
130
+ console.log();
131
+ renderer.info("Recent Sessions:");
132
+ console.log(" " + "-".repeat(72));
133
+ for (const s of sessions) {
134
+ const statusIcon = {
135
+ running: "\u25B6",
136
+ paused: "\u23F8",
137
+ completed: "\u2713",
138
+ crashed: "\u2717",
139
+ }[s.status] ?? "?";
140
+ const date = new Date(s.updatedAt).toLocaleString();
141
+ const dir = s.workDir.length > 30
142
+ ? "..." + s.workDir.slice(-27)
143
+ : s.workDir;
144
+ console.log(` ${statusIcon} ${s.id.slice(0, 8)} ${s.status.padEnd(10)} ${date} ${dir} (${s.messages.length} msgs, iter ${s.iteration})`);
145
+ }
146
+ console.log();
147
+ renderer.info("Use `yuan resume --id <sessionId>` to resume a specific session.");
148
+ process.exit(0);
149
+ }
150
+ // Resume mode
151
+ const session = options.id
152
+ ? sessionManager.load(options.id)
153
+ : sessionManager.loadLast();
154
+ if (!session) {
155
+ renderer.error("No session to resume. Start a new session with `yuan`.");
156
+ renderer.info("Use `yuan resume --list` to see available sessions.");
157
+ process.exit(1);
158
+ }
159
+ const statusLabel = session.status === "crashed"
160
+ ? " (recovering from crash)"
161
+ : session.status === "paused"
162
+ ? " (paused)"
163
+ : "";
164
+ renderer.info(`Resuming session ${session.id.slice(0, 8)}...${statusLabel}`);
165
+ renderer.info(`Status: ${session.status} | Messages: ${session.messages.length} | Iterations: ${session.iteration}`);
166
+ renderer.info(`Tokens used: ${session.tokenUsage.input + session.tokenUsage.output} (in: ${session.tokenUsage.input}, out: ${session.tokenUsage.output})`);
167
+ // Mark session as running
168
+ await sessionManager.updateStatus(session, "running");
169
+ const interactive = new InteractiveSession(renderer, sessionManager, configManager, session);
170
+ await interactive.start();
171
+ });
172
+ // ─── yuan design ───
173
+ program
174
+ .command("design")
175
+ .description("Enter Design Mode — AI-powered real-time design collaboration")
176
+ .option("-p, --port <port>", "Dev server port", parseInt)
177
+ .option("--auto-vision", "Auto-capture screenshot after every change")
178
+ .option("--viewport <preset>", "Viewport preset: mobile, tablet, desktop")
179
+ .option("--dev-command <cmd>", "Custom dev server command")
180
+ .action(async (options) => {
181
+ const { runDesignMode } = await import("./design.js");
182
+ await runDesignMode(options);
183
+ });
184
+ // ─── yuan login ───
185
+ program
186
+ .command("login")
187
+ .description("Login to YUA Platform")
188
+ .option("--url <url>", "Platform URL", "https://platform.yuaone.com")
189
+ .action(async (opts) => {
190
+ await login(opts.url);
191
+ });
192
+ // ─── yuan logout ───
193
+ program
194
+ .command("logout")
195
+ .description("Logout from YUA Platform")
196
+ .action(async () => {
197
+ await logout();
198
+ });
199
+ // ─── yuan whoami ───
200
+ program
201
+ .command("whoami")
202
+ .description("Show current user info")
203
+ .action(async () => {
204
+ const auth = await getAuth();
205
+ if (!auth) {
206
+ console.log("Not logged in. Run: yuan login");
207
+ return;
208
+ }
209
+ console.log(`${auth.user.email} (${auth.plan.name})`);
210
+ });
211
+ program.parse();
212
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}