@opendatalabs/connect 0.9.4 → 0.10.0-canary.e8aeb13

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.
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Credential management for Vana CLI authentication.
3
+ *
4
+ * Stores and retrieves auth credentials from ~/.vana/auth.json.
5
+ * Supports the device code flow for browser-based login and
6
+ * env var overrides for CI/automation.
7
+ */
8
+ export interface VanaCredentials {
9
+ account: {
10
+ address: string;
11
+ session_token: string;
12
+ expires_at: string;
13
+ };
14
+ personal_server: {
15
+ url: string;
16
+ access_token: string;
17
+ expires_at: string;
18
+ } | null;
19
+ }
20
+ /**
21
+ * Load credentials from disk or env vars.
22
+ *
23
+ * Priority:
24
+ * 1. Env vars (VANA_SESSION_TOKEN, VANA_PS_TOKEN, VANA_PS_URL)
25
+ * 2. File (~/.vana/auth.json)
26
+ *
27
+ * Returns null if no credentials are available or if they are expired.
28
+ */
29
+ export declare function loadCredentials(): VanaCredentials | null;
30
+ /**
31
+ * Save credentials to ~/.vana/auth.json with 0600 permissions.
32
+ */
33
+ export declare function saveCredentials(creds: VanaCredentials): Promise<void>;
34
+ /**
35
+ * Delete ~/.vana/auth.json.
36
+ */
37
+ export declare function clearCredentials(): Promise<void>;
38
+ /**
39
+ * Check if the account session token has expired.
40
+ */
41
+ export declare function isExpired(creds: VanaCredentials): boolean;
42
+ /**
43
+ * Format an address for display: 0x2Ab3...fa1
44
+ */
45
+ export declare function formatAddress(address: string): string;
46
+ /**
47
+ * Return human-readable time until expiry: "29 days", "3 hours", etc.
48
+ */
49
+ export declare function formatExpiresIn(expiresAt: string): string;
50
+ export interface DeviceCodeResponse {
51
+ device_code: string;
52
+ user_code: string;
53
+ verification_uri: string;
54
+ expires_in: number;
55
+ interval: number;
56
+ }
57
+ export interface DeviceCodePollAuthorized {
58
+ status: "authorized";
59
+ session_token: string;
60
+ personal_server_url?: string;
61
+ ps_access_token?: string;
62
+ address: string;
63
+ expires_in?: number;
64
+ }
65
+ export interface DeviceCodePollPending {
66
+ status: "pending";
67
+ }
68
+ export interface DeviceCodePollExpired {
69
+ status: "expired";
70
+ }
71
+ export type DeviceCodePollResponse = DeviceCodePollAuthorized | DeviceCodePollPending | DeviceCodePollExpired;
72
+ /**
73
+ * Request a device code from the auth server.
74
+ */
75
+ export declare function requestDeviceCode(): Promise<DeviceCodeResponse>;
76
+ /**
77
+ * Poll for device code authorization.
78
+ */
79
+ export declare function pollDeviceCode(deviceCode: string): Promise<DeviceCodePollResponse>;
80
+ /**
81
+ * Open a URL in the user's default browser.
82
+ * Best-effort — failures are silently ignored.
83
+ */
84
+ export declare function openBrowser(url: string): void;
85
+ /**
86
+ * Run the full device code login flow.
87
+ *
88
+ * Returns credentials on success, or null if the code expired.
89
+ * Calls the provided callbacks for UI updates.
90
+ */
91
+ export declare function runDeviceCodeFlow(callbacks: {
92
+ onCode: (code: string, verificationUri: string) => void;
93
+ onWaiting: () => void;
94
+ onAuthorized: (creds: VanaCredentials) => void;
95
+ onExpired: () => void;
96
+ onError: (error: Error) => void;
97
+ }): Promise<VanaCredentials | null>;
98
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/cli/auth.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE;QACP,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,eAAe,EAAE;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;CACV;AAQD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,IAAI,eAAe,GAAG,IAAI,CAyCxD;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ3E;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAUtD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAOzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGrD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAYzD;AAID,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,YAAY,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,MAAM,sBAAsB,GAC9B,wBAAwB,GACxB,qBAAqB,GACrB,qBAAqB,CAAC;AAS1B;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAerE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,sBAAsB,CAAC,CAejC;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAc7C;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE;IACjD,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC/C,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAkElC"}
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Credential management for Vana CLI authentication.
3
+ *
4
+ * Stores and retrieves auth credentials from ~/.vana/auth.json.
5
+ * Supports the device code flow for browser-based login and
6
+ * env var overrides for CI/automation.
7
+ */
8
+ import { execSync } from "node:child_process";
9
+ import fs from "node:fs";
10
+ import fsp from "node:fs/promises";
11
+ import path from "node:path";
12
+ import os from "node:os";
13
+ const AUTH_FILE = "auth.json";
14
+ function getAuthFilePath() {
15
+ return path.join(os.homedir(), ".vana", AUTH_FILE);
16
+ }
17
+ /**
18
+ * Load credentials from disk or env vars.
19
+ *
20
+ * Priority:
21
+ * 1. Env vars (VANA_SESSION_TOKEN, VANA_PS_TOKEN, VANA_PS_URL)
22
+ * 2. File (~/.vana/auth.json)
23
+ *
24
+ * Returns null if no credentials are available or if they are expired.
25
+ */
26
+ export function loadCredentials() {
27
+ // Check env var overrides first
28
+ const envSessionToken = process.env.VANA_SESSION_TOKEN;
29
+ const envPsToken = process.env.VANA_PS_TOKEN;
30
+ const envPsUrl = process.env.VANA_PS_URL ?? process.env.VANA_PERSONAL_SERVER_URL;
31
+ if (envSessionToken) {
32
+ // Build credentials from env vars — no expiry tracking for env-based tokens
33
+ const farFuture = new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString();
34
+ return {
35
+ account: {
36
+ address: "env",
37
+ session_token: envSessionToken,
38
+ expires_at: farFuture,
39
+ },
40
+ personal_server: envPsToken && envPsUrl
41
+ ? {
42
+ url: envPsUrl,
43
+ access_token: envPsToken,
44
+ expires_at: farFuture,
45
+ }
46
+ : null,
47
+ };
48
+ }
49
+ // Read from file
50
+ const filePath = getAuthFilePath();
51
+ try {
52
+ const raw = fs.readFileSync(filePath, "utf8");
53
+ const creds = JSON.parse(raw);
54
+ if (isExpired(creds)) {
55
+ return null;
56
+ }
57
+ return creds;
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ /**
64
+ * Save credentials to ~/.vana/auth.json with 0600 permissions.
65
+ */
66
+ export async function saveCredentials(creds) {
67
+ const filePath = getAuthFilePath();
68
+ const dir = path.dirname(filePath);
69
+ await fsp.mkdir(dir, { recursive: true });
70
+ await fsp.writeFile(filePath, JSON.stringify(creds, null, 2) + "\n", {
71
+ mode: 0o600,
72
+ });
73
+ }
74
+ /**
75
+ * Delete ~/.vana/auth.json.
76
+ */
77
+ export async function clearCredentials() {
78
+ const filePath = getAuthFilePath();
79
+ try {
80
+ await fsp.unlink(filePath);
81
+ }
82
+ catch (err) {
83
+ // Ignore if file doesn't exist
84
+ if (err.code !== "ENOENT") {
85
+ throw err;
86
+ }
87
+ }
88
+ }
89
+ /**
90
+ * Check if the account session token has expired.
91
+ */
92
+ export function isExpired(creds) {
93
+ try {
94
+ const expiresAt = new Date(creds.account.expires_at);
95
+ return expiresAt.getTime() <= Date.now();
96
+ }
97
+ catch {
98
+ return true;
99
+ }
100
+ }
101
+ /**
102
+ * Format an address for display: 0x2Ab3...fa1
103
+ */
104
+ export function formatAddress(address) {
105
+ if (address.length <= 10)
106
+ return address;
107
+ return `${address.slice(0, 6)}...${address.slice(-3)}`;
108
+ }
109
+ /**
110
+ * Return human-readable time until expiry: "29 days", "3 hours", etc.
111
+ */
112
+ export function formatExpiresIn(expiresAt) {
113
+ const ms = new Date(expiresAt).getTime() - Date.now();
114
+ if (ms <= 0)
115
+ return "expired";
116
+ const days = Math.floor(ms / (24 * 60 * 60 * 1000));
117
+ if (days > 0)
118
+ return `${days} day${days === 1 ? "" : "s"}`;
119
+ const hours = Math.floor(ms / (60 * 60 * 1000));
120
+ if (hours > 0)
121
+ return `${hours} hour${hours === 1 ? "" : "s"}`;
122
+ const minutes = Math.floor(ms / (60 * 1000));
123
+ return `${minutes} minute${minutes === 1 ? "" : "s"}`;
124
+ }
125
+ function getAccountUrl() {
126
+ return (process.env.VANA_ACCOUNT_URL?.replace(/\/+$/, "") ??
127
+ "https://account.vana.org");
128
+ }
129
+ /**
130
+ * Request a device code from the auth server.
131
+ */
132
+ export async function requestDeviceCode() {
133
+ const url = `${getAccountUrl()}/api/auth/device`;
134
+ const response = await fetch(url, {
135
+ method: "POST",
136
+ headers: { "Content-Type": "application/json" },
137
+ });
138
+ if (!response.ok) {
139
+ const text = await response.text().catch(() => "");
140
+ throw new Error(`Failed to start device code flow: HTTP ${response.status}${text ? ` — ${text}` : ""}`);
141
+ }
142
+ return (await response.json());
143
+ }
144
+ /**
145
+ * Poll for device code authorization.
146
+ */
147
+ export async function pollDeviceCode(deviceCode) {
148
+ const url = `${getAccountUrl()}/api/auth/device/poll?device_code=${encodeURIComponent(deviceCode)}`;
149
+ const response = await fetch(url, {
150
+ method: "GET",
151
+ signal: AbortSignal.timeout(10_000),
152
+ });
153
+ if (!response.ok) {
154
+ const text = await response.text().catch(() => "");
155
+ throw new Error(`Poll failed: HTTP ${response.status}${text ? ` — ${text}` : ""}`);
156
+ }
157
+ return (await response.json());
158
+ }
159
+ /**
160
+ * Open a URL in the user's default browser.
161
+ * Best-effort — failures are silently ignored.
162
+ */
163
+ export function openBrowser(url) {
164
+ const platform = process.platform;
165
+ try {
166
+ if (platform === "darwin") {
167
+ execSync(`open ${JSON.stringify(url)}`, { stdio: "ignore" });
168
+ }
169
+ else if (platform === "win32") {
170
+ execSync(`start "" ${JSON.stringify(url)}`, { stdio: "ignore" });
171
+ }
172
+ else {
173
+ execSync(`xdg-open ${JSON.stringify(url)}`, { stdio: "ignore" });
174
+ }
175
+ }
176
+ catch {
177
+ // Best-effort — user can open manually
178
+ }
179
+ }
180
+ /**
181
+ * Run the full device code login flow.
182
+ *
183
+ * Returns credentials on success, or null if the code expired.
184
+ * Calls the provided callbacks for UI updates.
185
+ */
186
+ export async function runDeviceCodeFlow(callbacks) {
187
+ try {
188
+ const deviceCode = await requestDeviceCode();
189
+ callbacks.onCode(deviceCode.user_code, deviceCode.verification_uri);
190
+ // Try to open browser
191
+ openBrowser(deviceCode.verification_uri);
192
+ callbacks.onWaiting();
193
+ const interval = (deviceCode.interval ?? 5) * 1000;
194
+ const deadline = Date.now() + deviceCode.expires_in * 1000;
195
+ while (Date.now() < deadline) {
196
+ await new Promise((resolve) => setTimeout(resolve, interval));
197
+ try {
198
+ const result = await pollDeviceCode(deviceCode.device_code);
199
+ if (result.status === "authorized") {
200
+ const expiresIn = result.expires_in ?? 30 * 24 * 60 * 60; // default 30 days
201
+ const expiresAt = new Date(Date.now() + expiresIn * 1000).toISOString();
202
+ const creds = {
203
+ account: {
204
+ address: result.address,
205
+ session_token: result.session_token,
206
+ expires_at: expiresAt,
207
+ },
208
+ personal_server: result.personal_server_url && result.ps_access_token
209
+ ? {
210
+ url: result.personal_server_url,
211
+ access_token: result.ps_access_token,
212
+ expires_at: expiresAt,
213
+ }
214
+ : null,
215
+ };
216
+ callbacks.onAuthorized(creds);
217
+ return creds;
218
+ }
219
+ if (result.status === "expired") {
220
+ callbacks.onExpired();
221
+ return null;
222
+ }
223
+ // status === "pending" — continue polling
224
+ }
225
+ catch {
226
+ // Transient poll error — retry on next interval
227
+ }
228
+ }
229
+ // Timed out
230
+ callbacks.onExpired();
231
+ return null;
232
+ }
233
+ catch (error) {
234
+ callbacks.onError(error instanceof Error ? error : new Error(String(error)));
235
+ return null;
236
+ }
237
+ }
238
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/cli/auth.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -34,6 +34,7 @@ import { findDataConnectorsDir, ManagedPlaywrightRuntime, } from "../runtime/ind
34
34
  import { listAvailableSkills, installSkill, readInstalledSkills, } from "../skills/index.js";
35
35
  import { queryStatus, querySources, queryDataList, queryDataShow, queryDoctor, } from "./queries.js";
36
36
  import { checkForUpdate, readUpdateCheck, isNewerVersion, } from "./update-check.js";
37
+ import { loadCredentials, saveCredentials, clearCredentials, isExpired, formatAddress, formatExpiresIn, runDeviceCodeFlow, } from "./auth.js";
37
38
  function cleanDescription(desc) {
38
39
  return desc
39
40
  .replace(/ using Playwright browser automation\.?/i, ".")
@@ -73,6 +74,7 @@ export async function runCli(argv = process.argv) {
73
74
  .showSuggestionAfterError(true)
74
75
  .addHelpText("after", `
75
76
  Quick start:
77
+ vana login Log in to your Vana account
76
78
  vana connect Connect a source and collect data
77
79
  vana sources Browse available sources
78
80
  vana status Check system health
@@ -330,6 +332,18 @@ Examples:
330
332
  .action(async (scope) => {
331
333
  process.exitCode = await runServerData(scope, parsedOptions);
332
334
  });
335
+ program
336
+ .command("login")
337
+ .description("Log in to your Vana account")
338
+ .action(async () => {
339
+ process.exitCode = await runLogin(parsedOptions);
340
+ });
341
+ program
342
+ .command("logout")
343
+ .description("Log out and remove saved credentials")
344
+ .action(async () => {
345
+ process.exitCode = await runLogout(parsedOptions);
346
+ });
333
347
  program
334
348
  .command("mcp")
335
349
  .description("Start MCP server for agent integration")
@@ -425,7 +439,10 @@ Examples:
425
439
  // The concurrent check may have populated the cache during this run.
426
440
  if (shouldNotify) {
427
441
  try {
428
- await updateCheckPromise;
442
+ await Promise.race([
443
+ updateCheckPromise,
444
+ new Promise((resolve) => setTimeout(resolve, 2000)),
445
+ ]);
429
446
  const cache = await readUpdateCheck();
430
447
  if (cache && isNewerVersion(cliVersion, cache.latestVersion)) {
431
448
  const { upgrade } = getLifecycleCommands(installMethod, getCliChannel(cliVersion));
@@ -1148,10 +1165,18 @@ async function runStatus(options) {
1148
1165
  }
1149
1166
  }
1150
1167
  if (options.json) {
1168
+ const jsonAuthCreds = loadCredentials();
1151
1169
  const compactJson = {
1152
1170
  runtime: status.runtime,
1153
1171
  personalServer: status.personalServer,
1154
1172
  personalServerUrl: status.personalServerUrl,
1173
+ auth: jsonAuthCreds
1174
+ ? {
1175
+ authenticated: !isExpired(jsonAuthCreds),
1176
+ address: jsonAuthCreds.account.address,
1177
+ expires_at: jsonAuthCreds.account.expires_at,
1178
+ }
1179
+ : { authenticated: false },
1155
1180
  sources: {
1156
1181
  connected: status.summary?.connectedCount ?? 0,
1157
1182
  needsAttention: status.summary?.needsAttentionCount ?? 0,
@@ -1174,6 +1199,16 @@ async function runStatus(options) {
1174
1199
  else {
1175
1200
  emit.keyValue("Personal Server", "not connected", "warning");
1176
1201
  }
1202
+ // Auth state
1203
+ const authCreds = loadCredentials();
1204
+ if (authCreds && !isExpired(authCreds)) {
1205
+ emit.keyValue("Account", formatAddress(authCreds.account.address), "success");
1206
+ emit.keyValue("Auth", `Authenticated (expires in ${formatExpiresIn(authCreds.account.expires_at)})`, "success");
1207
+ }
1208
+ else {
1209
+ emit.keyValue("Account", "Not logged in", "muted");
1210
+ emit.keyValue("Auth", "Run `vana login` to authenticate", "muted");
1211
+ }
1177
1212
  const connectedCount = status.summary?.connectedCount ?? 0;
1178
1213
  const attentionCount = status.summary?.needsAttentionCount ?? 0;
1179
1214
  const sourceParts = [
@@ -1230,6 +1265,47 @@ async function runStatus(options) {
1230
1265
  return 0;
1231
1266
  }
1232
1267
  }
1268
+ // Show attention-needing sources that weren't already displayed above
1269
+ const displayedSourceIds = new Set(connectedSources.map(([id]) => id));
1270
+ const hiddenAttentionSources = status.sources.filter((s) => rankSourceStatus(s) <= 4 && !displayedSourceIds.has(s.source));
1271
+ if (hiddenAttentionSources.length > 0) {
1272
+ if (connectedSources.length === 0) {
1273
+ emit.blank();
1274
+ }
1275
+ for (const source of hiddenAttentionSources) {
1276
+ const displayName = displaySource(source.source, sourceLabels);
1277
+ const presentation = getSourceStatusPresentation(source);
1278
+ const collectedAgo = source.lastCollectedAt
1279
+ ? `collected ${formatRelativeTime(source.lastCollectedAt)}`
1280
+ : "";
1281
+ emit.keyValue(` ${displayName}`, `${presentation.label}${collectedAgo ? ` ${collectedAgo}` : ""}`, presentation.tone);
1282
+ // Show actionable detail line
1283
+ if (source.lastRunOutcome === CliOutcomeStatus.INGEST_FAILED &&
1284
+ source.ingestScopes) {
1285
+ const failedScopes = source.ingestScopes.filter((s) => s.status === "failed");
1286
+ for (const scope of failedScopes) {
1287
+ const errMsg = scope.error ?? "sync failed";
1288
+ emit.detail(` \u21b3 ${source.source}.${scope.scope}: ${errMsg}. Run \`vana connect ${source.source}\``);
1289
+ }
1290
+ if (failedScopes.length === 0) {
1291
+ emit.detail(` \u21b3 Sync failed. Run \`vana connect ${source.source}\``);
1292
+ }
1293
+ }
1294
+ else if (source.lastRunOutcome === CliOutcomeStatus.CONNECTOR_UNAVAILABLE) {
1295
+ emit.detail(` \u21b3 No connector available. Run \`vana sources\``);
1296
+ }
1297
+ else if (source.lastRunOutcome === CliOutcomeStatus.RUNTIME_ERROR) {
1298
+ const reason = source.lastError ?? "runtime error";
1299
+ emit.detail(` \u21b3 ${reason}. Run \`vana connect ${source.source}\``);
1300
+ }
1301
+ else if (source.lastRunOutcome === CliOutcomeStatus.NEEDS_INPUT) {
1302
+ emit.detail(` \u21b3 Requires interactive login. Run \`vana connect ${source.source}\``);
1303
+ }
1304
+ else if (source.lastRunOutcome === CliOutcomeStatus.LEGACY_AUTH) {
1305
+ emit.detail(` \u21b3 Manual auth step required. Run \`vana connect ${source.source}\``);
1306
+ }
1307
+ }
1308
+ }
1233
1309
  if (nextSteps.length > 0) {
1234
1310
  emit.blank();
1235
1311
  const command = extractCommand(nextSteps[0]);
@@ -1350,9 +1426,11 @@ async function runServerStatus(options) {
1350
1426
  ? "(auto-detected)"
1351
1427
  : target.source === "config"
1352
1428
  ? "(saved)"
1353
- : target.source === "env"
1354
- ? "(from VANA_PERSONAL_SERVER_URL)"
1355
- : `(${target.source ?? "unknown"})`;
1429
+ : target.source === "auth"
1430
+ ? "(from vana login)"
1431
+ : target.source === "env"
1432
+ ? "(from VANA_PERSONAL_SERVER_URL)"
1433
+ : `(${target.source ?? "unknown"})`;
1356
1434
  emit.keyValue("URL", `${target.url} ${urlSuffix}`, "muted");
1357
1435
  }
1358
1436
  const stateLabel = target.state === "available" ? "healthy" : "Not connected";
@@ -2686,7 +2764,7 @@ export function formatHealthMessage(reason) {
2686
2764
  return null;
2687
2765
  const colonIndex = reason.indexOf(": ");
2688
2766
  const prefix = colonIndex > 0 ? reason.slice(0, colonIndex) : reason;
2689
- const detail = colonIndex > 0 ? reason.slice(colonIndex + 2) : "";
2767
+ const detail = colonIndex > 0 ? reason.slice(colonIndex + 2).replace(/\.$/, "") : "";
2690
2768
  switch (prefix) {
2691
2769
  case "needs-input":
2692
2770
  return `Requires interactive login${detail ? `: ${detail}` : ""}.`;
@@ -3896,4 +3974,117 @@ async function runSkillShow(name, options) {
3896
3974
  return 1;
3897
3975
  }
3898
3976
  }
3977
+ // ── Login / Logout ─────────────────────────────────────────────────────
3978
+ async function runLogin(options) {
3979
+ // Check env var shortcut
3980
+ const envToken = process.env.VANA_SESSION_TOKEN;
3981
+ if (envToken) {
3982
+ const creds = loadCredentials();
3983
+ if (creds) {
3984
+ if (options.json) {
3985
+ process.stdout.write(`${JSON.stringify({ status: "authenticated", source: "env", address: creds.account.address })}\n`);
3986
+ }
3987
+ else {
3988
+ const emit = createEmitter(options);
3989
+ emit.success(`Already authenticated via VANA_SESSION_TOKEN env var`);
3990
+ }
3991
+ return 0;
3992
+ }
3993
+ }
3994
+ // Check if already logged in
3995
+ const existing = loadCredentials();
3996
+ if (existing && !isExpired(existing)) {
3997
+ if (options.json) {
3998
+ process.stdout.write(`${JSON.stringify({
3999
+ status: "authenticated",
4000
+ address: existing.account.address,
4001
+ personal_server: existing.personal_server?.url ?? null,
4002
+ expires_at: existing.account.expires_at,
4003
+ })}\n`);
4004
+ }
4005
+ else {
4006
+ const emit = createEmitter(options);
4007
+ emit.success(`Already logged in as ${formatAddress(existing.account.address)}`);
4008
+ if (existing.personal_server) {
4009
+ emit.keyValue("Personal Server", existing.personal_server.url, "success");
4010
+ }
4011
+ emit.info(` Auth expires in ${formatExpiresIn(existing.account.expires_at)}`);
4012
+ emit.blank();
4013
+ emit.info(" Run `vana logout` first to re-authenticate.");
4014
+ }
4015
+ return 0;
4016
+ }
4017
+ if (options.json) {
4018
+ // JSON mode: run flow and output result
4019
+ const creds = await runDeviceCodeFlow({
4020
+ onCode: (code, uri) => {
4021
+ process.stderr.write(JSON.stringify({ event: "device_code", code, uri }) + "\n");
4022
+ },
4023
+ onWaiting: () => { },
4024
+ onAuthorized: () => { },
4025
+ onExpired: () => {
4026
+ process.stdout.write(JSON.stringify({ status: "expired", error: "Device code expired" }) +
4027
+ "\n");
4028
+ },
4029
+ onError: (err) => {
4030
+ process.stdout.write(JSON.stringify({ status: "error", error: err.message }) + "\n");
4031
+ },
4032
+ });
4033
+ if (creds) {
4034
+ await saveCredentials(creds);
4035
+ process.stdout.write(`${JSON.stringify({
4036
+ status: "authenticated",
4037
+ address: creds.account.address,
4038
+ personal_server: creds.personal_server?.url ?? null,
4039
+ expires_at: creds.account.expires_at,
4040
+ })}\n`);
4041
+ return 0;
4042
+ }
4043
+ return 1;
4044
+ }
4045
+ // Interactive mode
4046
+ const emit = createEmitter(options);
4047
+ emit.blank();
4048
+ emit.info(" Logging in to Vana...");
4049
+ emit.blank();
4050
+ const creds = await runDeviceCodeFlow({
4051
+ onCode: (code, uri) => {
4052
+ emit.info(` ! Open this URL in your browser:`);
4053
+ emit.info(` ${uri}`);
4054
+ emit.blank();
4055
+ emit.info(` ! Enter this code: ${BOLD}${code}${RESET}`);
4056
+ emit.blank();
4057
+ },
4058
+ onWaiting: () => {
4059
+ emit.info(" Waiting for authorization...");
4060
+ },
4061
+ onAuthorized: async (authedCreds) => {
4062
+ await saveCredentials(authedCreds);
4063
+ emit.success(`Logged in as ${formatAddress(authedCreds.account.address)}`);
4064
+ if (authedCreds.personal_server) {
4065
+ emit.blank();
4066
+ emit.keyValue("Personal Server", authedCreds.personal_server.url, "success");
4067
+ }
4068
+ emit.success(`Credentials saved to ~/.vana/auth.json`);
4069
+ },
4070
+ onExpired: () => {
4071
+ emit.info(` Device code expired. Run ${emit.code("vana login")} to try again.`);
4072
+ },
4073
+ onError: (err) => {
4074
+ emit.info(` Error: ${err.message}`);
4075
+ },
4076
+ });
4077
+ return creds ? 0 : 1;
4078
+ }
4079
+ async function runLogout(options) {
4080
+ await clearCredentials();
4081
+ if (options.json) {
4082
+ process.stdout.write(`${JSON.stringify({ status: "logged_out" })}\n`);
4083
+ }
4084
+ else {
4085
+ const emit = createEmitter(options);
4086
+ emit.success("Logged out. Credentials removed.");
4087
+ }
4088
+ return 0;
4089
+ }
3899
4090
  //# sourceMappingURL=index.js.map