@dreamboard-games/cli 0.1.30-alpha.30 → 0.1.30-alpha.32
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/README.md +8 -8
- package/dist/agent-verifier/agent-workspace-verifier.mjs +243 -102
- package/dist/agent-verifier/agent-workspace-verifier.mjs.map +1 -1
- package/dist/agent-verifier/{chunk-QMOBTQ5G.mjs → chunk-3SPDNMLA.mjs} +3 -3
- package/dist/agent-verifier/{chunk-QMOBTQ5G.mjs.map → chunk-3SPDNMLA.mjs.map} +1 -1
- package/dist/agent-verifier/{chunk-FNSHNMDY.mjs → chunk-MIRGCMUC.mjs} +3 -10
- package/dist/agent-verifier/chunk-MIRGCMUC.mjs.map +1 -0
- package/dist/agent-verifier/{global-config-SWWR2LP4.mjs → global-config-2NUESNEQ.mjs} +2 -2
- package/dist/agent-verifier/{keychain-backend-UF3Z26JM.mjs → keychain-backend-FF4I6ODB.mjs} +1 -1
- package/dist/agent-verifier/{keychain-backend-UF3Z26JM.mjs.map → keychain-backend-FF4I6ODB.mjs.map} +1 -1
- package/dist/agent-verifier/{materialize-workspace-K4WYFG5E.mjs → materialize-workspace-J2S4XIIC.mjs} +2 -2
- package/dist/agent-verifier/{static-scaffold-MHVM63HU.mjs → static-scaffold-56QBCO6P.mjs} +2 -2
- package/dist/authoring-compatibility-internal.js +1 -1
- package/dist/{chunk-UI7NWSYA.js → chunk-6NYVJYN4.js} +7 -28
- package/dist/chunk-6NYVJYN4.js.map +1 -0
- package/dist/{chunk-RTNKVNQA.js → chunk-DWWMZBFB.js} +247 -158
- package/dist/chunk-DWWMZBFB.js.map +1 -0
- package/dist/{chunk-I4SZ7FA4.js → chunk-TRF7IPXK.js} +3 -9
- package/dist/{chunk-I4SZ7FA4.js.map → chunk-TRF7IPXK.js.map} +1 -1
- package/dist/{global-config-GK2UC2X6.js → global-config-RBMW7IVA.js} +2 -2
- package/dist/index.js +123 -305
- package/dist/index.js.map +1 -1
- package/dist/internal.js +3 -3
- package/dist/internal.js.map +1 -1
- package/dist/{keychain-backend-GO34KGTG.js → keychain-backend-FSNTNTZE.js} +1 -1
- package/dist/{keychain-backend-GO34KGTG.js.map → keychain-backend-FSNTNTZE.js.map} +1 -1
- package/package.json +1 -1
- package/release/authoring-release-set.json +2 -2
- package/skills/dreamboard/SKILL.md +3 -3
- package/skills/dreamboard/references/building-your-first-game.md +1 -1
- package/skills/dreamboard/references/cli.md +20 -19
- package/skills/dreamboard/references/quickstart.md +3 -3
- package/dist/agent-verifier/chunk-FNSHNMDY.mjs.map +0 -1
- package/dist/chunk-RTNKVNQA.js.map +0 -1
- package/dist/chunk-UI7NWSYA.js.map +0 -1
- /package/dist/agent-verifier/{global-config-SWWR2LP4.mjs.map → global-config-2NUESNEQ.mjs.map} +0 -0
- /package/dist/agent-verifier/{materialize-workspace-K4WYFG5E.mjs.map → materialize-workspace-J2S4XIIC.mjs.map} +0 -0
- /package/dist/agent-verifier/{static-scaffold-MHVM63HU.mjs.map → static-scaffold-56QBCO6P.mjs.map} +0 -0
- /package/dist/{global-config-GK2UC2X6.js.map → global-config-RBMW7IVA.js.map} +0 -0
|
@@ -24,14 +24,12 @@ import {
|
|
|
24
24
|
writeWorkspaceJsonFile,
|
|
25
25
|
writeWorkspaceTextFile,
|
|
26
26
|
zProblemDetails
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-TRF7IPXK.js";
|
|
28
28
|
import {
|
|
29
|
-
clearCredentials,
|
|
30
29
|
getStoredSession,
|
|
31
30
|
loadGlobalConfig,
|
|
32
|
-
setCredentials,
|
|
33
31
|
withCredentialLock
|
|
34
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-6NYVJYN4.js";
|
|
35
33
|
import {
|
|
36
34
|
DEFAULT_API_BASE_URL,
|
|
37
35
|
DEFAULT_WEB_BASE_URL,
|
|
@@ -42,11 +40,30 @@ import {
|
|
|
42
40
|
} from "./chunk-EQNBQVIW.js";
|
|
43
41
|
|
|
44
42
|
// src/build-target.ts
|
|
45
|
-
var injectedBuildChannel = true ? "
|
|
43
|
+
var injectedBuildChannel = true ? "development" : void 0;
|
|
44
|
+
var injectedPackageVersion = true ? "0.1.30-alpha.32" : void 0;
|
|
46
45
|
var BUILD_CHANNEL = injectedBuildChannel === "published" ? "published" : "development";
|
|
46
|
+
var PACKAGE_VERSION = injectedPackageVersion ?? "0.0.0-development";
|
|
47
|
+
function isAlphaReleaseVersion(version) {
|
|
48
|
+
return /(?:^|-|\.)alpha(?:$|-|\.)/.test(version);
|
|
49
|
+
}
|
|
47
50
|
var IS_PUBLISHED_BUILD = BUILD_CHANNEL === "published";
|
|
51
|
+
var IS_ALPHA_RELEASE = isAlphaReleaseVersion(PACKAGE_VERSION);
|
|
52
|
+
var CAN_SELECT_ENVIRONMENT = !IS_PUBLISHED_BUILD || IS_ALPHA_RELEASE;
|
|
48
53
|
var PUBLISHED_ENVIRONMENT = "prod";
|
|
49
54
|
|
|
55
|
+
// src/auth/refresh-error.ts
|
|
56
|
+
function classifyRefreshError(error) {
|
|
57
|
+
const message = error.message?.toLowerCase() ?? "";
|
|
58
|
+
if (error.status === 400 || error.status === 401 || message.includes("invalid_grant") || message.includes("refresh token") || message.includes("expired") || message.includes("revoked")) {
|
|
59
|
+
return { kind: "permanent_invalid", reason: error.message };
|
|
60
|
+
}
|
|
61
|
+
if (error.status === 408 || error.status === 429 || typeof error.status === "number" && error.status >= 500 || message.includes("timeout") || message.includes("network") || message.includes("fetch failed")) {
|
|
62
|
+
return { kind: "transient", reason: error.message };
|
|
63
|
+
}
|
|
64
|
+
return { kind: "unknown", reason: error.message };
|
|
65
|
+
}
|
|
66
|
+
|
|
50
67
|
// src/auth/clerk-oauth.ts
|
|
51
68
|
import crypto from "crypto";
|
|
52
69
|
function createPkcePair() {
|
|
@@ -187,75 +204,183 @@ async function exchangeDreamboardUserToken(input) {
|
|
|
187
204
|
};
|
|
188
205
|
}
|
|
189
206
|
|
|
190
|
-
// src/auth/user-
|
|
191
|
-
var
|
|
192
|
-
function
|
|
207
|
+
// src/auth/user-session-manager.ts
|
|
208
|
+
var DEFAULT_TOKEN_MIN_VALIDITY_MS = 60 * 1e3;
|
|
209
|
+
function createUserSessionManager(config) {
|
|
193
210
|
return {
|
|
194
|
-
async
|
|
195
|
-
const localOrInjected = resolveNonStoredToken(config, "dreamboard-api");
|
|
196
|
-
if (localOrInjected) return localOrInjected;
|
|
197
|
-
if (!usesStoredSession(config)) return null;
|
|
211
|
+
async establishRefreshableSession(session) {
|
|
198
212
|
return withCredentialLock(async (ops) => {
|
|
199
|
-
const
|
|
200
|
-
|
|
201
|
-
if (apiToken) return apiToken;
|
|
202
|
-
const clerk = await resolveFreshClerkAccessToken(config, stored);
|
|
213
|
+
const credentials = credentialsFromRefreshableSession(session);
|
|
214
|
+
await ops.writeFull(credentials);
|
|
203
215
|
const exchanged = await exchangeDreamboardUserToken({
|
|
204
216
|
apiBaseUrl: config.apiBaseUrl,
|
|
205
|
-
clerkAccessToken:
|
|
217
|
+
clerkAccessToken: credentials.accessToken,
|
|
206
218
|
audience: "dreamboard-api"
|
|
207
219
|
});
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
220
|
+
const apiToken = toAccessToken(exchanged);
|
|
221
|
+
await ops.writeFull(withApiToken(credentials, apiToken));
|
|
222
|
+
return apiToken;
|
|
223
|
+
});
|
|
224
|
+
},
|
|
225
|
+
async establishAccessOnlySession(accessToken) {
|
|
226
|
+
await withCredentialLock((ops) => ops.writeAccessOnly(accessToken));
|
|
227
|
+
},
|
|
228
|
+
async resolveApiToken(options) {
|
|
229
|
+
const localOrInjected = resolveNonStoredToken(config, "dreamboard-api");
|
|
230
|
+
if (localOrInjected) return localOrInjected;
|
|
231
|
+
if (!usesStoredSession(config)) return null;
|
|
232
|
+
const minValidityMs = options?.minValiditySeconds === void 0 ? DEFAULT_TOKEN_MIN_VALIDITY_MS : Math.max(0, options.minValiditySeconds * 1e3);
|
|
233
|
+
return withCredentialLock(async (ops) => {
|
|
234
|
+
const stored = await ops.read();
|
|
235
|
+
return resolveStoredApiToken(ops, config, stored, minValidityMs);
|
|
218
236
|
});
|
|
219
237
|
},
|
|
220
238
|
async resolveGitToken() {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
apiBaseUrl: config.apiBaseUrl,
|
|
224
|
-
clerkAccessToken: config.authToken,
|
|
225
|
-
audience: "dreamboard-git"
|
|
226
|
-
});
|
|
227
|
-
return {
|
|
228
|
-
token: exchanged.accessToken,
|
|
229
|
-
expiresAt: exchanged.expiresAt,
|
|
230
|
-
audience: "dreamboard-git"
|
|
231
|
-
};
|
|
232
|
-
}
|
|
239
|
+
const localOrInjected = resolveNonStoredToken(config, "dreamboard-git");
|
|
240
|
+
if (localOrInjected) return localOrInjected;
|
|
233
241
|
if (!usesStoredSession(config)) {
|
|
234
|
-
throw
|
|
235
|
-
|
|
242
|
+
throw missingSessionError();
|
|
243
|
+
}
|
|
244
|
+
return withCredentialLock(async (ops) => {
|
|
245
|
+
const stored = await ops.read();
|
|
246
|
+
const clerk = await resolveFreshClerkSession(ops, config, stored);
|
|
247
|
+
return toAccessToken(
|
|
248
|
+
await exchangeDreamboardUserToken({
|
|
249
|
+
apiBaseUrl: config.apiBaseUrl,
|
|
250
|
+
clerkAccessToken: clerk.accessToken,
|
|
251
|
+
audience: "dreamboard-git"
|
|
252
|
+
})
|
|
236
253
|
);
|
|
254
|
+
});
|
|
255
|
+
},
|
|
256
|
+
async inspectSession() {
|
|
257
|
+
const localOrInjected = resolveNonStoredToken(config, "dreamboard-api");
|
|
258
|
+
if (localOrInjected) {
|
|
259
|
+
return inspectAccessOnlyToken(localOrInjected);
|
|
260
|
+
}
|
|
261
|
+
if (!usesStoredSession(config)) {
|
|
262
|
+
return { kind: "none" };
|
|
237
263
|
}
|
|
238
264
|
return withCredentialLock(async (ops) => {
|
|
239
265
|
const stored = await ops.read();
|
|
240
|
-
|
|
241
|
-
const
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
266
|
+
if (!stored) return { kind: "none" };
|
|
267
|
+
const cached = freshStoredApiToken(
|
|
268
|
+
stored,
|
|
269
|
+
DEFAULT_TOKEN_MIN_VALIDITY_MS
|
|
270
|
+
);
|
|
271
|
+
if (cached) {
|
|
272
|
+
return activeStatus("refreshable", cached, false);
|
|
273
|
+
}
|
|
274
|
+
try {
|
|
275
|
+
const token = await resolveStoredApiToken(
|
|
276
|
+
ops,
|
|
277
|
+
config,
|
|
278
|
+
stored,
|
|
279
|
+
DEFAULT_TOKEN_MIN_VALIDITY_MS
|
|
280
|
+
);
|
|
281
|
+
return activeStatus("refreshable", token, true);
|
|
282
|
+
} catch (error) {
|
|
283
|
+
return failedRefreshableStatus(error);
|
|
284
|
+
}
|
|
252
285
|
});
|
|
253
286
|
},
|
|
254
287
|
async logout() {
|
|
255
|
-
await
|
|
288
|
+
await withCredentialLock((ops) => ops.clear("logout_command"));
|
|
256
289
|
}
|
|
257
290
|
};
|
|
258
291
|
}
|
|
292
|
+
async function resolveStoredApiToken(ops, config, stored, minValidityMs) {
|
|
293
|
+
const cached = freshStoredApiToken(stored, minValidityMs);
|
|
294
|
+
if (cached) return cached;
|
|
295
|
+
const clerk = await resolveFreshClerkSession(ops, config, stored);
|
|
296
|
+
const exchanged = await exchangeDreamboardUserToken({
|
|
297
|
+
apiBaseUrl: config.apiBaseUrl,
|
|
298
|
+
clerkAccessToken: clerk.accessToken,
|
|
299
|
+
audience: "dreamboard-api"
|
|
300
|
+
});
|
|
301
|
+
const apiToken = toAccessToken(exchanged);
|
|
302
|
+
await ops.writeFull(withApiToken(clerk, apiToken));
|
|
303
|
+
return apiToken;
|
|
304
|
+
}
|
|
305
|
+
async function resolveFreshClerkSession(ops, config, stored) {
|
|
306
|
+
if (!stored) {
|
|
307
|
+
throw missingSessionError();
|
|
308
|
+
}
|
|
309
|
+
if (!stored.refreshToken) {
|
|
310
|
+
throw new Error(
|
|
311
|
+
"Stored Dreamboard session is missing its refresh token. Run `dreamboard auth login` to authenticate again."
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
if (stored.accessToken && isFresh(
|
|
315
|
+
stored.tokenExpiresAt,
|
|
316
|
+
stored.accessToken,
|
|
317
|
+
DEFAULT_TOKEN_MIN_VALIDITY_MS
|
|
318
|
+
)) {
|
|
319
|
+
return credentialsFromStored(config, stored);
|
|
320
|
+
}
|
|
321
|
+
const payload = await refreshClerkOAuthToken({
|
|
322
|
+
config: {
|
|
323
|
+
issuer: stored.clerkOAuthIssuer ?? config.clerkOAuthIssuer,
|
|
324
|
+
clientId: stored.clerkOAuthClientId ?? config.clerkOAuthClientId,
|
|
325
|
+
tokenUrl: stored.clerkOAuthTokenUrl ?? config.clerkOAuthTokenUrl
|
|
326
|
+
},
|
|
327
|
+
refreshToken: stored.refreshToken
|
|
328
|
+
});
|
|
329
|
+
const refreshed = {
|
|
330
|
+
accessToken: payload.accessToken,
|
|
331
|
+
refreshToken: payload.refreshToken,
|
|
332
|
+
tokenExpiresAt: payload.expiresAt,
|
|
333
|
+
dreamboardApiToken: stored.dreamboardApiToken,
|
|
334
|
+
dreamboardApiExpiresAt: stored.dreamboardApiExpiresAt,
|
|
335
|
+
clerkOAuthIssuer: stored.clerkOAuthIssuer ?? config.clerkOAuthIssuer,
|
|
336
|
+
clerkOAuthClientId: stored.clerkOAuthClientId ?? config.clerkOAuthClientId,
|
|
337
|
+
clerkOAuthTokenUrl: payload.tokenUrl,
|
|
338
|
+
environment: stored.environment ?? config.environment
|
|
339
|
+
};
|
|
340
|
+
await ops.writeFull(refreshed);
|
|
341
|
+
return refreshed;
|
|
342
|
+
}
|
|
343
|
+
function credentialsFromStored(config, stored) {
|
|
344
|
+
if (!stored.accessToken || !stored.refreshToken) {
|
|
345
|
+
throw missingSessionError();
|
|
346
|
+
}
|
|
347
|
+
return {
|
|
348
|
+
accessToken: stored.accessToken,
|
|
349
|
+
refreshToken: stored.refreshToken,
|
|
350
|
+
tokenExpiresAt: stored.tokenExpiresAt,
|
|
351
|
+
dreamboardApiToken: stored.dreamboardApiToken,
|
|
352
|
+
dreamboardApiExpiresAt: stored.dreamboardApiExpiresAt,
|
|
353
|
+
clerkOAuthIssuer: stored.clerkOAuthIssuer ?? config.clerkOAuthIssuer,
|
|
354
|
+
clerkOAuthClientId: stored.clerkOAuthClientId ?? config.clerkOAuthClientId,
|
|
355
|
+
clerkOAuthTokenUrl: stored.clerkOAuthTokenUrl ?? config.clerkOAuthTokenUrl,
|
|
356
|
+
environment: stored.environment ?? config.environment
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
function credentialsFromRefreshableSession(session) {
|
|
360
|
+
return {
|
|
361
|
+
accessToken: session.clerkAccessToken,
|
|
362
|
+
refreshToken: session.refreshToken,
|
|
363
|
+
tokenExpiresAt: session.clerkAccessExpiresAt,
|
|
364
|
+
clerkOAuthIssuer: session.clerkOAuthIssuer,
|
|
365
|
+
clerkOAuthClientId: session.clerkOAuthClientId,
|
|
366
|
+
clerkOAuthTokenUrl: session.clerkOAuthTokenUrl,
|
|
367
|
+
environment: session.environment
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
function withApiToken(credentials, token) {
|
|
371
|
+
return {
|
|
372
|
+
...credentials,
|
|
373
|
+
dreamboardApiToken: token.token,
|
|
374
|
+
dreamboardApiExpiresAt: token.expiresAt
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
function toAccessToken(token) {
|
|
378
|
+
return {
|
|
379
|
+
token: token.accessToken,
|
|
380
|
+
expiresAt: token.expiresAt,
|
|
381
|
+
audience: token.audience
|
|
382
|
+
};
|
|
383
|
+
}
|
|
259
384
|
function resolveNonStoredToken(config, audience) {
|
|
260
385
|
if (usesStoredSession(config)) return null;
|
|
261
386
|
if (!config.authToken) return null;
|
|
@@ -265,9 +390,13 @@ function resolveNonStoredToken(config, audience) {
|
|
|
265
390
|
audience
|
|
266
391
|
};
|
|
267
392
|
}
|
|
268
|
-
function freshStoredApiToken(stored) {
|
|
393
|
+
function freshStoredApiToken(stored, minValidityMs) {
|
|
269
394
|
if (!stored?.dreamboardApiToken) return null;
|
|
270
|
-
if (isFresh(
|
|
395
|
+
if (isFresh(
|
|
396
|
+
stored.dreamboardApiExpiresAt,
|
|
397
|
+
stored.dreamboardApiToken,
|
|
398
|
+
minValidityMs
|
|
399
|
+
)) {
|
|
271
400
|
return {
|
|
272
401
|
token: stored.dreamboardApiToken,
|
|
273
402
|
expiresAt: stored.dreamboardApiExpiresAt,
|
|
@@ -276,49 +405,60 @@ function freshStoredApiToken(stored) {
|
|
|
276
405
|
}
|
|
277
406
|
return null;
|
|
278
407
|
}
|
|
279
|
-
|
|
280
|
-
const
|
|
281
|
-
|
|
282
|
-
const tokenExpiresAt = stored?.tokenExpiresAt ?? config.clerkAccessExpiresAt;
|
|
283
|
-
if (!refreshToken) {
|
|
284
|
-
throw new Error(
|
|
285
|
-
"Stored Dreamboard session is missing its refresh token. Run `dreamboard auth login` to authenticate again."
|
|
286
|
-
);
|
|
287
|
-
}
|
|
288
|
-
if (accessToken && isFresh(tokenExpiresAt, accessToken)) {
|
|
408
|
+
function inspectAccessOnlyToken(token) {
|
|
409
|
+
const expiry = resolveExpiry(token.expiresAt, token.token);
|
|
410
|
+
if (expiry && expiry.getTime() <= Date.now()) {
|
|
289
411
|
return {
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
dreamboardApiToken: stored?.dreamboardApiToken,
|
|
294
|
-
dreamboardApiExpiresAt: stored?.dreamboardApiExpiresAt,
|
|
295
|
-
clerkOAuthIssuer: stored?.clerkOAuthIssuer ?? config.clerkOAuthIssuer,
|
|
296
|
-
clerkOAuthClientId: stored?.clerkOAuthClientId ?? config.clerkOAuthClientId,
|
|
297
|
-
clerkOAuthTokenUrl: stored?.clerkOAuthTokenUrl ?? config.clerkOAuthTokenUrl,
|
|
298
|
-
environment: stored?.environment ?? config.environment
|
|
412
|
+
kind: "invalid",
|
|
413
|
+
sessionKind: "access-only",
|
|
414
|
+
message: "Stored Dreamboard access token is expired. Run `dreamboard auth login` to authenticate again."
|
|
299
415
|
};
|
|
300
416
|
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
417
|
+
return activeStatus("access-only", token, false);
|
|
418
|
+
}
|
|
419
|
+
function failedRefreshableStatus(error) {
|
|
420
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
421
|
+
const errorStatus = typeof error === "object" && error !== null && "status" in error ? error.status : void 0;
|
|
422
|
+
const classification = classifyRefreshError({
|
|
423
|
+
message,
|
|
424
|
+
status: typeof errorStatus === "number" ? errorStatus : void 0
|
|
308
425
|
});
|
|
426
|
+
if (classification.kind === "permanent_invalid") {
|
|
427
|
+
return {
|
|
428
|
+
kind: "invalid",
|
|
429
|
+
sessionKind: "refreshable",
|
|
430
|
+
message
|
|
431
|
+
};
|
|
432
|
+
}
|
|
309
433
|
return {
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
434
|
+
kind: "degraded",
|
|
435
|
+
sessionKind: "refreshable",
|
|
436
|
+
message
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
function activeStatus(sessionKind, apiToken, repaired) {
|
|
440
|
+
return {
|
|
441
|
+
kind: "active",
|
|
442
|
+
sessionKind,
|
|
443
|
+
apiToken,
|
|
444
|
+
repaired
|
|
317
445
|
};
|
|
318
446
|
}
|
|
319
|
-
function
|
|
320
|
-
|
|
321
|
-
|
|
447
|
+
function missingSessionError() {
|
|
448
|
+
return new Error(
|
|
449
|
+
"Missing Dreamboard session. Run `dreamboard auth login` to authenticate."
|
|
450
|
+
);
|
|
451
|
+
}
|
|
452
|
+
function isFresh(expiresAt, token, minValidityMs) {
|
|
453
|
+
const expiry = resolveExpiry(expiresAt, token);
|
|
454
|
+
return expiry !== null && Number.isFinite(expiry.getTime()) && expiry.getTime() > Date.now() + minValidityMs;
|
|
455
|
+
}
|
|
456
|
+
function resolveExpiry(expiresAt, token) {
|
|
457
|
+
if (expiresAt) {
|
|
458
|
+
const parsed = new Date(expiresAt);
|
|
459
|
+
return Number.isFinite(parsed.getTime()) ? parsed : null;
|
|
460
|
+
}
|
|
461
|
+
return getJwtExpiry(token);
|
|
322
462
|
}
|
|
323
463
|
function getJwtExpiry(accessToken) {
|
|
324
464
|
if (!accessToken) return null;
|
|
@@ -425,21 +565,20 @@ function isLocalAwsUrl(rawUrl) {
|
|
|
425
565
|
}
|
|
426
566
|
|
|
427
567
|
// src/config/resolve.ts
|
|
428
|
-
var DEFAULT_REFRESH_WINDOW_MS = 5 * 60 * 1e3;
|
|
429
568
|
var TRANSIENT_READ_RETRY_DELAYS_MS = [100, 300];
|
|
430
569
|
function resolveConfig(globalConfig, flags, project, credentials) {
|
|
431
570
|
if (IS_PUBLISHED_BUILD) {
|
|
432
571
|
assertPublicRuntimeFlags(flags);
|
|
433
572
|
}
|
|
434
|
-
const envEnvironment =
|
|
435
|
-
const projectEnvironment =
|
|
436
|
-
const environment =
|
|
573
|
+
const envEnvironment = CAN_SELECT_ENVIRONMENT ? environmentFromProcess() : void 0;
|
|
574
|
+
const projectEnvironment = CAN_SELECT_ENVIRONMENT ? project?.environment : void 0;
|
|
575
|
+
const environment = CAN_SELECT_ENVIRONMENT ? flags.env || envEnvironment || projectEnvironment || globalConfig.environment || (IS_PUBLISHED_BUILD ? PUBLISHED_ENVIRONMENT : "staging") : PUBLISHED_ENVIRONMENT;
|
|
437
576
|
const envConfig = ENVIRONMENT_CONFIGS[environment];
|
|
438
577
|
const publishedEnvConfig = ENVIRONMENT_CONFIGS[PUBLISHED_ENVIRONMENT];
|
|
439
|
-
const hasExplicitEnvironmentOverride =
|
|
440
|
-
const resolvedApiBaseUrl = IS_PUBLISHED_BUILD ? publishedEnvConfig?.apiBaseUrl ?? DEFAULT_API_BASE_URL : hasExplicitEnvironmentOverride ? projectLocalBaseUrl(project?.apiBaseUrl, environment) || envConfig?.apiBaseUrl || DEFAULT_API_BASE_URL : project?.apiBaseUrl || envConfig?.apiBaseUrl || DEFAULT_API_BASE_URL;
|
|
578
|
+
const hasExplicitEnvironmentOverride = CAN_SELECT_ENVIRONMENT && Boolean(flags.env || envEnvironment || projectEnvironment);
|
|
579
|
+
const resolvedApiBaseUrl = IS_PUBLISHED_BUILD && !CAN_SELECT_ENVIRONMENT ? publishedEnvConfig?.apiBaseUrl ?? DEFAULT_API_BASE_URL : hasExplicitEnvironmentOverride ? projectLocalBaseUrl(project?.apiBaseUrl, environment) || envConfig?.apiBaseUrl || DEFAULT_API_BASE_URL : project?.apiBaseUrl || envConfig?.apiBaseUrl || DEFAULT_API_BASE_URL;
|
|
441
580
|
const apiBaseUrl = valueOrUndefined(process.env.DREAMBOARD_API_BASE_URL) ?? resolvedApiBaseUrl;
|
|
442
|
-
const resolvedWebBaseUrl = IS_PUBLISHED_BUILD ? publishedEnvConfig?.webBaseUrl ?? DEFAULT_WEB_BASE_URL : hasExplicitEnvironmentOverride ? projectLocalBaseUrl(project?.webBaseUrl, environment) || envConfig?.webBaseUrl || DEFAULT_WEB_BASE_URL : project?.webBaseUrl || envConfig?.webBaseUrl || DEFAULT_WEB_BASE_URL;
|
|
581
|
+
const resolvedWebBaseUrl = IS_PUBLISHED_BUILD && !CAN_SELECT_ENVIRONMENT ? publishedEnvConfig?.webBaseUrl ?? DEFAULT_WEB_BASE_URL : hasExplicitEnvironmentOverride ? projectLocalBaseUrl(project?.webBaseUrl, environment) || envConfig?.webBaseUrl || DEFAULT_WEB_BASE_URL : project?.webBaseUrl || envConfig?.webBaseUrl || DEFAULT_WEB_BASE_URL;
|
|
443
582
|
const webBaseUrl = valueOrUndefined(process.env.DREAMBOARD_WEB_BASE_URL) ?? resolvedWebBaseUrl;
|
|
444
583
|
const snapshot = buildCredentialSnapshot(flags, credentials, environment);
|
|
445
584
|
const oauthConfig = resolveEnvironmentOAuthConfig(environment, envConfig);
|
|
@@ -544,9 +683,10 @@ function projectLocalBaseUrl(rawUrl, environment) {
|
|
|
544
683
|
return void 0;
|
|
545
684
|
}
|
|
546
685
|
}
|
|
547
|
-
function assertPublicRuntimeFlags(flags) {
|
|
548
|
-
const
|
|
549
|
-
|
|
686
|
+
function assertPublicRuntimeFlags(flags, options = {}) {
|
|
687
|
+
const canSelectEnvironment = options.canSelectEnvironment ?? CAN_SELECT_ENVIRONMENT;
|
|
688
|
+
const argv = options.argv ?? process.argv.slice(2);
|
|
689
|
+
if (!canSelectEnvironment && (flags.env || argv.includes("--env"))) {
|
|
550
690
|
throw new Error(
|
|
551
691
|
"The published Dreamboard CLI is production-only and does not accept `--env`."
|
|
552
692
|
);
|
|
@@ -564,7 +704,7 @@ function assertPublicRuntimeFlags(flags) {
|
|
|
564
704
|
}
|
|
565
705
|
async function configureClient(config) {
|
|
566
706
|
const localHarnessToken = resolveLocalHarnessAccessToken(config);
|
|
567
|
-
const resolvedToken = localHarnessToken ? { token: localHarnessToken } : await
|
|
707
|
+
const resolvedToken = localHarnessToken ? { token: localHarnessToken } : await createUserSessionManager(config).resolveApiToken();
|
|
568
708
|
const effectiveAccessToken = resolvedToken?.token;
|
|
569
709
|
client.setConfig({
|
|
570
710
|
baseUrl: config.apiBaseUrl,
|
|
@@ -605,35 +745,6 @@ function isTransientFetchError(error) {
|
|
|
605
745
|
function sleep(ms) {
|
|
606
746
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
607
747
|
}
|
|
608
|
-
async function refreshResolvedAuthSession(config) {
|
|
609
|
-
if (!usesStoredSession2(config)) return null;
|
|
610
|
-
if (config.refreshToken) {
|
|
611
|
-
return refreshClerkOAuthSession(config);
|
|
612
|
-
}
|
|
613
|
-
return null;
|
|
614
|
-
}
|
|
615
|
-
async function refreshClerkOAuthSession(config) {
|
|
616
|
-
if (!config.refreshToken) return null;
|
|
617
|
-
const payload = await refreshClerkOAuthToken({
|
|
618
|
-
config: {
|
|
619
|
-
issuer: config.clerkOAuthIssuer,
|
|
620
|
-
clientId: config.clerkOAuthClientId,
|
|
621
|
-
tokenUrl: config.clerkOAuthTokenUrl
|
|
622
|
-
},
|
|
623
|
-
refreshToken: config.refreshToken
|
|
624
|
-
});
|
|
625
|
-
const credentials = {
|
|
626
|
-
accessToken: payload.accessToken,
|
|
627
|
-
refreshToken: payload.refreshToken,
|
|
628
|
-
tokenExpiresAt: payload.expiresAt,
|
|
629
|
-
clerkOAuthIssuer: config.clerkOAuthIssuer,
|
|
630
|
-
clerkOAuthClientId: config.clerkOAuthClientId,
|
|
631
|
-
clerkOAuthTokenUrl: payload.tokenUrl,
|
|
632
|
-
environment: config.environment
|
|
633
|
-
};
|
|
634
|
-
await setCredentials(credentials);
|
|
635
|
-
return credentials;
|
|
636
|
-
}
|
|
637
748
|
function requireAuth(config) {
|
|
638
749
|
if (!config.authToken && !config.refreshToken && !resolveLocalHarnessAccessToken(config)) {
|
|
639
750
|
throw new Error(
|
|
@@ -660,9 +771,6 @@ function getAuthTokenExpiry(accessToken) {
|
|
|
660
771
|
return null;
|
|
661
772
|
}
|
|
662
773
|
}
|
|
663
|
-
function usesStoredSession2(config) {
|
|
664
|
-
return config.refreshTokenSource === "global";
|
|
665
|
-
}
|
|
666
774
|
async function loadProjectContextCredentials(requireAuth2, loadCredentials = getStoredSession) {
|
|
667
775
|
return requireAuth2 ? loadCredentials() : void 0;
|
|
668
776
|
}
|
|
@@ -733,13 +841,6 @@ var commitScopedCommandArgsSchema = configFlagsSchema.extend({
|
|
|
733
841
|
commit: external_exports.string().min(1),
|
|
734
842
|
json: external_exports.boolean().default(false)
|
|
735
843
|
});
|
|
736
|
-
var projectRepositoryCommandArgsSchema = configFlagsSchema.extend({
|
|
737
|
-
project: external_exports.string().min(1),
|
|
738
|
-
wait: external_exports.boolean().default(false),
|
|
739
|
-
"wait-timeout-ms": external_exports.string().optional(),
|
|
740
|
-
"repository-poll-interval-ms": external_exports.string().optional(),
|
|
741
|
-
json: external_exports.boolean().default(false)
|
|
742
|
-
});
|
|
743
844
|
var buildCommandArgsSchema = commitScopedCommandArgsSchema.extend({
|
|
744
845
|
profile: external_exports.enum(["preview", "release"]).optional().default("preview")
|
|
745
846
|
});
|
|
@@ -770,14 +871,7 @@ var configCommandArgsSchema = configFlagsSchema.extend({
|
|
|
770
871
|
scope: external_exports.enum(["global", "workspace"]).optional().default("global")
|
|
771
872
|
});
|
|
772
873
|
var authCommandArgsSchema = external_exports.object({
|
|
773
|
-
action: external_exports.enum([
|
|
774
|
-
"set",
|
|
775
|
-
"login",
|
|
776
|
-
"logout",
|
|
777
|
-
"env",
|
|
778
|
-
"status",
|
|
779
|
-
"git-credential"
|
|
780
|
-
]),
|
|
874
|
+
action: external_exports.enum(["set", "login", "logout", "env", "status", "git-credential"]),
|
|
781
875
|
tokenValue: external_exports.string().optional(),
|
|
782
876
|
token: external_exports.string().optional(),
|
|
783
877
|
jwt: external_exports.boolean().optional(),
|
|
@@ -809,9 +903,6 @@ function parseCloneCommandArgs(args) {
|
|
|
809
903
|
function parseCommitScopedCommandArgs(commandName, args) {
|
|
810
904
|
return parseArgs(commandName, commitScopedCommandArgsSchema, args);
|
|
811
905
|
}
|
|
812
|
-
function parseProjectRepositoryCommandArgs(commandName, args) {
|
|
813
|
-
return parseArgs(commandName, projectRepositoryCommandArgsSchema, args);
|
|
814
|
-
}
|
|
815
906
|
function parseBuildCommandArgs(args) {
|
|
816
907
|
return parseArgs("build", buildCommandArgsSchema, args);
|
|
817
908
|
}
|
|
@@ -3683,14 +3774,13 @@ export {
|
|
|
3683
3774
|
createPkcePair,
|
|
3684
3775
|
buildClerkAuthorizationUrl,
|
|
3685
3776
|
exchangeClerkOAuthCode,
|
|
3686
|
-
|
|
3777
|
+
createUserSessionManager,
|
|
3687
3778
|
IS_PUBLISHED_BUILD,
|
|
3779
|
+
CAN_SELECT_ENVIRONMENT,
|
|
3688
3780
|
PUBLISHED_ENVIRONMENT,
|
|
3689
|
-
createUserTokenManager,
|
|
3690
3781
|
resolveLocalHarnessAccessToken,
|
|
3691
3782
|
resolveConfig,
|
|
3692
3783
|
configureClient,
|
|
3693
|
-
refreshResolvedAuthSession,
|
|
3694
3784
|
requireAuth,
|
|
3695
3785
|
getAuthTokenExpiry,
|
|
3696
3786
|
resolveProjectContext,
|
|
@@ -3699,7 +3789,6 @@ export {
|
|
|
3699
3789
|
parseNewCommandArgs,
|
|
3700
3790
|
parseCloneCommandArgs,
|
|
3701
3791
|
parseCommitScopedCommandArgs,
|
|
3702
|
-
parseProjectRepositoryCommandArgs,
|
|
3703
3792
|
parseBuildCommandArgs,
|
|
3704
3793
|
parseReleasePublishCommandArgs,
|
|
3705
3794
|
parseDevCommandArgs,
|
|
@@ -3732,4 +3821,4 @@ export {
|
|
|
3732
3821
|
isLocalMaintainerRegistryEnabled,
|
|
3733
3822
|
didLocalMaintainerSnapshotChange
|
|
3734
3823
|
};
|
|
3735
|
-
//# sourceMappingURL=chunk-
|
|
3824
|
+
//# sourceMappingURL=chunk-DWWMZBFB.js.map
|