@dreamboard-games/cli 0.1.30-alpha.30 → 0.1.30-alpha.31

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 (34) hide show
  1. package/dist/agent-verifier/agent-workspace-verifier.mjs +226 -93
  2. package/dist/agent-verifier/agent-workspace-verifier.mjs.map +1 -1
  3. package/dist/agent-verifier/{chunk-FNSHNMDY.mjs → chunk-MIRGCMUC.mjs} +3 -10
  4. package/dist/agent-verifier/chunk-MIRGCMUC.mjs.map +1 -0
  5. package/dist/agent-verifier/{chunk-QMOBTQ5G.mjs → chunk-NBRUEJUK.mjs} +3 -3
  6. package/dist/agent-verifier/{chunk-QMOBTQ5G.mjs.map → chunk-NBRUEJUK.mjs.map} +1 -1
  7. package/dist/agent-verifier/{global-config-SWWR2LP4.mjs → global-config-2NUESNEQ.mjs} +2 -2
  8. package/dist/agent-verifier/{keychain-backend-UF3Z26JM.mjs → keychain-backend-FF4I6ODB.mjs} +1 -1
  9. package/dist/agent-verifier/{keychain-backend-UF3Z26JM.mjs.map → keychain-backend-FF4I6ODB.mjs.map} +1 -1
  10. package/dist/agent-verifier/{materialize-workspace-K4WYFG5E.mjs → materialize-workspace-MAGKDMK5.mjs} +2 -2
  11. package/dist/agent-verifier/{static-scaffold-MHVM63HU.mjs → static-scaffold-CLRRWXON.mjs} +2 -2
  12. package/dist/authoring-compatibility-internal.js +1 -1
  13. package/dist/{chunk-UI7NWSYA.js → chunk-6NYVJYN4.js} +7 -28
  14. package/dist/chunk-6NYVJYN4.js.map +1 -0
  15. package/dist/{chunk-RTNKVNQA.js → chunk-X244CUU4.js} +228 -148
  16. package/dist/chunk-X244CUU4.js.map +1 -0
  17. package/dist/{chunk-I4SZ7FA4.js → chunk-YNJVKC2T.js} +3 -9
  18. package/dist/{chunk-I4SZ7FA4.js.map → chunk-YNJVKC2T.js.map} +1 -1
  19. package/dist/{global-config-GK2UC2X6.js → global-config-RBMW7IVA.js} +2 -2
  20. package/dist/index.js +110 -295
  21. package/dist/index.js.map +1 -1
  22. package/dist/internal.js +3 -3
  23. package/dist/internal.js.map +1 -1
  24. package/dist/{keychain-backend-GO34KGTG.js → keychain-backend-FSNTNTZE.js} +1 -1
  25. package/dist/{keychain-backend-GO34KGTG.js.map → keychain-backend-FSNTNTZE.js.map} +1 -1
  26. package/package.json +1 -1
  27. package/release/authoring-release-set.json +2 -2
  28. package/dist/agent-verifier/chunk-FNSHNMDY.mjs.map +0 -1
  29. package/dist/chunk-RTNKVNQA.js.map +0 -1
  30. package/dist/chunk-UI7NWSYA.js.map +0 -1
  31. /package/dist/agent-verifier/{global-config-SWWR2LP4.mjs.map → global-config-2NUESNEQ.mjs.map} +0 -0
  32. /package/dist/agent-verifier/{materialize-workspace-K4WYFG5E.mjs.map → materialize-workspace-MAGKDMK5.mjs.map} +0 -0
  33. /package/dist/agent-verifier/{static-scaffold-MHVM63HU.mjs.map → static-scaffold-CLRRWXON.mjs.map} +0 -0
  34. /package/dist/{global-config-GK2UC2X6.js.map → global-config-RBMW7IVA.js.map} +0 -0
@@ -4,11 +4,10 @@ import {
4
4
  loadProjectConfig
5
5
  } from "./chunk-M6YNQZCC.mjs";
6
6
  import {
7
- clearCredentials,
8
7
  getStoredSession,
9
8
  loadGlobalConfig,
10
9
  withCredentialLock
11
- } from "./chunk-FNSHNMDY.mjs";
10
+ } from "./chunk-MIRGCMUC.mjs";
12
11
  import "./chunk-GWRZRWCF.mjs";
13
12
  import {
14
13
  readJsonFile,
@@ -1134,6 +1133,18 @@ var BUILD_CHANNEL = injectedBuildChannel === "published" ? "published" : "develo
1134
1133
  var IS_PUBLISHED_BUILD = BUILD_CHANNEL === "published";
1135
1134
  var PUBLISHED_ENVIRONMENT = "prod";
1136
1135
 
1136
+ // src/auth/refresh-error.ts
1137
+ function classifyRefreshError(error) {
1138
+ const message = error.message?.toLowerCase() ?? "";
1139
+ if (error.status === 400 || error.status === 401 || message.includes("invalid_grant") || message.includes("refresh token") || message.includes("expired") || message.includes("revoked")) {
1140
+ return { kind: "permanent_invalid", reason: error.message };
1141
+ }
1142
+ if (error.status === 408 || error.status === 429 || typeof error.status === "number" && error.status >= 500 || message.includes("timeout") || message.includes("network") || message.includes("fetch failed")) {
1143
+ return { kind: "transient", reason: error.message };
1144
+ }
1145
+ return { kind: "unknown", reason: error.message };
1146
+ }
1147
+
1137
1148
  // src/auth/clerk-oauth.ts
1138
1149
  import crypto from "crypto";
1139
1150
  async function refreshClerkOAuthToken(input) {
@@ -1241,75 +1252,183 @@ async function exchangeDreamboardUserToken(input) {
1241
1252
  };
1242
1253
  }
1243
1254
 
1244
- // src/auth/user-token-manager.ts
1245
- var TOKEN_REFRESH_WINDOW_MS = 60 * 1e3;
1246
- function createUserTokenManager(config) {
1255
+ // src/auth/user-session-manager.ts
1256
+ var DEFAULT_TOKEN_MIN_VALIDITY_MS = 60 * 1e3;
1257
+ function createUserSessionManager(config) {
1247
1258
  return {
1248
- async resolveApiToken() {
1249
- const localOrInjected = resolveNonStoredToken(config, "dreamboard-api");
1250
- if (localOrInjected) return localOrInjected;
1251
- if (!usesStoredSession(config)) return null;
1259
+ async establishRefreshableSession(session) {
1252
1260
  return withCredentialLock(async (ops) => {
1253
- const stored = await ops.read();
1254
- const apiToken = freshStoredApiToken(stored);
1255
- if (apiToken) return apiToken;
1256
- const clerk = await resolveFreshClerkAccessToken(config, stored);
1261
+ const credentials = credentialsFromRefreshableSession(session);
1262
+ await ops.writeFull(credentials);
1257
1263
  const exchanged = await exchangeDreamboardUserToken({
1258
1264
  apiBaseUrl: config.apiBaseUrl,
1259
- clerkAccessToken: clerk.accessToken,
1265
+ clerkAccessToken: credentials.accessToken,
1260
1266
  audience: "dreamboard-api"
1261
1267
  });
1262
- await ops.writeFull({
1263
- ...clerk,
1264
- dreamboardApiToken: exchanged.accessToken,
1265
- dreamboardApiExpiresAt: exchanged.expiresAt
1266
- });
1267
- return {
1268
- token: exchanged.accessToken,
1269
- expiresAt: exchanged.expiresAt,
1270
- audience: "dreamboard-api"
1271
- };
1268
+ const apiToken = toAccessToken(exchanged);
1269
+ await ops.writeFull(withApiToken(credentials, apiToken));
1270
+ return apiToken;
1271
+ });
1272
+ },
1273
+ async establishAccessOnlySession(accessToken) {
1274
+ await withCredentialLock((ops) => ops.writeAccessOnly(accessToken));
1275
+ },
1276
+ async resolveApiToken(options) {
1277
+ const localOrInjected = resolveNonStoredToken(config, "dreamboard-api");
1278
+ if (localOrInjected) return localOrInjected;
1279
+ if (!usesStoredSession(config)) return null;
1280
+ const minValidityMs = options?.minValiditySeconds === void 0 ? DEFAULT_TOKEN_MIN_VALIDITY_MS : Math.max(0, options.minValiditySeconds * 1e3);
1281
+ return withCredentialLock(async (ops) => {
1282
+ const stored = await ops.read();
1283
+ return resolveStoredApiToken(ops, config, stored, minValidityMs);
1272
1284
  });
1273
1285
  },
1274
1286
  async resolveGitToken() {
1275
- if (!usesStoredSession(config) && config.authToken) {
1276
- const exchanged = await exchangeDreamboardUserToken({
1277
- apiBaseUrl: config.apiBaseUrl,
1278
- clerkAccessToken: config.authToken,
1279
- audience: "dreamboard-git"
1280
- });
1281
- return {
1282
- token: exchanged.accessToken,
1283
- expiresAt: exchanged.expiresAt,
1284
- audience: "dreamboard-git"
1285
- };
1286
- }
1287
+ const localOrInjected = resolveNonStoredToken(config, "dreamboard-git");
1288
+ if (localOrInjected) return localOrInjected;
1287
1289
  if (!usesStoredSession(config)) {
1288
- throw new Error(
1289
- "Missing Dreamboard session. Run `dreamboard auth login` to authenticate."
1290
+ throw missingSessionError();
1291
+ }
1292
+ return withCredentialLock(async (ops) => {
1293
+ const stored = await ops.read();
1294
+ const clerk = await resolveFreshClerkSession(ops, config, stored);
1295
+ return toAccessToken(
1296
+ await exchangeDreamboardUserToken({
1297
+ apiBaseUrl: config.apiBaseUrl,
1298
+ clerkAccessToken: clerk.accessToken,
1299
+ audience: "dreamboard-git"
1300
+ })
1290
1301
  );
1302
+ });
1303
+ },
1304
+ async inspectSession() {
1305
+ const localOrInjected = resolveNonStoredToken(config, "dreamboard-api");
1306
+ if (localOrInjected) {
1307
+ return inspectAccessOnlyToken(localOrInjected);
1308
+ }
1309
+ if (!usesStoredSession(config)) {
1310
+ return { kind: "none" };
1291
1311
  }
1292
1312
  return withCredentialLock(async (ops) => {
1293
1313
  const stored = await ops.read();
1294
- const clerk = await resolveFreshClerkAccessToken(config, stored);
1295
- const exchanged = await exchangeDreamboardUserToken({
1296
- apiBaseUrl: config.apiBaseUrl,
1297
- clerkAccessToken: clerk.accessToken,
1298
- audience: "dreamboard-git"
1299
- });
1300
- await ops.writeFull(clerk);
1301
- return {
1302
- token: exchanged.accessToken,
1303
- expiresAt: exchanged.expiresAt,
1304
- audience: "dreamboard-git"
1305
- };
1314
+ if (!stored) return { kind: "none" };
1315
+ const cached = freshStoredApiToken(
1316
+ stored,
1317
+ DEFAULT_TOKEN_MIN_VALIDITY_MS
1318
+ );
1319
+ if (cached) {
1320
+ return activeStatus("refreshable", cached, false);
1321
+ }
1322
+ try {
1323
+ const token = await resolveStoredApiToken(
1324
+ ops,
1325
+ config,
1326
+ stored,
1327
+ DEFAULT_TOKEN_MIN_VALIDITY_MS
1328
+ );
1329
+ return activeStatus("refreshable", token, true);
1330
+ } catch (error) {
1331
+ return failedRefreshableStatus(error);
1332
+ }
1306
1333
  });
1307
1334
  },
1308
1335
  async logout() {
1309
- await clearCredentials("user_token_manager_logout");
1336
+ await withCredentialLock((ops) => ops.clear("logout_command"));
1310
1337
  }
1311
1338
  };
1312
1339
  }
1340
+ async function resolveStoredApiToken(ops, config, stored, minValidityMs) {
1341
+ const cached = freshStoredApiToken(stored, minValidityMs);
1342
+ if (cached) return cached;
1343
+ const clerk = await resolveFreshClerkSession(ops, config, stored);
1344
+ const exchanged = await exchangeDreamboardUserToken({
1345
+ apiBaseUrl: config.apiBaseUrl,
1346
+ clerkAccessToken: clerk.accessToken,
1347
+ audience: "dreamboard-api"
1348
+ });
1349
+ const apiToken = toAccessToken(exchanged);
1350
+ await ops.writeFull(withApiToken(clerk, apiToken));
1351
+ return apiToken;
1352
+ }
1353
+ async function resolveFreshClerkSession(ops, config, stored) {
1354
+ if (!stored) {
1355
+ throw missingSessionError();
1356
+ }
1357
+ if (!stored.refreshToken) {
1358
+ throw new Error(
1359
+ "Stored Dreamboard session is missing its refresh token. Run `dreamboard auth login` to authenticate again."
1360
+ );
1361
+ }
1362
+ if (stored.accessToken && isFresh(
1363
+ stored.tokenExpiresAt,
1364
+ stored.accessToken,
1365
+ DEFAULT_TOKEN_MIN_VALIDITY_MS
1366
+ )) {
1367
+ return credentialsFromStored(config, stored);
1368
+ }
1369
+ const payload = await refreshClerkOAuthToken({
1370
+ config: {
1371
+ issuer: stored.clerkOAuthIssuer ?? config.clerkOAuthIssuer,
1372
+ clientId: stored.clerkOAuthClientId ?? config.clerkOAuthClientId,
1373
+ tokenUrl: stored.clerkOAuthTokenUrl ?? config.clerkOAuthTokenUrl
1374
+ },
1375
+ refreshToken: stored.refreshToken
1376
+ });
1377
+ const refreshed = {
1378
+ accessToken: payload.accessToken,
1379
+ refreshToken: payload.refreshToken,
1380
+ tokenExpiresAt: payload.expiresAt,
1381
+ dreamboardApiToken: stored.dreamboardApiToken,
1382
+ dreamboardApiExpiresAt: stored.dreamboardApiExpiresAt,
1383
+ clerkOAuthIssuer: stored.clerkOAuthIssuer ?? config.clerkOAuthIssuer,
1384
+ clerkOAuthClientId: stored.clerkOAuthClientId ?? config.clerkOAuthClientId,
1385
+ clerkOAuthTokenUrl: payload.tokenUrl,
1386
+ environment: stored.environment ?? config.environment
1387
+ };
1388
+ await ops.writeFull(refreshed);
1389
+ return refreshed;
1390
+ }
1391
+ function credentialsFromStored(config, stored) {
1392
+ if (!stored.accessToken || !stored.refreshToken) {
1393
+ throw missingSessionError();
1394
+ }
1395
+ return {
1396
+ accessToken: stored.accessToken,
1397
+ refreshToken: stored.refreshToken,
1398
+ tokenExpiresAt: stored.tokenExpiresAt,
1399
+ dreamboardApiToken: stored.dreamboardApiToken,
1400
+ dreamboardApiExpiresAt: stored.dreamboardApiExpiresAt,
1401
+ clerkOAuthIssuer: stored.clerkOAuthIssuer ?? config.clerkOAuthIssuer,
1402
+ clerkOAuthClientId: stored.clerkOAuthClientId ?? config.clerkOAuthClientId,
1403
+ clerkOAuthTokenUrl: stored.clerkOAuthTokenUrl ?? config.clerkOAuthTokenUrl,
1404
+ environment: stored.environment ?? config.environment
1405
+ };
1406
+ }
1407
+ function credentialsFromRefreshableSession(session) {
1408
+ return {
1409
+ accessToken: session.clerkAccessToken,
1410
+ refreshToken: session.refreshToken,
1411
+ tokenExpiresAt: session.clerkAccessExpiresAt,
1412
+ clerkOAuthIssuer: session.clerkOAuthIssuer,
1413
+ clerkOAuthClientId: session.clerkOAuthClientId,
1414
+ clerkOAuthTokenUrl: session.clerkOAuthTokenUrl,
1415
+ environment: session.environment
1416
+ };
1417
+ }
1418
+ function withApiToken(credentials, token) {
1419
+ return {
1420
+ ...credentials,
1421
+ dreamboardApiToken: token.token,
1422
+ dreamboardApiExpiresAt: token.expiresAt
1423
+ };
1424
+ }
1425
+ function toAccessToken(token) {
1426
+ return {
1427
+ token: token.accessToken,
1428
+ expiresAt: token.expiresAt,
1429
+ audience: token.audience
1430
+ };
1431
+ }
1313
1432
  function resolveNonStoredToken(config, audience) {
1314
1433
  if (usesStoredSession(config)) return null;
1315
1434
  if (!config.authToken) return null;
@@ -1319,9 +1438,13 @@ function resolveNonStoredToken(config, audience) {
1319
1438
  audience
1320
1439
  };
1321
1440
  }
1322
- function freshStoredApiToken(stored) {
1441
+ function freshStoredApiToken(stored, minValidityMs) {
1323
1442
  if (!stored?.dreamboardApiToken) return null;
1324
- if (isFresh(stored.dreamboardApiExpiresAt, stored.dreamboardApiToken)) {
1443
+ if (isFresh(
1444
+ stored.dreamboardApiExpiresAt,
1445
+ stored.dreamboardApiToken,
1446
+ minValidityMs
1447
+ )) {
1325
1448
  return {
1326
1449
  token: stored.dreamboardApiToken,
1327
1450
  expiresAt: stored.dreamboardApiExpiresAt,
@@ -1330,49 +1453,60 @@ function freshStoredApiToken(stored) {
1330
1453
  }
1331
1454
  return null;
1332
1455
  }
1333
- async function resolveFreshClerkAccessToken(config, stored) {
1334
- const accessToken = stored?.accessToken ?? config.clerkAccessToken;
1335
- const refreshToken = stored?.refreshToken ?? config.refreshToken;
1336
- const tokenExpiresAt = stored?.tokenExpiresAt ?? config.clerkAccessExpiresAt;
1337
- if (!refreshToken) {
1338
- throw new Error(
1339
- "Stored Dreamboard session is missing its refresh token. Run `dreamboard auth login` to authenticate again."
1340
- );
1341
- }
1342
- if (accessToken && isFresh(tokenExpiresAt, accessToken)) {
1456
+ function inspectAccessOnlyToken(token) {
1457
+ const expiry = resolveExpiry(token.expiresAt, token.token);
1458
+ if (expiry && expiry.getTime() <= Date.now()) {
1343
1459
  return {
1344
- accessToken,
1345
- refreshToken,
1346
- tokenExpiresAt,
1347
- dreamboardApiToken: stored?.dreamboardApiToken,
1348
- dreamboardApiExpiresAt: stored?.dreamboardApiExpiresAt,
1349
- clerkOAuthIssuer: stored?.clerkOAuthIssuer ?? config.clerkOAuthIssuer,
1350
- clerkOAuthClientId: stored?.clerkOAuthClientId ?? config.clerkOAuthClientId,
1351
- clerkOAuthTokenUrl: stored?.clerkOAuthTokenUrl ?? config.clerkOAuthTokenUrl,
1352
- environment: stored?.environment ?? config.environment
1460
+ kind: "invalid",
1461
+ sessionKind: "access-only",
1462
+ message: "Stored Dreamboard access token is expired. Run `dreamboard auth login` to authenticate again."
1353
1463
  };
1354
1464
  }
1355
- const payload = await refreshClerkOAuthToken({
1356
- config: {
1357
- issuer: stored?.clerkOAuthIssuer ?? config.clerkOAuthIssuer,
1358
- clientId: stored?.clerkOAuthClientId ?? config.clerkOAuthClientId,
1359
- tokenUrl: stored?.clerkOAuthTokenUrl ?? config.clerkOAuthTokenUrl
1360
- },
1361
- refreshToken
1465
+ return activeStatus("access-only", token, false);
1466
+ }
1467
+ function failedRefreshableStatus(error) {
1468
+ const message = error instanceof Error ? error.message : String(error);
1469
+ const errorStatus = typeof error === "object" && error !== null && "status" in error ? error.status : void 0;
1470
+ const classification = classifyRefreshError({
1471
+ message,
1472
+ status: typeof errorStatus === "number" ? errorStatus : void 0
1362
1473
  });
1474
+ if (classification.kind === "permanent_invalid") {
1475
+ return {
1476
+ kind: "invalid",
1477
+ sessionKind: "refreshable",
1478
+ message
1479
+ };
1480
+ }
1363
1481
  return {
1364
- accessToken: payload.accessToken,
1365
- refreshToken: payload.refreshToken,
1366
- tokenExpiresAt: payload.expiresAt,
1367
- clerkOAuthIssuer: stored?.clerkOAuthIssuer ?? config.clerkOAuthIssuer,
1368
- clerkOAuthClientId: stored?.clerkOAuthClientId ?? config.clerkOAuthClientId,
1369
- clerkOAuthTokenUrl: payload.tokenUrl,
1370
- environment: stored?.environment ?? config.environment
1482
+ kind: "degraded",
1483
+ sessionKind: "refreshable",
1484
+ message
1371
1485
  };
1372
1486
  }
1373
- function isFresh(expiresAt, token) {
1374
- const expiry = expiresAt ? new Date(expiresAt) : getJwtExpiry(token);
1375
- return expiry !== null && Number.isFinite(expiry.getTime()) && expiry.getTime() > Date.now() + TOKEN_REFRESH_WINDOW_MS;
1487
+ function activeStatus(sessionKind, apiToken, repaired) {
1488
+ return {
1489
+ kind: "active",
1490
+ sessionKind,
1491
+ apiToken,
1492
+ repaired
1493
+ };
1494
+ }
1495
+ function missingSessionError() {
1496
+ return new Error(
1497
+ "Missing Dreamboard session. Run `dreamboard auth login` to authenticate."
1498
+ );
1499
+ }
1500
+ function isFresh(expiresAt, token, minValidityMs) {
1501
+ const expiry = resolveExpiry(expiresAt, token);
1502
+ return expiry !== null && Number.isFinite(expiry.getTime()) && expiry.getTime() > Date.now() + minValidityMs;
1503
+ }
1504
+ function resolveExpiry(expiresAt, token) {
1505
+ if (expiresAt) {
1506
+ const parsed = new Date(expiresAt);
1507
+ return Number.isFinite(parsed.getTime()) ? parsed : null;
1508
+ }
1509
+ return getJwtExpiry(token);
1376
1510
  }
1377
1511
  function getJwtExpiry(accessToken) {
1378
1512
  if (!accessToken) return null;
@@ -1479,7 +1613,6 @@ function isLocalAwsUrl(rawUrl) {
1479
1613
  }
1480
1614
 
1481
1615
  // src/config/resolve.ts
1482
- var DEFAULT_REFRESH_WINDOW_MS = 5 * 60 * 1e3;
1483
1616
  var TRANSIENT_READ_RETRY_DELAYS_MS = [100, 300];
1484
1617
  function resolveConfig(globalConfig, flags, project, credentials) {
1485
1618
  if (IS_PUBLISHED_BUILD) {
@@ -1618,7 +1751,7 @@ function assertPublicRuntimeFlags(flags) {
1618
1751
  }
1619
1752
  async function configureClient(config) {
1620
1753
  const localHarnessToken = resolveLocalHarnessAccessToken(config);
1621
- const resolvedToken = localHarnessToken ? { token: localHarnessToken } : await createUserTokenManager(config).resolveApiToken();
1754
+ const resolvedToken = localHarnessToken ? { token: localHarnessToken } : await createUserSessionManager(config).resolveApiToken();
1622
1755
  const effectiveAccessToken = resolvedToken?.token;
1623
1756
  client.setConfig({
1624
1757
  baseUrl: config.apiBaseUrl,
@@ -1879,7 +2012,7 @@ Usage:
1879
2012
  }
1880
2013
  async function materializePreparedWorkspace(args) {
1881
2014
  const inputPath = readRequiredOption(args, "--input");
1882
- const { materializeWorkspaceProject } = await import("./materialize-workspace-K4WYFG5E.mjs");
2015
+ const { materializeWorkspaceProject } = await import("./materialize-workspace-MAGKDMK5.mjs");
1883
2016
  const input = JSON.parse(await readFile(inputPath, "utf8"));
1884
2017
  await materializeWorkspaceProject({
1885
2018
  ...input,
@@ -1947,7 +2080,7 @@ async function runCloudLocalVerification(projectRoot, projectConfig, config) {
1947
2080
  { assertReducerContractPreflight },
1948
2081
  { getProjectLocalMaintainerRegistry }
1949
2082
  ] = await Promise.all([
1950
- import("./static-scaffold-MHVM63HU.mjs"),
2083
+ import("./static-scaffold-CLRRWXON.mjs"),
1951
2084
  import("./local-files-OF4QFISU.mjs"),
1952
2085
  import("./workspace-codegen-SPPVHURX.mjs"),
1953
2086
  import("./workspace-dependencies-5HEEKZFP.mjs"),