demofly 0.1.5 → 0.1.7

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.
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAyDzC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAyExD"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAsXzC,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAexD"}
@@ -1,109 +1,297 @@
1
1
  import {} from "commander";
2
+ import { createInterface } from "node:readline";
2
3
  import { createServer } from "node:http";
3
- import { execFileSync } from "node:child_process";
4
- import { setToken } from "../../lib/credentials.js";
5
- const CLIENT_ID = "demofly-cli";
6
- const AUTH_BASE = `${process.env.DEMOFLY_URL || "https://demofly.ai"}/oauth`;
7
- const LOGIN_TIMEOUT_MS = 120_000;
4
+ import { randomBytes, createHash } from "node:crypto";
5
+ import { execSync } from "node:child_process";
6
+ import { setToken, setCredentials } from "../../lib/credentials.js";
7
+ const API_BASE = process.env.DEMOFLY_URL || "https://demofly.ai";
8
+ const CLI_CLIENT_ID = "demofly-cli";
9
+ const CALLBACK_PORTS = [19823, 19824, 19825];
10
+ const DEVICE_POLL_INTERVAL_MS = 5000;
11
+ function prompt(question) {
12
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
13
+ return new Promise((resolve) => {
14
+ rl.question(question, (answer) => {
15
+ rl.close();
16
+ resolve(answer.trim());
17
+ });
18
+ });
19
+ }
8
20
  function openBrowser(url) {
9
- const platform = process.platform;
10
21
  try {
11
- if (platform === "darwin") {
12
- execFileSync("open", [url], { stdio: ["pipe", "pipe", "pipe"] });
13
- }
14
- else if (platform === "win32") {
15
- execFileSync("cmd", ["/c", "start", "", url], { stdio: ["pipe", "pipe", "pipe"] });
16
- }
17
- else {
18
- execFileSync("xdg-open", [url], { stdio: ["pipe", "pipe", "pipe"] });
19
- }
22
+ const cmd = process.platform === "darwin"
23
+ ? `open "${url}"`
24
+ : process.platform === "win32"
25
+ ? `start "" "${url}"`
26
+ : `xdg-open "${url}"`;
27
+ execSync(cmd, { stdio: "ignore" });
20
28
  }
21
29
  catch {
22
30
  console.log(`Open this URL in your browser:\n ${url}`);
23
31
  }
24
32
  }
25
- async function exchangeCodeForToken(code, redirectUri) {
26
- const response = await fetch(`${AUTH_BASE}/token`, {
33
+ // ── Device Code Flow (default) ─────────────────────────────────────────────
34
+ async function deviceCodeFlow() {
35
+ console.log("Requesting device code...");
36
+ const codeRes = await fetch(`${API_BASE}/api/auth/device/code`, {
27
37
  method: "POST",
28
38
  headers: { "Content-Type": "application/json" },
29
- body: JSON.stringify({
30
- code,
31
- client_id: CLIENT_ID,
39
+ body: JSON.stringify({ client_id: CLI_CLIENT_ID }),
40
+ });
41
+ if (!codeRes.ok) {
42
+ const text = await codeRes.text();
43
+ console.error(`Failed to request device code: ${text}`);
44
+ process.exit(1);
45
+ }
46
+ const codeData = (await codeRes.json());
47
+ console.log();
48
+ console.log(`Your code: ${codeData.user_code}`);
49
+ console.log();
50
+ console.log(`Open this URL to authorize:`);
51
+ console.log(` ${codeData.verification_uri_complete}`);
52
+ console.log();
53
+ openBrowser(codeData.verification_uri_complete);
54
+ console.log("Waiting for authorization...");
55
+ const pollInterval = Math.max((codeData.interval || 5) * 1000, DEVICE_POLL_INTERVAL_MS);
56
+ const deadline = Date.now() + codeData.expires_in * 1000;
57
+ while (Date.now() < deadline) {
58
+ await new Promise((r) => setTimeout(r, pollInterval));
59
+ const tokenRes = await fetch(`${API_BASE}/api/auth/device/token`, {
60
+ method: "POST",
61
+ headers: { "Content-Type": "application/json" },
62
+ body: JSON.stringify({
63
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
64
+ device_code: codeData.device_code,
65
+ client_id: CLI_CLIENT_ID,
66
+ }),
67
+ });
68
+ if (tokenRes.ok) {
69
+ const tokenData = (await tokenRes.json());
70
+ // Device flow returns a session token
71
+ await setCredentials({
72
+ access_token: tokenData.access_token,
73
+ expires_at: Date.now() + tokenData.expires_in * 1000,
74
+ token_type: "session",
75
+ });
76
+ console.log("Authenticated successfully.");
77
+ return;
78
+ }
79
+ const errData = (await tokenRes.json());
80
+ if (errData.error === "authorization_pending") {
81
+ continue;
82
+ }
83
+ if (errData.error === "slow_down") {
84
+ await new Promise((r) => setTimeout(r, pollInterval));
85
+ continue;
86
+ }
87
+ if (errData.error === "access_denied") {
88
+ console.error("Authorization denied.");
89
+ process.exit(1);
90
+ }
91
+ if (errData.error === "expired_token") {
92
+ console.error("Device code expired. Please try again.");
93
+ process.exit(1);
94
+ }
95
+ console.error(`Error: ${errData.error_description || errData.error}`);
96
+ process.exit(1);
97
+ }
98
+ console.error("Device code expired. Please try again.");
99
+ process.exit(1);
100
+ }
101
+ // ── Authorization Code Flow (--browser) ─────────────────────────────────────
102
+ function generatePKCE() {
103
+ const verifier = randomBytes(32)
104
+ .toString("base64url")
105
+ .slice(0, 43);
106
+ const challenge = createHash("sha256")
107
+ .update(verifier)
108
+ .digest("base64url");
109
+ return { verifier, challenge };
110
+ }
111
+ function startCallbackServer(port, resolve, reject) {
112
+ const server = createServer((req, res) => {
113
+ const url = new URL(req.url || "/", `http://127.0.0.1:${port}`);
114
+ if (url.pathname !== "/callback") {
115
+ res.writeHead(404);
116
+ res.end("Not found");
117
+ return;
118
+ }
119
+ const code = url.searchParams.get("code");
120
+ const state = url.searchParams.get("state");
121
+ const error = url.searchParams.get("error");
122
+ if (error) {
123
+ const desc = url.searchParams.get("error_description") || error;
124
+ res.writeHead(200, { "Content-Type": "text/html" });
125
+ res.end(`<html><body><h1>Authorization Failed</h1><p>${desc}</p><p>You can close this window.</p></body></html>`);
126
+ server.close();
127
+ reject(new Error(desc));
128
+ return;
129
+ }
130
+ if (!code || !state) {
131
+ res.writeHead(400, { "Content-Type": "text/html" });
132
+ res.end(`<html><body><h1>Missing parameters</h1><p>You can close this window.</p></body></html>`);
133
+ return;
134
+ }
135
+ res.writeHead(200, { "Content-Type": "text/html" });
136
+ res.end(`<html><body><h1>Authenticated!</h1><p>You can close this window and return to the CLI.</p></body></html>`);
137
+ server.close();
138
+ resolve({ code, state });
139
+ });
140
+ server.listen(port, "127.0.0.1");
141
+ return server;
142
+ }
143
+ async function tryStartServer(resolve, reject) {
144
+ for (const port of CALLBACK_PORTS) {
145
+ try {
146
+ const server = startCallbackServer(port, resolve, reject);
147
+ await new Promise((res, rej) => {
148
+ server.once("listening", res);
149
+ server.once("error", rej);
150
+ });
151
+ return { server, port };
152
+ }
153
+ catch {
154
+ continue;
155
+ }
156
+ }
157
+ throw new Error(`Could not bind to any callback port (${CALLBACK_PORTS.join(", ")}). ` +
158
+ `Try the device flow instead: demofly auth login`);
159
+ }
160
+ async function authCodeFlow() {
161
+ const pkce = generatePKCE();
162
+ const state = randomBytes(16).toString("hex");
163
+ let callbackResult;
164
+ let resolveCallback;
165
+ let rejectCallback;
166
+ callbackResult = new Promise((resolve, reject) => {
167
+ resolveCallback = resolve;
168
+ rejectCallback = reject;
169
+ });
170
+ const { server, port } = await tryStartServer(resolveCallback, rejectCallback);
171
+ const redirectUri = `http://127.0.0.1:${port}/callback`;
172
+ const params = new URLSearchParams({
173
+ response_type: "code",
174
+ client_id: CLI_CLIENT_ID,
175
+ redirect_uri: redirectUri,
176
+ state,
177
+ scope: "openid profile email offline_access",
178
+ code_challenge: pkce.challenge,
179
+ code_challenge_method: "S256",
180
+ });
181
+ const authorizeUrl = `${API_BASE}/api/auth/oauth2/authorize?${params}`;
182
+ console.log("Opening browser for authorization...");
183
+ openBrowser(authorizeUrl);
184
+ console.log("Waiting for authorization...");
185
+ let result;
186
+ try {
187
+ result = await callbackResult;
188
+ }
189
+ catch (err) {
190
+ server.close();
191
+ console.error(`Authorization failed: ${err.message}`);
192
+ process.exit(1);
193
+ }
194
+ if (result.state !== state) {
195
+ console.error("State mismatch — possible CSRF attack.");
196
+ process.exit(1);
197
+ }
198
+ // Exchange code for tokens
199
+ const tokenRes = await fetch(`${API_BASE}/api/auth/oauth2/token`, {
200
+ method: "POST",
201
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
202
+ body: new URLSearchParams({
203
+ grant_type: "authorization_code",
204
+ code: result.code,
32
205
  redirect_uri: redirectUri,
206
+ client_id: CLI_CLIENT_ID,
207
+ code_verifier: pkce.verifier,
33
208
  }),
34
209
  });
35
- if (!response.ok) {
36
- const body = await response.text();
37
- throw new Error(`Token exchange failed (${response.status}): ${body}`);
210
+ if (!tokenRes.ok) {
211
+ const text = await tokenRes.text();
212
+ console.error(`Token exchange failed: ${text}`);
213
+ process.exit(1);
38
214
  }
39
- const data = (await response.json());
40
- return data.access_token;
215
+ const tokenData = (await tokenRes.json());
216
+ const creds = {
217
+ access_token: tokenData.access_token,
218
+ refresh_token: tokenData.refresh_token,
219
+ expires_at: Date.now() + tokenData.expires_in * 1000,
220
+ token_type: "oauth",
221
+ };
222
+ await setCredentials(creds);
223
+ console.log("Authenticated successfully.");
41
224
  }
42
- function extractCode(url) {
43
- if (!url)
44
- return null;
45
- try {
46
- const parsed = new URL(url, "http://localhost");
47
- return parsed.searchParams.get("code");
225
+ // ── Email OTP Flow (--otp, legacy) ─────────────────────────────────────────
226
+ async function otpFlow() {
227
+ const email = await prompt("Email: ");
228
+ if (!email) {
229
+ console.error("Email is required.");
230
+ process.exit(1);
48
231
  }
49
- catch {
50
- return null;
232
+ console.log("Sending verification code...");
233
+ const sendRes = await fetch(`${API_BASE}/api/auth/email-otp/send-verification-otp`, {
234
+ method: "POST",
235
+ headers: { "Content-Type": "application/json" },
236
+ body: JSON.stringify({ email, type: "sign-in" }),
237
+ });
238
+ if (!sendRes.ok) {
239
+ const text = await sendRes.text();
240
+ console.error(`Failed to send verification code: ${text}`);
241
+ process.exit(1);
242
+ }
243
+ console.log(`Verification code sent to ${email}.`);
244
+ const otp = await prompt("Enter code: ");
245
+ if (!otp) {
246
+ console.error("Code is required.");
247
+ process.exit(1);
51
248
  }
249
+ const signInRes = await fetch(`${API_BASE}/api/auth/sign-in/email-otp`, {
250
+ method: "POST",
251
+ headers: { "Content-Type": "application/json" },
252
+ body: JSON.stringify({ email, otp }),
253
+ });
254
+ if (!signInRes.ok) {
255
+ const text = await signInRes.text();
256
+ console.error(`Sign-in failed: ${text}`);
257
+ process.exit(1);
258
+ }
259
+ const data = (await signInRes.json());
260
+ const token = data.token ?? data.session?.token;
261
+ if (!token) {
262
+ const cookies = signInRes.headers.getSetCookie?.() ?? [];
263
+ const sessionCookie = cookies.find((c) => c.startsWith("better-auth.session_token="));
264
+ if (sessionCookie) {
265
+ const value = sessionCookie.split("=")[1]?.split(";")[0];
266
+ if (value) {
267
+ await setToken(value);
268
+ console.log("Authenticated successfully.");
269
+ return;
270
+ }
271
+ }
272
+ console.error("Authentication succeeded but no session token was returned.");
273
+ process.exit(1);
274
+ }
275
+ await setToken(token);
276
+ console.log("Authenticated successfully.");
52
277
  }
278
+ // ── Command Registration ───────────────────────────────────────────────────
53
279
  export function registerLoginCommand(auth) {
54
280
  auth
55
281
  .command("login")
56
282
  .description("Authenticate with demofly")
57
- .action(async () => {
58
- await new Promise((resolve, reject) => {
59
- const server = createServer(async (req, res) => {
60
- const code = extractCode(req.url);
61
- if (!code) {
62
- res.writeHead(400, { "Content-Type": "text/plain" });
63
- res.end("Missing authorization code.");
64
- return;
65
- }
66
- try {
67
- const address = server.address();
68
- const port = address && typeof address === "object" ? address.port : 0;
69
- const redirectUri = `http://localhost:${port}/callback`;
70
- const token = await exchangeCodeForToken(code, redirectUri);
71
- await setToken(token);
72
- res.writeHead(200, { "Content-Type": "text/html" });
73
- res.end("<html><body><h2>Authenticated successfully.</h2><p>You can close this tab.</p></body></html>");
74
- console.log("Authenticated successfully.");
75
- }
76
- catch (err) {
77
- const message = err instanceof Error ? err.message : "Unknown error";
78
- res.writeHead(500, { "Content-Type": "text/plain" });
79
- res.end(`Authentication failed: ${message}`);
80
- console.error(`Authentication failed: ${message}`);
81
- }
82
- finally {
83
- clearTimeout(timeout);
84
- server.close();
85
- resolve();
86
- }
87
- });
88
- const timeout = setTimeout(() => {
89
- console.error("Authentication timed out. Try again with: demofly auth login");
90
- server.close();
91
- process.exit(1);
92
- }, LOGIN_TIMEOUT_MS);
93
- server.on("error", (err) => {
94
- clearTimeout(timeout);
95
- reject(new Error(`Failed to start auth server: ${err.message}`));
96
- });
97
- server.listen(0, () => {
98
- const address = server.address();
99
- const port = address && typeof address === "object" ? address.port : 0;
100
- const redirectUri = `http://localhost:${port}/callback`;
101
- const authorizeUrl = `${AUTH_BASE}/authorize?client_id=${CLIENT_ID}&redirect_uri=${encodeURIComponent(redirectUri)}&response_type=code`;
102
- console.log("Opening browser for authentication...");
103
- openBrowser(authorizeUrl);
104
- console.log("Waiting for authentication (timeout in 120s)...");
105
- });
106
- });
283
+ .option("--browser", "Use browser-based authorization code flow with PKCE")
284
+ .option("--otp", "Use email OTP flow (legacy)")
285
+ .action(async (options) => {
286
+ if (options.otp) {
287
+ await otpFlow();
288
+ }
289
+ else if (options.browser) {
290
+ await authCodeFlow();
291
+ }
292
+ else {
293
+ await deviceCodeFlow();
294
+ }
107
295
  });
108
296
  }
109
297
  //# sourceMappingURL=login.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAEpD,MAAM,SAAS,GAAG,aAAa,CAAC;AAChC,MAAM,SAAS,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,oBAAoB,QAAQ,CAAC;AAC7E,MAAM,gBAAgB,GAAG,OAAO,CAAC;AAEjC,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,YAAY,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACrF,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,qCAAqC,GAAG,EAAE,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,IAAY,EACZ,WAAmB;IAEnB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,SAAS,QAAQ,EAAE;QACjD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,IAAI;YACJ,SAAS,EAAE,SAAS;YACpB,YAAY,EAAE,WAAW;SAC1B,CAAC;KACH,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,MAAM,IAAI,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA6B,CAAC;IACjE,OAAO,IAAI,CAAC,YAAY,CAAC;AAC3B,CAAC;AAED,SAAS,WAAW,CAAC,GAAuB;IAC1C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAChD,OAAO,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,IAAI;SACD,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,MAAM,GAAG,YAAY,CACzB,KAAK,EAAE,GAAoB,EAAE,GAAmB,EAAE,EAAE;gBAClD,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAElC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;oBACrD,GAAG,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;oBACvC,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;oBACjC,MAAM,IAAI,GACR,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC5D,MAAM,WAAW,GAAG,oBAAoB,IAAI,WAAW,CAAC;oBAExD,MAAM,KAAK,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;oBAC5D,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC;oBAEtB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;oBACpD,GAAG,CAAC,GAAG,CACL,8FAA8F,CAC/F,CAAC;oBAEF,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBAC7C,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,OAAO,GACX,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;oBACvD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC;oBACrD,GAAG,CAAC,GAAG,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;oBAC7C,OAAO,CAAC,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAC;gBACrD,CAAC;wBAAS,CAAC;oBACT,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CACF,CAAC;YAEF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,OAAO,CAAC,KAAK,CACX,8DAA8D,CAC/D,CAAC;gBACF,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,EAAE,gBAAgB,CAAC,CAAC;YAErB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACzB,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACnE,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE;gBACpB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjC,MAAM,IAAI,GACR,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5D,MAAM,WAAW,GAAG,oBAAoB,IAAI,WAAW,CAAC;gBACxD,MAAM,YAAY,GAAG,GAAG,SAAS,wBAAwB,SAAS,iBAAiB,kBAAkB,CAAC,WAAW,CAAC,qBAAqB,CAAC;gBAExI,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;gBACrD,WAAW,CAAC,YAAY,CAAC,CAAC;gBAC1B,OAAO,CAAC,GAAG,CACT,iDAAiD,CAClD,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAwBzD"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAsDzD"}
@@ -1,11 +1,16 @@
1
1
  import {} from "commander";
2
- import { getTokenSource } from "../../lib/credentials.js";
2
+ import { getTokenSource, getCredentials } from "../../lib/credentials.js";
3
3
  export function registerStatusCommand(auth) {
4
4
  auth
5
5
  .command("status")
6
6
  .description("Show current authentication status")
7
7
  .action(async () => {
8
8
  const source = await getTokenSource();
9
+ if (!source) {
10
+ console.log("Not authenticated. Run: demofly auth login");
11
+ return;
12
+ }
13
+ const creds = await getCredentials();
9
14
  switch (source) {
10
15
  case "env":
11
16
  console.log("Authenticated via DEMOFLY_TOKEN environment variable");
@@ -16,9 +21,28 @@ export function registerStatusCommand(auth) {
16
21
  case "file":
17
22
  console.log("Logged in (via config file)");
18
23
  break;
19
- default:
20
- console.log("Not authenticated. Run: demofly auth login");
21
- break;
24
+ }
25
+ if (creds) {
26
+ const typeLabel = creds.token_type === "oauth" ? "OAuth access token" : "Session token";
27
+ console.log(` Token type: ${typeLabel}`);
28
+ if (creds.expires_at) {
29
+ const expiresAt = new Date(creds.expires_at);
30
+ const remaining = creds.expires_at - Date.now();
31
+ if (remaining <= 0) {
32
+ console.log(` Expires: expired`);
33
+ if (creds.refresh_token) {
34
+ console.log(` Refresh token: available (will auto-refresh)`);
35
+ }
36
+ }
37
+ else {
38
+ const mins = Math.floor(remaining / 60000);
39
+ const hours = Math.floor(mins / 60);
40
+ const timeStr = hours > 0
41
+ ? `${hours}h ${mins % 60}m`
42
+ : `${mins}m`;
43
+ console.log(` Expires: ${expiresAt.toLocaleString()} (${timeStr} remaining)`);
44
+ }
45
+ }
22
46
  }
23
47
  });
24
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,UAAU,qBAAqB,CAAC,IAAa;IACjD,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QAEtC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,KAAK;gBACR,OAAO,CAAC,GAAG,CACT,sDAAsD,CACvD,CAAC;gBACF,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;gBACxC,MAAM;YACR,KAAK,MAAM;gBACT,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBAC3C,MAAM;YACR;gBACE,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;gBAC1D,MAAM;QACV,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1E,MAAM,UAAU,qBAAqB,CAAC,IAAa;IACjD,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oCAAoC,CAAC;SACjD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;QAEtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,cAAc,EAAE,CAAC;QAErC,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,KAAK;gBACR,OAAO,CAAC,GAAG,CACT,sDAAsD,CACvD,CAAC;gBACF,MAAM;YACR,KAAK,UAAU;gBACb,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;gBACxC,MAAM;YACR,KAAK,MAAM;gBACT,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;gBAC3C,MAAM;QACV,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,SAAS,GACb,KAAK,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,eAAe,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC;YAE1C,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;gBACrB,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;gBAC7C,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAEhD,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;oBACnB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;oBAClC,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;wBACxB,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;oBAChE,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC;oBAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;oBACpC,MAAM,OAAO,GACX,KAAK,GAAG,CAAC;wBACP,CAAC,CAAC,GAAG,KAAK,KAAK,IAAI,GAAG,EAAE,GAAG;wBAC3B,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC;oBACjB,OAAO,CAAC,GAAG,CAAC,cAAc,SAAS,CAAC,cAAc,EAAE,KAAK,OAAO,aAAa,CAAC,CAAC;gBACjF,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type Command } from "commander";
2
+ export declare function registerVersionCommand(program: Command): void;
3
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/commands/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAO7D"}
@@ -0,0 +1,11 @@
1
+ import {} from "commander";
2
+ import { VERSION } from "../lib/version.js";
3
+ export function registerVersionCommand(program) {
4
+ program
5
+ .command("version")
6
+ .description("Print the demofly CLI version")
7
+ .action(() => {
8
+ console.log(VERSION);
9
+ });
10
+ }
11
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/commands/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE5C,MAAM,UAAU,sBAAsB,CAAC,OAAgB;IACrD,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
package/dist/index.js CHANGED
@@ -6,7 +6,9 @@ import { registerTtsCommand } from "./commands/tts.js";
6
6
  import { registerAuthCommands } from "./commands/auth/index.js";
7
7
  import { registerPushCommand } from "./commands/push.js";
8
8
  import { registerDemosCommands } from "./commands/demos/index.js";
9
+ import { registerVersionCommand } from "./commands/version.js";
9
10
  import { setVerbose } from "./lib/logger.js";
11
+ import { VERSION } from "./lib/version.js";
10
12
  const nodeVersion = parseInt(process.versions.node.split(".")[0], 10);
11
13
  if (nodeVersion < 22) {
12
14
  console.error(`demofly requires Node.js 22 or higher (found v${process.versions.node})`);
@@ -14,7 +16,7 @@ if (nodeVersion < 22) {
14
16
  }
15
17
  program
16
18
  .name("demofly")
17
- .version("0.1.1")
19
+ .version(VERSION)
18
20
  .description("CLI for demofly — automated demo video generation")
19
21
  .option("--verbose", "Show detailed debug output");
20
22
  program.hook("preAction", (thisCommand) => {
@@ -28,5 +30,6 @@ registerTtsCommand(program);
28
30
  registerAuthCommands(program);
29
31
  registerPushCommand(program);
30
32
  registerDemosCommands(program);
33
+ registerVersionCommand(program);
31
34
  program.parse();
32
35
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtE,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC;IACrB,OAAO,CAAC,KAAK,CACX,iDAAiD,OAAO,CAAC,QAAQ,CAAC,IAAI,GAAG,CAC1E,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,WAAW,EAAE,4BAA4B,CAAC,CAAC;AAErD,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;IACxC,MAAM,IAAI,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;IAC3C,IAAI,IAAI,CAAC,OAAO;QAAE,UAAU,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAE/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAE3C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtE,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC;IACrB,OAAO,CAAC,KAAK,CACX,iDAAiD,OAAO,CAAC,QAAQ,CAAC,IAAI,GAAG,CAC1E,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,WAAW,EAAE,4BAA4B,CAAC,CAAC;AAErD,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;IACxC,MAAM,IAAI,GAAG,WAAW,CAAC,eAAe,EAAE,CAAC;IAC3C,IAAI,IAAI,CAAC,OAAO;QAAE,UAAU,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEhC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -1,5 +1,13 @@
1
+ export interface Credentials {
2
+ access_token: string;
3
+ refresh_token?: string;
4
+ expires_at?: number;
5
+ token_type: "session" | "oauth";
6
+ }
1
7
  export declare function getToken(): Promise<string | null>;
8
+ export declare function getCredentials(): Promise<Credentials | null>;
2
9
  export declare function setToken(token: string): Promise<void>;
10
+ export declare function setCredentials(creds: Credentials): Promise<void>;
3
11
  export declare function deleteToken(): Promise<void>;
4
12
  export declare function getTokenSource(): Promise<string | null>;
5
13
  //# sourceMappingURL=credentials.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAqFA,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAUvD;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3D;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAGjD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAK7D"}
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC;CACjC;AA0KD,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAuBvD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CASlE;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3D;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtE;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAGjD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAK7D"}
@@ -7,6 +7,9 @@ const KEYCHAIN_ACCOUNT = "demofly-token";
7
7
  const CONFIG_DIR = join(homedir(), ".config", "demofly");
8
8
  const CREDENTIALS_FILE = join(CONFIG_DIR, "credentials.json");
9
9
  const ENV_VAR = "DEMOFLY_TOKEN";
10
+ const API_BASE = process.env.DEMOFLY_URL || "https://demofly.ai";
11
+ // Refresh when token expires within this window (5 minutes)
12
+ const REFRESH_WINDOW_MS = 5 * 60 * 1000;
10
13
  function isMacOS() {
11
14
  return process.platform === "darwin";
12
15
  }
@@ -21,11 +24,11 @@ function tryKeychainRead() {
21
24
  return null;
22
25
  }
23
26
  }
24
- function tryKeychainWrite(token) {
27
+ function tryKeychainWrite(value) {
25
28
  if (!isMacOS())
26
29
  return false;
27
30
  try {
28
- const result = spawnSync("security", ["add-generic-password", "-s", KEYCHAIN_SERVICE, "-a", KEYCHAIN_ACCOUNT, "-w", token, "-U"], { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
31
+ const result = spawnSync("security", ["add-generic-password", "-s", KEYCHAIN_SERVICE, "-a", KEYCHAIN_ACCOUNT, "-w", value, "-U"], { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
29
32
  return result.status === 0;
30
33
  }
31
34
  catch {
@@ -46,19 +49,15 @@ function tryFileRead() {
46
49
  try {
47
50
  if (!existsSync(CREDENTIALS_FILE))
48
51
  return null;
49
- const raw = readFileSync(CREDENTIALS_FILE, "utf-8");
50
- const data = JSON.parse(raw);
51
- return data.token ?? null;
52
+ return readFileSync(CREDENTIALS_FILE, "utf-8");
52
53
  }
53
54
  catch {
54
55
  return null;
55
56
  }
56
57
  }
57
- function writeFile(token) {
58
+ function writeFile(value) {
58
59
  mkdirSync(CONFIG_DIR, { recursive: true });
59
- writeFileSync(CREDENTIALS_FILE, JSON.stringify({ token }, null, 2) + "\n", {
60
- mode: 0o600,
61
- });
60
+ writeFileSync(CREDENTIALS_FILE, value + "\n", { mode: 0o600 });
62
61
  }
63
62
  function deleteFile() {
64
63
  try {
@@ -70,22 +69,128 @@ function deleteFile() {
70
69
  // File may already be gone; ignore
71
70
  }
72
71
  }
72
+ function serializeCredentials(creds) {
73
+ // Compact JSON (no newlines) — macOS Keychain returns hex when
74
+ // the stored value contains non-printable characters like \n
75
+ return JSON.stringify(creds);
76
+ }
77
+ function parseCredentials(raw) {
78
+ try {
79
+ const data = JSON.parse(raw);
80
+ // New structured format
81
+ if (data.access_token) {
82
+ return {
83
+ access_token: data.access_token,
84
+ refresh_token: data.refresh_token,
85
+ expires_at: data.expires_at,
86
+ token_type: data.token_type || "session",
87
+ };
88
+ }
89
+ // Legacy format: { token: "..." }
90
+ if (data.token) {
91
+ return { access_token: data.token, token_type: "session" };
92
+ }
93
+ return null;
94
+ }
95
+ catch {
96
+ return null;
97
+ }
98
+ }
99
+ function readStoredCredentials() {
100
+ // Try keychain first
101
+ const keychainRaw = tryKeychainRead();
102
+ if (keychainRaw) {
103
+ // Keychain may hold a plain token (legacy) or JSON credentials
104
+ const creds = parseCredentials(keychainRaw);
105
+ if (creds)
106
+ return creds;
107
+ // Legacy: raw token string in keychain
108
+ return { access_token: keychainRaw, token_type: "session" };
109
+ }
110
+ // Try file
111
+ const fileRaw = tryFileRead();
112
+ if (fileRaw) {
113
+ const creds = parseCredentials(fileRaw);
114
+ if (creds)
115
+ return creds;
116
+ }
117
+ return null;
118
+ }
119
+ function writeStoredCredentials(creds) {
120
+ const serialized = serializeCredentials(creds);
121
+ const stored = tryKeychainWrite(serialized);
122
+ if (!stored) {
123
+ writeFile(serialized);
124
+ }
125
+ }
126
+ async function refreshOAuthToken(creds) {
127
+ if (!creds.refresh_token)
128
+ return null;
129
+ try {
130
+ const res = await fetch(`${API_BASE}/api/auth/oauth2/token`, {
131
+ method: "POST",
132
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
133
+ body: new URLSearchParams({
134
+ grant_type: "refresh_token",
135
+ refresh_token: creds.refresh_token,
136
+ client_id: "demofly-cli",
137
+ }),
138
+ });
139
+ if (!res.ok)
140
+ return null;
141
+ const data = await res.json();
142
+ const newCreds = {
143
+ access_token: data.access_token,
144
+ refresh_token: data.refresh_token ?? creds.refresh_token,
145
+ expires_at: data.expires_in
146
+ ? Date.now() + data.expires_in * 1000
147
+ : undefined,
148
+ token_type: "oauth",
149
+ };
150
+ writeStoredCredentials(newCreds);
151
+ return newCreds;
152
+ }
153
+ catch {
154
+ return null;
155
+ }
156
+ }
73
157
  export async function getToken() {
74
158
  if (process.env.DF_DEV_AUTH_BYPASS === "true")
75
159
  return "dev-bypass";
76
160
  const envToken = process.env[ENV_VAR];
77
161
  if (envToken)
78
162
  return envToken;
79
- const keychainToken = tryKeychainRead();
80
- if (keychainToken)
81
- return keychainToken;
82
- return tryFileRead();
163
+ const creds = readStoredCredentials();
164
+ if (!creds)
165
+ return null;
166
+ // Auto-refresh OAuth tokens nearing expiry
167
+ if (creds.token_type === "oauth" &&
168
+ creds.expires_at &&
169
+ creds.expires_at - Date.now() < REFRESH_WINDOW_MS) {
170
+ const refreshed = await refreshOAuthToken(creds);
171
+ if (refreshed)
172
+ return refreshed.access_token;
173
+ // If refresh failed but token isn't actually expired yet, use it
174
+ if (creds.expires_at > Date.now())
175
+ return creds.access_token;
176
+ return null;
177
+ }
178
+ return creds.access_token;
83
179
  }
84
- export async function setToken(token) {
85
- const stored = tryKeychainWrite(token);
86
- if (!stored) {
87
- writeFile(token);
180
+ export async function getCredentials() {
181
+ if (process.env.DF_DEV_AUTH_BYPASS === "true") {
182
+ return { access_token: "dev-bypass", token_type: "session" };
88
183
  }
184
+ const envToken = process.env[ENV_VAR];
185
+ if (envToken)
186
+ return { access_token: envToken, token_type: "session" };
187
+ return readStoredCredentials();
188
+ }
189
+ export async function setToken(token) {
190
+ writeStoredCredentials({ access_token: token, token_type: "session" });
191
+ }
192
+ export async function setCredentials(creds) {
193
+ writeStoredCredentials(creds);
89
194
  }
90
195
  export async function deleteToken() {
91
196
  tryKeychainDelete();
@@ -1 +1 @@
1
- {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/lib/credentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION: string;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,OAAO,QAAc,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { createRequire } from "node:module";
2
+ const require = createRequire(import.meta.url);
3
+ const pkg = require("../../package.json");
4
+ export const VERSION = pkg.version;
5
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/lib/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAwB,CAAC;AAEjE,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "demofly",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "CLI for demofly — automated demo video generation",
5
5
  "type": "module",
6
6
  "bin": {
@@ -23,6 +23,7 @@
23
23
  "test:watch": "vitest"
24
24
  },
25
25
  "dependencies": {
26
+ "@playwright/test": "^1.58.2",
26
27
  "commander": "^13.0.0",
27
28
  "sherpa-onnx-node": "^1.12.25"
28
29
  },