@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.
- package/dist/cli/auth.d.ts +98 -0
- package/dist/cli/auth.d.ts.map +1 -0
- package/dist/cli/auth.js +238 -0
- package/dist/cli/auth.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +196 -5
- package/dist/cli/index.js.map +1 -1
- package/dist/core/cli-types.d.ts +3 -0
- package/dist/core/cli-types.d.ts.map +1 -1
- package/dist/core/cli-types.js +1 -1
- package/dist/core/cli-types.js.map +1 -1
- package/dist/personal-server/index.d.ts +1 -1
- package/dist/personal-server/index.d.ts.map +1 -1
- package/dist/personal-server/index.js +26 -2
- package/dist/personal-server/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -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"}
|
package/dist/cli/auth.js
ADDED
|
@@ -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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"}
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAuCA,OAAO,EAQL,YAAY,EAIb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EACV,UAAU,EAEV,gBAAgB,EAEhB,SAAS,EACT,YAAY,EACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;
|
|
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
|
|
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 === "
|
|
1354
|
-
? "(from
|
|
1355
|
-
:
|
|
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
|