@dreamboard-games/cli 0.1.30-alpha.4 → 0.1.30-alpha.40
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 +32 -113
- package/dist/agent-verifier/agent-workspace-verifier.mjs +2084 -57
- package/dist/agent-verifier/agent-workspace-verifier.mjs.map +1 -1
- package/dist/agent-verifier/{chunk-XQXDOBYB.mjs → chunk-4I2WWAPK.mjs} +27 -10
- package/dist/agent-verifier/chunk-4I2WWAPK.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-C3VW3DTA.mjs → chunk-BWBN2TDJ.mjs} +535 -633
- package/dist/agent-verifier/chunk-BWBN2TDJ.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-TAEQKBJB.mjs → chunk-GWRZRWCF.mjs} +1 -1
- package/dist/agent-verifier/chunk-GWRZRWCF.mjs.map +1 -0
- package/dist/agent-verifier/chunk-HUBV22JQ.mjs +89 -0
- package/dist/agent-verifier/chunk-HUBV22JQ.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-MW2QIWWA.mjs → chunk-KAA3B4DI.mjs} +215 -223
- package/dist/agent-verifier/chunk-KAA3B4DI.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-27EEIZCI.mjs → chunk-KDAQ4CZY.mjs} +34 -27
- package/dist/agent-verifier/chunk-KDAQ4CZY.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-IAYRNVUC.mjs → chunk-LMW66VBH.mjs} +2 -13
- package/dist/agent-verifier/{chunk-IAYRNVUC.mjs.map → chunk-LMW66VBH.mjs.map} +1 -1
- package/dist/agent-verifier/{chunk-776W3UGV.mjs → chunk-LROY5SN2.mjs} +7 -45
- package/dist/agent-verifier/chunk-LROY5SN2.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-H76MT5UR.mjs → chunk-M7UVBANQ.mjs} +2 -1
- package/dist/agent-verifier/chunk-M7UVBANQ.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-5NYBTZB4.mjs → chunk-MIRGCMUC.mjs} +112 -26
- package/dist/agent-verifier/chunk-MIRGCMUC.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-NAK77WXW.mjs → chunk-MYMVXTZT.mjs} +4 -5
- package/dist/agent-verifier/chunk-MYMVXTZT.mjs.map +1 -0
- package/dist/agent-verifier/chunk-OJFZVGEL.mjs +492 -0
- package/dist/agent-verifier/chunk-OJFZVGEL.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-XKCJBIRY.mjs → chunk-QD4SQNUP.mjs} +2 -2
- package/dist/agent-verifier/{chunk-QBAF7EYR.mjs → chunk-TTB7AIHZ.mjs} +4 -4
- package/dist/agent-verifier/{chunk-QBAF7EYR.mjs.map → chunk-TTB7AIHZ.mjs.map} +1 -1
- package/dist/agent-verifier/{chunk-F2DIOJJZ.mjs → chunk-XCQQIPCO.mjs} +5 -46
- package/dist/agent-verifier/chunk-XCQQIPCO.mjs.map +1 -0
- package/dist/agent-verifier/{global-config-NYCSCAUI.mjs → global-config-2NUESNEQ.mjs} +5 -5
- package/dist/agent-verifier/{keychain-backend-A3MRWLPF.mjs → keychain-backend-FF4I6ODB.mjs} +11 -6
- package/dist/agent-verifier/keychain-backend-FF4I6ODB.mjs.map +1 -0
- package/dist/agent-verifier/{local-files-QVJ2H3MH.mjs → local-files-OF4QFISU.mjs} +8 -8
- package/dist/agent-verifier/{chunk-UIOLGH4A.mjs → local-typecheck-DHVLM37Z.mjs} +4 -4
- package/dist/agent-verifier/local-typecheck-DHVLM37Z.mjs.map +1 -0
- package/dist/agent-verifier/{materialize-workspace-OZKOQCSQ.mjs → materialize-workspace-JBDL6LF4.mjs} +22 -22
- package/dist/agent-verifier/materialize-workspace-JBDL6LF4.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-Z6OZWUIZ.mjs → reducer-bundle-preflight-GLUJKTWU.mjs} +75 -24
- package/dist/agent-verifier/reducer-bundle-preflight-GLUJKTWU.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-YDIOW2BO.mjs → reducer-contract-preflight-WVQQPW5F.mjs} +7 -6
- package/dist/agent-verifier/reducer-contract-preflight-WVQQPW5F.mjs.map +1 -0
- package/dist/agent-verifier/{chunk-ON62IGWK.mjs → reducer-native-test-harness-XQUPIT5D.mjs} +480 -703
- package/dist/agent-verifier/reducer-native-test-harness-XQUPIT5D.mjs.map +1 -0
- package/dist/agent-verifier/static-scaffold-U5DXE23S.mjs +24 -0
- package/dist/agent-verifier/{workspace-codegen-WPZHMATU.mjs → workspace-codegen-SPPVHURX.mjs} +3 -3
- package/dist/agent-verifier/{workspace-dependencies-B6A2ZX55.mjs → workspace-dependencies-5HEEKZFP.mjs} +5 -3
- package/dist/authoring-compatibility-internal.js +12 -0
- package/dist/chunk-5IYJOVUA.js +3902 -0
- package/dist/chunk-5IYJOVUA.js.map +1 -0
- package/dist/chunk-6NYVJYN4.js +313 -0
- package/dist/chunk-6NYVJYN4.js.map +1 -0
- package/dist/chunk-EQNBQVIW.js +204 -0
- package/dist/chunk-EQNBQVIW.js.map +1 -0
- package/dist/{chunk-M4SCKH5M.js → chunk-USZAPMQ4.js} +2488 -4993
- package/dist/chunk-USZAPMQ4.js.map +1 -0
- package/dist/{global-config-YBFEGJQG.js → global-config-RBMW7IVA.js} +3 -2
- package/dist/index.js +3099 -6188
- package/dist/index.js.map +1 -1
- package/dist/internal.js +35 -9
- package/dist/internal.js.map +1 -1
- package/dist/{keychain-backend-JHTXAKWC.js → keychain-backend-FSNTNTZE.js} +11 -6
- package/dist/keychain-backend-FSNTNTZE.js.map +1 -0
- package/package.json +9 -19
- package/release/authoring-release-set.json +38 -0
- package/skills/dreamboard/SKILL.md +32 -30
- package/skills/dreamboard/references/building-your-first-game.md +16 -16
- package/skills/dreamboard/references/cli.md +54 -54
- package/skills/dreamboard/references/manifest-authoring.md +11 -3
- package/skills/dreamboard/references/quickstart.md +19 -16
- package/skills/dreamboard/references/testing.md +6 -13
- package/dist/agent-verifier/chunk-27EEIZCI.mjs.map +0 -1
- package/dist/agent-verifier/chunk-5NYBTZB4.mjs.map +0 -1
- package/dist/agent-verifier/chunk-776W3UGV.mjs.map +0 -1
- package/dist/agent-verifier/chunk-C3VW3DTA.mjs.map +0 -1
- package/dist/agent-verifier/chunk-F2DIOJJZ.mjs.map +0 -1
- package/dist/agent-verifier/chunk-G42BGGG2.mjs +0 -70
- package/dist/agent-verifier/chunk-G42BGGG2.mjs.map +0 -1
- package/dist/agent-verifier/chunk-H76MT5UR.mjs.map +0 -1
- package/dist/agent-verifier/chunk-IDVQXGAO.mjs +0 -222
- package/dist/agent-verifier/chunk-IDVQXGAO.mjs.map +0 -1
- package/dist/agent-verifier/chunk-JO5AMVZU.mjs +0 -1744
- package/dist/agent-verifier/chunk-JO5AMVZU.mjs.map +0 -1
- package/dist/agent-verifier/chunk-KDBSVLCF.mjs +0 -624
- package/dist/agent-verifier/chunk-KDBSVLCF.mjs.map +0 -1
- package/dist/agent-verifier/chunk-MW2QIWWA.mjs.map +0 -1
- package/dist/agent-verifier/chunk-NAK77WXW.mjs.map +0 -1
- package/dist/agent-verifier/chunk-ON62IGWK.mjs.map +0 -1
- package/dist/agent-verifier/chunk-QZH6IEZS.mjs +0 -39
- package/dist/agent-verifier/chunk-QZH6IEZS.mjs.map +0 -1
- package/dist/agent-verifier/chunk-TAEQKBJB.mjs.map +0 -1
- package/dist/agent-verifier/chunk-UIOLGH4A.mjs.map +0 -1
- package/dist/agent-verifier/chunk-XQXDOBYB.mjs.map +0 -1
- package/dist/agent-verifier/chunk-YDIOW2BO.mjs.map +0 -1
- package/dist/agent-verifier/chunk-Z6OZWUIZ.mjs.map +0 -1
- package/dist/agent-verifier/compile-576O7TYP.mjs +0 -312
- package/dist/agent-verifier/compile-576O7TYP.mjs.map +0 -1
- package/dist/agent-verifier/keychain-backend-A3MRWLPF.mjs.map +0 -1
- package/dist/agent-verifier/local-typecheck-2JWG5IGL.mjs +0 -10
- package/dist/agent-verifier/materialize-workspace-OZKOQCSQ.mjs.map +0 -1
- package/dist/agent-verifier/reducer-bundle-preflight-7NYZF5ZT.mjs +0 -20
- package/dist/agent-verifier/reducer-contract-preflight-COD2CO22.mjs +0 -11
- package/dist/agent-verifier/reducer-native-test-harness-QC7HZUK4.mjs +0 -50
- package/dist/agent-verifier/static-scaffold-JBUE3ROP.mjs +0 -27
- package/dist/agent-verifier/sync-C6S3OGCD.mjs +0 -588
- package/dist/agent-verifier/sync-C6S3OGCD.mjs.map +0 -1
- package/dist/agent-verifier/test-Y5UGQV7J.mjs +0 -353
- package/dist/agent-verifier/test-Y5UGQV7J.mjs.map +0 -1
- package/dist/agent-verifier/workspace-codegen-WPZHMATU.mjs.map +0 -1
- package/dist/agent-verifier/workspace-dependencies-B6A2ZX55.mjs.map +0 -1
- package/dist/chunk-3NRROR4P.js +0 -432
- package/dist/chunk-3NRROR4P.js.map +0 -1
- package/dist/chunk-M4SCKH5M.js.map +0 -1
- package/dist/dev-host/components/drawer.tsx +0 -132
- package/dist/dev-host/components/input.tsx +0 -21
- package/dist/dev-host/dev-api-proxy-plugin.ts +0 -328
- package/dist/dev-host/dev-author-dom-warnings.ts +0 -100
- package/dist/dev-host/dev-diagnostics.ts +0 -62
- package/dist/dev-host/dev-fallback-stylesheet.ts +0 -53
- package/dist/dev-host/dev-hmr-guard-plugin.ts +0 -47
- package/dist/dev-host/dev-host-controller.ts +0 -674
- package/dist/dev-host/dev-host-player-query.ts +0 -17
- package/dist/dev-host/dev-host-session-transport.ts +0 -52
- package/dist/dev-host/dev-host-storage.ts +0 -56
- package/dist/dev-host/dev-log-relay-plugin.ts +0 -510
- package/dist/dev-host/dev-runtime-config.ts +0 -14
- package/dist/dev-host/dev-runtime-platform.ts +0 -335
- package/dist/dev-host/dev-virtual-modules-plugin.ts +0 -64
- package/dist/dev-host/host-main.css +0 -224
- package/dist/dev-host/host-main.tsx +0 -948
- package/dist/dev-host/index.html +0 -56
- package/dist/dev-host/lib/utils.ts +0 -6
- package/dist/dev-host/plugin-main.ts +0 -61
- package/dist/dev-host/plugin.html +0 -24
- package/dist/dev-host/shared-styles.css +0 -144
- package/dist/dev-host/start-dev-server.ts +0 -140
- package/dist/dev-host/virtual-modules.d.ts +0 -27
- package/dist/global-config-YBFEGJQG.js.map +0 -1
- package/dist/keychain-backend-JHTXAKWC.js.map +0 -1
- package/skills/dreamboard/scripts/events-extract.mjs +0 -218
- /package/dist/agent-verifier/{chunk-XKCJBIRY.mjs.map → chunk-QD4SQNUP.mjs.map} +0 -0
- /package/dist/agent-verifier/{global-config-NYCSCAUI.mjs.map → global-config-2NUESNEQ.mjs.map} +0 -0
- /package/dist/agent-verifier/{local-files-QVJ2H3MH.mjs.map → local-files-OF4QFISU.mjs.map} +0 -0
- /package/dist/agent-verifier/{local-typecheck-2JWG5IGL.mjs.map → static-scaffold-U5DXE23S.mjs.map} +0 -0
- /package/dist/agent-verifier/{reducer-bundle-preflight-7NYZF5ZT.mjs.map → workspace-codegen-SPPVHURX.mjs.map} +0 -0
- /package/dist/agent-verifier/{reducer-contract-preflight-COD2CO22.mjs.map → workspace-dependencies-5HEEKZFP.mjs.map} +0 -0
- /package/dist/{agent-verifier/reducer-native-test-harness-QC7HZUK4.mjs.map → authoring-compatibility-internal.js.map} +0 -0
- /package/dist/{agent-verifier/static-scaffold-JBUE3ROP.mjs.map → global-config-RBMW7IVA.js.map} +0 -0
- /package/{dist/scaffold → scaffold}/assets/static/app/tsconfig.framework.json +0 -0
- /package/{dist/scaffold → scaffold}/assets/static/app/tsconfig.json +0 -0
- /package/{dist/scaffold → scaffold}/assets/static/ui/index.tsx +0 -0
- /package/{dist/scaffold → scaffold}/assets/static/ui/style.css +0 -0
- /package/{dist/scaffold → scaffold}/assets/static/ui/tsconfig.framework.json +0 -0
- /package/{dist/scaffold → scaffold}/assets/static/ui/tsconfig.json +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/build-target.ts","../src/auth/refresh-error.ts","../src/auth/clerk-oauth.ts","../src/auth/token-exchange.ts","../src/auth/user-session-manager.ts","../src/config/local-harness-auth.ts","../src/config/resolve.ts","../src/flags.ts","../src/command-args.ts","../src/utils/problem-types.ts","../src/utils/errors.ts","../src/utils/strings.ts","../src/services/api/compiled-results-api.ts","../src/services/testing/reducer-native-test-harness.ts","../src/utils/ts-module-loader.ts","../src/services/gameplay-authority-submit.ts","../../../node_modules/.pnpm/@dreamboard-games+gameplay-authority-protocol@0.1.0-alpha.0/node_modules/@dreamboard-games/gameplay-authority-protocol/dist/frames.js","../../../node_modules/.pnpm/@dreamboard-games+gameplay-authority-client@0.1.0-alpha.1/node_modules/@dreamboard-games/gameplay-authority-client/dist/index.js","../src/services/workflows/resolve-setup-profile.ts","../src/utils/session-game-source.ts","../src/services/project/local-maintainer-registry-shared.ts"],"sourcesContent":["declare const __DREAMBOARD_BUILD_CHANNEL__: string | undefined;\ndeclare const __DREAMBOARD_PACKAGE_VERSION__: string | undefined;\n\nconst injectedBuildChannel =\n typeof __DREAMBOARD_BUILD_CHANNEL__ === \"string\"\n ? __DREAMBOARD_BUILD_CHANNEL__\n : undefined;\nconst injectedPackageVersion =\n typeof __DREAMBOARD_PACKAGE_VERSION__ === \"string\"\n ? __DREAMBOARD_PACKAGE_VERSION__\n : undefined;\n\nexport const BUILD_CHANNEL =\n injectedBuildChannel === \"published\" ? \"published\" : \"development\";\nexport const PACKAGE_VERSION = injectedPackageVersion ?? \"0.0.0-development\";\n\nexport function isAlphaReleaseVersion(version: string): boolean {\n return /(?:^|-|\\.)alpha(?:$|-|\\.)/.test(version);\n}\n\nexport const IS_PUBLISHED_BUILD = BUILD_CHANNEL === \"published\";\nexport const IS_ALPHA_RELEASE = isAlphaReleaseVersion(PACKAGE_VERSION);\nexport const CAN_SELECT_ENVIRONMENT =\n !IS_PUBLISHED_BUILD || IS_ALPHA_RELEASE;\nexport const PUBLISHED_ENVIRONMENT = \"prod\" as const;\n","export type RefreshErrorKind = \"permanent_invalid\" | \"transient\" | \"unknown\";\n\nexport type ClassifiedRefreshError = {\n kind: RefreshErrorKind;\n reason?: string;\n};\n\nexport function classifyRefreshError(error: {\n message?: string;\n status?: number;\n}): ClassifiedRefreshError {\n const message = error.message?.toLowerCase() ?? \"\";\n if (\n error.status === 400 ||\n error.status === 401 ||\n message.includes(\"invalid_grant\") ||\n message.includes(\"refresh token\") ||\n message.includes(\"expired\") ||\n message.includes(\"revoked\")\n ) {\n return { kind: \"permanent_invalid\", reason: error.message };\n }\n if (\n error.status === 408 ||\n error.status === 429 ||\n (typeof error.status === \"number\" && error.status >= 500) ||\n message.includes(\"timeout\") ||\n message.includes(\"network\") ||\n message.includes(\"fetch failed\")\n ) {\n return { kind: \"transient\", reason: error.message };\n }\n return { kind: \"unknown\", reason: error.message };\n}\n","import crypto from \"node:crypto\";\n\nexport type ClerkOAuthConfig = {\n issuer?: string;\n clientId?: string;\n tokenUrl?: string;\n scope?: string;\n};\n\nexport type ClerkOAuthTokenResponse = {\n accessToken: string;\n refreshToken: string;\n expiresAt?: string;\n tokenUrl: string;\n};\n\nexport function createPkcePair(): { verifier: string; challenge: string } {\n const verifier = base64Url(crypto.randomBytes(32));\n const challenge = base64Url(\n crypto.createHash(\"sha256\").update(verifier).digest(),\n );\n return { verifier, challenge };\n}\n\nexport function buildClerkAuthorizationUrl(input: {\n config: ClerkOAuthConfig;\n redirectUri: string;\n state: string;\n codeChallenge: string;\n}): URL {\n const { issuer, clientId, scope } = assertConfigured(input.config);\n const url = new URL(\"/oauth/authorize\", issuer);\n url.searchParams.set(\"response_type\", \"code\");\n url.searchParams.set(\"client_id\", clientId);\n url.searchParams.set(\"redirect_uri\", input.redirectUri);\n url.searchParams.set(\"state\", input.state);\n url.searchParams.set(\"code_challenge\", input.codeChallenge);\n url.searchParams.set(\"code_challenge_method\", \"S256\");\n url.searchParams.set(\"scope\", scope ?? \"openid profile email offline_access\");\n return url;\n}\n\nexport async function exchangeClerkOAuthCode(input: {\n config: ClerkOAuthConfig;\n code: string;\n redirectUri: string;\n codeVerifier: string;\n}): Promise<ClerkOAuthTokenResponse> {\n const { clientId, tokenUrl } = assertConfigured(input.config);\n const body = new URLSearchParams({\n grant_type: \"authorization_code\",\n client_id: clientId,\n code: input.code,\n redirect_uri: input.redirectUri,\n code_verifier: input.codeVerifier,\n });\n return requestClerkToken(tokenUrl, body);\n}\n\nexport async function refreshClerkOAuthToken(input: {\n config: ClerkOAuthConfig;\n refreshToken: string;\n}): Promise<ClerkOAuthTokenResponse> {\n const { clientId, tokenUrl } = assertConfigured(input.config);\n const body = new URLSearchParams({\n grant_type: \"refresh_token\",\n client_id: clientId,\n refresh_token: input.refreshToken,\n });\n return requestClerkToken(tokenUrl, body);\n}\n\nfunction assertConfigured(config: ClerkOAuthConfig): {\n issuer: string;\n clientId: string;\n tokenUrl: string;\n scope?: string;\n} {\n const issuer = config.issuer?.trim().replace(/\\/$/, \"\");\n const clientId = config.clientId?.trim();\n if (!issuer || !clientId) {\n throw new Error(\n [\n \"Clerk OAuth CLI is not configured for this environment.\",\n \"The CLI expects first-party environments to be configured in its built-in registry.\",\n \"If this environment has no registered public Clerk OAuth client, create one and release a CLI with its client id.\",\n \"For emergency overrides, set the environment-specific DREAMBOARD_<ENV>_CLERK_OAUTH_* variables or DREAMBOARD_CLERK_OAUTH_*.\",\n \"For local harness auth, use `pnpm auth:local` or the auto-bootstrapped local harness flows instead.\",\n ].join(\" \"),\n );\n }\n return {\n issuer,\n clientId,\n tokenUrl:\n config.tokenUrl?.trim() || new URL(\"/oauth/token\", issuer).toString(),\n scope: config.scope?.trim() || undefined,\n };\n}\n\nasync function requestClerkToken(\n tokenUrl: string,\n body: URLSearchParams,\n): Promise<ClerkOAuthTokenResponse> {\n const response = await fetch(tokenUrl, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n Accept: \"application/json\",\n },\n body,\n });\n if (!response.ok) {\n const detail = await response.text();\n throw new Error(\n `Clerk OAuth token request failed (${response.status}): ${detail}`,\n );\n }\n const payload = (await response.json()) as {\n access_token?: unknown;\n refresh_token?: unknown;\n expires_in?: unknown;\n };\n if (typeof payload.access_token !== \"string\") {\n throw new Error(\"Clerk OAuth token response did not include access_token.\");\n }\n if (typeof payload.refresh_token !== \"string\") {\n throw new Error(\n \"Clerk OAuth token response did not include refresh_token.\",\n );\n }\n const expiresAt =\n typeof payload.expires_in === \"number\"\n ? new Date(Date.now() + payload.expires_in * 1000).toISOString()\n : undefined;\n return {\n accessToken: payload.access_token,\n refreshToken: payload.refresh_token,\n expiresAt,\n tokenUrl,\n };\n}\n\nfunction base64Url(bytes: Buffer): string {\n return bytes\n .toString(\"base64\")\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/g, \"\");\n}\n","export type DreamboardTokenAudience = \"dreamboard-api\" | \"dreamboard-git\";\n\nexport type DreamboardTokenResponse = {\n accessToken: string;\n tokenType: \"Bearer\";\n audience: DreamboardTokenAudience;\n expiresIn?: number;\n expiresAt?: string;\n};\n\nexport async function exchangeDreamboardUserToken(input: {\n apiBaseUrl: string;\n clerkAccessToken: string;\n audience: DreamboardTokenAudience;\n fetchImpl?: typeof fetch;\n}): Promise<DreamboardTokenResponse> {\n const fetchImpl = input.fetchImpl ?? globalThis.fetch.bind(globalThis);\n const response = await fetchImpl(\n new URL(\"/api/auth/token-exchange\", input.apiBaseUrl),\n {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${input.clerkAccessToken}`,\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n },\n body: JSON.stringify({ audience: input.audience }),\n },\n );\n\n if (!response.ok) {\n throw new Error(\n `Dreamboard token exchange failed (${response.status}). Run \\`dreamboard auth login\\` to authenticate again.`,\n );\n }\n\n const payload = (await response.json()) as {\n accessToken?: unknown;\n tokenType?: unknown;\n audience?: unknown;\n expiresIn?: unknown;\n };\n\n if (typeof payload.accessToken !== \"string\" || payload.accessToken === \"\") {\n throw new Error(\"Dreamboard token exchange response omitted accessToken.\");\n }\n if (payload.tokenType !== \"Bearer\") {\n throw new Error(\n \"Dreamboard token exchange response had invalid tokenType.\",\n );\n }\n if (payload.audience !== input.audience) {\n throw new Error(\"Dreamboard token exchange response had wrong audience.\");\n }\n\n const expiresIn =\n typeof payload.expiresIn === \"number\" && Number.isFinite(payload.expiresIn)\n ? payload.expiresIn\n : undefined;\n\n return {\n accessToken: payload.accessToken,\n tokenType: \"Bearer\",\n audience: input.audience,\n expiresIn,\n expiresAt:\n expiresIn === undefined\n ? undefined\n : new Date(Date.now() + expiresIn * 1000).toISOString(),\n };\n}\n","import type {\n AccessToken,\n RefreshableUserSession,\n UserSessionManager,\n UserSessionStatus,\n} from \"@dreamboard-games/cli-core\";\nimport {\n type CredentialLockOps,\n type Credentials,\n type StoredSessionSnapshot,\n withCredentialLock,\n} from \"../config/credential-store.js\";\nimport type { ResolvedConfig } from \"../types.js\";\nimport { refreshClerkOAuthToken } from \"./clerk-oauth.js\";\nimport { classifyRefreshError } from \"./refresh-error.js\";\nimport {\n exchangeDreamboardUserToken,\n type DreamboardTokenAudience,\n} from \"./token-exchange.js\";\n\nconst DEFAULT_TOKEN_MIN_VALIDITY_MS = 60 * 1000;\n\nexport function createUserSessionManager(\n config: ResolvedConfig,\n): UserSessionManager {\n return {\n async establishRefreshableSession(session) {\n return withCredentialLock(async (ops) => {\n const credentials = credentialsFromRefreshableSession(session);\n\n // The Clerk refresh token is the durable session authority. Persist it\n // before exchanging derived audience tokens so a transient Dreamboard\n // API failure cannot discard a newly established login.\n await ops.writeFull(credentials);\n\n const exchanged = await exchangeDreamboardUserToken({\n apiBaseUrl: config.apiBaseUrl,\n clerkAccessToken: credentials.accessToken,\n audience: \"dreamboard-api\",\n });\n const apiToken = toAccessToken(exchanged);\n await ops.writeFull(withApiToken(credentials, apiToken));\n return apiToken;\n });\n },\n\n async establishAccessOnlySession(accessToken) {\n await withCredentialLock((ops) => ops.writeAccessOnly(accessToken));\n },\n\n async resolveApiToken(options) {\n const localOrInjected = resolveNonStoredToken(config, \"dreamboard-api\");\n if (localOrInjected) return localOrInjected;\n if (!usesStoredSession(config)) return null;\n\n const minValidityMs =\n options?.minValiditySeconds === undefined\n ? DEFAULT_TOKEN_MIN_VALIDITY_MS\n : Math.max(0, options.minValiditySeconds * 1000);\n\n return withCredentialLock(async (ops) => {\n const stored = await ops.read();\n return resolveStoredApiToken(ops, config, stored, minValidityMs);\n });\n },\n\n async resolveGitToken() {\n const localOrInjected = resolveNonStoredToken(config, \"dreamboard-git\");\n if (localOrInjected) return localOrInjected;\n if (!usesStoredSession(config)) {\n throw missingSessionError();\n }\n\n return withCredentialLock(async (ops) => {\n const stored = await ops.read();\n const clerk = await resolveFreshClerkSession(ops, config, stored);\n return toAccessToken(\n await exchangeDreamboardUserToken({\n apiBaseUrl: config.apiBaseUrl,\n clerkAccessToken: clerk.accessToken,\n audience: \"dreamboard-git\",\n }),\n );\n });\n },\n\n async inspectSession() {\n const localOrInjected = resolveNonStoredToken(config, \"dreamboard-api\");\n if (localOrInjected) {\n return inspectAccessOnlyToken(localOrInjected);\n }\n if (!usesStoredSession(config)) {\n return { kind: \"none\" };\n }\n\n return withCredentialLock(async (ops) => {\n const stored = await ops.read();\n if (!stored) return { kind: \"none\" };\n\n const cached = freshStoredApiToken(\n stored,\n DEFAULT_TOKEN_MIN_VALIDITY_MS,\n );\n if (cached) {\n return activeStatus(\"refreshable\", cached, false);\n }\n\n try {\n const token = await resolveStoredApiToken(\n ops,\n config,\n stored,\n DEFAULT_TOKEN_MIN_VALIDITY_MS,\n );\n return activeStatus(\"refreshable\", token, true);\n } catch (error) {\n return failedRefreshableStatus(error);\n }\n });\n },\n\n async logout() {\n await withCredentialLock((ops) => ops.clear(\"logout_command\"));\n },\n };\n}\n\nasync function resolveStoredApiToken(\n ops: CredentialLockOps,\n config: ResolvedConfig,\n stored: StoredSessionSnapshot | null,\n minValidityMs: number,\n): Promise<AccessToken> {\n const cached = freshStoredApiToken(stored, minValidityMs);\n if (cached) return cached;\n\n const clerk = await resolveFreshClerkSession(ops, config, stored);\n const exchanged = await exchangeDreamboardUserToken({\n apiBaseUrl: config.apiBaseUrl,\n clerkAccessToken: clerk.accessToken,\n audience: \"dreamboard-api\",\n });\n const apiToken = toAccessToken(exchanged);\n await ops.writeFull(withApiToken(clerk, apiToken));\n return apiToken;\n}\n\nasync function resolveFreshClerkSession(\n ops: CredentialLockOps,\n config: ResolvedConfig,\n stored: StoredSessionSnapshot | null,\n): Promise<Credentials> {\n if (!stored) {\n throw missingSessionError();\n }\n if (!stored.refreshToken) {\n throw new Error(\n \"Stored Dreamboard session is missing its refresh token. Run `dreamboard auth login` to authenticate again.\",\n );\n }\n\n if (\n stored.accessToken &&\n isFresh(\n stored.tokenExpiresAt,\n stored.accessToken,\n DEFAULT_TOKEN_MIN_VALIDITY_MS,\n )\n ) {\n return credentialsFromStored(config, stored);\n }\n\n const payload = await refreshClerkOAuthToken({\n config: {\n issuer: stored.clerkOAuthIssuer ?? config.clerkOAuthIssuer,\n clientId: stored.clerkOAuthClientId ?? config.clerkOAuthClientId,\n tokenUrl: stored.clerkOAuthTokenUrl ?? config.clerkOAuthTokenUrl,\n },\n refreshToken: stored.refreshToken,\n });\n const refreshed: Credentials = {\n accessToken: payload.accessToken,\n refreshToken: payload.refreshToken,\n tokenExpiresAt: payload.expiresAt,\n dreamboardApiToken: stored.dreamboardApiToken,\n dreamboardApiExpiresAt: stored.dreamboardApiExpiresAt,\n clerkOAuthIssuer: stored.clerkOAuthIssuer ?? config.clerkOAuthIssuer,\n clerkOAuthClientId: stored.clerkOAuthClientId ?? config.clerkOAuthClientId,\n clerkOAuthTokenUrl: payload.tokenUrl,\n environment: stored.environment ?? config.environment,\n };\n\n // OAuth refresh tokens may rotate. Save the refreshed Clerk layer before\n // any audience exchange, while retaining derived token caches.\n await ops.writeFull(refreshed);\n return refreshed;\n}\n\nfunction credentialsFromStored(\n config: ResolvedConfig,\n stored: StoredSessionSnapshot,\n): Credentials {\n if (!stored.accessToken || !stored.refreshToken) {\n throw missingSessionError();\n }\n return {\n accessToken: stored.accessToken,\n refreshToken: stored.refreshToken,\n tokenExpiresAt: stored.tokenExpiresAt,\n dreamboardApiToken: stored.dreamboardApiToken,\n dreamboardApiExpiresAt: stored.dreamboardApiExpiresAt,\n clerkOAuthIssuer: stored.clerkOAuthIssuer ?? config.clerkOAuthIssuer,\n clerkOAuthClientId: stored.clerkOAuthClientId ?? config.clerkOAuthClientId,\n clerkOAuthTokenUrl: stored.clerkOAuthTokenUrl ?? config.clerkOAuthTokenUrl,\n environment: stored.environment ?? config.environment,\n };\n}\n\nfunction credentialsFromRefreshableSession(\n session: RefreshableUserSession,\n): Credentials {\n return {\n accessToken: session.clerkAccessToken,\n refreshToken: session.refreshToken,\n tokenExpiresAt: session.clerkAccessExpiresAt,\n clerkOAuthIssuer: session.clerkOAuthIssuer,\n clerkOAuthClientId: session.clerkOAuthClientId,\n clerkOAuthTokenUrl: session.clerkOAuthTokenUrl,\n environment: session.environment,\n };\n}\n\nfunction withApiToken(\n credentials: Credentials,\n token: AccessToken,\n): Credentials {\n return {\n ...credentials,\n dreamboardApiToken: token.token,\n dreamboardApiExpiresAt: token.expiresAt,\n };\n}\n\nfunction toAccessToken(token: {\n accessToken: string;\n expiresAt?: string;\n audience: DreamboardTokenAudience;\n}): AccessToken {\n return {\n token: token.accessToken,\n expiresAt: token.expiresAt,\n audience: token.audience,\n };\n}\n\nfunction resolveNonStoredToken(\n config: ResolvedConfig,\n audience: DreamboardTokenAudience,\n): AccessToken | null {\n if (usesStoredSession(config)) return null;\n if (!config.authToken) return null;\n return {\n token: config.authToken,\n expiresAt: config.tokenExpiresAt,\n audience,\n };\n}\n\nfunction freshStoredApiToken(\n stored: StoredSessionSnapshot | null,\n minValidityMs: number,\n): AccessToken | null {\n if (!stored?.dreamboardApiToken) return null;\n if (\n isFresh(\n stored.dreamboardApiExpiresAt,\n stored.dreamboardApiToken,\n minValidityMs,\n )\n ) {\n return {\n token: stored.dreamboardApiToken,\n expiresAt: stored.dreamboardApiExpiresAt,\n audience: \"dreamboard-api\",\n };\n }\n return null;\n}\n\nfunction inspectAccessOnlyToken(token: AccessToken): UserSessionStatus {\n const expiry = resolveExpiry(token.expiresAt, token.token);\n if (expiry && expiry.getTime() <= Date.now()) {\n return {\n kind: \"invalid\",\n sessionKind: \"access-only\",\n message:\n \"Stored Dreamboard access token is expired. Run `dreamboard auth login` to authenticate again.\",\n };\n }\n return activeStatus(\"access-only\", token, false);\n}\n\nfunction failedRefreshableStatus(error: unknown): UserSessionStatus {\n const message = error instanceof Error ? error.message : String(error);\n const errorStatus =\n typeof error === \"object\" && error !== null && \"status\" in error\n ? (error as { status?: unknown }).status\n : undefined;\n const classification = classifyRefreshError({\n message,\n status: typeof errorStatus === \"number\" ? errorStatus : undefined,\n });\n if (classification.kind === \"permanent_invalid\") {\n return {\n kind: \"invalid\",\n sessionKind: \"refreshable\",\n message,\n };\n }\n return {\n kind: \"degraded\",\n sessionKind: \"refreshable\",\n message,\n };\n}\n\nfunction activeStatus(\n sessionKind: \"access-only\" | \"refreshable\",\n apiToken: AccessToken,\n repaired: boolean,\n): UserSessionStatus {\n return {\n kind: \"active\",\n sessionKind,\n apiToken,\n repaired,\n };\n}\n\nfunction missingSessionError(): Error {\n return new Error(\n \"Missing Dreamboard session. Run `dreamboard auth login` to authenticate.\",\n );\n}\n\nfunction isFresh(\n expiresAt: string | undefined,\n token: string,\n minValidityMs: number,\n): boolean {\n const expiry = resolveExpiry(expiresAt, token);\n return (\n expiry !== null &&\n Number.isFinite(expiry.getTime()) &&\n expiry.getTime() > Date.now() + minValidityMs\n );\n}\n\nfunction resolveExpiry(\n expiresAt: string | undefined,\n token: string,\n): Date | null {\n if (expiresAt) {\n const parsed = new Date(expiresAt);\n return Number.isFinite(parsed.getTime()) ? parsed : null;\n }\n return getJwtExpiry(token);\n}\n\nfunction getJwtExpiry(accessToken: string | undefined): Date | null {\n if (!accessToken) return null;\n const parts = accessToken.split(\".\");\n if (parts.length !== 3) return null;\n try {\n const payload = JSON.parse(\n Buffer.from(parts[1]!, \"base64url\").toString(\"utf8\"),\n ) as { exp?: unknown };\n if (typeof payload.exp !== \"number\" || !Number.isFinite(payload.exp)) {\n return null;\n }\n return new Date(payload.exp * 1000);\n } catch {\n return null;\n }\n}\n\nfunction usesStoredSession(config: ResolvedConfig): boolean {\n return config.refreshTokenSource === \"global\";\n}\n","import { createHmac, randomUUID } from \"node:crypto\";\nimport type { ResolvedConfig } from \"../types.js\";\nimport { IS_PUBLISHED_BUILD } from \"../build-target.js\";\n\ntype LocalHarnessProfile = \"local\" | \"local-aws\";\n\nconst DEFAULT_SUBJECT = \"harness-smoke-local@dreamboard.local\";\nconst DEFAULT_ISSUER = \"dreamboard-local-harness\";\nconst DEFAULT_SECRET = \"dreamboard-local-harness-token-secret\";\nconst LOCAL_AWS_ISSUER = \"dreamboard-local-aws-harness\";\nconst LOCAL_AWS_SECRET = \"dreamboard-local-aws-harness-token-secret\";\nconst DEFAULT_TTL_SECONDS = 8 * 60 * 60;\n\nconst mintedTokens = new Map<string, string>();\n\nexport function resolveLocalHarnessAccessToken(\n config: ResolvedConfig,\n): string | undefined {\n if (IS_PUBLISHED_BUILD || config.environment !== \"local\") {\n return undefined;\n }\n\n const profile = inferLocalHarnessProfile(config);\n if (\n config.authToken &&\n (profile !== \"local-aws\" || isExplicitTokenSource(config.authTokenSource))\n ) {\n return undefined;\n }\n\n const cacheKey = [\n profile,\n process.env.LOCAL_HARNESS_TOKEN_ISSUER ?? \"\",\n process.env.LOCAL_HARNESS_TOKEN_SECRET ?? \"\",\n process.env.LOCAL_HARNESS_SUBJECT ?? \"\",\n process.env.HARNESS_USER_EMAIL ?? \"\",\n process.env.LOCAL_HARNESS_EMAIL ?? \"\",\n process.env.LOCAL_HARNESS_TOKEN_TTL_SECONDS ?? \"\",\n ].join(\"\\0\");\n const cached = mintedTokens.get(cacheKey);\n if (cached) return cached;\n\n const token = mintLocalHarnessToken(profile);\n mintedTokens.set(cacheKey, token);\n return token;\n}\n\nfunction isExplicitTokenSource(\n source: ResolvedConfig[\"authTokenSource\"],\n): boolean {\n return source === \"flag\" || source === \"env\" || source === \"agent-env\";\n}\n\nexport function inferLocalHarnessProfile(\n config: Pick<ResolvedConfig, \"apiBaseUrl\" | \"webBaseUrl\">,\n): LocalHarnessProfile {\n return isLocalAwsUrl(config.apiBaseUrl) || isLocalAwsUrl(config.webBaseUrl)\n ? \"local-aws\"\n : \"local\";\n}\n\nfunction mintLocalHarnessToken(profile: LocalHarnessProfile): string {\n const subject =\n envValue(process.env.LOCAL_HARNESS_SUBJECT) ??\n envValue(process.env.HARNESS_USER_EMAIL) ??\n DEFAULT_SUBJECT;\n const email =\n envValue(process.env.LOCAL_HARNESS_EMAIL) ??\n (subject.includes(\"@\") ? subject : undefined);\n const issuer =\n envValue(process.env.LOCAL_HARNESS_TOKEN_ISSUER) ??\n (profile === \"local-aws\" ? LOCAL_AWS_ISSUER : DEFAULT_ISSUER);\n const secret =\n envValue(process.env.LOCAL_HARNESS_TOKEN_SECRET) ??\n (profile === \"local-aws\" ? LOCAL_AWS_SECRET : DEFAULT_SECRET);\n const ttlSeconds = Number(\n envValue(process.env.LOCAL_HARNESS_TOKEN_TTL_SECONDS) ??\n String(DEFAULT_TTL_SECONDS),\n );\n if (!Number.isFinite(ttlSeconds) || ttlSeconds <= 0) {\n throw new Error(\n \"LOCAL_HARNESS_TOKEN_TTL_SECONDS must be a positive number.\",\n );\n }\n\n const now = Math.floor(Date.now() / 1000);\n const payload = {\n typ: \"local_harness_access\",\n dreamboard_provider: \"local-harness\",\n dreamboard_provider_subject: subject,\n ...(email ? { email } : {}),\n iss: issuer,\n sub: subject,\n iat: now,\n exp: now + Math.floor(ttlSeconds),\n jti: randomUUID(),\n };\n\n const headerPart = base64UrlJson({ alg: \"HS256\", typ: \"JWT\" });\n const payloadPart = base64UrlJson(payload);\n const signature = createHmac(\"sha256\", secret)\n .update(`${headerPart}.${payloadPart}`)\n .digest(\"base64url\");\n return `${headerPart}.${payloadPart}.${signature}`;\n}\n\nfunction base64UrlJson(value: unknown): string {\n return Buffer.from(JSON.stringify(value), \"utf8\").toString(\"base64url\");\n}\n\nfunction envValue(raw: string | undefined): string | undefined {\n return typeof raw === \"string\" && raw.trim().length > 0\n ? raw.trim()\n : undefined;\n}\n\nfunction isLocalAwsUrl(rawUrl: string | undefined): boolean {\n if (!rawUrl) return false;\n try {\n const url = new URL(rawUrl);\n return (\n (url.hostname === \"localhost\" || url.hostname === \"127.0.0.1\") &&\n (url.port === \"18080\" || url.port === \"8088\")\n );\n } catch {\n return false;\n }\n}\n","import { client } from \"@dreamboard-games/api-client/client.gen\";\nimport type {\n Environment,\n EnvironmentConfig,\n GlobalConfig,\n ProjectConfig,\n ResolvedConfig,\n} from \"../types.js\";\nimport type { ConfigFlags } from \"../flags.js\";\nimport {\n CAN_SELECT_ENVIRONMENT,\n IS_PUBLISHED_BUILD,\n PUBLISHED_ENVIRONMENT,\n} from \"../build-target.js\";\nimport {\n DEFAULT_API_BASE_URL,\n DEFAULT_WEB_BASE_URL,\n ENVIRONMENT_CONFIGS,\n} from \"../constants.js\";\nimport { loadGlobalConfig } from \"./global-config.js\";\nimport { findProjectRoot, loadProjectConfig } from \"./project-config.js\";\nimport {\n type StoredSessionSnapshot,\n getStoredSession,\n} from \"./credential-store.js\";\nimport { classifyRefreshError } from \"../auth/refresh-error.js\";\nimport { createUserSessionManager } from \"../auth/user-session-manager.js\";\nimport { resolveLocalHarnessAccessToken } from \"./local-harness-auth.js\";\n\nconst LOGIN_HINT = \"Run `dreamboard auth login` to authenticate again.\";\nconst TRANSIENT_READ_RETRY_DELAYS_MS = [100, 300];\n\nexport type CredentialSnapshot = {\n accessToken?: string;\n refreshToken?: string;\n tokenExpiresAt?: string;\n dreamboardApiToken?: string;\n dreamboardApiExpiresAt?: string;\n clerkOAuthIssuer?: string;\n clerkOAuthClientId?: string;\n clerkOAuthTokenUrl?: string;\n environment?: string;\n authTokenSource: ResolvedConfig[\"authTokenSource\"];\n refreshTokenSource: ResolvedConfig[\"refreshTokenSource\"];\n};\n\n/**\n * Resolve the effective CLI config for this invocation.\n *\n * `resolveConfig` is pure and synchronous: it takes pre-loaded inputs\n * (global config, flags, optional project config, optional credential\n * snapshot) and assembles a read-only `ResolvedConfig`. It intentionally\n * does not touch disk or the network - refreshing, repairing, and persisting\n * credentials is owned by `UserSessionManager`.\n *\n * Passing `credentials = undefined` is equivalent to \"no stored session\n * for this call\", used by contexts that should never inherit the local\n * session (e.g. `dreamboard login` before the browser flow).\n */\nexport function resolveConfig(\n globalConfig: GlobalConfig,\n flags: ConfigFlags,\n project?: ProjectConfig,\n credentials?: StoredSessionSnapshot | null,\n): ResolvedConfig {\n if (IS_PUBLISHED_BUILD) {\n assertPublicRuntimeFlags(flags);\n }\n\n const envEnvironment = CAN_SELECT_ENVIRONMENT\n ? environmentFromProcess()\n : undefined;\n const projectEnvironment = CAN_SELECT_ENVIRONMENT\n ? project?.environment\n : undefined;\n const environment = CAN_SELECT_ENVIRONMENT\n ? flags.env ||\n envEnvironment ||\n projectEnvironment ||\n globalConfig.environment ||\n (IS_PUBLISHED_BUILD ? PUBLISHED_ENVIRONMENT : \"staging\")\n : PUBLISHED_ENVIRONMENT;\n const envConfig = ENVIRONMENT_CONFIGS[environment];\n const publishedEnvConfig = ENVIRONMENT_CONFIGS[PUBLISHED_ENVIRONMENT];\n const hasExplicitEnvironmentOverride =\n CAN_SELECT_ENVIRONMENT &&\n Boolean(flags.env || envEnvironment || projectEnvironment);\n\n const resolvedApiBaseUrl =\n IS_PUBLISHED_BUILD && !CAN_SELECT_ENVIRONMENT\n ? (publishedEnvConfig?.apiBaseUrl ?? DEFAULT_API_BASE_URL)\n : hasExplicitEnvironmentOverride\n ? projectLocalBaseUrl(project?.apiBaseUrl, environment) ||\n envConfig?.apiBaseUrl ||\n DEFAULT_API_BASE_URL\n : project?.apiBaseUrl || envConfig?.apiBaseUrl || DEFAULT_API_BASE_URL;\n const apiBaseUrl =\n valueOrUndefined(process.env.DREAMBOARD_API_BASE_URL) ?? resolvedApiBaseUrl;\n\n const resolvedWebBaseUrl =\n IS_PUBLISHED_BUILD && !CAN_SELECT_ENVIRONMENT\n ? (publishedEnvConfig?.webBaseUrl ?? DEFAULT_WEB_BASE_URL)\n : hasExplicitEnvironmentOverride\n ? projectLocalBaseUrl(project?.webBaseUrl, environment) ||\n envConfig?.webBaseUrl ||\n DEFAULT_WEB_BASE_URL\n : project?.webBaseUrl || envConfig?.webBaseUrl || DEFAULT_WEB_BASE_URL;\n const webBaseUrl =\n valueOrUndefined(process.env.DREAMBOARD_WEB_BASE_URL) ?? resolvedWebBaseUrl;\n\n const snapshot = buildCredentialSnapshot(flags, credentials, environment);\n const oauthConfig = resolveEnvironmentOAuthConfig(environment, envConfig);\n\n return {\n environment,\n apiBaseUrl,\n webBaseUrl,\n authToken:\n snapshot.dreamboardApiToken ??\n (snapshot.refreshToken ? undefined : snapshot.accessToken),\n refreshToken: snapshot.refreshToken,\n tokenExpiresAt:\n snapshot.dreamboardApiExpiresAt ??\n (snapshot.refreshToken ? undefined : snapshot.tokenExpiresAt),\n clerkAccessToken: snapshot.accessToken,\n clerkAccessExpiresAt: snapshot.tokenExpiresAt,\n dreamboardApiToken: snapshot.dreamboardApiToken,\n dreamboardApiExpiresAt: snapshot.dreamboardApiExpiresAt,\n clerkOAuthIssuer: snapshot.clerkOAuthIssuer ?? oauthConfig.issuer,\n clerkOAuthClientId: snapshot.clerkOAuthClientId ?? oauthConfig.clientId,\n clerkOAuthTokenUrl: snapshot.clerkOAuthTokenUrl ?? oauthConfig.tokenUrl,\n clerkOAuthScope: oauthConfig.scope,\n authTokenSource: snapshot.authTokenSource,\n refreshTokenSource: snapshot.refreshTokenSource,\n };\n}\n\nfunction resolveEnvironmentOAuthConfig(\n environment: Environment,\n envConfig?: EnvironmentConfig,\n): {\n issuer?: string;\n clientId?: string;\n tokenUrl?: string;\n scope?: string;\n} {\n const prefix = environment.toUpperCase();\n return {\n issuer:\n valueOrUndefined(\n process.env[`DREAMBOARD_${prefix}_CLERK_OAUTH_ISSUER`],\n ) ??\n valueOrUndefined(process.env.DREAMBOARD_CLERK_OAUTH_ISSUER) ??\n envConfig?.clerkOAuthIssuer,\n clientId:\n valueOrUndefined(\n process.env[`DREAMBOARD_${prefix}_CLERK_OAUTH_CLIENT_ID`],\n ) ??\n valueOrUndefined(process.env.DREAMBOARD_CLERK_OAUTH_CLIENT_ID) ??\n envConfig?.clerkOAuthClientId,\n tokenUrl:\n valueOrUndefined(\n process.env[`DREAMBOARD_${prefix}_CLERK_OAUTH_TOKEN_URL`],\n ) ??\n valueOrUndefined(process.env.DREAMBOARD_CLERK_OAUTH_TOKEN_URL) ??\n envConfig?.clerkOAuthTokenUrl,\n scope:\n valueOrUndefined(process.env[`DREAMBOARD_${prefix}_CLERK_OAUTH_SCOPE`]) ??\n valueOrUndefined(process.env.DREAMBOARD_CLERK_OAUTH_SCOPE) ??\n envConfig?.clerkOAuthScope,\n };\n}\n\nfunction buildCredentialSnapshot(\n flags: ConfigFlags,\n storedCredentials?: StoredSessionSnapshot | null,\n environment?: Environment,\n): CredentialSnapshot {\n const flagToken = valueOrUndefined(flags.token);\n const agentEnvToken = valueOrUndefined(process.env.DREAMBOARD_AGENT_TOKEN);\n const envToken = valueOrUndefined(process.env.DREAMBOARD_TOKEN);\n const environmentScopedStoredCredentials =\n storedCredentials?.environment &&\n environment &&\n storedCredentials.environment !== environment\n ? null\n : (storedCredentials ?? null);\n\n if (IS_PUBLISHED_BUILD) {\n const stored = environmentScopedStoredCredentials;\n if (agentEnvToken) {\n return {\n accessToken: agentEnvToken,\n refreshToken: undefined,\n tokenExpiresAt: undefined,\n authTokenSource: \"agent-env\",\n refreshTokenSource: \"none\",\n };\n }\n return {\n accessToken: stored?.accessToken,\n refreshToken: stored?.refreshToken,\n tokenExpiresAt: stored?.tokenExpiresAt,\n dreamboardApiToken: stored?.dreamboardApiToken,\n dreamboardApiExpiresAt: stored?.dreamboardApiExpiresAt,\n clerkOAuthIssuer: stored?.clerkOAuthIssuer,\n clerkOAuthClientId: stored?.clerkOAuthClientId,\n clerkOAuthTokenUrl: stored?.clerkOAuthTokenUrl,\n environment: stored?.environment,\n authTokenSource:\n stored?.dreamboardApiToken ||\n (stored?.accessToken && !stored.refreshToken)\n ? \"global\"\n : \"none\",\n refreshTokenSource: stored?.refreshToken ? \"global\" : \"none\",\n };\n }\n\n const accessToken =\n flagToken ||\n agentEnvToken ||\n envToken ||\n environmentScopedStoredCredentials?.accessToken;\n const refreshToken = environmentScopedStoredCredentials?.refreshToken;\n\n const authTokenSource: ResolvedConfig[\"authTokenSource\"] = flagToken\n ? \"flag\"\n : agentEnvToken\n ? \"agent-env\"\n : envToken\n ? \"env\"\n : environmentScopedStoredCredentials?.accessToken\n ? \"global\"\n : \"none\";\n\n const refreshTokenSource: ResolvedConfig[\"refreshTokenSource\"] =\n environmentScopedStoredCredentials?.refreshToken ? \"global\" : \"none\";\n\n return {\n accessToken,\n refreshToken,\n tokenExpiresAt: environmentScopedStoredCredentials?.tokenExpiresAt,\n dreamboardApiToken: environmentScopedStoredCredentials?.dreamboardApiToken,\n dreamboardApiExpiresAt:\n environmentScopedStoredCredentials?.dreamboardApiExpiresAt,\n clerkOAuthIssuer: environmentScopedStoredCredentials?.clerkOAuthIssuer,\n clerkOAuthClientId: environmentScopedStoredCredentials?.clerkOAuthClientId,\n clerkOAuthTokenUrl: environmentScopedStoredCredentials?.clerkOAuthTokenUrl,\n environment: environmentScopedStoredCredentials?.environment,\n authTokenSource,\n refreshTokenSource,\n };\n}\n\nfunction environmentFromProcess(): Environment | undefined {\n const value = valueOrUndefined(process.env.DREAMBOARD_ENV);\n if (!value) return undefined;\n if (value === \"local\" || value === \"staging\" || value === \"prod\") {\n return value;\n }\n throw new Error(\n `Invalid DREAMBOARD_ENV '${value}'. Valid options: local, staging, prod`,\n );\n}\n\nfunction projectLocalBaseUrl(\n rawUrl: string | undefined,\n environment: Environment,\n): string | undefined {\n if (environment !== \"local\" || !rawUrl) return undefined;\n try {\n const url = new URL(rawUrl);\n return url.hostname === \"localhost\" || url.hostname === \"127.0.0.1\"\n ? rawUrl\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function assertPublicRuntimeFlags(\n flags: ConfigFlags,\n options: {\n canSelectEnvironment?: boolean;\n argv?: string[];\n } = {},\n): void {\n const canSelectEnvironment =\n options.canSelectEnvironment ?? CAN_SELECT_ENVIRONMENT;\n const argv = options.argv ?? process.argv.slice(2);\n\n if (!canSelectEnvironment && (flags.env || argv.includes(\"--env\"))) {\n throw new Error(\n \"The published Dreamboard CLI is production-only and does not accept `--env`.\",\n );\n }\n\n if (valueOrUndefined(flags.token) || argv.includes(\"--token\")) {\n throw new Error(\n \"Direct JWT injection is not supported in the published Dreamboard CLI. Use `dreamboard auth login` so the CLI can store and refresh your session.\",\n );\n }\n\n if (process.env.DREAMBOARD_TOKEN) {\n throw new Error(\n \"The published Dreamboard CLI ignores direct token environment variables. Use `dreamboard auth login` so the CLI can manage refreshable credentials.\",\n );\n }\n}\n\n/**\n * Configure the API client for the resolved environment, refreshing the\n * stored CLI session first if it is close to expiry.\n *\n * The refresh path never mutates `config`. It goes through\n * Clerk OAuth directly and the CredentialStore writes. After a successful\n * rotation the HTTP client\n * is configured with the rotated access token; on transient failures we\n * fall back to the `config.authToken` snapshot (which is why commands\n * still see a bearer header and can surface the original error).\n */\nexport async function configureClient(config: ResolvedConfig): Promise<void> {\n const localHarnessToken = resolveLocalHarnessAccessToken(config);\n const resolvedToken = localHarnessToken\n ? { token: localHarnessToken }\n : await createUserSessionManager(config).resolveApiToken();\n const effectiveAccessToken = resolvedToken?.token;\n\n client.setConfig({\n baseUrl: config.apiBaseUrl,\n fetch: createRetryingReadFetch(globalThis.fetch.bind(globalThis)),\n headers: effectiveAccessToken\n ? { Authorization: `Bearer ${effectiveAccessToken}` }\n : {},\n });\n}\n\nfunction createRetryingReadFetch(fetchImpl: typeof fetch): typeof fetch {\n return (async (input: RequestInfo | URL, init?: RequestInit) => {\n const method = resolveFetchMethod(input, init);\n if (method !== \"GET\" && method !== \"HEAD\") {\n return fetchWithOptionalTrace(fetchImpl, input, init, {\n attempt: 0,\n willRetry: false,\n });\n }\n\n let lastError: unknown;\n for (\n let attempt = 0;\n attempt <= TRANSIENT_READ_RETRY_DELAYS_MS.length;\n attempt += 1\n ) {\n try {\n return await fetchWithOptionalTrace(fetchImpl, input, init, {\n attempt,\n willRetry: attempt < TRANSIENT_READ_RETRY_DELAYS_MS.length,\n });\n } catch (error) {\n lastError = error;\n if (\n attempt >= TRANSIENT_READ_RETRY_DELAYS_MS.length ||\n !isTransientFetchError(error)\n ) {\n throw error;\n }\n await sleep(TRANSIENT_READ_RETRY_DELAYS_MS[attempt]!);\n }\n }\n\n throw lastError;\n }) as typeof fetch;\n}\n\nasync function fetchWithOptionalTrace(\n fetchImpl: typeof fetch,\n input: RequestInfo | URL,\n init: RequestInit | undefined,\n options: { attempt: number; willRetry: boolean },\n): Promise<Response> {\n if (!isHttpTraceEnabled()) {\n return fetchImpl(input, init);\n }\n\n const request = describeRequest(input, init);\n const startedAt = Date.now();\n try {\n const response = await fetchImpl(input, init);\n writeHttpTrace({\n ...request,\n attempt: options.attempt,\n status: response.status,\n durationMs: Date.now() - startedAt,\n });\n return response;\n } catch (error) {\n writeHttpTrace({\n ...request,\n attempt: options.attempt,\n durationMs: Date.now() - startedAt,\n error: error instanceof Error ? error.name : \"UnknownError\",\n willRetry: options.willRetry,\n });\n throw error;\n }\n}\n\nfunction isHttpTraceEnabled(): boolean {\n return process.env.DREAMBOARD_CLI_HTTP_TRACE === \"1\";\n}\n\nfunction describeRequest(\n input: RequestInfo | URL,\n init?: RequestInit,\n): {\n method: string;\n url: string;\n hasAuthorization: boolean;\n} {\n return {\n method: resolveFetchMethod(input, init),\n url: redactUrl(input),\n hasAuthorization: hasAuthorizationHeader(input, init),\n };\n}\n\nfunction redactUrl(input: RequestInfo | URL): string {\n const rawUrl =\n typeof input === \"string\"\n ? input\n : input instanceof URL\n ? input.toString()\n : input.url;\n try {\n const url = new URL(rawUrl);\n return `${url.origin}${url.pathname}`;\n } catch {\n return \"<unparseable-url>\";\n }\n}\n\nfunction hasAuthorizationHeader(\n input: RequestInfo | URL,\n init?: RequestInit,\n): boolean {\n return (\n headersContainAuthorization(init?.headers) ||\n (typeof Request !== \"undefined\" &&\n input instanceof Request &&\n input.headers.has(\"Authorization\"))\n );\n}\n\nfunction headersContainAuthorization(headers?: HeadersInit): boolean {\n if (!headers) {\n return false;\n }\n if (headers instanceof Headers) {\n return headers.has(\"Authorization\");\n }\n if (Array.isArray(headers)) {\n return headers.some(([name]) => name.toLowerCase() === \"authorization\");\n }\n return Object.keys(headers).some(\n (name) => name.toLowerCase() === \"authorization\",\n );\n}\n\nfunction writeHttpTrace(event: {\n method: string;\n url: string;\n hasAuthorization: boolean;\n attempt: number;\n durationMs: number;\n status?: number;\n error?: string;\n willRetry?: boolean;\n}): void {\n const parts = [\n \"[dreamboard-cli:http]\",\n `method=${event.method}`,\n `url=${event.url}`,\n `auth=${event.hasAuthorization ? \"present\" : \"missing\"}`,\n `attempt=${event.attempt + 1}`,\n `durationMs=${event.durationMs}`,\n ];\n if (typeof event.status === \"number\") {\n parts.push(`status=${event.status}`);\n }\n if (event.error) {\n parts.push(`error=${event.error}`);\n }\n if (event.willRetry) {\n parts.push(\"willRetry=true\");\n }\n console.error(parts.join(\" \"));\n}\n\nfunction resolveFetchMethod(\n input: RequestInfo | URL,\n init?: RequestInit,\n): string {\n const method =\n init?.method ??\n (typeof Request !== \"undefined\" && input instanceof Request\n ? input.method\n : undefined);\n return (method ?? \"GET\").toUpperCase();\n}\n\nfunction isTransientFetchError(error: unknown): boolean {\n const message =\n error instanceof Error\n ? error.message\n : typeof error === \"object\" && error !== null && \"message\" in error\n ? String((error as { message?: unknown }).message)\n : String(error);\n const normalized = message.toLowerCase();\n return (\n normalized.includes(\"fetch failed\") ||\n normalized.includes(\"network\") ||\n normalized.includes(\"timeout\") ||\n normalized.includes(\"econnreset\") ||\n normalized.includes(\"econnrefused\") ||\n normalized.includes(\"socket\")\n );\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function requireAuth(config: ResolvedConfig): void {\n if (\n !config.authToken &&\n !config.refreshToken &&\n !resolveLocalHarnessAccessToken(config)\n ) {\n throw new Error(\n \"Missing Dreamboard session. Run `dreamboard auth login` to authenticate.\",\n );\n }\n}\n\nexport function valueOrUndefined(\n value: string | boolean | undefined,\n): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0\n ? value.trim()\n : undefined;\n}\n\nexport function getAuthTokenExpiry(\n accessToken: string | undefined,\n): Date | null {\n if (!accessToken) return null;\n const parts = accessToken.split(\".\");\n if (parts.length !== 3) return null;\n try {\n const payload = JSON.parse(\n Buffer.from(parts[1]!, \"base64url\").toString(\"utf8\"),\n ) as { exp?: unknown };\n if (typeof payload.exp !== \"number\" || !Number.isFinite(payload.exp)) {\n return null;\n }\n return new Date(payload.exp * 1000);\n } catch {\n return null;\n }\n}\n\n/**\n * Compatibility helper retained for `dreamboard auth status` / tests.\n * Returns true iff the error looks like a permanent refresh-token\n * invalidation. Prefer `classifyRefreshError` for new call sites.\n */\nexport function isInvalidRefreshTokenMessage(\n message: string | undefined,\n): boolean {\n if (!message) return false;\n return classifyRefreshError({ message }).kind === \"permanent_invalid\";\n}\n\nexport function formatStoredSessionInvalidMessage(reason?: string): string {\n const detail = reason ? ` (${reason})` : \"\";\n return `Stored Dreamboard session is expired or invalid${detail}. ${LOGIN_HINT}`;\n}\n\nexport async function loadProjectContextCredentials(\n requireAuth: boolean,\n loadCredentials = getStoredSession,\n): Promise<Awaited<ReturnType<typeof getStoredSession>> | undefined> {\n return requireAuth ? loadCredentials() : undefined;\n}\n\n/**\n * Common init pattern used by pull, push, status, update, run commands:\n * find project root, load config, resolve config, require auth,\n * configure client.\n */\nexport async function resolveProjectContext(\n flags: ConfigFlags,\n opts?: { requireAuth?: boolean },\n): Promise<{\n projectRoot: string;\n projectConfig: ProjectConfig;\n config: ResolvedConfig;\n}> {\n const projectRoot = await findProjectRoot(process.cwd());\n if (!projectRoot) {\n throw new Error(\n \"Not inside a dreamboard project (missing .dreamboard/project.json).\",\n );\n }\n\n const projectConfig = await loadProjectConfig(projectRoot);\n const requireAuthForContext = opts?.requireAuth !== false;\n const [globalConfig, credentials] = await Promise.all([\n loadGlobalConfig(),\n loadProjectContextCredentials(requireAuthForContext),\n ]);\n const config = resolveConfig(globalConfig, flags, projectConfig, credentials);\n\n if (requireAuthForContext) {\n requireAuth(config);\n await configureClient(config);\n }\n\n return { projectRoot, projectConfig, config };\n}\n","import { z } from \"zod\";\n\nconst configFlagsSchema = z.object({\n env: z.enum([\"local\", \"staging\", \"prod\"]).optional(),\n token: z.string().optional(),\n});\n\nconst ruleInputFlagsSchema = z.object({\n \"rule-file\": z.string().optional(),\n rule: z.string().optional(),\n});\n\nconst playerCountFlagsSchema = z.object({\n players: z.string().optional(),\n \"player-count\": z.string().optional(),\n});\n\nconst newCommandArgsSchema = configFlagsSchema.extend({\n slug: z.string().min(1),\n description: z.string().min(1),\n force: z.boolean().default(false),\n \"wait-timeout-ms\": z.string().optional(),\n \"repository-poll-interval-ms\": z.string().optional(),\n});\n\nconst cloneCommandArgsSchema = configFlagsSchema.extend({\n slug: z.string().min(1),\n \"wait-timeout-ms\": z.string().optional(),\n \"repository-poll-interval-ms\": z.string().optional(),\n});\n\nconst queryCommandArgsSchema = configFlagsSchema.extend({\n title: z.string().min(1),\n});\n\nconst pullCommandArgsSchema = configFlagsSchema.extend({\n force: z.boolean().default(false),\n});\n\nconst syncCommandArgsSchema = configFlagsSchema.extend({\n force: z.boolean().default(false),\n yes: z.boolean().default(false),\n});\n\nconst compileCommandArgsSchema = configFlagsSchema.extend({\n debug: z.boolean().default(false),\n \"skip-local-check\": z.boolean().default(false),\n});\n\nconst statusCommandArgsSchema = configFlagsSchema.extend({\n json: z.boolean().default(false),\n});\n\nconst commitScopedCommandArgsSchema = configFlagsSchema.extend({\n commit: z.string().min(1),\n json: z.boolean().default(false),\n});\n\nconst buildCommandArgsSchema = commitScopedCommandArgsSchema.extend({\n profile: z.enum([\"preview\", \"release\"]).optional().default(\"preview\"),\n});\n\nconst releasePublishCommandArgsSchema = commitScopedCommandArgsSchema.extend({\n yes: z.boolean().default(false),\n});\n\nconst devCommandArgsSchema = configFlagsSchema.extend({\n seed: z.string().optional(),\n \"setup-profile\": z.string().optional(),\n players: z.string().optional(),\n \"player-count\": z.string().optional(),\n debug: z.boolean().default(false),\n resume: z.string().optional(),\n \"from-scenario\": z.string().optional(),\n \"new-session\": z.boolean().default(false),\n open: z.boolean().default(false),\n port: z.string().optional(),\n host: z.union([z.string(), z.boolean()]).optional(),\n \"allowed-host\": z.string().optional(),\n});\n\nconst joinCommandArgsSchema = configFlagsSchema.extend({\n session: z.string().min(1).optional(),\n player: z.string().min(1),\n \"raw-events\": z.boolean().default(false),\n});\n\nconst loginCommandArgsSchema = configFlagsSchema;\n\nconst configCommandArgsSchema = configFlagsSchema.extend({\n action: z.string().optional().default(\"show\"),\n scope: z.enum([\"global\", \"workspace\"]).optional().default(\"global\"),\n});\n\nconst authCommandArgsSchema = z.object({\n action: z.enum([\"set\", \"login\", \"logout\", \"env\", \"status\", \"git-credential\"]),\n tokenValue: z.string().optional(),\n token: z.string().optional(),\n jwt: z.boolean().optional(),\n env: z.enum([\"local\", \"staging\", \"prod\"]).optional(),\n});\n\nexport type ConfigFlags = z.infer<typeof configFlagsSchema>;\nexport type RuleInputFlags = z.infer<typeof ruleInputFlagsSchema>;\nexport type PlayerCountFlags = z.infer<typeof playerCountFlagsSchema>;\n\nexport type NewCommandArgs = z.infer<typeof newCommandArgsSchema>;\nexport type CloneCommandArgs = z.infer<typeof cloneCommandArgsSchema>;\nexport type QueryCommandArgs = z.infer<typeof queryCommandArgsSchema>;\nexport type PullCommandArgs = z.infer<typeof pullCommandArgsSchema>;\nexport type SyncCommandArgs = z.infer<typeof syncCommandArgsSchema>;\nexport type CompileCommandArgs = z.infer<typeof compileCommandArgsSchema>;\nexport type StatusCommandArgs = z.infer<typeof statusCommandArgsSchema>;\nexport type CommitScopedCommandArgs = z.infer<\n typeof commitScopedCommandArgsSchema\n>;\nexport type BuildCommandArgs = z.infer<typeof buildCommandArgsSchema>;\nexport type ReleasePublishCommandArgs = z.infer<\n typeof releasePublishCommandArgsSchema\n>;\nexport type DevCommandArgs = z.infer<typeof devCommandArgsSchema>;\nexport type JoinCommandArgs = z.infer<typeof joinCommandArgsSchema>;\nexport type LoginCommandArgs = z.infer<typeof loginCommandArgsSchema>;\nexport type ConfigCommandArgs = z.infer<typeof configCommandArgsSchema>;\nexport type AuthCommandArgs = z.infer<typeof authCommandArgsSchema>;\n\nfunction parseArgs<TOutput>(\n commandName: string,\n schema: z.ZodType<TOutput>,\n args: unknown,\n): TOutput {\n const parsed = schema.safeParse(args);\n if (parsed.success) {\n return parsed.data;\n }\n\n const details = parsed.error.issues\n .map((issue) => {\n const field = issue.path.length > 0 ? issue.path.join(\".\") : \"args\";\n return `${field}: ${issue.message}`;\n })\n .join(\"; \");\n throw new Error(`Invalid arguments for '${commandName}': ${details}`);\n}\n\nexport function parseConfigFlags(args: unknown): ConfigFlags {\n return parseArgs(\"config-flags\", configFlagsSchema, args);\n}\n\nexport function parseRuleInputFlags(args: unknown): RuleInputFlags {\n return parseArgs(\"rule-flags\", ruleInputFlagsSchema, args);\n}\n\nexport function parsePlayerCountFlags(args: unknown): PlayerCountFlags {\n return parseArgs(\"player-count\", playerCountFlagsSchema, args);\n}\n\nexport function parseNewCommandArgs(args: unknown): NewCommandArgs {\n return parseArgs(\"new\", newCommandArgsSchema, args);\n}\n\nexport function parseCloneCommandArgs(args: unknown): CloneCommandArgs {\n return parseArgs(\"clone\", cloneCommandArgsSchema, args);\n}\n\nexport function parseQueryCommandArgs(args: unknown): QueryCommandArgs {\n return parseArgs(\"query\", queryCommandArgsSchema, args);\n}\n\nexport function parsePullCommandArgs(args: unknown): PullCommandArgs {\n return parseArgs(\"pull\", pullCommandArgsSchema, args);\n}\n\nexport function parseSyncCommandArgs(args: unknown): SyncCommandArgs {\n return parseArgs(\"sync\", syncCommandArgsSchema, args);\n}\n\nexport function parseCompileCommandArgs(args: unknown): CompileCommandArgs {\n return parseArgs(\"compile\", compileCommandArgsSchema, args);\n}\n\nexport function parseStatusCommandArgs(args: unknown): StatusCommandArgs {\n return parseArgs(\"status\", statusCommandArgsSchema, args);\n}\n\nexport function parseCommitScopedCommandArgs(\n commandName: string,\n args: unknown,\n): CommitScopedCommandArgs {\n return parseArgs(commandName, commitScopedCommandArgsSchema, args);\n}\n\nexport function parseBuildCommandArgs(args: unknown): BuildCommandArgs {\n return parseArgs(\"build\", buildCommandArgsSchema, args);\n}\n\nexport function parseReleasePublishCommandArgs(\n args: unknown,\n): ReleasePublishCommandArgs {\n return parseArgs(\"release publish\", releasePublishCommandArgsSchema, args);\n}\n\nexport function parseDevCommandArgs(args: unknown): DevCommandArgs {\n return parseArgs(\"dev\", devCommandArgsSchema, args);\n}\n\nexport function parseJoinCommandArgs(args: unknown): JoinCommandArgs {\n return parseArgs(\"join\", joinCommandArgsSchema, args);\n}\n\nexport function parseLoginCommandArgs(args: unknown): LoginCommandArgs {\n return parseArgs(\"login\", loginCommandArgsSchema, args);\n}\n\nexport function parseConfigCommandArgs(args: unknown): ConfigCommandArgs {\n return parseArgs(\"config\", configCommandArgsSchema, args);\n}\n\nexport function parseAuthCommandArgs(args: unknown): AuthCommandArgs {\n return parseArgs(\"auth\", authCommandArgsSchema, args);\n}\n","export const CONFIG_FLAG_ARGS = {\n env: {\n type: \"string\" as const,\n description: \"Environment: local | staging | prod\",\n },\n token: {\n type: \"string\" as const,\n description: \"Auth token (Dreamboard bearer JWT)\",\n },\n};\n","import {\n CLIENT_PROBLEM_TYPES,\n SERVER_PROBLEM_TYPES,\n} from \"@dreamboard-games/api-client/problem-types\";\n\nexport { CLIENT_PROBLEM_TYPES, SERVER_PROBLEM_TYPES };\n\nexport const CLI_PROBLEM_TYPES = {\n ...SERVER_PROBLEM_TYPES,\n ...CLIENT_PROBLEM_TYPES,\n} as const;\n\nexport type CliProblemType =\n (typeof CLI_PROBLEM_TYPES)[keyof typeof CLI_PROBLEM_TYPES];\n","import type {\n ProblemDetails,\n ProblemViolation,\n} from \"@dreamboard-games/api-client\";\nimport { zProblemDetails } from \"@dreamboard-games/api-client/zod.gen\";\nimport { CLI_PROBLEM_TYPES } from \"./problem-types.js\";\nimport type { CliProblemType } from \"./problem-types.js\";\n\ntype ApiClientError =\n | ProblemDetails\n | Error\n | string\n | Record<string, unknown>\n | null\n | undefined;\n\ntype ApiProblem = Omit<ProblemDetails, \"type\"> & {\n type: CliProblemType | (string & {});\n};\n\ntype CliErrorPresentation = {\n message: string;\n resolution?: string;\n details: string[];\n};\n\nexport const STALE_CONTRACT_ARTIFACT_CODE = \"STALE_CONTRACT_ARTIFACT\";\nexport const STALE_CONTRACT_ARTIFACT_EXIT_CODE = 42;\n\ntype ResponseLike = {\n status?: number;\n statusText?: string;\n headers?: {\n get?: (name: string) => string | null | undefined;\n };\n};\n\nfunction isProblemViolationArray(value: unknown): value is ProblemViolation[] {\n return (\n Array.isArray(value) &&\n value.every(\n (entry) =>\n typeof entry === \"object\" &&\n entry !== null &&\n typeof (entry as { message?: unknown }).message === \"string\",\n )\n );\n}\n\nexport function isProblemDetails(value: unknown): value is ProblemDetails {\n return zProblemDetails.safeParse(value).success;\n}\n\nfunction coerceViolations(value: unknown): ProblemViolation[] | undefined {\n if (isProblemViolationArray(value)) {\n return value;\n }\n\n if (\n Array.isArray(value) &&\n value.every((entry) => typeof entry === \"string\")\n ) {\n return value.map((message) => ({ message }));\n }\n\n return undefined;\n}\n\nfunction getRequestId(response?: ResponseLike): string | undefined {\n return (\n response?.headers?.get?.(\"X-Correlation-ID\") ??\n response?.headers?.get?.(\"x-correlation-id\") ??\n undefined\n );\n}\n\nexport function toApiProblem(\n error: ApiClientError,\n response: ResponseLike | undefined,\n fallback: string,\n): ApiProblem {\n if (isProblemDetails(error)) {\n return {\n ...error,\n status: error.status || response?.status || 0,\n requestId: error.requestId ?? getRequestId(response),\n };\n }\n\n if (error instanceof Error) {\n return {\n type: CLI_PROBLEM_TYPES.TRANSPORT_ERROR,\n title: response?.statusText || \"API error\",\n status: response?.status ?? 0,\n detail: error.message || fallback,\n requestId: getRequestId(response),\n };\n }\n\n if (error && typeof error === \"object\") {\n const obj = error as Record<string, unknown>;\n const detail =\n typeof obj.detail === \"string\"\n ? obj.detail\n : typeof obj.message === \"string\"\n ? obj.message\n : undefined;\n const title =\n typeof obj.title === \"string\"\n ? obj.title\n : response?.statusText || \"API error\";\n const violations =\n coerceViolations(obj.violations) ?? coerceViolations(obj.errors);\n\n if (detail) {\n return {\n type:\n typeof obj.type === \"string\"\n ? obj.type\n : CLI_PROBLEM_TYPES.UNKNOWN_API_ERROR,\n title,\n status:\n typeof obj.status === \"number\" ? obj.status : (response?.status ?? 0),\n detail,\n requestId:\n typeof obj.requestId === \"string\"\n ? obj.requestId\n : getRequestId(response),\n retryable:\n typeof obj.retryable === \"boolean\" ? obj.retryable : undefined,\n context:\n typeof obj.context === \"object\" && obj.context !== null\n ? (obj.context as Record<string, string>)\n : undefined,\n violations,\n timestamp:\n typeof obj.timestamp === \"string\" ? obj.timestamp : undefined,\n instance: typeof obj.instance === \"string\" ? obj.instance : undefined,\n };\n }\n }\n\n const detail =\n typeof error === \"string\" ? error.trim() || fallback : fallback;\n\n return {\n type: CLI_PROBLEM_TYPES.UNKNOWN_API_ERROR,\n title: response?.statusText || \"API error\",\n status: response?.status ?? 0,\n detail,\n requestId: getRequestId(response),\n };\n}\n\nfunction formatProblem(problem: ApiProblem): string {\n const base = problem.detail || problem.title;\n const violations =\n problem.violations && problem.violations.length > 0\n ? ` (${problem.violations.map((entry) => entry.message).join(\"; \")})`\n : \"\";\n const statusSuffix =\n problem.status && problem.status > 0 ? ` (HTTP ${problem.status})` : \"\";\n return `${base}${violations}${statusSuffix}`;\n}\n\nexport class DreamboardApiError extends Error {\n readonly problem: ApiProblem;\n readonly status: number;\n readonly requestId?: string;\n readonly retryable?: boolean;\n\n constructor(problem: ApiProblem, cause?: unknown) {\n super(formatProblem(problem), { cause });\n this.name = \"DreamboardApiError\";\n this.problem = problem;\n this.status = problem.status;\n this.requestId = problem.requestId;\n this.retryable = problem.retryable;\n }\n}\n\nexport function toDreamboardApiError(\n error: ApiClientError,\n response: ResponseLike | undefined,\n fallback: string,\n): DreamboardApiError {\n return new DreamboardApiError(toApiProblem(error, response, fallback), error);\n}\n\nexport function formatApiError(\n error: ApiClientError,\n response: ResponseLike | undefined,\n fallback: string,\n): string {\n return formatProblem(toApiProblem(error, response, fallback));\n}\n\nexport function isDreamboardApiError(\n error: unknown,\n): error is DreamboardApiError {\n return error instanceof DreamboardApiError;\n}\n\nexport function isProblemType(error: unknown, ...types: string[]): boolean {\n return isDreamboardApiError(error) && types.includes(error.problem.type);\n}\n\nfunction getObjectStringProperty(\n value: unknown,\n property: string,\n): string | undefined {\n return value &&\n typeof value === \"object\" &&\n typeof (value as Record<string, unknown>)[property] === \"string\"\n ? ((value as Record<string, unknown>)[property] as string)\n : undefined;\n}\n\nexport function isStaleContractArtifactMessage(message: string): boolean {\n return (\n message.includes(STALE_CONTRACT_ARTIFACT_CODE) ||\n message.includes(\"StaleContractArtifactError\") ||\n message.toLowerCase().includes(\"stale contract artifact\")\n );\n}\n\nexport function isStaleContractArtifactError(error: unknown): boolean {\n if (getObjectStringProperty(error, \"code\") === STALE_CONTRACT_ARTIFACT_CODE) {\n return true;\n }\n if (getObjectStringProperty(error, \"name\") === \"StaleContractArtifactError\") {\n return true;\n }\n const message = getObjectStringProperty(error, \"message\");\n return message ? isStaleContractArtifactMessage(message) : false;\n}\n\nexport function getCliErrorExitCode(error: unknown): number {\n return isStaleContractArtifactError(error)\n ? STALE_CONTRACT_ARTIFACT_EXIT_CODE\n : 1;\n}\n\nexport function getProblemContext(\n error: unknown,\n): Record<string, string> | undefined {\n return isDreamboardApiError(error) ? error.problem.context : undefined;\n}\n\nexport function getProblemContextValue(\n error: unknown,\n key: string,\n): string | undefined {\n return getProblemContext(error)?.[key];\n}\n\nfunction isGameNotFoundProblem(problem: ApiProblem): boolean {\n return (\n problem.status === 404 &&\n (problem.detail?.startsWith(\"Game not found: \") === true ||\n problem.instance?.includes(\"/source-blobs/upload-sessions\") === true)\n );\n}\n\nfunction getProblemResolution(problem: ApiProblem): string | undefined {\n if (isGameNotFoundProblem(problem)) {\n return [\n \"Verify the project binding with `dreamboard project status --commit <rev>` after pushing the exact commit.\",\n \"If you meant to use an existing remote project, check that your selected account and environment point at the backend that has that project.\",\n ].join(\" \");\n }\n\n switch (problem.type) {\n case CLI_PROBLEM_TYPES.UNAUTHORIZED:\n return \"Run `dreamboard auth login` to authenticate again.\";\n case CLI_PROBLEM_TYPES.FORBIDDEN:\n return \"Check that the signed-in account has access to this game, or run `dreamboard auth login` with the correct account.\";\n case CLI_PROBLEM_TYPES.TOO_MANY_REQUESTS:\n return \"Wait a moment, then retry the command.\";\n case CLI_PROBLEM_TYPES.TRANSPORT_ERROR:\n return \"Check that the selected Dreamboard server is reachable and try again later.\";\n case CLI_PROBLEM_TYPES.VALIDATION_FAILED:\n return \"Fix the validation issue above, then retry the command.\";\n case CLI_PROBLEM_TYPES.ACTIVE_JOB_CONFLICT:\n return \"Wait for the active job to finish, then retry the command.\";\n case CLI_PROBLEM_TYPES.GAME_SLUG_CONFLICT:\n return \"Choose a different game slug, or use the existing workspace for that slug.\";\n case CLI_PROBLEM_TYPES.SOURCE_REVISION_NOT_FOUND:\n return \"Push the exact Git commit, then run `dreamboard project status --commit <rev> --wait` before retrying.\";\n case CLI_PROBLEM_TYPES.SOURCE_REVISION_DRIFT:\n case CLI_PROBLEM_TYPES.AUTHORING_STATE_DRIFT:\n case CLI_PROBLEM_TYPES.STATE_CONFLICT:\n return \"Resolve the Git/source conflict in your worktree, push the intended exact commit, and retry the command against that commit.\";\n case CLI_PROBLEM_TYPES.SOURCE_REVISION_BASE_MISSING:\n case CLI_PROBLEM_TYPES.AUTHORING_STATE_BASE_MISSING:\n return \"Clone the project repository into a clean workspace or push the intended exact commit before retrying.\";\n case CLI_PROBLEM_TYPES.INTERNAL_ERROR:\n return \"Retry the command. If it still fails, include the request id when asking for help.\";\n default:\n return undefined;\n }\n}\n\nfunction getProblemDetails(problem: ApiProblem): string[] {\n return [\n `Problem: ${problem.type}`,\n problem.instance ? `Endpoint: ${problem.instance}` : undefined,\n problem.requestId ? `Request ID: ${problem.requestId}` : undefined,\n problem.timestamp ? `Timestamp: ${problem.timestamp}` : undefined,\n ].filter((detail): detail is string => Boolean(detail));\n}\n\nexport function presentCliError(error: unknown): CliErrorPresentation {\n if (isDreamboardApiError(error)) {\n return {\n message: formatProblem(error.problem),\n resolution: getProblemResolution(error.problem),\n details: getProblemDetails(error.problem),\n };\n }\n\n if (error instanceof Error) {\n return {\n message: error.message,\n details: [],\n };\n }\n\n if (typeof error === \"object\" && error !== null) {\n let serialized: string;\n try {\n serialized = JSON.stringify(error);\n } catch {\n serialized = String(error);\n }\n return {\n message: serialized,\n details: [],\n };\n }\n\n return {\n message: String(error),\n details: [],\n };\n}\n\nexport function formatCliError(error: unknown): string {\n const presentation = presentCliError(error);\n return [\n presentation.message,\n presentation.resolution\n ? `Resolution: ${presentation.resolution}`\n : undefined,\n ...presentation.details,\n ]\n .filter((line): line is string => Boolean(line))\n .join(\"\\n\");\n}\n","import path from \"node:path\";\nimport type { RuleInputFlags } from \"../flags.js\";\nimport { readTextFile } from \"./fs.js\";\n\nexport function normalizeSlug(input: string): string {\n const lowered = input.trim().toLowerCase();\n const replaced = lowered.replace(/[^a-z0-9]+/g, \"-\");\n return replaced.replace(/^-+/, \"\").replace(/-+$/, \"\");\n}\n\nexport function titleFromSlug(slug: string): string {\n return slug\n .split(\"-\")\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nexport async function readRuleInput(flags: RuleInputFlags): Promise<string> {\n if (flags[\"rule-file\"] && typeof flags[\"rule-file\"] === \"string\") {\n const filePath = path.resolve(process.cwd(), flags[\"rule-file\"]);\n return readTextFile(filePath);\n }\n if (flags.rule && typeof flags.rule === \"string\") {\n return flags.rule;\n }\n throw new Error('Provide rule input via --rule-file or --rule \"...\".');\n}\n\nexport function parsePositiveInt(value: string, label: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`${label} must be a positive integer.`);\n }\n return parsed;\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import {\n getJob,\n getProjectCompiledResult,\n listProjectCompiledResults,\n queueProjectRevisionCompile,\n type CompiledResult,\n type JobDetailResponse,\n type QueueCompiledResultJobResponse,\n} from \"@dreamboard-games/api-client\";\nimport { toDreamboardApiError } from \"../../utils/errors.js\";\n\nconst COMPILE_JOB_POLL_INTERVAL_MS = 1000;\nconst DEFAULT_COMPILE_JOB_WAIT_TIMEOUT_MS = 10 * 60 * 1000;\nimport { sleep } from \"../../utils/strings.js\";\n\nfunction firstNonEmpty(\n ...values: Array<string | null | undefined>\n): string | null {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value.trim();\n }\n }\n return null;\n}\n\nfunction formatTerminalCompileJobMessage(\n job: Pick<\n JobDetailResponse,\n \"createdAt\" | \"errorMessage\" | \"jobId\" | \"message\" | \"phase\" | \"status\"\n >,\n): string {\n const detail = firstNonEmpty(job.errorMessage, job.message);\n const phase = firstNonEmpty(job.phase);\n const prefix = `Compile ${job.status.toLowerCase()}${phase ? ` [${phase}]` : \"\"}`;\n return detail\n ? `${prefix}: ${detail}`\n : `${prefix}: job ${job.jobId} ended before a compiled result was created.`;\n}\n\nfunction compareCreatedAtDesc(\n left: Pick<CompiledResult, \"createdAt\">,\n right: Pick<CompiledResult, \"createdAt\">,\n): number {\n const leftTime = Date.parse(left.createdAt);\n const rightTime = Date.parse(right.createdAt);\n if (Number.isFinite(leftTime) && Number.isFinite(rightTime)) {\n return rightTime - leftTime;\n }\n if (Number.isFinite(rightTime)) {\n return 1;\n }\n if (Number.isFinite(leftTime)) {\n return -1;\n }\n return 0;\n}\n\nasync function findFallbackCompiledResultForJob(options: {\n projectId?: string;\n job: Pick<JobDetailResponse, \"createdAt\">;\n}): Promise<CompiledResult | null> {\n const { projectId, job } = options;\n if (!projectId) {\n return null;\n }\n const results = await listProjectCompiledResults({\n path: { projectId },\n query: { limit: 100 },\n });\n if (results.error || !results.data) {\n return null;\n }\n if (results.data.results.length === 0) {\n return null;\n }\n\n const jobCreatedAtMs = Date.parse(job.createdAt);\n const resultsCreatedAfterJob = Number.isFinite(jobCreatedAtMs)\n ? results.data.results.filter((result) => {\n const resultCreatedAtMs = Date.parse(result.createdAt);\n return (\n !Number.isFinite(resultCreatedAtMs) ||\n resultCreatedAtMs >= jobCreatedAtMs\n );\n })\n : results.data.results;\n const candidateResults =\n resultsCreatedAfterJob.length > 0\n ? resultsCreatedAfterJob\n : results.data.results;\n\n return [...candidateResults].sort(compareCreatedAtDesc)[0] ?? null;\n}\n\nexport async function findLatestSuccessfulCompiledResult(\n projectId: string,\n): Promise<CompiledResult | null> {\n void projectId;\n return null;\n}\n\nexport async function findCompiledResultsForAuthoringState(options: {\n projectId: string;\n authoringStateId: string;\n}): Promise<CompiledResult[]> {\n void options;\n return [];\n}\n\nexport async function getCompiledResultSdk(\n projectId: string,\n compiledResultId: string,\n): Promise<CompiledResult> {\n void projectId;\n void compiledResultId;\n throw new Error(\"Project-scoped compiled result lookup is no longer supported.\");\n}\n\nexport async function findProjectCompiledResultsForRevision(options: {\n projectId: string;\n revisionDigest: string;\n}): Promise<CompiledResult[]> {\n const { projectId, revisionDigest } = options;\n const { data, error, response } = await listProjectCompiledResults({\n path: { projectId },\n query: { limit: 100 },\n });\n if (error || !data) {\n throw toDreamboardApiError(\n error,\n response,\n \"Failed to list compiled results\",\n );\n }\n return data.results.filter(\n (result) => result.revisionDigest === revisionDigest,\n );\n}\n\nexport async function getProjectCompiledResultSdk(\n projectId: string,\n compiledResultId: string,\n): Promise<CompiledResult> {\n const { data, error, response } = await getProjectCompiledResult({\n path: { projectId, compiledResultId },\n });\n if (error || !data) {\n throw toDreamboardApiError(\n error,\n response,\n \"Failed to fetch compiled result\",\n );\n }\n return data;\n}\n\nexport async function queueProjectRevisionCompileSdk(options: {\n projectId: string;\n revisionDigest: string;\n}): Promise<QueueCompiledResultJobResponse> {\n const { data, error, response } = await queueProjectRevisionCompile({\n path: {\n projectId: options.projectId,\n revisionDigest: options.revisionDigest,\n },\n });\n\n if (error || !data) {\n throw toDreamboardApiError(error, response, \"Failed to create compile job\");\n }\n\n return data;\n}\n\nexport async function waitForCompiledResultJobSdk(options: {\n projectId?: string;\n jobId: string;\n onProgress?: (job: JobDetailResponse) => void;\n}): Promise<{\n job: JobDetailResponse;\n compiledResult: CompiledResult;\n}> {\n const { projectId, jobId, onProgress } = options;\n if (!projectId) {\n throw new Error(\"projectId is required when waiting for a compile job.\");\n }\n let previousTransitionKey: string | null = null;\n const startedAt = Date.now();\n const timeoutMs = readCompileJobWaitTimeoutMs();\n\n while (Date.now() - startedAt < timeoutMs) {\n const {\n data: job,\n error,\n response,\n } = await getJob({\n path: { jobId },\n });\n if (error || !job) {\n if (isTransientJobPollError(error, response)) {\n await sleep(COMPILE_JOB_POLL_INTERVAL_MS);\n continue;\n }\n throw toDreamboardApiError(error, response, \"Failed to get job\");\n }\n\n const transitionKey = `${job.status}:${job.phase ?? \"\"}`;\n if (transitionKey !== previousTransitionKey) {\n previousTransitionKey = transitionKey;\n onProgress?.(job);\n }\n\n if (job.status === \"COMPLETED\" || job.status === \"FAILED\") {\n const compiledResultId =\n job.createdCompiledResultId ?? job.createdAppScriptId;\n if (compiledResultId) {\n const compiledResult = await getProjectCompiledResultSdk(\n projectId,\n compiledResultId,\n );\n return { job, compiledResult };\n }\n\n const fallbackCompiledResult = await findFallbackCompiledResultForJob({\n projectId,\n job,\n });\n if (fallbackCompiledResult) {\n return { job, compiledResult: fallbackCompiledResult };\n }\n\n throw new Error(formatTerminalCompileJobMessage(job));\n }\n\n if (job.status === \"CANCELLED\" || job.status === \"INTERRUPTED\") {\n throw new Error(formatTerminalCompileJobMessage(job));\n }\n\n await sleep(COMPILE_JOB_POLL_INTERVAL_MS);\n }\n\n throw new Error(`Compile job ${jobId} did not complete in time.`);\n}\n\nfunction readCompileJobWaitTimeoutMs(): number {\n const raw = process.env.DREAMBOARD_COMPILE_WAIT_TIMEOUT_MS;\n if (!raw) return DEFAULT_COMPILE_JOB_WAIT_TIMEOUT_MS;\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return DEFAULT_COMPILE_JOB_WAIT_TIMEOUT_MS;\n }\n return parsed;\n}\n\nfunction isTransientJobPollError(error: unknown, response: unknown): boolean {\n if (response) return false;\n if (!error) return false;\n if (error instanceof Error) {\n return isTransientJobPollMessage(error.message);\n }\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n return isTransientJobPollMessage(String(error.message));\n }\n return isTransientJobPollMessage(String(error));\n}\n\nfunction isTransientJobPollMessage(message: string): boolean {\n const normalized = message.toLowerCase();\n return (\n normalized.includes(\"fetch failed\") ||\n normalized.includes(\"network\") ||\n normalized.includes(\"timeout\") ||\n normalized.includes(\"econnreset\") ||\n normalized.includes(\"econnrefused\") ||\n normalized.includes(\"socket\")\n );\n}\n","import path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { createRequire } from \"node:module\";\nimport { pathToFileURL } from \"node:url\";\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n readdirSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport type {\n BoardSpec,\n GameTopologyManifest,\n} from \"@dreamboard-games/sdk/types\";\nimport {\n createProjectSessionFromReducerSnapshot,\n createProjectSession,\n getSessionSnapshot,\n startGame,\n} from \"@dreamboard-games/api-client\";\nimport type { ReducerWire as Wire } from \"@dreamboard-games/sdk/reducer-contract\";\nimport type { ProjectConfig, ResolvedConfig } from \"../../types.js\";\nimport { ensureDir, exists } from \"../../utils/fs.js\";\nimport {\n readWorkspaceTextFileIfExists,\n resolveWorkspacePath,\n workspacePathExists,\n writeWorkspaceJsonFile,\n writeWorkspaceTextFile,\n} from \"../project/workspace-path.js\";\nimport {\n importTypeScriptModule,\n bundleTypeScriptModuleText,\n} from \"../../utils/ts-module-loader.js\";\nimport { hashContent } from \"../../utils/crypto.js\";\nimport { loadManifest } from \"../project/local-files.js\";\nimport {\n REDUCER_TESTING_TYPES_WRAPPER_CONTENT,\n buildReducerTestingContractContent,\n} from \"../../templates/testing-types-content.js\";\nimport { submitGameplayAuthorityAction } from \"../gameplay-authority-submit.js\";\nimport { resolveSetupProfileSelection } from \"../workflows/resolve-setup-profile.js\";\nimport {\n isStaleContractArtifactError,\n STALE_CONTRACT_ARTIFACT_CODE,\n toDreamboardApiError,\n} from \"../../utils/errors.js\";\nimport { PROJECT_DIR_NAME } from \"../../constants.js\";\nimport { projectIdFromSessionGameSource } from \"../../utils/session-game-source.js\";\n\n// Opt in to SDK authoring warnings (e.g. concrete dependent-choice defaults).\n// Trusted reducer code cannot read process.env, so the SDK gates authoring\n// warnings on this host-set global instead.\n(globalThis as Record<string, unknown>).__DREAMBOARD_AUTHORING_WARNINGS__ =\n true;\n\nconst GENERATED_TESTING_TYPES_PREFIX = \"// Generated by dreamboard\";\nconst TESTING_TYPES_STUB =\n \"export function defineScenario(scenario) { return scenario; }\\n\";\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst BASE_SUFFIX = \".base.ts\";\nconst SCENARIO_SUFFIX = \".scenario.ts\";\nconst SDK_UI_RUNTIME_EXTERNALS = [\n \"@radix-ui/react-accordion\",\n \"@radix-ui/react-dialog\",\n \"@radix-ui/react-label\",\n \"@radix-ui/react-select\",\n \"@radix-ui/react-slot\",\n \"@radix-ui/react-tooltip\",\n \"@use-gesture/react\",\n \"clsx\",\n \"framer-motion\",\n \"lucide-react\",\n \"react\",\n \"react-dom\",\n \"vaul\",\n] as const;\n\ntype ReducerRuntimeLike = {\n initialize(input: {\n table: unknown;\n playerIds: readonly string[];\n rngSeed?: number | null;\n setup?: unknown;\n }): unknown | Promise<unknown>;\n hydrate(input: { state: Record<string, unknown> }): void;\n unsafeState(): unknown;\n snapshot(): unknown;\n projectSeatsDynamic(input: { playerIds: readonly string[] }): unknown;\n projectSeatViewDynamic(input: { playerId: string }): unknown;\n dispatch(input: { input: Record<string, unknown> }): Promise<{\n kind: string;\n errorCode?: string;\n message?: string;\n }>;\n explainInteraction?(input: {\n playerId: string;\n interactionId: string;\n }): unknown;\n};\n\ntype ReducerBundleLike = {\n createInProcessRuntime(): ReducerRuntimeLike;\n};\n\ntype ProjectReducerNativeModules = {\n createReducerBundle(game: unknown): ReducerBundleLike;\n contractFingerprint(game: unknown): { value: string };\n materializeManifestTable(input: {\n manifest: GameTopologyManifest;\n playerIds: readonly string[];\n shuffleItems<Value>(values: readonly Value[]): Value[];\n }): unknown;\n createExpectApi(options?: {\n matchSnapshot?: (name: string | undefined, actual: unknown) => void;\n }): ExpectApi;\n};\n\ntype TypedBaseDefinition = {\n id: string;\n seed?: number;\n players?: number;\n setupProfileId?: string;\n extends?: string;\n setup: (ctx: BaseContext) => void | Promise<void>;\n};\n\ntype ResolvedBaseDefinition = TypedBaseDefinition & {\n seed: number;\n players: number;\n};\n\ntype TypedScenarioDefinition = {\n id: string;\n description?: string;\n from: string;\n phase?: string;\n stage?: string;\n when: (ctx: SharedScenarioContext) => void | Promise<void>;\n then: (ctx: SharedScenarioContext) => void | Promise<void>;\n};\n\ntype LoadedBase = {\n filePath: string;\n definition: TypedBaseDefinition;\n bundleHash: string;\n};\n\ntype LoadedScenario = {\n filePath: string;\n definition: TypedScenarioDefinition;\n bundleHash: string;\n};\n\ntype ExpectMatchers = {\n toBe: (expected: unknown) => void;\n toEqual: (expected: unknown) => void;\n toBeDefined: () => void;\n toBeUndefined: () => void;\n toBeNull: () => void;\n toContain: (expected: unknown) => void;\n toBeGreaterThan: (expected: number) => void;\n toBeGreaterThanOrEqual: (expected: number) => void;\n};\n\ntype ExpectApi = (actual: unknown) => ExpectMatchers;\n\ntype HistoryInput = {\n kind: \"interaction\";\n playerId: string;\n interactionId: string;\n params: Record<string, unknown>;\n};\n\ntype HistoryRecord = {\n input: HistoryInput;\n accepted: boolean;\n errorCode?: string;\n message?: string;\n};\n\ntype BaseStateArtifact = {\n key: string;\n base: string;\n snapshot: Record<string, unknown>;\n version: number;\n fingerprint: {\n base: string;\n seed: number;\n players: number;\n baseBundleHash: string;\n manifestHash: string;\n appBundleHash: string;\n uiContractHash: string;\n setupProfileId?: string | null;\n compiledResultId?: string;\n projectId?: string;\n parentBaseId?: string | null;\n parentFingerprintHash?: string | null;\n contractFingerprint?: string;\n };\n};\n\ntype BaseStateFile = Record<string, BaseStateArtifact>;\n\ntype BaseContext = {\n game: ScenarioGameApi;\n players: () => readonly string[];\n seat: (index: number) => string;\n};\n\ntype SharedScenarioContext = BaseContext & {\n state: () => string;\n view: (playerId: string) => unknown;\n interactions: (playerId: string) => readonly Record<string, unknown>[];\n explain: (playerId: string, interactionId: string) => unknown;\n expect: ExpectApi;\n};\n\ntype ScenarioGameApi = {\n start: () => Promise<void>;\n patchState: (\n mutator: (state: Record<string, unknown>) => void,\n ) => Promise<void>;\n submit: (\n playerId: string,\n interactionId: string,\n params?: Record<string, unknown>,\n ) => Promise<void>;\n};\n\ntype SubmissionError = Error & { errorCode?: string };\n\nexport type ReducerNativeScenarioResult = {\n id: string;\n success: boolean;\n error?: string;\n errorCode?: string;\n};\n\nexport type ReducerNativeScenarioSummary = {\n passed: number;\n failed: number;\n results: ReducerNativeScenarioResult[];\n};\n\nexport function formatScenarioErrorForDisplay(options: {\n error: Error;\n projectRoot: string;\n scenarioFilePath: string;\n}): string {\n const message = options.error.message || \"Scenario failed.\";\n const scenarioFrame = findScenarioStackFrame({\n stack: options.error.stack,\n projectRoot: options.projectRoot,\n scenarioFilePath: options.scenarioFilePath,\n });\n return scenarioFrame ? `${message}\\n${scenarioFrame}` : message;\n}\n\nfunction findScenarioStackFrame(options: {\n stack: string | undefined;\n projectRoot: string;\n scenarioFilePath: string;\n}): string | null {\n if (!options.stack) {\n return null;\n }\n\n const absolutePath = path.resolve(options.scenarioFilePath);\n const relativePath = path.relative(options.projectRoot, absolutePath);\n const normalizedRelativePath = relativePath.split(path.sep).join(\"/\");\n const escapedAbsolutePath = escapeRegExp(absolutePath);\n const escapedRelativePath = escapeRegExp(normalizedRelativePath);\n const absoluteFrame = new RegExp(`${escapedAbsolutePath}:(\\\\d+):(\\\\d+)`);\n const relativeFrame = new RegExp(`${escapedRelativePath}:(\\\\d+):(\\\\d+)`);\n\n for (const line of options.stack.split(\"\\n\")) {\n const normalizedLine = line.split(path.sep).join(\"/\");\n const match =\n normalizedLine.match(absoluteFrame) ??\n normalizedLine.match(relativeFrame);\n if (match?.[1] && match?.[2]) {\n return `at ${normalizedRelativePath}:${match[1]}:${match[2]}`;\n }\n }\n\n return null;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nexport type SeededScenarioSession = {\n sessionId: string;\n shortCode: string;\n projectId: string;\n seed: number;\n playerCount: number;\n setupProfileId: string | null;\n scenarioId: string;\n phase: string | null;\n stage: string | null;\n materialization?: {\n mode: \"snapshot\";\n totalMs: number;\n reducerHarnessMs: number;\n backendHydrateMs: number;\n };\n};\n\nexport type MaterializedScenarioReducerState = {\n baseId: string;\n scenarioId: string;\n seed: number;\n playerCount: number;\n setupProfileId: string | null;\n reducerState: Record<string, unknown>;\n reducerStateVersion: number;\n fingerprintMetadata: Record<string, string>;\n phase: string | null;\n stage: string | null;\n};\n\nexport type LiveReplayActionDiagnostic = {\n index: number;\n playerId: string;\n interactionId: string;\n inputs?: JsonObject;\n expectedVersion: number;\n actionSetVersion: string;\n responseStatus?: number;\n responseBody?: string;\n accepted?: boolean;\n errorCode?: string;\n backendTiming?: string;\n durationMs: number;\n};\n\nexport type LiveReplayScenarioResult = SeededScenarioSession & {\n diagnostics: LiveReplayActionDiagnostic[];\n};\n\nexport type LiveReplayActionPlanSession = SeededScenarioSession;\n\nexport type LiveReplayActionPlan = {\n projectId: string;\n seed: number;\n playerCount: number;\n setupProfileId: string | null;\n scenarioId: string;\n phase: string | null;\n stage: string | null;\n diagnostics: LiveReplayActionDiagnostic[];\n};\n\ntype JsonValue =\n | string\n | number\n | boolean\n | null\n | JsonValue[]\n | { [key: string]: JsonValue };\ntype JsonObject = { [key: string]: JsonValue };\n\nconst projectReducerNativeModules = new Map<\n string,\n Promise<ProjectReducerNativeModules>\n>();\n\nfunction resolveProjectSdkModule(\n projectRoot: string,\n specifier: string,\n): string {\n const requireFromProject = createRequire(\n path.join(projectRoot, \"package.json\"),\n );\n return requireFromProject.resolve(specifier);\n}\n\nasync function importProjectSdkModule<T>(\n projectRoot: string,\n specifier: string,\n): Promise<T> {\n const modulePath = resolveProjectSdkModule(projectRoot, specifier);\n return (await import(pathToFileURL(modulePath).href)) as T;\n}\n\nasync function loadProjectReducerNativeModules(\n projectRoot: string,\n): Promise<ProjectReducerNativeModules> {\n const cacheKey = path.resolve(projectRoot);\n const cached = projectReducerNativeModules.get(cacheKey);\n if (cached) {\n return cached;\n }\n\n const promise = Promise.all([\n importProjectSdkModule<{\n createReducerBundle?: unknown;\n contractFingerprint?: unknown;\n }>(cacheKey, \"@dreamboard-games/sdk/reducer\"),\n importProjectSdkModule<{\n materializeManifestTable?: unknown;\n }>(cacheKey, \"@dreamboard-games/sdk/reducer-contract\"),\n importProjectSdkModule<{ createExpectApi?: unknown }>(\n cacheKey,\n \"@dreamboard-games/sdk/testing\",\n ),\n ]).then(([reducerModule, reducerContractModule, testingModule]) => {\n if (\n typeof reducerModule.createReducerBundle !== \"function\" ||\n typeof reducerModule.contractFingerprint !== \"function\" ||\n typeof reducerContractModule.materializeManifestTable !== \"function\" ||\n typeof testingModule.createExpectApi !== \"function\"\n ) {\n throw new Error(\n \"Installed @dreamboard-games/sdk does not expose the reducer-native test helpers required by this CLI.\",\n );\n }\n\n return {\n createReducerBundle:\n reducerModule.createReducerBundle as ProjectReducerNativeModules[\"createReducerBundle\"],\n contractFingerprint:\n reducerModule.contractFingerprint as ProjectReducerNativeModules[\"contractFingerprint\"],\n materializeManifestTable:\n reducerContractModule.materializeManifestTable as ProjectReducerNativeModules[\"materializeManifestTable\"],\n createExpectApi:\n testingModule.createExpectApi as ProjectReducerNativeModules[\"createExpectApi\"],\n };\n });\n\n projectReducerNativeModules.set(cacheKey, promise);\n return promise;\n}\n\nfunction createSubmissionError(\n errorCode: string | undefined,\n message: string | undefined,\n fallbackMessage: string,\n): SubmissionError {\n const error = new Error(message ?? fallbackMessage) as SubmissionError;\n error.name = \"SubmissionError\";\n error.errorCode = errorCode;\n return error;\n}\n\nfunction parseJsonValue(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n}\n\nfunction deepEqual(left: unknown, right: unknown): boolean {\n return isDeepStrictEqual(left, right);\n}\n\nfunction shouldRefreshReducerTestingTypes(\n existingContent: string | null,\n): boolean {\n if (\n existingContent === null ||\n existingContent.trim().length === 0 ||\n existingContent === TESTING_TYPES_STUB ||\n existingContent.startsWith(GENERATED_TESTING_TYPES_PREFIX)\n ) {\n return true;\n }\n return false;\n}\n\nasync function discoverFiles(root: string, suffix: string): Promise<string[]> {\n if (!(await exists(root))) {\n return [];\n }\n const entries = await readdir(root, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const entryPath = path.join(root, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await discoverFiles(entryPath, suffix)));\n continue;\n }\n if (entry.isFile() && entry.name.endsWith(suffix)) {\n files.push(entryPath);\n }\n }\n files.sort();\n return files;\n}\n\nfunction isFunction(value: unknown): value is (...args: never[]) => unknown {\n return typeof value === \"function\";\n}\n\nfunction parseTypedBaseDefinition(value: unknown): TypedBaseDefinition {\n if (\n typeof value !== \"object\" ||\n value === null ||\n !(\"id\" in value) ||\n typeof value.id !== \"string\" ||\n !(\"setup\" in value) ||\n !isFunction(value.setup)\n ) {\n throw new Error(\"Invalid reducer-native base definition.\");\n }\n const parentBaseId =\n \"extends\" in value && typeof value.extends === \"string\"\n ? value.extends\n : undefined;\n const seed =\n \"seed\" in value && typeof value.seed === \"number\" ? value.seed : undefined;\n const players =\n \"players\" in value && typeof value.players === \"number\"\n ? value.players\n : undefined;\n if ((seed === undefined || players === undefined) && !parentBaseId) {\n throw new Error(\n \"Invalid reducer-native base definition. Base definitions without --extends must declare numeric seed and players.\",\n );\n }\n const setupProfileId =\n \"setupProfileId\" in value && typeof value.setupProfileId === \"string\"\n ? value.setupProfileId\n : undefined;\n return {\n ...(value as TypedBaseDefinition),\n seed,\n players,\n setupProfileId,\n extends: parentBaseId,\n };\n}\n\nfunction parseTypedScenarioDefinition(value: unknown): TypedScenarioDefinition {\n if (\n typeof value !== \"object\" ||\n value === null ||\n !(\"id\" in value) ||\n typeof value.id !== \"string\" ||\n !(\"from\" in value) ||\n typeof value.from !== \"string\" ||\n !(\"when\" in value) ||\n !isFunction(value.when) ||\n !(\"then\" in value) ||\n !isFunction(value.then)\n ) {\n throw new Error(\"Invalid reducer-native scenario definition.\");\n }\n const phase =\n \"phase\" in value && typeof value.phase === \"string\"\n ? value.phase\n : undefined;\n const stage =\n \"stage\" in value && typeof value.stage === \"string\"\n ? value.stage\n : undefined;\n return {\n ...(value as TypedScenarioDefinition),\n phase,\n stage,\n };\n}\n\nexport async function isReducerNativeTestingWorkspace(\n projectRoot: string,\n): Promise<boolean> {\n return (\n (await exists(path.join(projectRoot, \"app\", \"game.ts\"))) &&\n (await exists(\n path.join(projectRoot, \"shared\", \"generated\", \"ui-contract.ts\"),\n ))\n );\n}\n\nexport async function ensureReducerNativeTestingFiles(\n projectRoot: string,\n): Promise<void> {\n const testingTypesPath = \"test/testing-types.ts\";\n const testingContractPath = \"test/generated/testing-contract.ts\";\n const baseStatesPath = \"test/generated/base-states.generated.ts\";\n const baseStatesDtsPath = \"test/generated/base-states.generated.d.ts\";\n const scenarioManifestPath = \"test/generated/scenario-manifest.generated.ts\";\n\n await ensureDir(resolveWorkspacePath(projectRoot, \"test\"));\n await ensureDir(resolveWorkspacePath(projectRoot, \"test/generated\"));\n\n const existingTestingTypes = await readWorkspaceTextFileIfExists(\n projectRoot,\n testingTypesPath,\n );\n if (shouldRefreshReducerTestingTypes(existingTestingTypes)) {\n await writeWorkspaceTextFile(\n projectRoot,\n testingTypesPath,\n REDUCER_TESTING_TYPES_WRAPPER_CONTENT,\n );\n }\n\n const rejectionCodes = await collectKnownRejectionCodes(projectRoot);\n await writeWorkspaceTextFile(\n projectRoot,\n testingContractPath,\n buildReducerTestingContractContent({ rejectionCodes }),\n );\n\n const header =\n \"// Generated by dreamboard test. Do not edit by hand.\\n\";\n if (!(await workspacePathExists(projectRoot, baseStatesPath))) {\n await writeWorkspaceTextFile(\n projectRoot,\n baseStatesPath,\n `${header}export const BASE_STATES = {} as const;\\nexport const BASE_STATES_CONTRACT_FINGERPRINT = undefined;\\n`,\n );\n } else {\n const existingBaseStates = await readWorkspaceTextFileIfExists(\n projectRoot,\n baseStatesPath,\n );\n if (\n existingBaseStates &&\n !existingBaseStates.includes(\"BASE_STATES_CONTRACT_FINGERPRINT\")\n ) {\n await writeWorkspaceTextFile(\n projectRoot,\n baseStatesPath,\n `${existingBaseStates.trimEnd()}\\nexport const BASE_STATES_CONTRACT_FINGERPRINT = undefined;\\n`,\n );\n }\n }\n if (!(await workspacePathExists(projectRoot, baseStatesDtsPath))) {\n await writeWorkspaceTextFile(\n projectRoot,\n baseStatesDtsPath,\n `${header}export declare const BASE_STATES: Record<string, unknown>;\\nexport declare const BASE_STATES_CONTRACT_FINGERPRINT: string | undefined;\\n`,\n );\n } else {\n const existingBaseStatesDts = await readWorkspaceTextFileIfExists(\n projectRoot,\n baseStatesDtsPath,\n );\n if (\n existingBaseStatesDts &&\n !existingBaseStatesDts.includes(\"BASE_STATES_CONTRACT_FINGERPRINT\")\n ) {\n await writeWorkspaceTextFile(\n projectRoot,\n baseStatesDtsPath,\n `${existingBaseStatesDts.trimEnd()}\\nexport declare const BASE_STATES_CONTRACT_FINGERPRINT: string | undefined;\\n`,\n );\n }\n }\n if (!(await workspacePathExists(projectRoot, scenarioManifestPath))) {\n await writeWorkspaceTextFile(\n projectRoot,\n scenarioManifestPath,\n `${header}export const SCENARIO_MANIFEST = [] as const;\\n`,\n );\n }\n}\n\nconst DEFAULT_REJECTION_CODES = [\n \"NOT_YOUR_TURN\",\n \"action-unavailable\",\n \"invalid-action-params\",\n \"prompt-not-owned\",\n] as const;\n\nasync function collectKnownRejectionCodes(\n projectRoot: string,\n): Promise<string[]> {\n const knownCodes = new Set<string>(DEFAULT_REJECTION_CODES);\n const gamePath = path.join(projectRoot, \"app\", \"game.ts\");\n if (!(await exists(gamePath))) {\n return Array.from(knownCodes).sort((left, right) =>\n left.localeCompare(right),\n );\n }\n\n try {\n const module =\n await importTypeScriptModule<Record<string, unknown>>(gamePath);\n const phases =\n (\n module.default as {\n phases?: Record<\n string,\n {\n interactions?: Record<string, { errorCodes?: readonly string[] }>;\n }\n >;\n }\n )?.phases ?? {};\n for (const phase of Object.values(phases)) {\n const interactions = phase.interactions ?? {};\n for (const interaction of Object.values(interactions)) {\n for (const errorCode of interaction.errorCodes ?? []) {\n if (typeof errorCode === \"string\" && errorCode.length > 0) {\n knownCodes.add(errorCode);\n }\n }\n }\n }\n } catch {\n // Keep the generated contract usable even if the project module fails to load.\n }\n\n return Array.from(knownCodes).sort((left, right) =>\n left.localeCompare(right),\n );\n}\n\nexport async function loadTypedBases(\n projectRoot: string,\n): Promise<LoadedBase[]> {\n const baseFiles = await discoverFiles(\n resolveWorkspacePath(projectRoot, \"test/bases\"),\n BASE_SUFFIX,\n );\n const loaded: LoadedBase[] = [];\n for (const filePath of baseFiles) {\n const externals = reducerNativeTestHelperExternals(projectRoot, filePath);\n const [module, bundledText] = await Promise.all([\n importTypeScriptModule<Record<string, unknown>>(filePath),\n bundleTypeScriptModuleText(filePath, { external: externals }),\n ]);\n loaded.push({\n filePath,\n definition: parseTypedBaseDefinition(module.default),\n bundleHash: hashContent(bundledText),\n });\n }\n return loaded;\n}\n\nexport async function loadTypedScenarios(\n projectRoot: string,\n options: { scenarioPath?: string },\n): Promise<LoadedScenario[]> {\n const scenarioFiles = options.scenarioPath\n ? [resolveWorkspacePath(projectRoot, options.scenarioPath)]\n : await discoverFiles(\n resolveWorkspacePath(projectRoot, \"test/scenarios\"),\n SCENARIO_SUFFIX,\n );\n const loaded: LoadedScenario[] = [];\n for (const filePath of scenarioFiles) {\n const externals = reducerNativeTestHelperExternals(projectRoot, filePath);\n const [module, bundledText] = await Promise.all([\n importTypeScriptModule<Record<string, unknown>>(filePath),\n bundleTypeScriptModuleText(filePath, { external: externals }),\n ]);\n loaded.push({\n filePath,\n definition: parseTypedScenarioDefinition(module.default),\n bundleHash: hashContent(bundledText),\n });\n }\n return loaded;\n}\n\nfunction reducerNativeTestHelperExternals(\n projectRoot: string,\n filePath: string,\n): string[] {\n const testingTypesPath = path.join(projectRoot, \"test\", \"testing-types\");\n const relative = path\n .relative(path.dirname(filePath), testingTypesPath)\n .replaceAll(\"\\\\\", \"/\");\n const specifier = relative.startsWith(\".\") ? relative : `./${relative}`;\n return [specifier, `${specifier}.ts`, ...SDK_UI_RUNTIME_EXTERNALS];\n}\n\nconst JS_MAX_SAFE_INTEGER = 9_007_199_254_740_991n;\nconst JS_MIN_SAFE_INTEGER = -JS_MAX_SAFE_INTEGER;\nconst JS_MAX_SAFE_INTEGER_EXCLUSIVE = JS_MAX_SAFE_INTEGER + 1n;\n\nclass KotlinSeededRandom {\n private x: number;\n private y: number;\n private z: number;\n private w: number;\n private v: number;\n private addend: number;\n\n constructor(seed: number) {\n const seedBig = BigInt.asIntN(64, BigInt(Math.trunc(seed)));\n const seed1 = Number(BigInt.asIntN(32, seedBig));\n const seed2 = Number(BigInt.asIntN(32, seedBig >> 32n));\n\n this.x = seed1 | 0;\n this.y = seed2 | 0;\n this.z = 0;\n this.w = 0;\n this.v = ~seed1;\n this.addend = ((seed1 << 10) ^ (seed2 >>> 4)) | 0;\n\n if ((this.x | this.y | this.z | this.w | this.v) === 0) {\n throw new Error(\n \"Kotlin random seed must initialize at least one state word.\",\n );\n }\n\n for (let index = 0; index < 64; index += 1) {\n this.nextInt();\n }\n }\n\n nextInt(): number {\n let next = this.x | 0;\n next ^= next >>> 2;\n this.x = this.y;\n this.y = this.z;\n this.z = this.w;\n const currentV = this.v | 0;\n this.w = currentV;\n next = (next ^ (next << 1) ^ currentV ^ (currentV << 4)) | 0;\n this.v = next;\n this.addend = (this.addend + 362437) | 0;\n return (next + this.addend) | 0;\n }\n\n private nextBits(bitCount: number): number {\n if (bitCount <= 0) {\n return 0;\n }\n return this.nextInt() >>> (32 - bitCount);\n }\n\n nextIntBound(bound: number): number {\n if (bound <= 0) {\n throw new Error(\"bound must be positive\");\n }\n\n if ((bound & -bound) === bound) {\n const bitCount = 31 - Math.clz32(bound);\n return this.nextBits(bitCount);\n }\n\n let value: number;\n while (true) {\n const bits = this.nextInt() >>> 1;\n value = bits % bound;\n if (bits - value + (bound - 1) >= 0) {\n return value;\n }\n }\n }\n\n nextLong(): number {\n return Number(this.nextLongBigInt());\n }\n\n private nextLongBigInt(): bigint {\n const high = BigInt(this.nextInt());\n const low = BigInt(this.nextInt());\n return BigInt.asIntN(64, (high << 32n) + low);\n }\n\n nextReducerRuntimeSeed(): number {\n return Number(\n this.nextLongRange(JS_MIN_SAFE_INTEGER, JS_MAX_SAFE_INTEGER_EXCLUSIVE),\n );\n }\n\n private nextLongRange(from: bigint, until: bigint): bigint {\n if (until <= from) {\n throw new Error(\"until must be greater than from\");\n }\n\n const bound = until - from;\n const mask = bound - 1n;\n if ((bound & mask) === 0n) {\n return from + (BigInt.asUintN(64, this.nextLongBigInt()) & mask);\n }\n\n while (true) {\n const bits = BigInt.asUintN(64, this.nextLongBigInt()) >> 1n;\n const value = bits % bound;\n if (BigInt.asIntN(64, bits + mask - value) >= 0n) {\n return from + value;\n }\n }\n }\n}\n\nfunction shuffleWithKotlinRandom<T>(\n values: readonly T[],\n random: KotlinSeededRandom,\n): T[] {\n const next = [...values];\n for (let index = next.length - 1; index > 0; index -= 1) {\n const swapIndex = random.nextIntBound(index + 1);\n const current = next[index];\n next[index] = next[swapIndex] as T;\n next[swapIndex] = current as T;\n }\n return next;\n}\n\ntype EffectiveBaseSetup = {\n setupProfileId: string | null;\n};\n\ntype GeneratedInitialTableFactory = (options?: {\n playerIds?: readonly string[];\n shuffleItems?: <Value>(values: readonly Value[]) => Value[];\n}) => Record<string, unknown>;\n\nfunction resolveEffectiveBaseSetup(options: {\n manifest: GameTopologyManifest;\n base: TypedBaseDefinition;\n basesById?: Map<string, LoadedBase>;\n}): EffectiveBaseSetup {\n const inheritedSetupProfileId =\n options.base.setupProfileId ??\n (options.base.extends && options.basesById\n ? resolveEffectiveBaseSetup({\n manifest: options.manifest,\n base:\n options.basesById.get(options.base.extends)?.definition ??\n (() => {\n throw new Error(\n `Base '${options.base.id}' extends unknown parent '${options.base.extends}'.`,\n );\n })(),\n basesById: options.basesById,\n }).setupProfileId\n : undefined);\n const selection = resolveSetupProfileSelection({\n manifest: options.manifest,\n requestedSetupProfileId: inheritedSetupProfileId ?? undefined,\n });\n return {\n setupProfileId: selection.id,\n };\n}\n\nfunction resolveBaseDefinition(\n base: LoadedBase,\n basesById: Map<string, LoadedBase>,\n): ResolvedBaseDefinition {\n const inherited =\n base.definition.extends !== undefined\n ? resolveBaseDefinition(\n basesById.get(base.definition.extends) ??\n (() => {\n throw new Error(\n `Base '${base.definition.id}' extends unknown parent '${base.definition.extends}'.`,\n );\n })(),\n basesById,\n )\n : null;\n\n const seed = base.definition.seed ?? inherited?.seed;\n const players = base.definition.players ?? inherited?.players;\n if (seed === undefined || players === undefined) {\n throw new Error(\n `Base '${base.definition.id}' must resolve numeric seed and players.`,\n );\n }\n\n return {\n ...base.definition,\n seed,\n players,\n setupProfileId:\n base.definition.setupProfileId ?? inherited?.setupProfileId ?? undefined,\n };\n}\n\nfunction summarizeTableValidationError(\n manifest: GameTopologyManifest,\n error: Error,\n): string {\n const issues = error.message\n .split(\"; \")\n .map((issue) => issue.trim())\n .filter((issue) => issue.length > 0);\n\n if (\n issues.length === 0 ||\n !issues.every((issue) => issue.startsWith(\"table\"))\n ) {\n return error.message;\n }\n\n const boardBaseIdByRuntimeId = new Map<string, string>(\n (manifest.boards ?? []).flatMap((board: BoardSpec) =>\n board.scope === \"perPlayer\"\n ? Array.from(\n { length: manifest.players.maxPlayers },\n (_, index) =>\n [`${board.id}:player-${index + 1}`, board.id] as const,\n )\n : ([[board.id, board.id]] as const),\n ),\n );\n\n const representativeIssues = issues.slice(0, 3).map((issue) => {\n const [, runtimeBoardId = \"\"] =\n issue.match(/^table\\.boards\\.byId\\.([^.]+)\\./) ?? [];\n const boardBaseId = boardBaseIdByRuntimeId.get(runtimeBoardId);\n if (!boardBaseId) {\n return `- ${issue.replace(/^table\\./, \"\")}`;\n }\n const boardSpecificPath = issue\n .replace(/^table\\.boards\\.byId\\.[^.]+\\./, \"\")\n .replace(/^table\\./, \"\");\n return `- board '${boardBaseId}' (${runtimeBoardId}): ${boardSpecificPath}`;\n });\n\n return [\n `Reducer-native table validation failed with ${issues.length} issue${issues.length === 1 ? \"\" : \"s\"}.`,\n \"Likely root cause: the generated test table shape does not match the authored manifest topology.\",\n ...representativeIssues,\n \"Pass --debug for the full validation dump.\",\n ].join(\"\\n\");\n}\n\nclass ShadowReducerRuntime {\n private readonly bundle: ReducerBundleLike;\n private readonly runtime: ReducerRuntimeLike;\n private readonly playerIds: string[];\n private readonly historyRecords: HistoryRecord[] = [];\n private version = 0;\n private started = false;\n\n constructor(\n private readonly modules: ProjectReducerNativeModules,\n private readonly manifest: GameTopologyManifest,\n private readonly gameModuleDefault: unknown,\n private readonly createInitialTable: GeneratedInitialTableFactory | null,\n private readonly seed: number,\n private readonly players: number,\n private readonly setupProfileId: string | null,\n private readonly debug = false,\n ) {\n if (\n typeof gameModuleDefault !== \"object\" ||\n gameModuleDefault === null ||\n !(\"contract\" in gameModuleDefault)\n ) {\n throw new Error(\n \"app/game.ts must export a reducer-native project definition.\",\n );\n }\n this.bundle = this.modules.createReducerBundle(gameModuleDefault);\n this.runtime = this.bundle.createInProcessRuntime();\n this.playerIds = Array.from(\n { length: players },\n (_, index) => `player-${index + 1}`,\n );\n }\n\n async start(): Promise<void> {\n if (this.started) {\n return;\n }\n const random = new KotlinSeededRandom(this.seed);\n const shuffleItems = <Value>(values: readonly Value[]) =>\n shuffleWithKotlinRandom(values, random);\n // JSON-roundtrip the materialized table to mirror the backend wire\n // boundary: real flows serialize the table over HTTP, which drops\n // explicit `undefined` property values (e.g. optional card text) that\n // the bundle's strict JSON state schema would otherwise reject.\n const table: unknown = JSON.parse(\n JSON.stringify(\n this.createInitialTable?.({\n playerIds: this.playerIds,\n shuffleItems,\n }) ??\n this.modules.materializeManifestTable({\n manifest: this.manifest,\n playerIds: this.playerIds,\n shuffleItems,\n }),\n ),\n );\n const rngSeed = random.nextReducerRuntimeSeed();\n try {\n await this.runtime.initialize({\n table: table as never,\n playerIds: this.playerIds,\n rngSeed,\n setup: this.setupProfileId\n ? {\n profileId: this.setupProfileId,\n }\n : null,\n });\n } catch (error) {\n if (!this.debug && error instanceof Error) {\n throw new Error(summarizeTableValidationError(this.manifest, error));\n }\n throw error;\n }\n this.version = 0;\n this.started = true;\n }\n\n phase(): string {\n return (\n ((\n (\n (this.runtime.unsafeState() as { domain?: unknown } | null)\n ?.domain as { flow?: { currentPhase?: string } } | undefined\n )?.flow as { currentPhase?: string } | undefined\n )?.currentPhase ??\n null) ||\n \"\"\n );\n }\n\n playerOrder(): string[] {\n return this.playerIds;\n }\n\n rawState(): Record<string, unknown> {\n return this.runtime.snapshot() as Record<string, unknown>;\n }\n\n currentVersion(): number {\n return this.version;\n }\n\n hydrate(snapshot: Record<string, unknown>, version = 0): void {\n this.runtime.hydrate({ state: structuredClone(snapshot) });\n this.version = version;\n this.started = true;\n }\n\n patchState(mutator: (state: Record<string, unknown>) => void): void {\n const next = structuredClone(this.rawState());\n mutator(next);\n this.hydrate(next, this.version + 1);\n }\n\n projectAllSeats(): {\n currentStage: string | null;\n stageSeats: string[];\n seats: Record<\n string,\n {\n view?: unknown;\n availableInteractions?: Array<Record<string, unknown>>;\n zones?: Record<string, unknown>;\n }\n >;\n } {\n type RawSeatProjection = {\n view?: unknown;\n availableInteractions?: Array<Record<string, unknown>>;\n availableInteractionRefs?: unknown;\n zones?: Record<string, unknown>;\n };\n type RawSeatProjectionBundle = {\n currentStage?: string | null;\n stageSeats?: string[];\n interactionsByRef?: unknown;\n seats?: Record<string, RawSeatProjection>;\n };\n\n const projection = this.runtime.projectSeatsDynamic({\n playerIds: this.playerIds as never,\n }) as RawSeatProjectionBundle;\n const interactionsByRef =\n projection.interactionsByRef &&\n typeof projection.interactionsByRef === \"object\" &&\n !Array.isArray(projection.interactionsByRef)\n ? (projection.interactionsByRef as Record<\n string,\n Record<string, unknown> | undefined\n >)\n : {};\n const seats = Object.fromEntries(\n Object.entries(projection.seats ?? {}).map(([playerId, seat]) => {\n const availableInteractionRefs = Array.isArray(\n seat.availableInteractionRefs,\n )\n ? seat.availableInteractionRefs.filter(\n (ref): ref is string => typeof ref === \"string\",\n )\n : [];\n const availableInteractions =\n seat.availableInteractions ??\n availableInteractionRefs\n .map((ref) => interactionsByRef[ref])\n .filter(\n (descriptor): descriptor is Record<string, unknown> =>\n !!descriptor && typeof descriptor === \"object\",\n );\n return [\n playerId,\n {\n view: seat.view,\n availableInteractions,\n zones: seat.zones,\n },\n ];\n }),\n );\n return {\n currentStage: projection.currentStage ?? null,\n stageSeats: projection.stageSeats ?? [],\n seats,\n };\n }\n\n currentStage(): string | null {\n return this.projectAllSeats().currentStage;\n }\n\n view(playerId: string): unknown {\n return (\n this.runtime.projectSeatViewDynamic({\n playerId: playerId as never,\n }) ?? null\n );\n }\n\n availableInteractionsForPlayer(playerId: string): string[] {\n const projection = this.projectAllSeats();\n const seat = projection.seats[playerId];\n const descriptors = seat?.availableInteractions ?? [];\n return descriptors\n .filter(\n (descriptor) =>\n !!descriptor && typeof descriptor.interactionId === \"string\",\n )\n .map((descriptor) => descriptor.interactionId as string);\n }\n\n /**\n * Phase-kind interaction descriptors (action + prompt) available to\n * `playerId` in the current phase. Surfaces the same projection the UI\n * SDK consumes, so scenarios can assert addressee authorization and\n * availability without reaching into game-specific state. Returned as\n * loose records — the typed `InteractionDescriptor` shape is narrowed\n * downstream in the workspace-generated `testing-contract.ts`.\n */\n interactionsForPlayer(playerId: string): Array<Record<string, unknown>> {\n return this.projectAllSeats().seats[playerId]?.availableInteractions ?? [];\n }\n\n explain(playerId: string, interactionId: string): unknown {\n const runtime = this.runtime as {\n explainInteraction?: (input: {\n playerId: string;\n interactionId: string;\n }) => unknown;\n };\n if (typeof runtime.explainInteraction !== \"function\") {\n throw new Error(\n \"The installed @dreamboard-games/sdk does not expose interaction explanations. Update the workspace SDK pin.\",\n );\n }\n return runtime.explainInteraction({ playerId, interactionId });\n }\n\n clearHistory(): void {\n this.historyRecords.length = 0;\n }\n\n private async applyInput(input: HistoryInput): Promise<void> {\n const parsedInput = toReducerInput(input);\n const result = await this.runtime.dispatch({ input: parsedInput });\n\n if (result.kind === \"reject\") {\n const record = {\n input,\n accepted: false,\n errorCode: result.errorCode,\n message: result.message,\n };\n this.historyRecords.push(record);\n throw createSubmissionError(\n result.errorCode,\n result.message,\n \"Reducer input rejected.\",\n );\n }\n\n this.version += 1;\n this.historyRecords.push({ input, accepted: true });\n }\n\n async submitInteraction(\n playerId: string,\n interactionId: string,\n params: Record<string, unknown>,\n ): Promise<void> {\n await this.applyInput({\n kind: \"interaction\",\n playerId,\n interactionId,\n params,\n });\n }\n}\n\n/**\n * Translate the harness's history record into the unified `interaction`\n * wire shape the ingress bundle accepts.\n */\nfunction toReducerInput(input: HistoryInput): Record<string, unknown> {\n return {\n kind: \"interaction\",\n playerId: input.playerId,\n interactionId: input.interactionId,\n params: input.params,\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function assertDispatchResultWireContract(\n result: unknown,\n): Wire.DispatchResult {\n if (typeof result !== \"object\" || result === null) {\n throw new Error(\n \"Reducer bundle returned invalid payload for 'dispatch': DispatchResult must be an object.\",\n );\n }\n return result as Wire.DispatchResult;\n}\n\nfunction sanitizeSnapshotSegment(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]+/g, \"-\");\n}\n\nfunction createScenarioSnapshotMatcher(options: {\n projectRoot: string;\n scenarioId: string;\n updateSnapshots: boolean;\n}): (filename: string | undefined, actual: unknown) => void {\n return (filename, actual) => {\n const suffix = filename ? `.${sanitizeSnapshotSegment(filename)}` : \"\";\n const snapshotPath = resolveWorkspacePath(\n options.projectRoot,\n `test/generated/snapshots/${sanitizeSnapshotSegment(options.scenarioId)}${suffix}.snapshot.json`,\n );\n const wrappedValue = {\n value: actual,\n };\n const serialized = `${JSON.stringify(wrappedValue, null, 2)}\\n`;\n\n mkdirSync(path.dirname(snapshotPath), { recursive: true });\n if (!existsSync(snapshotPath) || options.updateSnapshots) {\n writeFileSync(snapshotPath, serialized, \"utf8\");\n return;\n }\n\n const previous = JSON.parse(readFileSync(snapshotPath, \"utf8\")) as {\n value: unknown;\n };\n if (!deepEqual(previous.value, actual)) {\n throw new Error(\n `Snapshot mismatch for scenario '${options.scenarioId}'. Re-run with --update-snapshots to refresh ${path.relative(options.projectRoot, snapshotPath)}.`,\n );\n }\n };\n}\n\nasync function createScenarioContext(options: {\n shadow: ShadowReducerRuntime;\n expect: ExpectApi;\n live?:\n | {\n sessionId: string;\n version: number;\n actionSetVersion: string;\n submitIndex?: number;\n diagnostics?: LiveReplayActionDiagnostic[];\n captureResponseBody?: boolean;\n }\n | undefined;\n actionPlan?:\n | {\n submitIndex?: number;\n diagnostics: LiveReplayActionDiagnostic[];\n }\n | undefined;\n}): Promise<SharedScenarioContext> {\n const api: ScenarioGameApi = {\n start: async () => {\n await options.shadow.start();\n },\n patchState: async (mutator) => {\n await api.start();\n if (options.live || options.actionPlan) {\n throw new Error(\n \"game.patchState is only supported for reducer snapshot scenarios. Use it to materialize a state before --from-scenario or reducer tests, not inside live replay.\",\n );\n }\n options.shadow.patchState(mutator);\n },\n submit: async (playerId, interactionId, params) => {\n await api.start();\n const interactionParams = params ?? {};\n const normalizedInputs =\n interactionParams &&\n typeof interactionParams === \"object\" &&\n !Array.isArray(interactionParams)\n ? (interactionParams as JsonObject)\n : {};\n\n const previousVersion = options.live\n ? options.live.version\n : options.actionPlan\n ? options.shadow.currentVersion()\n : 0;\n\n if (options.live) {\n if (!options.live.actionSetVersion) {\n options.live.actionSetVersion = await fetchLiveActionSetVersion(\n options.live.sessionId,\n playerId,\n );\n }\n const submittedActionSetVersion = options.live.actionSetVersion;\n const submitStartedAt = performance.now();\n const clientActionId = randomUUID();\n const { data, error, response } = await submitGameplayAuthorityAction({\n path: {\n sessionId: options.live.sessionId,\n playerId,\n interactionId,\n },\n body: {\n expectedVersion: previousVersion,\n actionSetVersion: options.live.actionSetVersion,\n inputs: normalizedInputs as never,\n },\n headers: { \"X-Dreamboard-Client-Action-Id\": clientActionId },\n });\n const durationMs = performance.now() - submitStartedAt;\n options.live.diagnostics?.push({\n index: options.live.submitIndex ?? 0,\n playerId,\n interactionId,\n inputs: normalizedInputs,\n expectedVersion: previousVersion,\n actionSetVersion: submittedActionSetVersion,\n responseStatus: response?.status,\n responseBody:\n options.live.captureResponseBody === false\n ? undefined\n : JSON.stringify(error ?? data ?? null),\n accepted: data?.accepted ?? undefined,\n errorCode:\n data?.accepted === false\n ? (data.errorCode ?? undefined)\n : error && typeof error === \"object\" && \"detail\" in error\n ? String((error as { detail?: unknown }).detail)\n : undefined,\n backendTiming:\n response?.headers?.get(\"server-timing\") ??\n response?.headers?.get(\"x-dreamboard-timing\") ??\n undefined,\n durationMs,\n });\n options.live.submitIndex = (options.live.submitIndex ?? 0) + 1;\n if (error) {\n throw createSubmissionError(\n \"api-error\",\n undefined,\n \"Failed to submit interaction\",\n );\n }\n if (data?.accepted === false) {\n const shadowError = await tryShadowSubmit(\n options.shadow,\n playerId,\n interactionId,\n interactionParams,\n );\n if (!shadowError || shadowError.errorCode !== data.errorCode) {\n throw new Error(\n \"Live session rejection diverged from reducer shadow state.\",\n );\n }\n throw createSubmissionError(\n data.errorCode ?? undefined,\n data.message ?? undefined,\n \"Interaction rejected\",\n );\n }\n options.live.version =\n typeof data?.version === \"number\"\n ? data.version\n : previousVersion + 1;\n options.live.actionSetVersion =\n data?.actionSetVersion ?? options.live.actionSetVersion;\n }\n\n await options.shadow.submitInteraction(\n playerId,\n interactionId,\n interactionParams,\n );\n\n if (options.actionPlan) {\n options.actionPlan.diagnostics.push({\n index: options.actionPlan.submitIndex ?? 0,\n playerId,\n interactionId,\n inputs: normalizedInputs,\n expectedVersion: previousVersion,\n actionSetVersion: \"\",\n accepted: true,\n durationMs: 0,\n });\n options.actionPlan.submitIndex =\n (options.actionPlan.submitIndex ?? 0) + 1;\n }\n\n },\n };\n\n return {\n game: api,\n players: () => options.shadow.playerOrder(),\n seat: (index: number) => {\n const order = options.shadow.playerOrder();\n if (!Number.isInteger(index) || index < 0 || index >= order.length) {\n throw new Error(\n `seat(${index}) is out of range; scenario has ${order.length} player(s).`,\n );\n }\n return order[index]!;\n },\n state: () => options.shadow.phase(),\n view: (playerId) => options.shadow.view(playerId),\n interactions: (playerId) => options.shadow.interactionsForPlayer(playerId),\n explain: (playerId, interactionId) =>\n options.shadow.explain(playerId, interactionId),\n expect: options.expect,\n };\n}\n\nasync function tryShadowSubmit(\n shadow: ShadowReducerRuntime,\n playerId: string,\n interactionId: string,\n params: Record<string, unknown>,\n): Promise<SubmissionError | null> {\n try {\n await shadow.submitInteraction(playerId, interactionId, params);\n throw new Error(\"Expected shadow interaction to reject.\");\n } catch (error) {\n if (\n error instanceof Error &&\n (error as SubmissionError).name === \"SubmissionError\"\n ) {\n return error as SubmissionError;\n }\n throw error;\n }\n}\n\nexport async function createSessionFromScenario(options: {\n projectRoot: string;\n scenarioId: string;\n compiledResultId: string;\n projectId: string;\n debug?: boolean;\n trustGeneratedFingerprint?: boolean;\n}): Promise<SeededScenarioSession> {\n const startedAt = Date.now();\n const materialized = await materializeScenarioReducerState(options);\n const reducerHarnessMs = Date.now() - startedAt;\n const hydrateStartedAt = Date.now();\n const {\n data: snapshot,\n error,\n response,\n } = await createProjectSessionFromReducerSnapshot({\n path: { projectId: options.projectId },\n body: {\n compiledResultId: options.compiledResultId,\n seed: materialized.seed,\n playerCount: materialized.playerCount,\n setupProfileId: materialized.setupProfileId ?? undefined,\n baseId: materialized.baseId,\n scenarioId: materialized.scenarioId,\n reducerState: materialized.reducerState,\n reducerStateVersion: materialized.reducerStateVersion,\n fingerprintMetadata: materialized.fingerprintMetadata,\n },\n });\n const backendHydrateMs = Date.now() - hydrateStartedAt;\n if (error || !snapshot) {\n throw toDreamboardApiError(\n error,\n response,\n `Failed to materialize scenario '${options.scenarioId}' from reducer snapshot`,\n );\n }\n\n return {\n sessionId: snapshot.context.sessionId,\n shortCode: snapshot.context.shortCode,\n projectId: projectIdFromSessionGameSource(snapshot.context.gameSource),\n seed: materialized.seed,\n playerCount: materialized.playerCount,\n setupProfileId: materialized.setupProfileId,\n scenarioId: materialized.scenarioId,\n phase: materialized.phase,\n stage: materialized.stage,\n materialization: {\n mode: \"snapshot\",\n totalMs: Date.now() - startedAt,\n reducerHarnessMs,\n backendHydrateMs,\n },\n };\n}\n\nconst MATERIALIZED_SCENARIO_CACHE_VERSION = 1;\n\ntype MaterializedScenarioCachePayload = {\n cacheVersion: typeof MATERIALIZED_SCENARIO_CACHE_VERSION;\n fingerprintHash: string;\n materialized: MaterializedScenarioReducerState;\n};\n\ntype GeneratedScenarioManifestEntry = {\n id: string;\n base: string;\n};\n\nfunction materializedScenarioCachePath(options: {\n projectRoot: string;\n baseId: string;\n scenarioId: string;\n fingerprintHash: string;\n}): string {\n return [\n PROJECT_DIR_NAME,\n \"dev\",\n \"scenario-cache\",\n `${sanitizeSnapshotSegment(options.baseId)}.${sanitizeSnapshotSegment(\n options.scenarioId,\n )}.${options.fingerprintHash}.json`,\n ].join(\"/\");\n}\n\nfunction materializedScenarioCacheFilePath(options: {\n projectRoot: string;\n baseId: string;\n scenarioId: string;\n fingerprintHash: string;\n}): string {\n return resolveWorkspacePath(\n options.projectRoot,\n materializedScenarioCachePath(options),\n );\n}\n\nasync function readMaterializedScenarioCache(options: {\n projectRoot: string;\n baseId: string;\n scenarioId: string;\n fingerprintHash: string;\n}): Promise<MaterializedScenarioReducerState | null> {\n const text = await readWorkspaceTextFileIfExists(\n options.projectRoot,\n materializedScenarioCachePath(options),\n );\n if (!text) return null;\n try {\n const payload = JSON.parse(\n text,\n ) as Partial<MaterializedScenarioCachePayload>;\n if (\n payload.cacheVersion !== MATERIALIZED_SCENARIO_CACHE_VERSION ||\n payload.fingerprintHash !== options.fingerprintHash ||\n !payload.materialized\n ) {\n return null;\n }\n return payload.materialized;\n } catch {\n return null;\n }\n}\n\nasync function writeMaterializedScenarioCache(options: {\n projectRoot: string;\n baseId: string;\n scenarioId: string;\n fingerprintHash: string;\n materialized: MaterializedScenarioReducerState;\n}): Promise<void> {\n const cachePath = materializedScenarioCacheFilePath(options);\n await ensureDir(path.dirname(cachePath));\n await writeWorkspaceJsonFile(\n options.projectRoot,\n materializedScenarioCachePath(options),\n {\n cacheVersion: MATERIALIZED_SCENARIO_CACHE_VERSION,\n fingerprintHash: options.fingerprintHash,\n materialized: options.materialized,\n } satisfies MaterializedScenarioCachePayload,\n );\n}\n\nexport async function materializeScenarioReducerState(options: {\n projectRoot: string;\n scenarioId: string;\n compiledResultId?: string;\n projectId?: string;\n debug?: boolean;\n trustGeneratedFingerprint?: boolean;\n}): Promise<MaterializedScenarioReducerState> {\n await ensureReducerNativeTestingFiles(options.projectRoot);\n let preloadedGeneratedBaseStates: BaseStateFile | null | undefined;\n if (options.trustGeneratedFingerprint === true) {\n const [generatedBaseStates, scenarioManifest] = await Promise.all([\n loadGeneratedBaseStates(options.projectRoot),\n loadGeneratedScenarioManifest(options.projectRoot),\n ]);\n preloadedGeneratedBaseStates = generatedBaseStates;\n const scenarioEntry = scenarioManifest.find(\n (entry) => entry.id === options.scenarioId,\n );\n const generatedBase = scenarioEntry\n ? generatedBaseStates?.[baseStateKey(scenarioEntry.base)]\n : null;\n if (\n generatedBase &&\n generatedBase.fingerprint.compiledResultId === options.compiledResultId &&\n generatedBase.fingerprint.projectId === options.projectId\n ) {\n const cached = await readMaterializedScenarioCache({\n projectRoot: options.projectRoot,\n baseId: scenarioEntry!.base,\n scenarioId: options.scenarioId,\n fingerprintHash: fingerprintHash(generatedBase.fingerprint),\n });\n if (cached) {\n return cached;\n }\n }\n }\n\n const [bases, scenarios, generatedBaseStates, manifest] = await Promise.all([\n loadTypedBases(options.projectRoot),\n loadTypedScenarios(options.projectRoot, {}),\n preloadedGeneratedBaseStates === undefined\n ? loadGeneratedBaseStates(options.projectRoot)\n : Promise.resolve(preloadedGeneratedBaseStates),\n loadManifest(options.projectRoot),\n ]);\n\n const matchingScenarios = scenarios.filter(\n (scenario) => scenario.definition.id === options.scenarioId,\n );\n if (matchingScenarios.length === 0) {\n throw new Error(\n `Unknown scenario '${options.scenarioId}'. Available scenarios: ${scenarios\n .map((scenario) => scenario.definition.id)\n .sort()\n .join(\", \")}`,\n );\n }\n if (matchingScenarios.length > 1) {\n throw new Error(\n `Scenario id '${options.scenarioId}' is defined more than once. Keep one scenario per file and one unique id per workspace.`,\n );\n }\n\n const scenario = matchingScenarios[0]!;\n const basesById = new Map(bases.map((base) => [base.definition.id, base]));\n validateTypedScenarioBases([scenario], basesById);\n const base = basesById.get(scenario.definition.from);\n if (!base) {\n throw new Error(\n `Missing typed base '${scenario.definition.from}' for scenario '${scenario.definition.id}'.`,\n );\n }\n\n const generatedBase = generatedBaseStates?.[baseStateKey(base.definition.id)];\n if (!generatedBase) {\n throw new Error(\n `Missing generated base artifact for '${base.definition.id}'. Run 'dreamboard test' before using --from-scenario.`,\n );\n }\n if (typeof generatedBase.version !== \"number\") {\n throw new Error(\n `Generated base artifact for '${base.definition.id}' is stale. Run 'dreamboard test' before using --from-scenario.`,\n );\n }\n\n const canTrustGeneratedFingerprint =\n options.trustGeneratedFingerprint === true &&\n generatedBase.fingerprint.compiledResultId === options.compiledResultId &&\n generatedBase.fingerprint.projectId === options.projectId;\n const current = canTrustGeneratedFingerprint\n ? generatedBase.fingerprint\n : await currentFingerprint({\n projectRoot: options.projectRoot,\n base,\n basesById,\n compiledResultId: options.compiledResultId,\n projectId: options.projectId,\n });\n if (!canTrustGeneratedFingerprint) {\n validateGeneratedFingerprint({\n generated: generatedBase.fingerprint,\n current,\n });\n }\n const currentHash = fingerprintHash(current);\n const cached = await readMaterializedScenarioCache({\n projectRoot: options.projectRoot,\n baseId: base.definition.id,\n scenarioId: scenario.definition.id,\n fingerprintHash: currentHash,\n });\n if (cached) {\n return cached;\n }\n\n const [gameModule, manifestContractModule, modules] = await Promise.all([\n importTypeScriptModule<Record<string, unknown>>(\n path.join(options.projectRoot, \"app\", \"game.ts\"),\n ),\n importTypeScriptModule<Record<string, unknown>>(\n path.join(options.projectRoot, \"shared\", \"manifest-contract.ts\"),\n ),\n loadProjectReducerNativeModules(options.projectRoot),\n ]);\n\n const createInitialTable =\n typeof manifestContractModule.createInitialTable === \"function\"\n ? (manifestContractModule.createInitialTable as GeneratedInitialTableFactory)\n : null;\n const resolvedBase = resolveBaseDefinition(base, basesById);\n const effectiveSetup = resolveEffectiveBaseSetup({\n manifest,\n base: base.definition,\n basesById,\n });\n const shadow = new ShadowReducerRuntime(\n modules,\n manifest,\n gameModule.default,\n createInitialTable,\n resolvedBase.seed,\n resolvedBase.players,\n effectiveSetup.setupProfileId,\n options.debug ?? false,\n );\n shadow.hydrate(generatedBase.snapshot, generatedBase.version);\n\n const context = await createScenarioContext({\n shadow,\n expect: modules.createExpectApi(),\n });\n\n shadow.clearHistory();\n await scenario.definition.when(context);\n if (\n scenario.definition.phase &&\n shadow.phase() !== scenario.definition.phase\n ) {\n throw new Error(\n `Scenario '${scenario.definition.id}' expected phase '${scenario.definition.phase}' but reached '${shadow.phase()}'.`,\n );\n }\n if (\n scenario.definition.stage &&\n shadow.currentStage() !== scenario.definition.stage\n ) {\n throw new Error(\n `Scenario '${scenario.definition.id}' expected stage '${scenario.definition.stage}' but reached '${\n shadow.currentStage() ?? \"null\"\n }'.`,\n );\n }\n\n const materialized: MaterializedScenarioReducerState = {\n baseId: base.definition.id,\n scenarioId: scenario.definition.id,\n seed: resolvedBase.seed,\n playerCount: resolvedBase.players,\n setupProfileId: effectiveSetup.setupProfileId,\n reducerState: shadow.rawState(),\n reducerStateVersion: shadow.currentVersion(),\n fingerprintMetadata: {\n baseFingerprintHash: fingerprintHash(generatedBase.fingerprint),\n currentFingerprintHash: fingerprintHash(current),\n baseBundleHash: generatedBase.fingerprint.baseBundleHash,\n manifestHash: generatedBase.fingerprint.manifestHash,\n appBundleHash: generatedBase.fingerprint.appBundleHash,\n uiContractHash: generatedBase.fingerprint.uiContractHash,\n baseId: base.definition.id,\n scenarioId: scenario.definition.id,\n },\n phase: shadow.phase(),\n stage: shadow.currentStage(),\n };\n await writeMaterializedScenarioCache({\n projectRoot: options.projectRoot,\n baseId: base.definition.id,\n scenarioId: scenario.definition.id,\n fingerprintHash: currentHash,\n materialized,\n });\n return materialized;\n}\n\nexport async function replayScenarioThroughBackend(options: {\n projectRoot: string;\n scenarioId: string;\n compiledResultId: string;\n projectId: string;\n debug?: boolean;\n captureResponseBody?: boolean;\n}): Promise<LiveReplayScenarioResult> {\n await ensureReducerNativeTestingFiles(options.projectRoot);\n\n const [\n bases,\n scenarios,\n generatedBaseStates,\n manifest,\n gameModule,\n manifestContractModule,\n modules,\n ] = await Promise.all([\n loadTypedBases(options.projectRoot),\n loadTypedScenarios(options.projectRoot, {}),\n loadGeneratedBaseStates(options.projectRoot),\n loadManifest(options.projectRoot),\n importTypeScriptModule<Record<string, unknown>>(\n path.join(options.projectRoot, \"app\", \"game.ts\"),\n ),\n importTypeScriptModule<Record<string, unknown>>(\n path.join(options.projectRoot, \"shared\", \"manifest-contract.ts\"),\n ),\n loadProjectReducerNativeModules(options.projectRoot),\n ]);\n\n const matchingScenarios = scenarios.filter(\n (scenario) => scenario.definition.id === options.scenarioId,\n );\n if (matchingScenarios.length !== 1) {\n throw new Error(\n matchingScenarios.length === 0\n ? `Unknown scenario '${options.scenarioId}'. Available scenarios: ${scenarios\n .map((scenario) => scenario.definition.id)\n .sort()\n .join(\", \")}`\n : `Scenario id '${options.scenarioId}' is defined more than once. Keep one scenario per file and one unique id per workspace.`,\n );\n }\n\n const scenario = matchingScenarios[0]!;\n const basesById = new Map(bases.map((base) => [base.definition.id, base]));\n validateTypedScenarioBases([scenario], basesById);\n const base = basesById.get(scenario.definition.from);\n if (!base) {\n throw new Error(\n `Missing typed base '${scenario.definition.from}' for scenario '${scenario.definition.id}'.`,\n );\n }\n\n const generatedBase = generatedBaseStates?.[baseStateKey(base.definition.id)];\n if (!generatedBase) {\n throw new Error(\n `Missing generated base artifact for '${base.definition.id}'. Run 'dreamboard test' before replaying a scenario.`,\n );\n }\n validateGeneratedFingerprint({\n generated: generatedBase.fingerprint,\n current: await currentFingerprint({\n projectRoot: options.projectRoot,\n base,\n basesById,\n compiledResultId: options.compiledResultId,\n projectId: options.projectId,\n }),\n });\n\n const createInitialTable =\n typeof manifestContractModule.createInitialTable === \"function\"\n ? (manifestContractModule.createInitialTable as GeneratedInitialTableFactory)\n : null;\n const resolvedBase = resolveBaseDefinition(base, basesById);\n const effectiveSetup = resolveEffectiveBaseSetup({\n manifest,\n base: base.definition,\n basesById,\n });\n const shadow = new ShadowReducerRuntime(\n await loadProjectReducerNativeModules(options.projectRoot),\n manifest,\n gameModule.default,\n createInitialTable,\n resolvedBase.seed,\n resolvedBase.players,\n effectiveSetup.setupProfileId,\n options.debug ?? false,\n );\n if (base.definition.extends) {\n const parentArtifact =\n generatedBaseStates?.[baseStateKey(base.definition.extends)];\n if (!parentArtifact || typeof parentArtifact.version !== \"number\") {\n throw new Error(\n `Base '${base.definition.id}' extends '${base.definition.extends}', but the parent artifact is missing or stale. Run 'dreamboard test' first.`,\n );\n }\n shadow.hydrate(parentArtifact.snapshot, parentArtifact.version);\n }\n\n const {\n data: session,\n error: sessionError,\n response: sessionResponse,\n } = await createProjectSession({\n path: { projectId: options.projectId },\n body: {\n compiledResultId: options.compiledResultId,\n seed: resolvedBase.seed,\n playerCount: resolvedBase.players,\n autoAssignSeats: true,\n setupProfileId: effectiveSetup.setupProfileId ?? undefined,\n },\n });\n if (!session || sessionError) {\n throw toDreamboardApiError(\n sessionError,\n sessionResponse,\n `Failed to create replay session for '${scenario.definition.id}'`,\n );\n }\n\n const { error: startError, response: startResponse } = await startGame({\n path: { sessionId: session.sessionId },\n });\n if (startError) {\n throw toDreamboardApiError(\n startError,\n startResponse,\n `Failed to start replay session for '${scenario.definition.id}'`,\n );\n }\n\n const diagnostics: LiveReplayActionDiagnostic[] = [];\n const context = await createScenarioContext({\n shadow,\n expect: (\n await loadProjectReducerNativeModules(options.projectRoot)\n ).createExpectApi(),\n live: {\n sessionId: session.sessionId,\n version: 0,\n actionSetVersion: \"\",\n submitIndex: 0,\n diagnostics,\n captureResponseBody: options.captureResponseBody,\n },\n });\n\n await context.game.start();\n await base.definition.setup({\n game: context.game,\n players: context.players,\n seat: context.seat,\n });\n shadow.clearHistory();\n await scenario.definition.when(context);\n if (\n scenario.definition.phase &&\n shadow.phase() !== scenario.definition.phase\n ) {\n throw new Error(\n `Scenario '${scenario.definition.id}' expected phase '${scenario.definition.phase}' but reached '${shadow.phase()}'.`,\n );\n }\n if (\n scenario.definition.stage &&\n shadow.currentStage() !== scenario.definition.stage\n ) {\n throw new Error(\n `Scenario '${scenario.definition.id}' expected stage '${scenario.definition.stage}' but reached '${\n shadow.currentStage() ?? \"null\"\n }'.`,\n );\n }\n\n return {\n sessionId: session.sessionId,\n shortCode: session.shortCode,\n projectId: projectIdFromSessionGameSource(session.gameSource),\n seed: resolvedBase.seed,\n playerCount: resolvedBase.players,\n setupProfileId: effectiveSetup.setupProfileId,\n scenarioId: scenario.definition.id,\n phase: shadow.phase(),\n stage: shadow.currentStage(),\n diagnostics,\n };\n}\n\nexport async function createScenarioActionPlan(options: {\n projectRoot: string;\n scenarioId: string;\n compiledResultId: string;\n projectId: string;\n debug?: boolean;\n}): Promise<LiveReplayActionPlan> {\n await ensureReducerNativeTestingFiles(options.projectRoot);\n\n const [\n bases,\n scenarios,\n generatedBaseStates,\n manifest,\n gameModule,\n manifestContractModule,\n modules,\n ] = await Promise.all([\n loadTypedBases(options.projectRoot),\n loadTypedScenarios(options.projectRoot, {}),\n loadGeneratedBaseStates(options.projectRoot),\n loadManifest(options.projectRoot),\n importTypeScriptModule<Record<string, unknown>>(\n path.join(options.projectRoot, \"app\", \"game.ts\"),\n ),\n importTypeScriptModule<Record<string, unknown>>(\n path.join(options.projectRoot, \"shared\", \"manifest-contract.ts\"),\n ),\n loadProjectReducerNativeModules(options.projectRoot),\n ]);\n\n const matchingScenarios = scenarios.filter(\n (scenario) => scenario.definition.id === options.scenarioId,\n );\n if (matchingScenarios.length !== 1) {\n throw new Error(\n matchingScenarios.length === 0\n ? `Unknown scenario '${options.scenarioId}'. Available scenarios: ${scenarios\n .map((scenario) => scenario.definition.id)\n .sort()\n .join(\", \")}`\n : `Scenario id '${options.scenarioId}' is defined more than once. Keep one scenario per file and one unique id per workspace.`,\n );\n }\n\n const scenario = matchingScenarios[0]!;\n const basesById = new Map(bases.map((base) => [base.definition.id, base]));\n validateTypedScenarioBases([scenario], basesById);\n const base = basesById.get(scenario.definition.from);\n if (!base) {\n throw new Error(\n `Missing typed base '${scenario.definition.from}' for scenario '${scenario.definition.id}'.`,\n );\n }\n\n const generatedBase = generatedBaseStates?.[baseStateKey(base.definition.id)];\n if (!generatedBase) {\n throw new Error(\n `Missing generated base artifact for '${base.definition.id}'. Run 'dreamboard test' before replaying a scenario.`,\n );\n }\n validateGeneratedFingerprint({\n generated: generatedBase.fingerprint,\n current: await currentFingerprint({\n projectRoot: options.projectRoot,\n base,\n basesById,\n compiledResultId: options.compiledResultId,\n projectId: options.projectId,\n }),\n });\n\n const createInitialTable =\n typeof manifestContractModule.createInitialTable === \"function\"\n ? (manifestContractModule.createInitialTable as GeneratedInitialTableFactory)\n : null;\n const resolvedBase = resolveBaseDefinition(base, basesById);\n const effectiveSetup = resolveEffectiveBaseSetup({\n manifest,\n base: base.definition,\n basesById,\n });\n const shadow = new ShadowReducerRuntime(\n await loadProjectReducerNativeModules(options.projectRoot),\n manifest,\n gameModule.default,\n createInitialTable,\n resolvedBase.seed,\n resolvedBase.players,\n effectiveSetup.setupProfileId,\n options.debug ?? false,\n );\n if (base.definition.extends) {\n const parentArtifact =\n generatedBaseStates?.[baseStateKey(base.definition.extends)];\n if (!parentArtifact || typeof parentArtifact.version !== \"number\") {\n throw new Error(\n `Base '${base.definition.id}' extends '${base.definition.extends}', but the parent artifact is missing or stale. Run 'dreamboard test' first.`,\n );\n }\n shadow.hydrate(parentArtifact.snapshot, parentArtifact.version);\n }\n\n const diagnostics: LiveReplayActionDiagnostic[] = [];\n const context = await createScenarioContext({\n shadow,\n expect: (\n await loadProjectReducerNativeModules(options.projectRoot)\n ).createExpectApi(),\n actionPlan: {\n submitIndex: 0,\n diagnostics,\n },\n });\n\n await context.game.start();\n await base.definition.setup({\n game: context.game,\n players: context.players,\n seat: context.seat,\n });\n shadow.clearHistory();\n await scenario.definition.when(context);\n if (\n scenario.definition.phase &&\n shadow.phase() !== scenario.definition.phase\n ) {\n throw new Error(\n `Scenario '${scenario.definition.id}' expected phase '${scenario.definition.phase}' but reached '${shadow.phase()}'.`,\n );\n }\n if (\n scenario.definition.stage &&\n shadow.currentStage() !== scenario.definition.stage\n ) {\n throw new Error(\n `Scenario '${scenario.definition.id}' expected stage '${scenario.definition.stage}' but reached '${\n shadow.currentStage() ?? \"null\"\n }'.`,\n );\n }\n\n return {\n projectId: options.projectId,\n seed: resolvedBase.seed,\n playerCount: resolvedBase.players,\n setupProfileId: effectiveSetup.setupProfileId,\n scenarioId: scenario.definition.id,\n phase: shadow.phase(),\n stage: shadow.currentStage(),\n diagnostics,\n };\n}\n\nexport async function replayActionPlanThroughBackend(options: {\n projectId: string;\n compiledResultId: string;\n seed: number;\n playerCount: number;\n setupProfileId?: string | null;\n scenarioId?: string;\n actions: ReadonlyArray<LiveReplayActionDiagnostic>;\n captureResponseBody?: boolean;\n}): Promise<LiveReplayScenarioResult> {\n const session = await createActionPlanReplaySession(options);\n return replayActionPlanInSession({\n session,\n actions: options.actions,\n captureResponseBody: options.captureResponseBody,\n });\n}\n\nexport async function createActionPlanReplaySession(options: {\n projectId: string;\n compiledResultId: string;\n seed: number;\n playerCount: number;\n setupProfileId?: string | null;\n scenarioId?: string;\n}): Promise<LiveReplayActionPlanSession> {\n const {\n data: session,\n error: sessionError,\n response: sessionResponse,\n } = await createProjectSession({\n path: { projectId: options.projectId },\n body: {\n compiledResultId: options.compiledResultId,\n seed: options.seed,\n playerCount: options.playerCount,\n autoAssignSeats: true,\n setupProfileId: options.setupProfileId ?? undefined,\n },\n });\n if (!session || sessionError) {\n throw toDreamboardApiError(\n sessionError,\n sessionResponse,\n \"Failed to create replay session from action plan\",\n );\n }\n\n const { error: startError, response: startResponse } = await startGame({\n path: { sessionId: session.sessionId },\n });\n if (startError) {\n throw toDreamboardApiError(\n startError,\n startResponse,\n \"Failed to start replay session from action plan\",\n );\n }\n\n return {\n sessionId: session.sessionId,\n shortCode: session.shortCode,\n projectId: projectIdFromSessionGameSource(session.gameSource),\n seed: options.seed,\n playerCount: options.playerCount,\n setupProfileId: options.setupProfileId ?? null,\n scenarioId: options.scenarioId ?? \"action-plan\",\n phase: null,\n stage: null,\n };\n}\n\nexport async function replayActionPlanInSession(options: {\n session: LiveReplayActionPlanSession;\n actions: ReadonlyArray<LiveReplayActionDiagnostic>;\n captureResponseBody?: boolean;\n actionIntervalMs?: number;\n actionJitterMs?: number;\n}): Promise<LiveReplayScenarioResult> {\n let version = 0;\n let actionSetVersion = \"\";\n const diagnostics: LiveReplayActionDiagnostic[] = [];\n for (const [index, action] of options.actions.entries()) {\n if (index > 0) {\n await waitForActionPacing({\n actionIntervalMs: options.actionIntervalMs ?? 0,\n actionJitterMs: options.actionJitterMs ?? 0,\n });\n }\n if (!actionSetVersion) {\n actionSetVersion = await fetchLiveActionSetVersion(\n options.session.sessionId,\n action.playerId,\n );\n }\n\n const submittedActionSetVersion = actionSetVersion;\n const submitStartedAt = performance.now();\n const clientActionId = randomUUID();\n const { data, error, response } = await submitGameplayAuthorityAction({\n path: {\n sessionId: options.session.sessionId,\n playerId: action.playerId,\n interactionId: action.interactionId,\n },\n body: {\n expectedVersion: version,\n actionSetVersion,\n inputs: action.inputs ?? {},\n },\n headers: { \"X-Dreamboard-Client-Action-Id\": clientActionId },\n });\n const durationMs = performance.now() - submitStartedAt;\n diagnostics.push({\n index,\n playerId: action.playerId,\n interactionId: action.interactionId,\n inputs: action.inputs ?? {},\n expectedVersion: version,\n actionSetVersion: submittedActionSetVersion,\n responseStatus: response?.status,\n responseBody:\n options.captureResponseBody === false\n ? undefined\n : JSON.stringify(error ?? data ?? null),\n accepted: data?.accepted ?? undefined,\n errorCode:\n data?.accepted === false\n ? (data.errorCode ?? undefined)\n : error && typeof error === \"object\" && \"detail\" in error\n ? String((error as { detail?: unknown }).detail)\n : undefined,\n backendTiming:\n response?.headers?.get(\"server-timing\") ??\n response?.headers?.get(\"x-dreamboard-timing\") ??\n undefined,\n durationMs,\n });\n\n if (error) {\n throw createSubmissionError(\n \"api-error\",\n undefined,\n \"Failed to submit interaction from action plan\",\n );\n }\n if (data?.accepted === false) {\n throw createSubmissionError(\n data.errorCode ?? undefined,\n data.message ?? undefined,\n \"Interaction rejected while replaying action plan\",\n );\n }\n version = typeof data?.version === \"number\" ? data.version : version + 1;\n actionSetVersion = data?.actionSetVersion ?? actionSetVersion;\n }\n\n return {\n ...options.session,\n diagnostics,\n };\n}\n\nasync function fetchLiveActionSetVersion(\n sessionId: string,\n playerId: string,\n): Promise<string> {\n const { data, error, response } = await getSessionSnapshot({\n path: { sessionId },\n query: { playerId },\n });\n if (error || !data || data.type !== \"gameplay\") {\n throw toDreamboardApiError(\n error ?? { detail: \"Gameplay snapshot was unavailable.\" },\n response,\n \"Failed to read live gameplay action set version\",\n );\n }\n return data.gameplay.actionSetVersion;\n}\n\nasync function waitForActionPacing(options: {\n actionIntervalMs: number;\n actionJitterMs: number;\n}): Promise<void> {\n const intervalMs = Math.max(0, options.actionIntervalMs);\n const jitterMs = Math.max(0, options.actionJitterMs);\n if (intervalMs === 0 && jitterMs === 0) {\n return;\n }\n const offsetMs =\n jitterMs === 0 ? 0 : Math.floor((Math.random() * 2 - 1) * jitterMs);\n const delayMs = Math.max(0, intervalMs + offsetMs);\n if (delayMs === 0) {\n return;\n }\n await new Promise((resolve) => setTimeout(resolve, delayMs));\n}\n\nfunction baseStateKey(baseId: string): string {\n return baseId;\n}\n\nfunction fingerprintHash(\n fingerprint: BaseStateArtifact[\"fingerprint\"],\n): string {\n return hashContent(JSON.stringify(fingerprint));\n}\n\nfunction sortBasesForArtifacts(\n bases: LoadedBase[],\n basesById: Map<string, LoadedBase>,\n): LoadedBase[] {\n const ordered: LoadedBase[] = [];\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n const visit = (base: LoadedBase) => {\n if (visited.has(base.definition.id)) {\n return;\n }\n if (visiting.has(base.definition.id)) {\n throw new Error(\n `Cyclic reducer-native base inheritance detected at '${base.definition.id}'.`,\n );\n }\n visiting.add(base.definition.id);\n if (base.definition.extends) {\n const parent = basesById.get(base.definition.extends);\n if (!parent) {\n throw new Error(\n `Base '${base.definition.id}' extends unknown parent '${base.definition.extends}'.`,\n );\n }\n visit(parent);\n }\n visiting.delete(base.definition.id);\n visited.add(base.definition.id);\n ordered.push(base);\n };\n\n for (const base of bases) {\n visit(base);\n }\n\n return ordered;\n}\n\nfunction writeProjectionSnapshots(options: {\n projectRoot: string;\n baseId: string;\n shadow: ShadowReducerRuntime;\n}): void {\n const projectionDir = resolveWorkspacePath(\n options.projectRoot,\n `test/generated/bases/${sanitizeSnapshotSegment(options.baseId)}`,\n );\n rmSync(projectionDir, { recursive: true, force: true });\n mkdirSync(projectionDir, { recursive: true });\n const projection = options.shadow.projectAllSeats();\n for (const [playerId, seatProjection] of Object.entries(projection.seats)) {\n const outputPath = resolveWorkspacePath(\n options.projectRoot,\n `test/generated/bases/${sanitizeSnapshotSegment(options.baseId)}/${sanitizeSnapshotSegment(playerId)}.projection.json`,\n );\n writeFileSync(\n outputPath,\n `${JSON.stringify(\n {\n currentStage: projection.currentStage,\n stageSeats: projection.stageSeats,\n ...seatProjection,\n },\n null,\n 2,\n )}\\n`,\n \"utf8\",\n );\n }\n}\n\nfunction validateTypedScenarioBases(\n scenarios: LoadedScenario[],\n basesById: Map<string, LoadedBase>,\n): void {\n const available = new Set(basesById.keys());\n const invalid = scenarios\n .filter((scenario) => !available.has(scenario.definition.from))\n .map(\n (scenario) =>\n path.relative(process.cwd(), scenario.filePath) +\n ` -> '${scenario.definition.from}'`,\n );\n\n if (invalid.length > 0) {\n throw new Error(\n `Unknown scenario base(s): ${invalid.join(\", \")}. Available bases: ${Array.from(available).sort().join(\", \")}`,\n );\n }\n}\n\nexport async function writeReducerNativeGeneratedFiles(options: {\n projectRoot: string;\n bases: LoadedBase[];\n scenarios: LoadedScenario[];\n compiledResultId?: string;\n projectId?: string;\n debug?: boolean;\n}): Promise<void> {\n await ensureReducerNativeTestingFiles(options.projectRoot);\n\n const manifest = await loadManifest(options.projectRoot);\n const manifestHash = hashContent(JSON.stringify(manifest));\n const appBundleHash = hashContent(\n await bundleTypeScriptModuleText(\n path.join(options.projectRoot, \"app\", \"game.ts\"),\n ),\n );\n const uiContractHash = hashContent(\n await bundleTypeScriptModuleText(\n path.join(options.projectRoot, \"shared\", \"generated\", \"ui-contract.ts\"),\n { external: SDK_UI_RUNTIME_EXTERNALS },\n ),\n );\n\n const generatedDir = resolveWorkspacePath(\n options.projectRoot,\n \"test/generated\",\n );\n await ensureDir(generatedDir);\n const baseStates: BaseStateFile = {};\n const [gameModule, manifestContractModule, modules] = await Promise.all([\n importTypeScriptModule<Record<string, unknown>>(\n path.join(options.projectRoot, \"app\", \"game.ts\"),\n ),\n importTypeScriptModule<Record<string, unknown>>(\n path.join(options.projectRoot, \"shared\", \"manifest-contract.ts\"),\n ),\n loadProjectReducerNativeModules(options.projectRoot),\n ]);\n const createInitialTable =\n typeof manifestContractModule.createInitialTable === \"function\"\n ? (manifestContractModule.createInitialTable as GeneratedInitialTableFactory)\n : null;\n const contractFingerprintValue = modules.contractFingerprint(\n gameModule.default,\n ).value;\n const basesById = new Map(\n options.bases.map((base) => [base.definition.id, base]),\n );\n for (const base of sortBasesForArtifacts(options.bases, basesById)) {\n const resolvedBase = resolveBaseDefinition(base, basesById);\n const effectiveSetup = resolveEffectiveBaseSetup({\n manifest,\n base: base.definition,\n basesById,\n });\n const shadow = new ShadowReducerRuntime(\n modules,\n manifest,\n gameModule.default,\n createInitialTable,\n resolvedBase.seed,\n resolvedBase.players,\n effectiveSetup.setupProfileId,\n options.debug ?? false,\n );\n let parentFingerprintHash: string | null = null;\n if (base.definition.extends) {\n const parentArtifact = baseStates[baseStateKey(base.definition.extends)];\n if (!parentArtifact) {\n throw new Error(\n `Base '${base.definition.id}' extends '${base.definition.extends}', but the parent artifact does not exist yet.`,\n );\n }\n if (parentArtifact.fingerprint.seed !== resolvedBase.seed) {\n throw new Error(\n `Base '${base.definition.id}' extends '${base.definition.extends}' but changes seed from ${parentArtifact.fingerprint.seed} to ${resolvedBase.seed}.`,\n );\n }\n if (parentArtifact.fingerprint.players !== resolvedBase.players) {\n throw new Error(\n `Base '${base.definition.id}' extends '${base.definition.extends}' but changes players from ${parentArtifact.fingerprint.players} to ${resolvedBase.players}.`,\n );\n }\n if (\n (parentArtifact.fingerprint.setupProfileId ?? null) !==\n (effectiveSetup.setupProfileId ?? null)\n ) {\n throw new Error(\n `Base '${base.definition.id}' extends '${base.definition.extends}' but changes setup profile from ${\n parentArtifact.fingerprint.setupProfileId ?? \"none\"\n } to ${effectiveSetup.setupProfileId ?? \"none\"}.`,\n );\n }\n parentFingerprintHash = fingerprintHash(parentArtifact.fingerprint);\n shadow.hydrate(parentArtifact.snapshot, parentArtifact.version);\n }\n const context = await createScenarioContext({\n shadow,\n expect: modules.createExpectApi(),\n });\n await context.game.start();\n try {\n await base.definition.setup({\n game: context.game,\n players: context.players,\n seat: context.seat,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(\n `Base '${base.definition.id}' setup failed with setupProfileId '${effectiveSetup.setupProfileId ?? \"none\"}': ${message}`,\n { cause: error instanceof Error ? error : undefined },\n );\n }\n baseStates[baseStateKey(base.definition.id)] = {\n key: baseStateKey(base.definition.id),\n base: base.definition.id,\n snapshot: shadow.rawState(),\n version: shadow.currentVersion(),\n fingerprint: {\n base: base.definition.id,\n seed: resolvedBase.seed,\n players: resolvedBase.players,\n baseBundleHash: base.bundleHash,\n manifestHash,\n appBundleHash,\n uiContractHash,\n setupProfileId: effectiveSetup.setupProfileId,\n compiledResultId: options.compiledResultId,\n projectId: options.projectId,\n parentBaseId: base.definition.extends ?? null,\n parentFingerprintHash,\n contractFingerprint: contractFingerprintValue,\n },\n };\n writeProjectionSnapshots({\n projectRoot: options.projectRoot,\n baseId: base.definition.id,\n shadow,\n });\n }\n\n const header =\n \"// Generated by dreamboard test. Do not edit by hand.\\n\";\n await writeWorkspaceTextFile(\n options.projectRoot,\n \"test/generated/base-states.generated.ts\",\n `${header}export const BASE_STATES = ${JSON.stringify(baseStates, null, 2)} as const;\\nexport const BASE_STATES_CONTRACT_FINGERPRINT = ${JSON.stringify(contractFingerprintValue)};\\n`,\n );\n await writeWorkspaceTextFile(\n options.projectRoot,\n \"test/generated/base-states.generated.d.ts\",\n `${header}export declare const BASE_STATES: Record<string, unknown>;\\nexport declare const BASE_STATES_CONTRACT_FINGERPRINT: string | undefined;\\n`,\n );\n await writeWorkspaceTextFile(\n options.projectRoot,\n \"test/generated/scenario-manifest.generated.ts\",\n `${header}export const SCENARIO_MANIFEST = ${JSON.stringify(\n options.scenarios.map((scenario) => ({\n id: scenario.definition.id,\n filePath: path.relative(generatedDir, scenario.filePath),\n base: scenario.definition.from,\n })),\n null,\n 2,\n )} as const;\\n`,\n );\n await writeWorkspaceJsonFile(\n options.projectRoot,\n \"test/generated/.generation-meta.json\",\n {\n generatedAt: new Date().toISOString(),\n contractFingerprint: contractFingerprintValue,\n scenarioCount: options.scenarios.length,\n baseStateCount: options.bases.length,\n },\n );\n}\n\nasync function loadGeneratedBaseStates(\n projectRoot: string,\n): Promise<BaseStateFile | null> {\n const filePath = path.join(\n projectRoot,\n \"test\",\n \"generated\",\n \"base-states.generated.ts\",\n );\n if (!(await exists(filePath))) {\n return null;\n }\n const module =\n await importTypeScriptModule<Record<string, unknown>>(filePath);\n return (module.BASE_STATES as BaseStateFile | undefined) ?? null;\n}\n\nasync function loadGeneratedScenarioManifest(\n projectRoot: string,\n): Promise<GeneratedScenarioManifestEntry[]> {\n const filePath = path.join(\n projectRoot,\n \"test\",\n \"generated\",\n \"scenario-manifest.generated.ts\",\n );\n if (!(await exists(filePath))) {\n return [];\n }\n const module =\n await importTypeScriptModule<Record<string, unknown>>(filePath);\n const entries = module.SCENARIO_MANIFEST;\n if (!Array.isArray(entries)) {\n return [];\n }\n return entries.flatMap((entry) => {\n if (\n entry &&\n typeof entry === \"object\" &&\n \"id\" in entry &&\n \"base\" in entry &&\n typeof entry.id === \"string\" &&\n typeof entry.base === \"string\"\n ) {\n return [{ id: entry.id, base: entry.base }];\n }\n return [];\n });\n}\n\nfunction validateGeneratedFingerprint(options: {\n generated: BaseStateArtifact[\"fingerprint\"];\n current: BaseStateArtifact[\"fingerprint\"];\n}): void {\n const mismatches: string[] = [];\n if (\n options.generated.contractFingerprint &&\n options.current.contractFingerprint &&\n options.generated.contractFingerprint !==\n options.current.contractFingerprint\n ) {\n const error = new Error(\n `Base states were generated for contract ${options.generated.contractFingerprint} but the current contract is ${options.current.contractFingerprint}. Remedy: run \\`dreamboard test\\`, then re-run the tests.`,\n );\n (error as Error & { code?: string }).code = STALE_CONTRACT_ARTIFACT_CODE;\n throw error;\n }\n if (options.generated.baseBundleHash !== options.current.baseBundleHash) {\n mismatches.push(\"base module changed\");\n }\n if (options.generated.manifestHash !== options.current.manifestHash) {\n mismatches.push(\"manifest changed\");\n }\n if (options.generated.appBundleHash !== options.current.appBundleHash) {\n mismatches.push(\"project reducer bundle changed\");\n }\n if (options.generated.uiContractHash !== options.current.uiContractHash) {\n mismatches.push(\"ui contract changed\");\n }\n if (\n options.generated.seed !== options.current.seed ||\n options.generated.players !== options.current.players\n ) {\n mismatches.push(\"base seed/player count changed\");\n }\n if (\n (options.generated.setupProfileId ?? null) !==\n (options.current.setupProfileId ?? null)\n ) {\n mismatches.push(\"base setup profile changed\");\n }\n if (\n (options.generated.parentBaseId ?? null) !==\n (options.current.parentBaseId ?? null)\n ) {\n mismatches.push(\"base parent changed\");\n }\n if (\n (options.generated.parentFingerprintHash ?? null) !==\n (options.current.parentFingerprintHash ?? null)\n ) {\n mismatches.push(\"parent base artifact changed\");\n }\n if (mismatches.length > 0) {\n throw new Error(\n `${mismatches.join(\"; \")}. Run 'dreamboard test' to refresh reducer-native base artifacts.`,\n );\n }\n}\n\nasync function currentFingerprint(options: {\n projectRoot: string;\n base: LoadedBase;\n basesById?: Map<string, LoadedBase>;\n compiledResultId?: string;\n projectId?: string;\n}): Promise<BaseStateArtifact[\"fingerprint\"]> {\n const manifest = await loadManifest(options.projectRoot);\n const [gameModule, modules] = await Promise.all([\n importTypeScriptModule<Record<string, unknown>>(\n path.join(options.projectRoot, \"app\", \"game.ts\"),\n ),\n loadProjectReducerNativeModules(options.projectRoot),\n ]);\n const contractFingerprintValue = modules.contractFingerprint(\n gameModule.default,\n ).value;\n const resolvedBase = resolveBaseDefinition(\n options.base,\n options.basesById ?? new Map([[options.base.definition.id, options.base]]),\n );\n const effectiveSetup = resolveEffectiveBaseSetup({\n manifest,\n base: options.base.definition,\n basesById: options.basesById,\n });\n let parentFingerprintHash: string | null = null;\n if (options.base.definition.extends) {\n const parentBase = options.basesById?.get(options.base.definition.extends);\n if (!parentBase) {\n throw new Error(\n `Base '${options.base.definition.id}' extends unknown parent '${options.base.definition.extends}'.`,\n );\n }\n parentFingerprintHash = fingerprintHash(\n await currentFingerprint({\n projectRoot: options.projectRoot,\n base: parentBase,\n basesById: options.basesById,\n compiledResultId: options.compiledResultId,\n projectId: options.projectId,\n }),\n );\n }\n return {\n base: options.base.definition.id,\n seed: resolvedBase.seed,\n players: resolvedBase.players,\n baseBundleHash: options.base.bundleHash,\n manifestHash: hashContent(JSON.stringify(manifest)),\n appBundleHash: hashContent(\n await bundleTypeScriptModuleText(\n path.join(options.projectRoot, \"app\", \"game.ts\"),\n ),\n ),\n uiContractHash: hashContent(\n await bundleTypeScriptModuleText(\n path.join(options.projectRoot, \"shared\", \"generated\", \"ui-contract.ts\"),\n { external: SDK_UI_RUNTIME_EXTERNALS },\n ),\n ),\n setupProfileId: effectiveSetup.setupProfileId,\n compiledResultId: options.compiledResultId,\n projectId: options.projectId,\n parentBaseId: options.base.definition.extends ?? null,\n parentFingerprintHash,\n contractFingerprint: contractFingerprintValue,\n };\n}\n\nexport async function generateReducerNativeArtifacts(options: {\n projectRoot: string;\n compiledResultId?: string;\n projectId?: string;\n scenarioPath?: string;\n debug?: boolean;\n}): Promise<{\n bases: LoadedBase[];\n scenarios: LoadedScenario[];\n}> {\n await ensureReducerNativeTestingFiles(options.projectRoot);\n const [bases, scenarios] = await Promise.all([\n loadTypedBases(options.projectRoot),\n loadTypedScenarios(options.projectRoot, {\n scenarioPath: options.scenarioPath,\n }),\n ]);\n const basesById = new Map(bases.map((base) => [base.definition.id, base]));\n validateTypedScenarioBases(scenarios, basesById);\n await writeReducerNativeGeneratedFiles({\n projectRoot: options.projectRoot,\n bases,\n scenarios,\n compiledResultId: options.compiledResultId,\n projectId: options.projectId,\n debug: options.debug,\n });\n return { bases, scenarios };\n}\n\nexport async function runReducerNativeScenarios(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n resolvedConfig: ResolvedConfig;\n scenarioPath?: string;\n compiledResultId?: string;\n projectId?: string;\n webBaseUrl?: string;\n debug?: boolean;\n updateSnapshots?: boolean;\n}): Promise<ReducerNativeScenarioSummary> {\n await ensureReducerNativeTestingFiles(options.projectRoot);\n\n const [\n bases,\n scenarios,\n initialGeneratedBaseStates,\n manifest,\n gameModule,\n manifestContractModule,\n modules,\n ] = await Promise.all([\n loadTypedBases(options.projectRoot),\n loadTypedScenarios(options.projectRoot, {\n scenarioPath: options.scenarioPath,\n }),\n loadGeneratedBaseStates(options.projectRoot),\n loadManifest(options.projectRoot),\n importTypeScriptModule<Record<string, unknown>>(\n path.join(options.projectRoot, \"app\", \"game.ts\"),\n ),\n importTypeScriptModule<Record<string, unknown>>(\n path.join(options.projectRoot, \"shared\", \"manifest-contract.ts\"),\n ),\n loadProjectReducerNativeModules(options.projectRoot),\n ]);\n let generatedBaseStates = initialGeneratedBaseStates;\n const createInitialTable =\n typeof manifestContractModule.createInitialTable === \"function\"\n ? (manifestContractModule.createInitialTable as GeneratedInitialTableFactory)\n : null;\n\n const basesById = new Map(bases.map((base) => [base.definition.id, base]));\n validateTypedScenarioBases(scenarios, basesById);\n\n if (options.updateSnapshots) {\n await writeReducerNativeGeneratedFiles({\n projectRoot: options.projectRoot,\n bases,\n scenarios,\n compiledResultId: options.compiledResultId,\n projectId: options.projectId,\n debug: options.debug,\n });\n generatedBaseStates = await loadGeneratedBaseStates(options.projectRoot);\n }\n\n let passed = 0;\n let failed = 0;\n const results: ReducerNativeScenarioResult[] = [];\n\n for (const scenario of scenarios) {\n const base = basesById.get(scenario.definition.from);\n if (!base) {\n throw new Error(\n `Missing typed base '${scenario.definition.from}' for scenario '${scenario.definition.id}'.`,\n );\n }\n\n if (generatedBaseStates?.[baseStateKey(base.definition.id)]) {\n validateGeneratedFingerprint({\n generated:\n generatedBaseStates[baseStateKey(base.definition.id)]!.fingerprint,\n current: await currentFingerprint({\n projectRoot: options.projectRoot,\n base,\n basesById,\n compiledResultId: options.compiledResultId,\n projectId: options.projectId,\n }),\n });\n }\n\n try {\n const resolvedBase = resolveBaseDefinition(base, basesById);\n const effectiveSetup = resolveEffectiveBaseSetup({\n manifest,\n base: base.definition,\n basesById,\n });\n const shadow = new ShadowReducerRuntime(\n modules,\n manifest,\n gameModule.default,\n createInitialTable,\n resolvedBase.seed,\n resolvedBase.players,\n effectiveSetup.setupProfileId,\n options.debug ?? false,\n );\n if (base.definition.extends) {\n const parentArtifact =\n generatedBaseStates?.[baseStateKey(base.definition.extends)];\n if (!parentArtifact) {\n throw new Error(\n `Base '${base.definition.id}' extends '${base.definition.extends}', but the parent artifact is missing. Run 'dreamboard test' first.`,\n );\n }\n shadow.hydrate(parentArtifact.snapshot, parentArtifact.version);\n }\n\n const context = await createScenarioContext({\n shadow,\n expect: modules.createExpectApi({\n matchSnapshot: createScenarioSnapshotMatcher({\n projectRoot: options.projectRoot,\n scenarioId: scenario.definition.id,\n updateSnapshots: options.updateSnapshots ?? false,\n }),\n }),\n });\n\n await context.game.start();\n await base.definition.setup({\n game: context.game,\n players: context.players,\n seat: context.seat,\n });\n shadow.clearHistory();\n await scenario.definition.when(context);\n if (\n scenario.definition.phase &&\n shadow.phase() !== scenario.definition.phase\n ) {\n throw new Error(\n `Scenario '${scenario.definition.id}' expected phase '${scenario.definition.phase}' but reached '${shadow.phase()}'.`,\n );\n }\n if (\n scenario.definition.stage &&\n shadow.currentStage() !== scenario.definition.stage\n ) {\n throw new Error(\n `Scenario '${scenario.definition.id}' expected stage '${scenario.definition.stage}' but reached '${\n shadow.currentStage() ?? \"null\"\n }'.`,\n );\n }\n await scenario.definition.then(context);\n passed += 1;\n results.push({\n id: scenario.definition.id,\n success: true,\n });\n } catch (error) {\n failed += 1;\n results.push({\n id: scenario.definition.id,\n success: false,\n errorCode: isStaleContractArtifactError(error)\n ? STALE_CONTRACT_ARTIFACT_CODE\n : undefined,\n error:\n error instanceof Error\n ? formatScenarioErrorForDisplay({\n error,\n projectRoot: options.projectRoot,\n scenarioFilePath: scenario.filePath,\n })\n : `Scenario '${scenario.definition.id}' failed.`,\n });\n } finally {\n }\n }\n\n return { passed, failed, results };\n}\n","import { mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { build } from \"esbuild\";\nimport { resolveCliRepoRoot } from \"./repo-root.js\";\nimport { createRepoLocalPackageResolutionPlugin } from \"./repo-local-package-resolution.js\";\n\nconst ESBUILD_EXTERNALS = [\n \"playwright\",\n \"playwright-core\",\n \"chromium-bidi\",\n \"electron\",\n];\n\nfunction resolveSourceCheckoutBuildContext(): {\n nodePaths: string[];\n plugins: ReturnType<typeof createRepoLocalPackageResolutionPlugin>[];\n} {\n try {\n const repoRoot = resolveCliRepoRoot(import.meta.url);\n return {\n nodePaths: [\n path.join(repoRoot, \"apps\", \"dreamboard-cli\", \"node_modules\"),\n path.join(repoRoot, \"node_modules\"),\n ],\n plugins: [createRepoLocalPackageResolutionPlugin({ repoRoot })],\n };\n } catch {\n return {\n nodePaths: [path.join(process.cwd(), \"node_modules\")],\n plugins: [],\n };\n }\n}\n\nexport async function bundleTypeScriptModuleText(\n entryPath: string,\n options: { external?: readonly string[] } = {},\n): Promise<string> {\n const sourceCheckoutContext = resolveSourceCheckoutBuildContext();\n const result = await build({\n entryPoints: [entryPath],\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: \"node24\",\n sourcemap: \"inline\",\n external: [...ESBUILD_EXTERNALS, ...(options.external ?? [])],\n nodePaths: sourceCheckoutContext.nodePaths,\n plugins: sourceCheckoutContext.plugins,\n write: false,\n });\n\n const output = result.outputFiles?.[0];\n if (!output) {\n throw new Error(`Failed to bundle TypeScript module '${entryPath}'.`);\n }\n return output.text;\n}\n\nexport async function importTypeScriptModule<T>(entryPath: string): Promise<T> {\n const tempDir = await mkdtemp(path.join(tmpdir(), \"dreamboard-ts-module-\"));\n const outfile = path.join(\n tempDir,\n `${path.basename(entryPath).replace(/\\.[^.]+$/u, \"\")}.mjs`,\n );\n\n try {\n const bundledText = await bundleTypeScriptModuleText(entryPath);\n await writeFile(outfile, bundledText);\n\n return (await import(pathToFileURL(outfile).href)) as T;\n } finally {\n await rm(tempDir, { recursive: true, force: true });\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport { createGameplayCapability } from \"@dreamboard-games/api-client\";\nimport {\n GameplayAuthorityRecoveringError,\n connectGameplayAuthority,\n} from \"@dreamboard-games/gameplay-authority-client\";\n\nconst CLIENT_ACTION_ID_HEADER = \"X-Dreamboard-Client-Action-Id\";\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nexport type SubmitGameplayAuthorityActionOptions = {\n path: {\n sessionId: string;\n playerId: string;\n interactionId: string;\n };\n body: {\n expectedVersion: number;\n actionSetVersion: string;\n inputs: Record<string, unknown>;\n };\n headers?: Record<string, string>;\n capabilityRequester?: typeof createGameplayCapability;\n connectAuthority?: typeof connectGameplayAuthority;\n clientActionIdFactory?: () => string;\n};\n\nexport type GameplayAuthorityActionSubmitResponse = {\n success: boolean;\n version: number;\n actionSetVersion: string;\n accepted?: boolean | null;\n durabilityStatus?: \"COMMITTED\" | null;\n errorCode?: string | null;\n message?: string | null;\n clientActionId?: string | null;\n};\n\nexport type SubmitGameplayAuthorityActionResult = {\n data?: GameplayAuthorityActionSubmitResponse;\n error?: unknown;\n response?: Response;\n};\n\nexport async function submitGameplayAuthorityAction(\n options: SubmitGameplayAuthorityActionOptions,\n): Promise<SubmitGameplayAuthorityActionResult> {\n try {\n const requestCapability =\n options.capabilityRequester ?? createGameplayCapability;\n const connectAuthority =\n options.connectAuthority ?? connectGameplayAuthority;\n const capability = await requestCapability({\n path: {\n sessionId: options.path.sessionId,\n playerId: options.path.playerId,\n },\n });\n if (capability.error || !capability.data) {\n return { error: capability.error ?? new Error(\"Missing capability.\") };\n }\n\n const clientActionId =\n options.headers?.[CLIENT_ACTION_ID_HEADER] ??\n options.clientActionIdFactory?.() ??\n randomUUID();\n const client = await connectAuthority({\n websocketUrl: capability.data.websocketUrl,\n capabilityToken: capability.data.token,\n openTimeoutMs: DEFAULT_TIMEOUT_MS,\n requestTimeoutMs: DEFAULT_TIMEOUT_MS,\n });\n\n try {\n const frame = await client.submitCommand({\n clientActionId,\n expectedVersion: options.body.expectedVersion,\n actionSetVersion: options.body.actionSetVersion,\n interactionId: options.path.interactionId,\n inputs: options.body.inputs ?? {},\n });\n if (frame.type === \"command.rejected\") {\n return {\n data: {\n success: false,\n accepted: false,\n version:\n typeof frame.currentVersion === \"number\"\n ? frame.currentVersion\n : options.body.expectedVersion,\n actionSetVersion: options.body.actionSetVersion,\n errorCode:\n typeof frame.errorCode === \"string\" ? frame.errorCode : undefined,\n message:\n typeof frame.message === \"string\" ? frame.message : undefined,\n clientActionId,\n },\n };\n }\n const acceptedVersion =\n typeof frame.version === \"number\" ? frame.version : undefined;\n if (acceptedVersion === undefined) {\n return {\n error: new Error(\"Accepted frame did not include a numeric version.\"),\n };\n }\n const update =\n frame.update && typeof frame.update === \"object\"\n ? (frame.update as Record<string, unknown>)\n : {};\n const view =\n update.view && typeof update.view === \"object\"\n ? (update.view as { actionSetVersion?: unknown })\n : {};\n const projectedActionSetVersion =\n typeof view.actionSetVersion === \"string\"\n ? view.actionSetVersion\n : undefined;\n return {\n data: {\n success: true,\n accepted: true,\n durabilityStatus: \"COMMITTED\",\n version: acceptedVersion,\n actionSetVersion:\n projectedActionSetVersion ?? options.body.actionSetVersion,\n clientActionId,\n },\n };\n } catch (error) {\n if (error instanceof GameplayAuthorityRecoveringError) {\n return {\n error: new Error(error.message || \"Session authority is recovering.\"),\n };\n }\n throw error;\n } finally {\n client.close();\n }\n } catch (error) {\n return { error };\n }\n}\n","import { z } from \"zod\";\nexport const GAMEPLAY_AUTHORITY_AUDIENCE = \"dreamboard-gameplay-authority\";\nexport const GAMEPLAY_TUNNEL_AUDIENCE = \"dreamboard-gameplay-authority-tunnel\";\nexport const GameplayPermissionSchema = z.enum([\n \"observe\",\n \"submit\",\n \"restore-history\",\n]);\nexport const GameplayConnectionContextSchema = z.object({\n sessionId: z.string().uuid(),\n playerId: z.string().min(1),\n permissions: z.array(GameplayPermissionSchema),\n});\nexport const GameplayActorKindSchema = z.enum([\"user\", \"demo\", \"perf\"]);\nexport const JsonPatchOperationSchema = z\n .object({\n op: z.string().min(1),\n path: z.string(),\n})\n .catchall(z.unknown());\nexport const ProjectedDeltaSchema = z.object({\n kind: z.literal(\"delta\"),\n generation: z.number().int().nonnegative(),\n baseVersion: z.number().int().nonnegative(),\n version: z.number().int().nonnegative(),\n patch: z.array(JsonPatchOperationSchema),\n});\nexport const ProjectedSnapshotSchema = z.object({\n kind: z.literal(\"snapshot\"),\n generation: z.number().int().nonnegative(),\n version: z.number().int().nonnegative(),\n view: z.unknown(),\n});\nconst BaseGameplayCapabilityClaimsSchema = z.object({\n typ: z.literal(\"gameplay-capability\"),\n aud: z.literal(GAMEPLAY_AUTHORITY_AUDIENCE),\n iss: z.string().min(1),\n exp: z.number().int().positive(),\n iat: z.number().int().positive().optional(),\n jti: z.string().min(1).optional(),\n sessionId: z.string().uuid(),\n playerId: z.string().min(1),\n permissions: z.array(GameplayPermissionSchema),\n});\nexport const UserGameplayCapabilityClaimsSchema = BaseGameplayCapabilityClaimsSchema.extend({\n actorKind: z.literal(\"user\"),\n});\nexport const DemoGameplayCapabilityClaimsSchema = BaseGameplayCapabilityClaimsSchema.extend({\n actorKind: z.literal(\"demo\"),\n});\nexport const PerfGameplayCapabilityClaimsSchema = BaseGameplayCapabilityClaimsSchema.extend({\n actorKind: z.literal(\"perf\"),\n perfRunId: z.string().uuid(),\n laneId: z.string().min(1),\n});\nexport const GameplayCapabilityClaimsSchema = z.discriminatedUnion(\"actorKind\", [\n UserGameplayCapabilityClaimsSchema,\n DemoGameplayCapabilityClaimsSchema,\n PerfGameplayCapabilityClaimsSchema,\n]);\nexport const GameplayTunnelClaimsSchema = z.object({\n aud: z.literal(GAMEPLAY_TUNNEL_AUDIENCE),\n iss: z.string().min(1),\n exp: z.number().int().positive(),\n iat: z.number().int().positive().optional(),\n jti: z.string().min(1).optional(),\n targetInstanceId: z.string().min(1),\n sessionId: z.string().uuid(),\n playerId: z.string().min(1),\n // Permissions are cryptographically bound into the tunnel token so the owner\n // task trusts the signed claim set rather than the unauthenticated\n // `tunnel.bind` frame. An ingress task cannot grant a player capabilities the\n // issued token did not attest.\n permissions: z.array(GameplayPermissionSchema),\n});\nexport const AuthConnectFrameSchema = z.object({\n type: z.literal(\"auth.connect\"),\n capabilityToken: z.string().min(1),\n});\nexport const AuthRefreshFrameSchema = z.object({\n type: z.literal(\"auth.refresh\"),\n capabilityToken: z.string().min(1),\n});\nexport const SessionResumeFrameSchema = z.object({\n type: z.literal(\"session.resume\"),\n lastSeenGeneration: z.number().int().nonnegative().nullable(),\n lastSeenVersion: z.number().int().nonnegative().nullable(),\n unacknowledgedClientActionIds: z.array(z.string().min(1)).max(32),\n});\nexport const CommandSubmitFrameSchema = z.object({\n type: z.literal(\"command.submit\"),\n clientActionId: z.string().min(1).max(128),\n expectedVersion: z.number().int().nonnegative(),\n actionSetVersion: z.string().min(1),\n interactionId: z.string().min(1),\n inputs: z.record(z.string(), z.unknown()),\n});\nexport const HistoryRestoreFrameSchema = z.object({\n type: z.literal(\"history.restore\"),\n restoreId: z.string().min(1).max(128),\n targetGeneration: z.number().int().nonnegative(),\n targetVersion: z.number().int().nonnegative(),\n});\nexport const ClientGameplayFrameSchema = z.discriminatedUnion(\"type\", [\n AuthConnectFrameSchema,\n AuthRefreshFrameSchema,\n SessionResumeFrameSchema,\n CommandSubmitFrameSchema,\n HistoryRestoreFrameSchema,\n]);\nexport const TunnelBindFrameSchema = z.object({\n type: z.literal(\"tunnel.bind\"),\n context: GameplayConnectionContextSchema,\n});\nexport const TunnelClientFrameSchema = z.discriminatedUnion(\"type\", [\n TunnelBindFrameSchema,\n SessionResumeFrameSchema,\n CommandSubmitFrameSchema,\n HistoryRestoreFrameSchema,\n]);\nexport const CommandAcceptedFrameSchema = z.object({\n type: z.literal(\"command.accepted\"),\n clientActionId: z.string().min(1),\n generation: z.number().int().nonnegative(),\n version: z.number().int().nonnegative(),\n stateHash: z.string().min(1),\n update: ProjectedSnapshotSchema,\n});\nexport const CommandRejectedFrameSchema = z.object({\n type: z.literal(\"command.rejected\"),\n clientActionId: z.string().min(1).optional(),\n errorCode: z.string().min(1),\n message: z.string().min(1),\n currentGeneration: z.number().int().nonnegative().optional(),\n currentVersion: z.number().int().nonnegative().optional(),\n});\nexport const HistoryRestoredFrameSchema = z.object({\n type: z.literal(\"history.restored\"),\n restoreId: z.string().min(1),\n generation: z.number().int().nonnegative(),\n version: z.number().int().nonnegative(),\n stateHash: z.string().min(1),\n update: ProjectedSnapshotSchema,\n});\nexport const HistoryRestoreRejectedFrameSchema = z.object({\n type: z.literal(\"history.restoreRejected\"),\n restoreId: z.string().min(1).optional(),\n errorCode: z.string().min(1),\n message: z.string().min(1),\n currentGeneration: z.number().int().nonnegative().optional(),\n currentVersion: z.number().int().nonnegative().optional(),\n});\nexport const AuthAcceptedFrameSchema = z.object({\n type: z.literal(\"auth.accepted\"),\n expiresAt: z.string().datetime(),\n});\nexport const AuthorityRecoveringFrameSchema = z.object({\n type: z.literal(\"authority.recovering\"),\n retryAfterMs: z.number().int().positive(),\n message: z.string().min(1),\n});\nexport const SessionSnapshotFrameSchema = z.object({\n type: z.literal(\"session.snapshot\"),\n generation: z.number().int().nonnegative(),\n version: z.number().int().nonnegative(),\n stateHash: z.string().min(1),\n update: ProjectedSnapshotSchema,\n});\nexport const SessionDeltaFrameSchema = z.object({\n type: z.literal(\"session.delta\"),\n clientActionId: z.string().min(1).optional(),\n update: ProjectedDeltaSchema,\n});\nexport const ServerGameplayFrameSchema = z.discriminatedUnion(\"type\", [\n AuthAcceptedFrameSchema,\n AuthorityRecoveringFrameSchema,\n SessionSnapshotFrameSchema,\n SessionDeltaFrameSchema,\n CommandAcceptedFrameSchema,\n CommandRejectedFrameSchema,\n HistoryRestoredFrameSchema,\n HistoryRestoreRejectedFrameSchema,\n]);\nexport const TunnelBoundFrameSchema = z.object({\n type: z.literal(\"tunnel.bound\"),\n sessionId: z.string().uuid(),\n playerId: z.string().min(1),\n});\nexport const TunnelServerFrameSchema = z.discriminatedUnion(\"type\", [\n TunnelBoundFrameSchema,\n AuthorityRecoveringFrameSchema,\n SessionSnapshotFrameSchema,\n SessionDeltaFrameSchema,\n CommandAcceptedFrameSchema,\n CommandRejectedFrameSchema,\n HistoryRestoredFrameSchema,\n HistoryRestoreRejectedFrameSchema,\n]);\n","import { ServerGameplayFrameSchema, } from \"@dreamboard-games/gameplay-authority-protocol\";\nconst DEFAULT_OPEN_TIMEOUT_MS = 5_000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10_000;\nexport class GameplayAuthorityRecoveringError extends Error {\n retryAfterMs;\n constructor(message, retryAfterMs) {\n super(message);\n this.name = \"GameplayAuthorityRecoveringError\";\n this.retryAfterMs = retryAfterMs;\n }\n}\nexport async function connectGameplayAuthority(input) {\n const webSocketFactory = input.webSocketFactory ?? browserWebSocketFactory();\n const openTimeoutMs = input.openTimeoutMs ?? DEFAULT_OPEN_TIMEOUT_MS;\n const requestTimeoutMs = input.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n const socket = new webSocketFactory(input.websocketUrl, input.webSocketInit);\n try {\n await waitUntilOpen(socket, openTimeoutMs);\n socket.send(JSON.stringify({\n type: \"auth.connect\",\n capabilityToken: input.capabilityToken,\n }));\n await waitForServerFrame(socket, (frame) => frame.type === \"auth.accepted\", requestTimeoutMs);\n return new WebSocketGameplayAuthorityClient(socket, requestTimeoutMs);\n }\n catch (error) {\n socket.close();\n throw error;\n }\n}\nclass WebSocketGameplayAuthorityClient {\n socket;\n requestTimeoutMs;\n constructor(socket, requestTimeoutMs) {\n this.socket = socket;\n this.requestTimeoutMs = requestTimeoutMs;\n }\n resume(input = {}) {\n this.socket.send(JSON.stringify({\n type: \"session.resume\",\n lastSeenGeneration: input.lastSeenGeneration ?? null,\n lastSeenVersion: input.lastSeenVersion ?? null,\n unacknowledgedClientActionIds: input.unacknowledgedClientActionIds ?? [],\n }));\n }\n async submitCommand(input) {\n this.socket.send(JSON.stringify({\n type: \"command.submit\",\n clientActionId: input.clientActionId,\n expectedVersion: input.expectedVersion,\n actionSetVersion: input.actionSetVersion,\n interactionId: input.interactionId,\n inputs: input.inputs,\n }));\n const frame = await waitForServerFrame(this.socket, (candidate) => candidate.type === \"authority.recovering\" ||\n (candidate.type === \"command.accepted\" &&\n candidate.clientActionId === input.clientActionId) ||\n (candidate.type === \"command.rejected\" &&\n (candidate.clientActionId === undefined ||\n candidate.clientActionId === input.clientActionId)), this.requestTimeoutMs);\n throwIfRecovering(frame);\n if (frame.type !== \"command.accepted\" &&\n frame.type !== \"command.rejected\") {\n throw new Error(\"Unexpected gameplay authority command frame.\");\n }\n return frame;\n }\n async restoreHistory(input) {\n this.socket.send(JSON.stringify({\n type: \"history.restore\",\n restoreId: input.restoreId,\n targetGeneration: input.targetGeneration,\n targetVersion: input.targetVersion,\n }));\n const frame = await waitForServerFrame(this.socket, (candidate) => candidate.type === \"authority.recovering\" ||\n (candidate.type === \"history.restored\" &&\n candidate.restoreId === input.restoreId) ||\n (candidate.type === \"history.restoreRejected\" &&\n (candidate.restoreId === undefined ||\n candidate.restoreId === input.restoreId)), this.requestTimeoutMs);\n throwIfRecovering(frame);\n if (frame.type !== \"history.restored\" &&\n frame.type !== \"history.restoreRejected\") {\n throw new Error(\"Unexpected gameplay authority history frame.\");\n }\n return frame;\n }\n frames(signal) {\n return readServerFrames(this.socket, signal);\n }\n close() {\n this.socket.close();\n }\n}\nfunction throwIfRecovering(frame) {\n if (frame.type === \"authority.recovering\") {\n throw new GameplayAuthorityRecoveringError(frame.message, frame.retryAfterMs);\n }\n}\nfunction browserWebSocketFactory() {\n return BrowserGameplayAuthorityWebSocket;\n}\nclass BrowserGameplayAuthorityWebSocket {\n socket;\n listeners = new Map();\n constructor(url, init) {\n if (init?.headers && Object.keys(init.headers).length > 0) {\n throw new Error(\"Browser WebSocket does not support custom headers; provide a webSocketFactory for header-aware runtimes.\");\n }\n this.socket = new WebSocket(url);\n }\n send(data) {\n this.socket.send(data);\n }\n close() {\n this.socket.close();\n }\n on(event, listener) {\n const wrapped = (observed) => {\n if (event === \"message\" && \"data\" in observed) {\n listener(observed.data);\n return;\n }\n listener(observed);\n };\n const listeners = this.listeners.get(event) ?? new Map();\n listeners.set(listener, wrapped);\n this.listeners.set(event, listeners);\n this.socket.addEventListener(event, wrapped);\n }\n off(event, listener) {\n const listeners = this.listeners.get(event);\n const wrapped = listeners?.get(listener);\n if (!listeners || !wrapped) {\n return;\n }\n this.socket.removeEventListener(event, wrapped);\n listeners.delete(listener);\n }\n}\nasync function waitUntilOpen(socket, timeoutMs) {\n await waitForEvent(socket, \"open\", timeoutMs);\n}\nasync function waitForEvent(socket, event, timeoutMs) {\n return new Promise((resolve, reject) => {\n const cleanup = installSocketListeners(socket, {\n timeoutMs,\n onEvent(observed) {\n if (observed === event) {\n cleanup();\n resolve();\n }\n },\n onError(error) {\n cleanup();\n reject(error instanceof Error ? error : new Error(\"gameplay socket error\"));\n },\n onClose() {\n cleanup();\n reject(new Error(\"gameplay socket closed\"));\n },\n onTimeout() {\n cleanup();\n reject(new Error(\"gameplay socket timed out\"));\n },\n });\n });\n}\nasync function waitForServerFrame(socket, predicate, timeoutMs) {\n return new Promise((resolve, reject) => {\n const cleanup = installSocketListeners(socket, {\n timeoutMs,\n onMessage(data) {\n let frame;\n try {\n frame = ServerGameplayFrameSchema.parse(JSON.parse(messageToString(data)));\n }\n catch (error) {\n cleanup();\n reject(error instanceof Error\n ? error\n : new Error(\"invalid gameplay authority frame\"));\n return;\n }\n if (predicate(frame)) {\n cleanup();\n resolve(frame);\n }\n },\n onError(error) {\n cleanup();\n reject(error instanceof Error ? error : new Error(\"gameplay socket error\"));\n },\n onClose() {\n cleanup();\n reject(new Error(\"gameplay socket closed\"));\n },\n onTimeout() {\n cleanup();\n reject(new Error(\"gameplay socket timed out\"));\n },\n });\n });\n}\nfunction installSocketListeners(socket, handlers) {\n const timer = setTimeout(handlers.onTimeout, handlers.timeoutMs);\n const onOpen = () => handlers.onEvent?.(\"open\");\n const onMessage = (data) => handlers.onMessage?.(data);\n const onError = (error) => handlers.onError(error);\n const onClose = () => handlers.onClose();\n socket.on(\"open\", onOpen);\n socket.on(\"message\", onMessage);\n socket.on(\"error\", onError);\n socket.on(\"close\", onClose);\n return () => {\n clearTimeout(timer);\n socket.off?.(\"open\", onOpen);\n socket.off?.(\"message\", onMessage);\n socket.off?.(\"error\", onError);\n socket.off?.(\"close\", onClose);\n };\n}\nfunction readServerFrames(socket, signal) {\n const queue = [];\n let wake = null;\n let closed = false;\n let error = null;\n const wakeReader = () => {\n wake?.();\n wake = null;\n };\n const onMessage = (data) => {\n try {\n queue.push(ServerGameplayFrameSchema.parse(JSON.parse(messageToString(data))));\n }\n catch (candidate) {\n error =\n candidate instanceof Error\n ? candidate\n : new Error(\"invalid gameplay authority frame\");\n }\n wakeReader();\n };\n const onError = (candidate) => {\n error =\n candidate instanceof Error\n ? candidate\n : new Error(\"gameplay socket error\");\n wakeReader();\n };\n const onClose = () => {\n closed = true;\n wakeReader();\n };\n const onAbort = () => {\n closed = true;\n wakeReader();\n };\n socket.on(\"message\", onMessage);\n socket.on(\"error\", onError);\n socket.on(\"close\", onClose);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n const cleanup = () => {\n socket.off?.(\"message\", onMessage);\n socket.off?.(\"error\", onError);\n socket.off?.(\"close\", onClose);\n signal?.removeEventListener(\"abort\", onAbort);\n };\n const iterator = {\n async next() {\n while (!closed && !signal?.aborted) {\n const next = queue.shift();\n if (next) {\n return { done: false, value: next };\n }\n if (error) {\n cleanup();\n throw error;\n }\n await new Promise((resolve) => {\n wake = resolve;\n });\n }\n cleanup();\n if (error) {\n throw error;\n }\n return { done: true, value: undefined };\n },\n async return(value) {\n closed = true;\n wakeReader();\n cleanup();\n return { done: true, value: value };\n },\n async throw(candidate) {\n closed = true;\n wakeReader();\n cleanup();\n throw candidate;\n },\n [Symbol.asyncIterator]() {\n return this;\n },\n async [Symbol.asyncDispose]() {\n await this.return(undefined);\n },\n };\n return iterator;\n}\nfunction messageToString(data) {\n if (typeof data === \"string\") {\n return data;\n }\n if (data instanceof ArrayBuffer) {\n return new TextDecoder().decode(data);\n }\n if (ArrayBuffer.isView(data)) {\n return new TextDecoder().decode(data);\n }\n return String(data);\n}\n","import type {\n GameTopologyManifest,\n SetupProfileSpec,\n} from \"@dreamboard-games/sdk/types\";\nimport { loadManifest } from \"../project/local-files.js\";\n\nexport type ResolvedSetupProfileSelection = {\n id: string | null;\n name: string | null;\n source: \"explicit\" | \"implicit-single\" | \"implicit-first\" | \"none\";\n};\n\nexport function resolveSetupProfileSelection(options: {\n manifest: GameTopologyManifest;\n requestedSetupProfileId?: string;\n}): ResolvedSetupProfileSelection {\n const setupProfiles: SetupProfileSpec[] =\n options.manifest.setupProfiles ?? [];\n const requestedSetupProfileId =\n options.requestedSetupProfileId?.trim() || undefined;\n\n if (requestedSetupProfileId) {\n const requestedProfile = setupProfiles.find(\n (profile) => profile.id === requestedSetupProfileId,\n );\n if (!requestedProfile) {\n const knownProfiles = setupProfiles\n .map((profile) => profile.id)\n .join(\", \");\n throw new Error(\n setupProfiles.length === 0\n ? `Unknown setup profile '${requestedSetupProfileId}'. The manifest defines no setup profiles.`\n : `Unknown setup profile '${requestedSetupProfileId}'. Expected one of: ${knownProfiles}.`,\n );\n }\n return {\n id: requestedProfile.id,\n name: requestedProfile.name,\n source: \"explicit\",\n };\n }\n\n if (setupProfiles.length === 0) {\n return {\n id: null,\n name: null,\n source: \"none\",\n };\n }\n\n if (setupProfiles.length === 1) {\n return {\n id: setupProfiles[0]?.id ?? null,\n name: setupProfiles[0]?.name ?? null,\n source: \"implicit-single\",\n };\n }\n\n return {\n id: setupProfiles[0]?.id ?? null,\n name: setupProfiles[0]?.name ?? null,\n source: \"implicit-first\",\n };\n}\n\nexport async function resolveSetupProfileSelectionForSession(options: {\n projectRoot: string;\n requestedSetupProfileId?: string;\n}): Promise<ResolvedSetupProfileSelection> {\n const manifest = await loadManifest(options.projectRoot);\n return resolveSetupProfileSelection({\n manifest,\n requestedSetupProfileId: options.requestedSetupProfileId,\n });\n}\n\nexport async function resolveSetupProfileIdForSession(options: {\n projectRoot: string;\n requestedSetupProfileId?: string;\n}): Promise<string | null> {\n return (\n await resolveSetupProfileSelectionForSession({\n projectRoot: options.projectRoot,\n requestedSetupProfileId: options.requestedSetupProfileId,\n })\n ).id;\n}\n","import type { SessionGameSource } from \"@dreamboard-games/api-client\";\n\nexport function projectIdFromSessionGameSource(\n source: SessionGameSource,\n): string {\n if (source.kind === \"USER_COMPILED\") {\n return source.projectId;\n }\n\n return `demo:${source.slug}:${source.revisionId}`;\n}\n","import crypto from \"node:crypto\";\nimport path from \"node:path\";\nimport { BUILD_CHANNEL, IS_PUBLISHED_BUILD } from \"../../build-target.js\";\nimport { ENVIRONMENT_CONFIGS } from \"../../constants.js\";\nimport type {\n LocalMaintainerRegistryConfig,\n LocalMaintainerRegistryPackages,\n LocalMaintainerSdkPackageName,\n} from \"../../types.js\";\nimport { exists, readJsonFile } from \"../../utils/fs.js\";\n\nconst localRegistryAddress = readLocalRegistryAddress();\nexport const LOCAL_REGISTRY_HOST = localRegistryAddress.host;\nexport const LOCAL_REGISTRY_PORT = localRegistryAddress.port;\nexport const LOCAL_REGISTRY_URL = `http://${LOCAL_REGISTRY_HOST}:${LOCAL_REGISTRY_PORT}`;\nexport const LOCAL_SCOPE_NPMRC_CONTENT = `@dreamboard-games:registry=${LOCAL_REGISTRY_URL}\\n`;\nexport const SDK_PUBLISH_ORDER: readonly LocalMaintainerSdkPackageName[] = [\n \"@dreamboard-games/sdk\",\n];\n\nexport type PackageJsonShape = {\n name?: string;\n version?: string;\n description?: string;\n type?: string;\n main?: string;\n types?: string;\n exports?: unknown;\n typesVersions?: Record<string, unknown>;\n files?: string[];\n bin?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n};\n\nfunction readLocalRegistryAddress(): { host: string; port: number } {\n const urlOverride = process.env.DREAMBOARD_LOCAL_REGISTRY_URL?.trim();\n const hostOverride = process.env.DREAMBOARD_LOCAL_REGISTRY_HOST?.trim();\n const portOverride = process.env.DREAMBOARD_LOCAL_REGISTRY_PORT?.trim();\n if (urlOverride) {\n let parsed: URL;\n try {\n parsed = new URL(urlOverride);\n } catch {\n throw new Error(\n `Invalid DREAMBOARD_LOCAL_REGISTRY_URL '${urlOverride}'. Expected an http://host:port URL.`,\n );\n }\n if (parsed.protocol !== \"http:\" || !parsed.hostname || !parsed.port) {\n throw new Error(\n `Invalid DREAMBOARD_LOCAL_REGISTRY_URL '${urlOverride}'. Expected an http://host:port URL.`,\n );\n }\n return {\n host: hostOverride || parsed.hostname,\n port: parseLocalRegistryPort(portOverride || parsed.port),\n };\n }\n return {\n host: hostOverride || \"127.0.0.1\",\n port: portOverride ? parseLocalRegistryPort(portOverride) : 4873,\n };\n}\n\nfunction parseLocalRegistryPort(raw: string): number {\n const port = Number.parseInt(raw, 10);\n if (!Number.isInteger(port) || port < 1 || port > 65535) {\n throw new Error(\n `Invalid DREAMBOARD_LOCAL_REGISTRY_PORT '${raw}'. Expected a TCP port from 1 to 65535.`,\n );\n }\n return port;\n}\n\nexport function shortHash(value: string): string {\n return crypto.createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 12);\n}\n\nexport function isLocalMaintainerRegistryEnabled(apiBaseUrl: string): boolean {\n let isLocalLoopbackUrl = false;\n try {\n const parsed = new URL(apiBaseUrl);\n isLocalLoopbackUrl =\n parsed.protocol === \"http:\" &&\n (parsed.hostname === \"localhost\" || parsed.hostname === \"127.0.0.1\");\n } catch {\n isLocalLoopbackUrl = false;\n }\n\n return (\n !IS_PUBLISHED_BUILD &&\n (apiBaseUrl === ENVIRONMENT_CONFIGS.local?.apiBaseUrl ||\n isLocalLoopbackUrl) &&\n BUILD_CHANNEL === \"development\"\n );\n}\n\nexport function packageShortName(\n packageName: LocalMaintainerSdkPackageName,\n): string {\n return packageName.replace(/^@dreamboard(?:-games)?\\//, \"\");\n}\n\nexport async function readWorkspaceLocalMaintainerRegistryFromPackageJson(\n projectRoot: string,\n fallbackRegistryUrl: string = LOCAL_REGISTRY_URL,\n): Promise<LocalMaintainerRegistryConfig | null> {\n const packageJsonPath = path.join(projectRoot, \"package.json\");\n if (!(await exists(packageJsonPath))) {\n return null;\n }\n\n const packageJson = await readJsonFile<PackageJsonShape>(packageJsonPath);\n const sdkVersion =\n packageJson.dependencies?.[\"@dreamboard-games/sdk\"] ??\n packageJson.devDependencies?.[\"@dreamboard-games/sdk\"];\n const apiClientVersion =\n packageJson.dependencies?.[\"@dreamboard-games/api-client\"] ??\n packageJson.devDependencies?.[\"@dreamboard-games/api-client\"];\n const sdkDependencyVersion =\n packageJson.dependencies?.[\"@dreamboard-games/sdk\"];\n if (!sdkVersion?.includes(\"-local.\") || !sdkDependencyVersion) {\n return null;\n }\n const localSdkVersion = sdkVersion;\n\n const fingerprintSource = [\n apiClientVersion ?? \"\",\n localSdkVersion,\n fallbackRegistryUrl,\n ].join(\":\");\n return {\n registryUrl: fallbackRegistryUrl,\n snapshotId: shortHash(fingerprintSource),\n fingerprint: shortHash(fingerprintSource),\n publishedAt: \"\",\n packages: {\n \"@dreamboard-games/api-client\": apiClientVersion,\n \"@dreamboard-games/sdk\": localSdkVersion,\n } satisfies LocalMaintainerRegistryPackages,\n };\n}\n\nexport function getLocalMaintainerNpmrcContent(\n localMaintainerRegistry: LocalMaintainerRegistryConfig | null | undefined,\n): string | null {\n if (!localMaintainerRegistry) {\n return null;\n }\n return LOCAL_SCOPE_NPMRC_CONTENT.replace(\n LOCAL_REGISTRY_URL,\n localMaintainerRegistry.registryUrl,\n );\n}\n\nexport function didLocalMaintainerSnapshotChange(\n previous: LocalMaintainerRegistryConfig | undefined,\n next: LocalMaintainerRegistryConfig | null,\n): boolean {\n if (!next) {\n return false;\n }\n return previous?.snapshotId !== next.snapshotId;\n}\n\nexport function isLocalMaintainerRegistryUrl(\n fileContent: string | null,\n): boolean {\n if (!fileContent) {\n return false;\n }\n return /@dreamboard-games:registry=http:\\/\\/127\\.0\\.0\\.1:\\d+/.test(\n fileContent,\n );\n}\n"],"mappings":"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","names":["requireAuth","detail","sleep","sleep","path","randomUUID","pathToFileURL","path","path","randomUUID","randomUUID","client","path","pathToFileURL","path","path","randomUUID","generatedBaseStates","generatedBase","cached","scenario","base","path","crypto","path","crypto"]}
|