@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.
Files changed (39) hide show
  1. package/README.md +8 -8
  2. package/dist/agent-verifier/agent-workspace-verifier.mjs +243 -102
  3. package/dist/agent-verifier/agent-workspace-verifier.mjs.map +1 -1
  4. package/dist/agent-verifier/{chunk-QMOBTQ5G.mjs → chunk-3SPDNMLA.mjs} +3 -3
  5. package/dist/agent-verifier/{chunk-QMOBTQ5G.mjs.map → chunk-3SPDNMLA.mjs.map} +1 -1
  6. package/dist/agent-verifier/{chunk-FNSHNMDY.mjs → chunk-MIRGCMUC.mjs} +3 -10
  7. package/dist/agent-verifier/chunk-MIRGCMUC.mjs.map +1 -0
  8. package/dist/agent-verifier/{global-config-SWWR2LP4.mjs → global-config-2NUESNEQ.mjs} +2 -2
  9. package/dist/agent-verifier/{keychain-backend-UF3Z26JM.mjs → keychain-backend-FF4I6ODB.mjs} +1 -1
  10. package/dist/agent-verifier/{keychain-backend-UF3Z26JM.mjs.map → keychain-backend-FF4I6ODB.mjs.map} +1 -1
  11. package/dist/agent-verifier/{materialize-workspace-K4WYFG5E.mjs → materialize-workspace-J2S4XIIC.mjs} +2 -2
  12. package/dist/agent-verifier/{static-scaffold-MHVM63HU.mjs → static-scaffold-56QBCO6P.mjs} +2 -2
  13. package/dist/authoring-compatibility-internal.js +1 -1
  14. package/dist/{chunk-UI7NWSYA.js → chunk-6NYVJYN4.js} +7 -28
  15. package/dist/chunk-6NYVJYN4.js.map +1 -0
  16. package/dist/{chunk-RTNKVNQA.js → chunk-DWWMZBFB.js} +247 -158
  17. package/dist/chunk-DWWMZBFB.js.map +1 -0
  18. package/dist/{chunk-I4SZ7FA4.js → chunk-TRF7IPXK.js} +3 -9
  19. package/dist/{chunk-I4SZ7FA4.js.map → chunk-TRF7IPXK.js.map} +1 -1
  20. package/dist/{global-config-GK2UC2X6.js → global-config-RBMW7IVA.js} +2 -2
  21. package/dist/index.js +123 -305
  22. package/dist/index.js.map +1 -1
  23. package/dist/internal.js +3 -3
  24. package/dist/internal.js.map +1 -1
  25. package/dist/{keychain-backend-GO34KGTG.js → keychain-backend-FSNTNTZE.js} +1 -1
  26. package/dist/{keychain-backend-GO34KGTG.js.map → keychain-backend-FSNTNTZE.js.map} +1 -1
  27. package/package.json +1 -1
  28. package/release/authoring-release-set.json +2 -2
  29. package/skills/dreamboard/SKILL.md +3 -3
  30. package/skills/dreamboard/references/building-your-first-game.md +1 -1
  31. package/skills/dreamboard/references/cli.md +20 -19
  32. package/skills/dreamboard/references/quickstart.md +3 -3
  33. package/dist/agent-verifier/chunk-FNSHNMDY.mjs.map +0 -1
  34. package/dist/chunk-RTNKVNQA.js.map +0 -1
  35. package/dist/chunk-UI7NWSYA.js.map +0 -1
  36. /package/dist/agent-verifier/{global-config-SWWR2LP4.mjs.map → global-config-2NUESNEQ.mjs.map} +0 -0
  37. /package/dist/agent-verifier/{materialize-workspace-K4WYFG5E.mjs.map → materialize-workspace-J2S4XIIC.mjs.map} +0 -0
  38. /package/dist/agent-verifier/{static-scaffold-MHVM63HU.mjs.map → static-scaffold-56QBCO6P.mjs.map} +0 -0
  39. /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-I4SZ7FA4.js";
27
+ } from "./chunk-TRF7IPXK.js";
28
28
  import {
29
- clearCredentials,
30
29
  getStoredSession,
31
30
  loadGlobalConfig,
32
- setCredentials,
33
31
  withCredentialLock
34
- } from "./chunk-UI7NWSYA.js";
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 ? "published" : void 0;
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-token-manager.ts
191
- var TOKEN_REFRESH_WINDOW_MS = 60 * 1e3;
192
- function createUserTokenManager(config) {
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 resolveApiToken() {
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 stored = await ops.read();
200
- const apiToken = freshStoredApiToken(stored);
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: clerk.accessToken,
217
+ clerkAccessToken: credentials.accessToken,
206
218
  audience: "dreamboard-api"
207
219
  });
208
- await ops.writeFull({
209
- ...clerk,
210
- dreamboardApiToken: exchanged.accessToken,
211
- dreamboardApiExpiresAt: exchanged.expiresAt
212
- });
213
- return {
214
- token: exchanged.accessToken,
215
- expiresAt: exchanged.expiresAt,
216
- audience: "dreamboard-api"
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
- if (!usesStoredSession(config) && config.authToken) {
222
- const exchanged = await exchangeDreamboardUserToken({
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 new Error(
235
- "Missing Dreamboard session. Run `dreamboard auth login` to authenticate."
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
- const clerk = await resolveFreshClerkAccessToken(config, stored);
241
- const exchanged = await exchangeDreamboardUserToken({
242
- apiBaseUrl: config.apiBaseUrl,
243
- clerkAccessToken: clerk.accessToken,
244
- audience: "dreamboard-git"
245
- });
246
- await ops.writeFull(clerk);
247
- return {
248
- token: exchanged.accessToken,
249
- expiresAt: exchanged.expiresAt,
250
- audience: "dreamboard-git"
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 clearCredentials("user_token_manager_logout");
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(stored.dreamboardApiExpiresAt, stored.dreamboardApiToken)) {
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
- async function resolveFreshClerkAccessToken(config, stored) {
280
- const accessToken = stored?.accessToken ?? config.clerkAccessToken;
281
- const refreshToken = stored?.refreshToken ?? config.refreshToken;
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
- accessToken,
291
- refreshToken,
292
- tokenExpiresAt,
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
- const payload = await refreshClerkOAuthToken({
302
- config: {
303
- issuer: stored?.clerkOAuthIssuer ?? config.clerkOAuthIssuer,
304
- clientId: stored?.clerkOAuthClientId ?? config.clerkOAuthClientId,
305
- tokenUrl: stored?.clerkOAuthTokenUrl ?? config.clerkOAuthTokenUrl
306
- },
307
- refreshToken
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
- accessToken: payload.accessToken,
311
- refreshToken: payload.refreshToken,
312
- tokenExpiresAt: payload.expiresAt,
313
- clerkOAuthIssuer: stored?.clerkOAuthIssuer ?? config.clerkOAuthIssuer,
314
- clerkOAuthClientId: stored?.clerkOAuthClientId ?? config.clerkOAuthClientId,
315
- clerkOAuthTokenUrl: payload.tokenUrl,
316
- environment: stored?.environment ?? config.environment
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 isFresh(expiresAt, token) {
320
- const expiry = expiresAt ? new Date(expiresAt) : getJwtExpiry(token);
321
- return expiry !== null && Number.isFinite(expiry.getTime()) && expiry.getTime() > Date.now() + TOKEN_REFRESH_WINDOW_MS;
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 = IS_PUBLISHED_BUILD ? void 0 : environmentFromProcess();
435
- const projectEnvironment = IS_PUBLISHED_BUILD ? void 0 : project?.environment;
436
- const environment = IS_PUBLISHED_BUILD ? PUBLISHED_ENVIRONMENT : flags.env || envEnvironment || projectEnvironment || globalConfig.environment || "staging";
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 = !IS_PUBLISHED_BUILD && Boolean(flags.env || envEnvironment || projectEnvironment);
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 argv = process.argv.slice(2);
549
- if (flags.env || argv.includes("--env")) {
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 createUserTokenManager(config).resolveApiToken();
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
- exchangeDreamboardUserToken,
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-RTNKVNQA.js.map
3824
+ //# sourceMappingURL=chunk-DWWMZBFB.js.map