dreamboard 0.1.22 → 0.1.23

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/citty@0.2.2/node_modules/citty/dist/_chunks/libs/scule.mjs","../../../node_modules/.pnpm/citty@0.2.2/node_modules/citty/dist/index.mjs","../../../node_modules/.pnpm/consola@3.4.2/node_modules/consola/dist/core.mjs","../../../node_modules/.pnpm/consola@3.4.2/node_modules/consola/dist/shared/consola.DRwqZj3T.mjs","../../../node_modules/.pnpm/consola@3.4.2/node_modules/consola/dist/index.mjs","../../../node_modules/.pnpm/consola@3.4.2/node_modules/consola/dist/shared/consola.DXBYu-KD.mjs","../src/commands/clone.ts","../src/build-target.ts","../src/config/project-config.ts","../src/auth/refresh-error.ts","../src/auth/refresh-coordinator.ts","../src/config/resolve.ts","../src/flags.ts","../src/utils/strings.ts","../src/command-args.ts","../src/utils/problem-types.ts","../src/utils/errors.ts","../src/services/api/authoring-state-api.ts","../src/services/api/compiled-results-api.ts","../src/services/api/game-api.ts","../src/services/api/manifest-api.ts","../src/services/api/rule-api.ts","../src/services/api/preview-api.ts","../../../packages/api-client/src/source-revisions.ts","../src/services/api/source-revisions-api.ts","../src/services/project/local-files.ts","../src/utils/crypto.ts","../src/services/project/manifest-authoring.ts","../../../packages/workspace-codegen/src/hex-geometry.ts","../../../packages/workspace-codegen/src/preset-card-sets.ts","../../../packages/workspace-codegen/src/manifest-contract.ts","../../../packages/workspace-codegen/src/manifest-validation.ts","../../../packages/workspace-codegen/src/ownership.ts","../../../packages/workspace-codegen/src/seeds.ts","../../../packages/workspace-codegen/src/index.ts","../src/utils/repo-local-package-resolution.ts","../src/utils/repo-root.ts","../src/services/project/static-scaffold.ts","../src/templates/testing-types-content.ts","../src/services/project/framework-dependencies.ts","../src/services/project/sync.ts","../src/services/project/project-state.ts","../src/services/project/workspace-codegen.ts","../src/services/project/local-maintainer-registry.ts","../src/services/project/local-maintainer-registry-shared.ts","../src/services/project/workspace-dependencies.ts","../src/services/project/dependency-tooling-messages.ts","../src/services/project/dependency-portability.ts","../src/services/project/local-typecheck.ts","../src/commands/compile.ts","../src/commands/config.ts","../src/commands/dev.ts","../../../packages/ui-host-runtime/src/actor-principal.ts","../../../packages/ui-host-runtime/src/plugin-messages.ts","../../../packages/ui-host-runtime/src/unified-session-store.ts","../src/utils/dev-session.ts","../src/utils/player-count.ts","../src/auth/auth-server.ts","../src/dev-host/start-dev-server.ts","../src/dev-host/dev-api-proxy-plugin.ts","../src/dev-host/dev-runtime-platform.ts","../src/dev-host/dev-diagnostics.ts","../src/dev-host/dev-virtual-modules-plugin.ts","../src/dev-host/dev-log-relay-plugin.ts","../src/dev-host/dev-fallback-stylesheet.ts","../src/services/testing/reducer-native-test-harness.ts","../../../packages/reducer-contract/generated/zod.ts","../../../packages/app-sdk/src/reducer/per-player.ts","../../../packages/app-sdk/src/reducer/inputs/formInput.ts","../../../packages/app-sdk/src/reducer/inputs/boardInput.ts","../../../packages/app-sdk/src/reducer/inputs/targetRule.ts","../../../packages/app-sdk/src/reducer/inputs/boardTarget.ts","../../../packages/app-sdk/src/reducer/inputs/cardTarget.ts","../../../packages/app-sdk/src/reducer/inputs/cardInput.ts","../../../packages/app-sdk/src/reducer/engine/runtime-instruction-engine.ts","../../../packages/app-sdk/src/reducer/table-ops.ts","../../../packages/app-sdk/src/reducer/rng.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/rng-sampler.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/engine-instruction-resolver.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/flow-instruction-resolver.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/simultaneous-player.ts","../../../packages/app-sdk/src/reducer/table-queries.ts","../../../packages/app-sdk/src/reducer/derived.ts","../../../packages/app-sdk/src/reducer/effects.ts","../../../packages/app-sdk/src/reducer/ops.ts","../../../packages/app-sdk/src/reducer/definition-index.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/runtime-registry.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/trusted-runtime-args.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/trusted-runtime-result.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/trusted-state-codec.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/trusted-setup-profiles.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/runtime-scope.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/instruction-runner.ts","../../../packages/app-sdk/src/reducer/parse-utils.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/interaction-types.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/interaction-collectors.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/interaction-authorization.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/interaction-decision.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/stage-resolver.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/interaction-resolver.ts","../../../packages/app-sdk/src/reducer/setup-bootstrap.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/lifecycle-runner.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/projection-context.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/projection-builder.ts","../../../packages/app-sdk/src/reducer/bundle/trusted/static-projection.ts","../../../packages/app-sdk/src/reducer/bundle/trusted-bundle.ts","../../../packages/reducer-contract/generated/builders.ts","../../../packages/reducer-contract/generated/version.ts","../../../packages/app-sdk/src/reducer/ingress/runtime-payload.ts","../../../packages/app-sdk/src/reducer/ingress/input-codec.ts","../../../packages/app-sdk/src/reducer/ingress/phase-schemas.ts","../../../packages/app-sdk/src/reducer/ingress/session-codec.ts","../../../packages/app-sdk/src/reducer/bundle/ingress-bundle.ts","../src/utils/ts-module-loader.ts","../src/services/testing/embedded-harness.ts","../src/utils/session-event-stream.ts","../src/ui/playwright-runner.ts","../src/services/workflows/resolve-setup-profile.ts","../src/services/project/reducer-contract-preflight.ts","../src/services/project/reducer-bundle-preflight.ts","../src/commands/join.ts","../src/services/join/jsonl-bot-session.ts","../src/commands/login.ts","../src/commands/logout.ts","../src/commands/new.ts","../src/commands/pull.ts","../src/commands/status.ts","../src/commands/sync.ts","../src/commands/test.ts","../src/services/testing/runtime-mode.ts","../src/services/workflows/resolve-latest-compiled-result.ts","../src/cli-main.ts"],"sourcesContent":["//#region node_modules/.pnpm/scule@1.3.0/node_modules/scule/dist/index.mjs\nconst NUMBER_CHAR_RE = /\\d/;\nconst STR_SPLITTERS = [\n\t\"-\",\n\t\"_\",\n\t\"/\",\n\t\".\"\n];\nfunction isUppercase(char = \"\") {\n\tif (NUMBER_CHAR_RE.test(char)) return;\n\treturn char !== char.toLowerCase();\n}\nfunction splitByCase(str, separators) {\n\tconst splitters = separators ?? STR_SPLITTERS;\n\tconst parts = [];\n\tif (!str || typeof str !== \"string\") return parts;\n\tlet buff = \"\";\n\tlet previousUpper;\n\tlet previousSplitter;\n\tfor (const char of str) {\n\t\tconst isSplitter = splitters.includes(char);\n\t\tif (isSplitter === true) {\n\t\t\tparts.push(buff);\n\t\t\tbuff = \"\";\n\t\t\tpreviousUpper = void 0;\n\t\t\tcontinue;\n\t\t}\n\t\tconst isUpper = isUppercase(char);\n\t\tif (previousSplitter === false) {\n\t\t\tif (previousUpper === false && isUpper === true) {\n\t\t\t\tparts.push(buff);\n\t\t\t\tbuff = char;\n\t\t\t\tpreviousUpper = isUpper;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (previousUpper === true && isUpper === false && buff.length > 1) {\n\t\t\t\tconst lastChar = buff.at(-1);\n\t\t\t\tparts.push(buff.slice(0, Math.max(0, buff.length - 1)));\n\t\t\t\tbuff = lastChar + char;\n\t\t\t\tpreviousUpper = isUpper;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tbuff += char;\n\t\tpreviousUpper = isUpper;\n\t\tpreviousSplitter = isSplitter;\n\t}\n\tparts.push(buff);\n\treturn parts;\n}\nfunction upperFirst(str) {\n\treturn str ? str[0].toUpperCase() + str.slice(1) : \"\";\n}\nfunction lowerFirst(str) {\n\treturn str ? str[0].toLowerCase() + str.slice(1) : \"\";\n}\nfunction pascalCase(str, opts) {\n\treturn str ? (Array.isArray(str) ? str : splitByCase(str)).map((p) => upperFirst(opts?.normalize ? p.toLowerCase() : p)).join(\"\") : \"\";\n}\nfunction camelCase(str, opts) {\n\treturn lowerFirst(pascalCase(str || \"\", opts));\n}\nfunction kebabCase(str, joiner) {\n\treturn str ? (Array.isArray(str) ? str : splitByCase(str)).map((p) => p.toLowerCase()).join(joiner ?? \"-\") : \"\";\n}\nfunction snakeCase(str) {\n\treturn kebabCase(str || \"\", \"_\");\n}\n//#endregion\nexport { kebabCase as n, snakeCase as r, camelCase as t };\n","import { n as kebabCase, r as snakeCase, t as camelCase } from \"./_chunks/libs/scule.mjs\";\nimport { parseArgs as parseArgs$1 } from \"node:util\";\n//#region src/_utils.ts\nfunction toArray(val) {\n\tif (Array.isArray(val)) return val;\n\treturn val === void 0 ? [] : [val];\n}\nfunction formatLineColumns(lines, linePrefix = \"\") {\n\tconst maxLength = [];\n\tfor (const line of lines) for (const [i, element] of line.entries()) maxLength[i] = Math.max(maxLength[i] || 0, element.length);\n\treturn lines.map((l) => l.map((c, i) => linePrefix + c[i === 0 ? \"padStart\" : \"padEnd\"](maxLength[i])).join(\" \")).join(\"\\n\");\n}\nfunction resolveValue(input) {\n\treturn typeof input === \"function\" ? input() : input;\n}\nvar CLIError = class extends Error {\n\tcode;\n\tconstructor(message, code) {\n\t\tsuper(message);\n\t\tthis.name = \"CLIError\";\n\t\tthis.code = code;\n\t}\n};\n//#endregion\n//#region src/_parser.ts\nfunction parseRawArgs(args = [], opts = {}) {\n\tconst booleans = new Set(opts.boolean || []);\n\tconst strings = new Set(opts.string || []);\n\tconst aliasMap = opts.alias || {};\n\tconst defaults = opts.default || {};\n\tconst aliasToMain = /* @__PURE__ */ new Map();\n\tconst mainToAliases = /* @__PURE__ */ new Map();\n\tfor (const [key, value] of Object.entries(aliasMap)) {\n\t\tconst targets = value;\n\t\tfor (const target of targets) {\n\t\t\taliasToMain.set(key, target);\n\t\t\tif (!mainToAliases.has(target)) mainToAliases.set(target, []);\n\t\t\tmainToAliases.get(target).push(key);\n\t\t\taliasToMain.set(target, key);\n\t\t\tif (!mainToAliases.has(key)) mainToAliases.set(key, []);\n\t\t\tmainToAliases.get(key).push(target);\n\t\t}\n\t}\n\tconst options = {};\n\tfunction getType(name) {\n\t\tif (booleans.has(name)) return \"boolean\";\n\t\tconst aliases = mainToAliases.get(name) || [];\n\t\tfor (const alias of aliases) if (booleans.has(alias)) return \"boolean\";\n\t\treturn \"string\";\n\t}\n\tfunction isStringType(name) {\n\t\tif (strings.has(name)) return true;\n\t\tconst aliases = mainToAliases.get(name) || [];\n\t\tfor (const alias of aliases) if (strings.has(alias)) return true;\n\t\treturn false;\n\t}\n\tconst allOptions = new Set([\n\t\t...booleans,\n\t\t...strings,\n\t\t...Object.keys(aliasMap),\n\t\t...Object.values(aliasMap).flat(),\n\t\t...Object.keys(defaults)\n\t]);\n\tfor (const name of allOptions) if (!options[name]) options[name] = {\n\t\ttype: getType(name),\n\t\tdefault: defaults[name]\n\t};\n\tfor (const [alias, main] of aliasToMain.entries()) if (alias.length === 1 && options[main] && !options[main].short) options[main].short = alias;\n\tconst processedArgs = [];\n\tconst negatedFlags = {};\n\tfor (let i = 0; i < args.length; i++) {\n\t\tconst arg = args[i];\n\t\tif (arg === \"--\") {\n\t\t\tprocessedArgs.push(...args.slice(i));\n\t\t\tbreak;\n\t\t}\n\t\tif (arg.startsWith(\"--no-\")) {\n\t\t\tconst flagName = arg.slice(5);\n\t\t\tnegatedFlags[flagName] = true;\n\t\t\tcontinue;\n\t\t}\n\t\tprocessedArgs.push(arg);\n\t}\n\tlet parsed;\n\ttry {\n\t\tparsed = parseArgs$1({\n\t\t\targs: processedArgs,\n\t\t\toptions: Object.keys(options).length > 0 ? options : void 0,\n\t\t\tallowPositionals: true,\n\t\t\tstrict: false\n\t\t});\n\t} catch {\n\t\tparsed = {\n\t\t\tvalues: {},\n\t\t\tpositionals: processedArgs\n\t\t};\n\t}\n\tconst out = { _: [] };\n\tout._ = parsed.positionals;\n\tfor (const [key, value] of Object.entries(parsed.values)) {\n\t\tlet coerced = value;\n\t\tif (getType(key) === \"boolean\" && typeof value === \"string\") coerced = value !== \"false\";\n\t\telse if (isStringType(key) && typeof value === \"boolean\") coerced = \"\";\n\t\tout[key] = coerced;\n\t}\n\tfor (const [name] of Object.entries(negatedFlags)) {\n\t\tout[name] = false;\n\t\tconst mainName = aliasToMain.get(name);\n\t\tif (mainName) out[mainName] = false;\n\t\tconst aliases = mainToAliases.get(name);\n\t\tif (aliases) for (const alias of aliases) out[alias] = false;\n\t}\n\tfor (const [alias, main] of aliasToMain.entries()) {\n\t\tif (out[alias] !== void 0 && out[main] === void 0) out[main] = out[alias];\n\t\tif (out[main] !== void 0 && out[alias] === void 0) out[alias] = out[main];\n\t\tif (out[alias] !== out[main] && defaults[main] === out[main]) out[main] = out[alias];\n\t}\n\treturn out;\n}\n//#endregion\n//#region src/_color.ts\nconst noColor = /* @__PURE__ */ (() => {\n\tconst env = globalThis.process?.env ?? {};\n\treturn env.NO_COLOR === \"1\" || env.TERM === \"dumb\" || env.TEST || env.CI;\n})();\nconst _c = (c, r = 39) => (t) => noColor ? t : `\\u001B[${c}m${t}\\u001B[${r}m`;\nconst bold = /* @__PURE__ */ _c(1, 22);\nconst cyan = /* @__PURE__ */ _c(36);\nconst gray = /* @__PURE__ */ _c(90);\nconst underline = /* @__PURE__ */ _c(4, 24);\n//#endregion\n//#region src/args.ts\nfunction parseArgs(rawArgs, argsDef) {\n\tconst parseOptions = {\n\t\tboolean: [],\n\t\tstring: [],\n\t\talias: {},\n\t\tdefault: {}\n\t};\n\tconst args = resolveArgs(argsDef);\n\tfor (const arg of args) {\n\t\tif (arg.type === \"positional\") continue;\n\t\tif (arg.type === \"string\" || arg.type === \"enum\") parseOptions.string.push(arg.name);\n\t\telse if (arg.type === \"boolean\") parseOptions.boolean.push(arg.name);\n\t\tif (arg.default !== void 0) parseOptions.default[arg.name] = arg.default;\n\t\tif (arg.alias) parseOptions.alias[arg.name] = arg.alias;\n\t\tconst camelName = camelCase(arg.name);\n\t\tconst kebabName = kebabCase(arg.name);\n\t\tif (camelName !== arg.name || kebabName !== arg.name) {\n\t\t\tconst existingAliases = toArray(parseOptions.alias[arg.name] || []);\n\t\t\tif (camelName !== arg.name && !existingAliases.includes(camelName)) existingAliases.push(camelName);\n\t\t\tif (kebabName !== arg.name && !existingAliases.includes(kebabName)) existingAliases.push(kebabName);\n\t\t\tif (existingAliases.length > 0) parseOptions.alias[arg.name] = existingAliases;\n\t\t}\n\t}\n\tconst parsed = parseRawArgs(rawArgs, parseOptions);\n\tconst [ ...positionalArguments] = parsed._;\n\tconst parsedArgsProxy = new Proxy(parsed, { get(target, prop) {\n\t\treturn target[prop] ?? target[camelCase(prop)] ?? target[kebabCase(prop)];\n\t} });\n\tfor (const [, arg] of args.entries()) if (arg.type === \"positional\") {\n\t\tconst nextPositionalArgument = positionalArguments.shift();\n\t\tif (nextPositionalArgument !== void 0) parsedArgsProxy[arg.name] = nextPositionalArgument;\n\t\telse if (arg.default === void 0 && arg.required !== false) throw new CLIError(`Missing required positional argument: ${arg.name.toUpperCase()}`, \"EARG\");\n\t\telse parsedArgsProxy[arg.name] = arg.default;\n\t} else if (arg.type === \"enum\") {\n\t\tconst argument = parsedArgsProxy[arg.name];\n\t\tconst options = arg.options || [];\n\t\tif (argument !== void 0 && options.length > 0 && !options.includes(argument)) throw new CLIError(`Invalid value for argument: ${cyan(`--${arg.name}`)} (${cyan(argument)}). Expected one of: ${options.map((o) => cyan(o)).join(\", \")}.`, \"EARG\");\n\t} else if (arg.required && parsedArgsProxy[arg.name] === void 0) throw new CLIError(`Missing required argument: --${arg.name}`, \"EARG\");\n\treturn parsedArgsProxy;\n}\nfunction resolveArgs(argsDef) {\n\tconst args = [];\n\tfor (const [name, argDef] of Object.entries(argsDef || {})) args.push({\n\t\t...argDef,\n\t\tname,\n\t\talias: toArray(argDef.alias)\n\t});\n\treturn args;\n}\n//#endregion\n//#region src/plugin.ts\nfunction defineCittyPlugin(plugin) {\n\treturn plugin;\n}\nasync function resolvePlugins(plugins) {\n\treturn Promise.all(plugins.map((p) => resolveValue(p)));\n}\n//#endregion\n//#region src/command.ts\nfunction defineCommand(def) {\n\treturn def;\n}\nasync function runCommand(cmd, opts) {\n\tconst cmdArgs = await resolveValue(cmd.args || {});\n\tconst parsedArgs = parseArgs(opts.rawArgs, cmdArgs);\n\tconst context = {\n\t\trawArgs: opts.rawArgs,\n\t\targs: parsedArgs,\n\t\tdata: opts.data,\n\t\tcmd\n\t};\n\tconst plugins = await resolvePlugins(cmd.plugins ?? []);\n\tlet result;\n\tlet runError;\n\ttry {\n\t\tfor (const plugin of plugins) await plugin.setup?.(context);\n\t\tif (typeof cmd.setup === \"function\") await cmd.setup(context);\n\t\tconst subCommands = await resolveValue(cmd.subCommands);\n\t\tif (subCommands && Object.keys(subCommands).length > 0) {\n\t\t\tconst subCommandArgIndex = findSubCommandIndex(opts.rawArgs, cmdArgs);\n\t\t\tconst explicitName = opts.rawArgs[subCommandArgIndex];\n\t\t\tif (explicitName) {\n\t\t\t\tconst subCommand = await _findSubCommand(subCommands, explicitName);\n\t\t\t\tif (!subCommand) throw new CLIError(`Unknown command ${cyan(explicitName)}`, \"E_UNKNOWN_COMMAND\");\n\t\t\t\tawait runCommand(subCommand, { rawArgs: opts.rawArgs.slice(subCommandArgIndex + 1) });\n\t\t\t} else {\n\t\t\t\tconst defaultSubCommand = await resolveValue(cmd.default);\n\t\t\t\tif (defaultSubCommand) {\n\t\t\t\t\tif (cmd.run) throw new CLIError(`Cannot specify both 'run' and 'default' on the same command.`, \"E_DEFAULT_CONFLICT\");\n\t\t\t\t\tconst subCommand = await _findSubCommand(subCommands, defaultSubCommand);\n\t\t\t\t\tif (!subCommand) throw new CLIError(`Default sub command ${cyan(defaultSubCommand)} not found in subCommands.`, \"E_UNKNOWN_COMMAND\");\n\t\t\t\t\tawait runCommand(subCommand, { rawArgs: opts.rawArgs });\n\t\t\t\t} else if (!cmd.run) throw new CLIError(`No command specified.`, \"E_NO_COMMAND\");\n\t\t\t}\n\t\t}\n\t\tif (typeof cmd.run === \"function\") result = await cmd.run(context);\n\t} catch (error) {\n\t\trunError = error;\n\t}\n\tconst cleanupErrors = [];\n\tif (typeof cmd.cleanup === \"function\") try {\n\t\tawait cmd.cleanup(context);\n\t} catch (error) {\n\t\tcleanupErrors.push(error);\n\t}\n\tfor (const plugin of [...plugins].reverse()) try {\n\t\tawait plugin.cleanup?.(context);\n\t} catch (error) {\n\t\tcleanupErrors.push(error);\n\t}\n\tif (runError) throw runError;\n\tif (cleanupErrors.length === 1) throw cleanupErrors[0];\n\tif (cleanupErrors.length > 1) throw new Error(\"Multiple cleanup errors\", { cause: cleanupErrors });\n\treturn { result };\n}\nasync function resolveSubCommand(cmd, rawArgs, parent) {\n\tconst subCommands = await resolveValue(cmd.subCommands);\n\tif (subCommands && Object.keys(subCommands).length > 0) {\n\t\tconst subCommandArgIndex = findSubCommandIndex(rawArgs, await resolveValue(cmd.args || {}));\n\t\tconst subCommandName = rawArgs[subCommandArgIndex];\n\t\tconst subCommand = await _findSubCommand(subCommands, subCommandName);\n\t\tif (subCommand) return resolveSubCommand(subCommand, rawArgs.slice(subCommandArgIndex + 1), cmd);\n\t}\n\treturn [cmd, parent];\n}\nasync function _findSubCommand(subCommands, name) {\n\tif (name in subCommands) return resolveValue(subCommands[name]);\n\tfor (const sub of Object.values(subCommands)) {\n\t\tconst resolved = await resolveValue(sub);\n\t\tconst meta = await resolveValue(resolved?.meta);\n\t\tif (meta?.alias) {\n\t\t\tif (toArray(meta.alias).includes(name)) return resolved;\n\t\t}\n\t}\n}\nfunction findSubCommandIndex(rawArgs, argsDef) {\n\tfor (let i = 0; i < rawArgs.length; i++) {\n\t\tconst arg = rawArgs[i];\n\t\tif (arg === \"--\") return -1;\n\t\tif (arg.startsWith(\"-\")) {\n\t\t\tif (!arg.includes(\"=\") && _isValueFlag(arg, argsDef)) i++;\n\t\t\tcontinue;\n\t\t}\n\t\treturn i;\n\t}\n\treturn -1;\n}\nfunction _isValueFlag(flag, argsDef) {\n\tconst name = flag.replace(/^-{1,2}/, \"\");\n\tconst normalized = camelCase(name);\n\tfor (const [key, def] of Object.entries(argsDef)) {\n\t\tif (def.type !== \"string\" && def.type !== \"enum\") continue;\n\t\tif (normalized === camelCase(key)) return true;\n\t\tif ((Array.isArray(def.alias) ? def.alias : def.alias ? [def.alias] : []).includes(name)) return true;\n\t}\n\treturn false;\n}\n//#endregion\n//#region src/usage.ts\nasync function showUsage(cmd, parent) {\n\ttry {\n\t\tconsole.log(await renderUsage(cmd, parent) + \"\\n\");\n\t} catch (error) {\n\t\tconsole.error(error);\n\t}\n}\nconst negativePrefixRe = /^no[-A-Z]/;\nasync function renderUsage(cmd, parent) {\n\tconst cmdMeta = await resolveValue(cmd.meta || {});\n\tconst cmdArgs = resolveArgs(await resolveValue(cmd.args || {}));\n\tconst parentMeta = await resolveValue(parent?.meta || {});\n\tconst commandName = `${parentMeta.name ? `${parentMeta.name} ` : \"\"}` + (cmdMeta.name || process.argv[1]);\n\tconst argLines = [];\n\tconst posLines = [];\n\tconst commandsLines = [];\n\tconst usageLine = [];\n\tfor (const arg of cmdArgs) if (arg.type === \"positional\") {\n\t\tconst name = arg.name.toUpperCase();\n\t\tconst isRequired = arg.required !== false && arg.default === void 0;\n\t\tposLines.push([cyan(name + renderValueHint(arg)), renderDescription(arg, isRequired)]);\n\t\tusageLine.push(isRequired ? `<${name}>` : `[${name}]`);\n\t} else {\n\t\tconst isRequired = arg.required === true && arg.default === void 0;\n\t\tconst argStr = [...(arg.alias || []).map((a) => `-${a}`), `--${arg.name}`].join(\", \") + renderValueHint(arg);\n\t\targLines.push([cyan(argStr), renderDescription(arg, isRequired)]);\n\t\t/**\n\t\t* print negative boolean arg variant usage when\n\t\t* - enabled by default or has `negativeDescription`\n\t\t* - not prefixed with `no-` or `no[A-Z]`\n\t\t*/\n\t\tif (arg.type === \"boolean\" && (arg.default === true || arg.negativeDescription) && !negativePrefixRe.test(arg.name)) {\n\t\t\tconst negativeArgStr = [...(arg.alias || []).map((a) => `--no-${a}`), `--no-${arg.name}`].join(\", \");\n\t\t\targLines.push([cyan(negativeArgStr), [arg.negativeDescription, isRequired ? gray(\"(Required)\") : \"\"].filter(Boolean).join(\" \")]);\n\t\t}\n\t\tif (isRequired) usageLine.push(`--${arg.name}` + renderValueHint(arg));\n\t}\n\tif (cmd.subCommands) {\n\t\tconst commandNames = [];\n\t\tconst subCommands = await resolveValue(cmd.subCommands);\n\t\tfor (const [name, sub] of Object.entries(subCommands)) {\n\t\t\tconst meta = await resolveValue((await resolveValue(sub))?.meta);\n\t\t\tif (meta?.hidden) continue;\n\t\t\tconst aliases = toArray(meta?.alias);\n\t\t\tconst label = [name, ...aliases].join(\", \");\n\t\t\tcommandsLines.push([cyan(label), meta?.description || \"\"]);\n\t\t\tcommandNames.push(name, ...aliases);\n\t\t}\n\t\tusageLine.push(commandNames.join(\"|\"));\n\t}\n\tconst usageLines = [];\n\tconst version = cmdMeta.version || parentMeta.version;\n\tusageLines.push(gray(`${cmdMeta.description} (${commandName + (version ? ` v${version}` : \"\")})`), \"\");\n\tconst hasOptions = argLines.length > 0 || posLines.length > 0;\n\tusageLines.push(`${underline(bold(\"USAGE\"))} ${cyan(`${commandName}${hasOptions ? \" [OPTIONS]\" : \"\"} ${usageLine.join(\" \")}`)}`, \"\");\n\tif (posLines.length > 0) {\n\t\tusageLines.push(underline(bold(\"ARGUMENTS\")), \"\");\n\t\tusageLines.push(formatLineColumns(posLines, \" \"));\n\t\tusageLines.push(\"\");\n\t}\n\tif (argLines.length > 0) {\n\t\tusageLines.push(underline(bold(\"OPTIONS\")), \"\");\n\t\tusageLines.push(formatLineColumns(argLines, \" \"));\n\t\tusageLines.push(\"\");\n\t}\n\tif (commandsLines.length > 0) {\n\t\tusageLines.push(underline(bold(\"COMMANDS\")), \"\");\n\t\tusageLines.push(formatLineColumns(commandsLines, \" \"));\n\t\tusageLines.push(\"\", `Use ${cyan(`${commandName} <command> --help`)} for more information about a command.`);\n\t}\n\treturn usageLines.filter((l) => typeof l === \"string\").join(\"\\n\");\n}\nfunction renderValueHint(arg) {\n\tconst valueHint = arg.valueHint ? `=<${arg.valueHint}>` : \"\";\n\tconst fallbackValueHint = valueHint || `=<${snakeCase(arg.name)}>`;\n\tif (!arg.type || arg.type === \"positional\" || arg.type === \"boolean\") return valueHint;\n\tif (arg.type === \"enum\" && arg.options?.length) return `=<${arg.options.join(\"|\")}>`;\n\treturn fallbackValueHint;\n}\nfunction renderDescription(arg, required) {\n\tconst requiredHint = required ? gray(\"(Required)\") : \"\";\n\tconst defaultHint = arg.default === void 0 ? \"\" : gray(`(Default: ${arg.default})`);\n\treturn [\n\t\targ.description,\n\t\trequiredHint,\n\t\tdefaultHint\n\t].filter(Boolean).join(\" \");\n}\n//#endregion\n//#region src/main.ts\nasync function runMain(cmd, opts = {}) {\n\tconst rawArgs = opts.rawArgs || process.argv.slice(2);\n\tconst showUsage$1 = opts.showUsage || showUsage;\n\ttry {\n\t\tconst builtinFlags = await _resolveBuiltinFlags(cmd);\n\t\tif (builtinFlags.help.length > 0 && rawArgs.some((arg) => builtinFlags.help.includes(arg))) {\n\t\t\tawait showUsage$1(...await resolveSubCommand(cmd, rawArgs));\n\t\t\tprocess.exit(0);\n\t\t} else if (rawArgs.length === 1 && builtinFlags.version.includes(rawArgs[0])) {\n\t\t\tconst meta = typeof cmd.meta === \"function\" ? await cmd.meta() : await cmd.meta;\n\t\t\tif (!meta?.version) throw new CLIError(\"No version specified\", \"E_NO_VERSION\");\n\t\t\tconsole.log(meta.version);\n\t\t} else await runCommand(cmd, { rawArgs });\n\t} catch (error) {\n\t\tif (error instanceof CLIError) {\n\t\t\tawait showUsage$1(...await resolveSubCommand(cmd, rawArgs));\n\t\t\tconsole.error(error.message);\n\t\t} else console.error(error, \"\\n\");\n\t\tprocess.exit(1);\n\t}\n}\nfunction createMain(cmd) {\n\treturn (opts = {}) => runMain(cmd, opts);\n}\nasync function _resolveBuiltinFlags(cmd) {\n\tconst argsDef = await resolveValue(cmd.args || {});\n\tconst userNames = /* @__PURE__ */ new Set();\n\tconst userAliases = /* @__PURE__ */ new Set();\n\tfor (const [name, def] of Object.entries(argsDef)) {\n\t\tuserNames.add(name);\n\t\tfor (const alias of toArray(def.alias)) userAliases.add(alias);\n\t}\n\treturn {\n\t\thelp: _getBuiltinFlags(\"help\", \"h\", userNames, userAliases),\n\t\tversion: _getBuiltinFlags(\"version\", \"v\", userNames, userAliases)\n\t};\n}\nfunction _getBuiltinFlags(long, short, userNames, userAliases) {\n\tif (userNames.has(long) || userAliases.has(long)) return [];\n\tif (userNames.has(short) || userAliases.has(short)) return [`--${long}`];\n\treturn [`--${long}`, `-${short}`];\n}\n//#endregion\nexport { createMain, defineCittyPlugin, defineCommand, parseArgs, renderUsage, runCommand, runMain, showUsage };\n","const LogLevels = {\n silent: Number.NEGATIVE_INFINITY,\n fatal: 0,\n error: 0,\n warn: 1,\n log: 2,\n info: 3,\n success: 3,\n fail: 3,\n ready: 3,\n start: 3,\n box: 3,\n debug: 4,\n trace: 5,\n verbose: Number.POSITIVE_INFINITY\n};\nconst LogTypes = {\n // Silent\n silent: {\n level: -1\n },\n // Level 0\n fatal: {\n level: LogLevels.fatal\n },\n error: {\n level: LogLevels.error\n },\n // Level 1\n warn: {\n level: LogLevels.warn\n },\n // Level 2\n log: {\n level: LogLevels.log\n },\n // Level 3\n info: {\n level: LogLevels.info\n },\n success: {\n level: LogLevels.success\n },\n fail: {\n level: LogLevels.fail\n },\n ready: {\n level: LogLevels.info\n },\n start: {\n level: LogLevels.info\n },\n box: {\n level: LogLevels.info\n },\n // Level 4\n debug: {\n level: LogLevels.debug\n },\n // Level 5\n trace: {\n level: LogLevels.trace\n },\n // Verbose\n verbose: {\n level: LogLevels.verbose\n }\n};\n\nfunction isPlainObject$1(value) {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n const prototype = Object.getPrototypeOf(value);\n if (prototype !== null && prototype !== Object.prototype && Object.getPrototypeOf(prototype) !== null) {\n return false;\n }\n if (Symbol.iterator in value) {\n return false;\n }\n if (Symbol.toStringTag in value) {\n return Object.prototype.toString.call(value) === \"[object Module]\";\n }\n return true;\n}\n\nfunction _defu(baseObject, defaults, namespace = \".\", merger) {\n if (!isPlainObject$1(defaults)) {\n return _defu(baseObject, {}, namespace, merger);\n }\n const object = Object.assign({}, defaults);\n for (const key in baseObject) {\n if (key === \"__proto__\" || key === \"constructor\") {\n continue;\n }\n const value = baseObject[key];\n if (value === null || value === void 0) {\n continue;\n }\n if (merger && merger(object, key, value, namespace)) {\n continue;\n }\n if (Array.isArray(value) && Array.isArray(object[key])) {\n object[key] = [...value, ...object[key]];\n } else if (isPlainObject$1(value) && isPlainObject$1(object[key])) {\n object[key] = _defu(\n value,\n object[key],\n (namespace ? `${namespace}.` : \"\") + key.toString(),\n merger\n );\n } else {\n object[key] = value;\n }\n }\n return object;\n}\nfunction createDefu(merger) {\n return (...arguments_) => (\n // eslint-disable-next-line unicorn/no-array-reduce\n arguments_.reduce((p, c) => _defu(p, c, \"\", merger), {})\n );\n}\nconst defu = createDefu();\n\nfunction isPlainObject(obj) {\n return Object.prototype.toString.call(obj) === \"[object Object]\";\n}\nfunction isLogObj(arg) {\n if (!isPlainObject(arg)) {\n return false;\n }\n if (!arg.message && !arg.args) {\n return false;\n }\n if (arg.stack) {\n return false;\n }\n return true;\n}\n\nlet paused = false;\nconst queue = [];\nclass Consola {\n options;\n _lastLog;\n _mockFn;\n /**\n * Creates an instance of Consola with specified options or defaults.\n *\n * @param {Partial<ConsolaOptions>} [options={}] - Configuration options for the Consola instance.\n */\n constructor(options = {}) {\n const types = options.types || LogTypes;\n this.options = defu(\n {\n ...options,\n defaults: { ...options.defaults },\n level: _normalizeLogLevel(options.level, types),\n reporters: [...options.reporters || []]\n },\n {\n types: LogTypes,\n throttle: 1e3,\n throttleMin: 5,\n formatOptions: {\n date: true,\n colors: false,\n compact: true\n }\n }\n );\n for (const type in types) {\n const defaults = {\n type,\n ...this.options.defaults,\n ...types[type]\n };\n this[type] = this._wrapLogFn(defaults);\n this[type].raw = this._wrapLogFn(\n defaults,\n true\n );\n }\n if (this.options.mockFn) {\n this.mockTypes();\n }\n this._lastLog = {};\n }\n /**\n * Gets the current log level of the Consola instance.\n *\n * @returns {number} The current log level.\n */\n get level() {\n return this.options.level;\n }\n /**\n * Sets the minimum log level that will be output by the instance.\n *\n * @param {number} level - The new log level to set.\n */\n set level(level) {\n this.options.level = _normalizeLogLevel(\n level,\n this.options.types,\n this.options.level\n );\n }\n /**\n * Displays a prompt to the user and returns the response.\n * Throw an error if `prompt` is not supported by the current configuration.\n *\n * @template T\n * @param {string} message - The message to display in the prompt.\n * @param {T} [opts] - Optional options for the prompt. See {@link PromptOptions}.\n * @returns {promise<T>} A promise that infer with the prompt options. See {@link PromptOptions}.\n */\n prompt(message, opts) {\n if (!this.options.prompt) {\n throw new Error(\"prompt is not supported!\");\n }\n return this.options.prompt(message, opts);\n }\n /**\n * Creates a new instance of Consola, inheriting options from the current instance, with possible overrides.\n *\n * @param {Partial<ConsolaOptions>} options - Optional overrides for the new instance. See {@link ConsolaOptions}.\n * @returns {ConsolaInstance} A new Consola instance. See {@link ConsolaInstance}.\n */\n create(options) {\n const instance = new Consola({\n ...this.options,\n ...options\n });\n if (this._mockFn) {\n instance.mockTypes(this._mockFn);\n }\n return instance;\n }\n /**\n * Creates a new Consola instance with the specified default log object properties.\n *\n * @param {InputLogObject} defaults - Default properties to include in any log from the new instance. See {@link InputLogObject}.\n * @returns {ConsolaInstance} A new Consola instance. See {@link ConsolaInstance}.\n */\n withDefaults(defaults) {\n return this.create({\n ...this.options,\n defaults: {\n ...this.options.defaults,\n ...defaults\n }\n });\n }\n /**\n * Creates a new Consola instance with a specified tag, which will be included in every log.\n *\n * @param {string} tag - The tag to include in each log of the new instance.\n * @returns {ConsolaInstance} A new Consola instance. See {@link ConsolaInstance}.\n */\n withTag(tag) {\n return this.withDefaults({\n tag: this.options.defaults.tag ? this.options.defaults.tag + \":\" + tag : tag\n });\n }\n /**\n * Adds a custom reporter to the Consola instance.\n * Reporters will be called for each log message, depending on their implementation and log level.\n *\n * @param {ConsolaReporter} reporter - The reporter to add. See {@link ConsolaReporter}.\n * @returns {Consola} The current Consola instance.\n */\n addReporter(reporter) {\n this.options.reporters.push(reporter);\n return this;\n }\n /**\n * Removes a custom reporter from the Consola instance.\n * If no reporter is specified, all reporters will be removed.\n *\n * @param {ConsolaReporter} reporter - The reporter to remove. See {@link ConsolaReporter}.\n * @returns {Consola} The current Consola instance.\n */\n removeReporter(reporter) {\n if (reporter) {\n const i = this.options.reporters.indexOf(reporter);\n if (i !== -1) {\n return this.options.reporters.splice(i, 1);\n }\n } else {\n this.options.reporters.splice(0);\n }\n return this;\n }\n /**\n * Replaces all reporters of the Consola instance with the specified array of reporters.\n *\n * @param {ConsolaReporter[]} reporters - The new reporters to set. See {@link ConsolaReporter}.\n * @returns {Consola} The current Consola instance.\n */\n setReporters(reporters) {\n this.options.reporters = Array.isArray(reporters) ? reporters : [reporters];\n return this;\n }\n wrapAll() {\n this.wrapConsole();\n this.wrapStd();\n }\n restoreAll() {\n this.restoreConsole();\n this.restoreStd();\n }\n /**\n * Overrides console methods with Consola logging methods for consistent logging.\n */\n wrapConsole() {\n for (const type in this.options.types) {\n if (!console[\"__\" + type]) {\n console[\"__\" + type] = console[type];\n }\n console[type] = this[type].raw;\n }\n }\n /**\n * Restores the original console methods, removing Consola overrides.\n */\n restoreConsole() {\n for (const type in this.options.types) {\n if (console[\"__\" + type]) {\n console[type] = console[\"__\" + type];\n delete console[\"__\" + type];\n }\n }\n }\n /**\n * Overrides standard output and error streams to redirect them through Consola.\n */\n wrapStd() {\n this._wrapStream(this.options.stdout, \"log\");\n this._wrapStream(this.options.stderr, \"log\");\n }\n _wrapStream(stream, type) {\n if (!stream) {\n return;\n }\n if (!stream.__write) {\n stream.__write = stream.write;\n }\n stream.write = (data) => {\n this[type].raw(String(data).trim());\n };\n }\n /**\n * Restores the original standard output and error streams, removing the Consola redirection.\n */\n restoreStd() {\n this._restoreStream(this.options.stdout);\n this._restoreStream(this.options.stderr);\n }\n _restoreStream(stream) {\n if (!stream) {\n return;\n }\n if (stream.__write) {\n stream.write = stream.__write;\n delete stream.__write;\n }\n }\n /**\n * Pauses logging, queues incoming logs until resumed.\n */\n pauseLogs() {\n paused = true;\n }\n /**\n * Resumes logging, processing any queued logs.\n */\n resumeLogs() {\n paused = false;\n const _queue = queue.splice(0);\n for (const item of _queue) {\n item[0]._logFn(item[1], item[2]);\n }\n }\n /**\n * Replaces logging methods with mocks if a mock function is provided.\n *\n * @param {ConsolaOptions[\"mockFn\"]} mockFn - The function to use for mocking logging methods. See {@link ConsolaOptions[\"mockFn\"]}.\n */\n mockTypes(mockFn) {\n const _mockFn = mockFn || this.options.mockFn;\n this._mockFn = _mockFn;\n if (typeof _mockFn !== \"function\") {\n return;\n }\n for (const type in this.options.types) {\n this[type] = _mockFn(type, this.options.types[type]) || this[type];\n this[type].raw = this[type];\n }\n }\n _wrapLogFn(defaults, isRaw) {\n return (...args) => {\n if (paused) {\n queue.push([this, defaults, args, isRaw]);\n return;\n }\n return this._logFn(defaults, args, isRaw);\n };\n }\n _logFn(defaults, args, isRaw) {\n if ((defaults.level || 0) > this.level) {\n return false;\n }\n const logObj = {\n date: /* @__PURE__ */ new Date(),\n args: [],\n ...defaults,\n level: _normalizeLogLevel(defaults.level, this.options.types)\n };\n if (!isRaw && args.length === 1 && isLogObj(args[0])) {\n Object.assign(logObj, args[0]);\n } else {\n logObj.args = [...args];\n }\n if (logObj.message) {\n logObj.args.unshift(logObj.message);\n delete logObj.message;\n }\n if (logObj.additional) {\n if (!Array.isArray(logObj.additional)) {\n logObj.additional = logObj.additional.split(\"\\n\");\n }\n logObj.args.push(\"\\n\" + logObj.additional.join(\"\\n\"));\n delete logObj.additional;\n }\n logObj.type = typeof logObj.type === \"string\" ? logObj.type.toLowerCase() : \"log\";\n logObj.tag = typeof logObj.tag === \"string\" ? logObj.tag : \"\";\n const resolveLog = (newLog = false) => {\n const repeated = (this._lastLog.count || 0) - this.options.throttleMin;\n if (this._lastLog.object && repeated > 0) {\n const args2 = [...this._lastLog.object.args];\n if (repeated > 1) {\n args2.push(`(repeated ${repeated} times)`);\n }\n this._log({ ...this._lastLog.object, args: args2 });\n this._lastLog.count = 1;\n }\n if (newLog) {\n this._lastLog.object = logObj;\n this._log(logObj);\n }\n };\n clearTimeout(this._lastLog.timeout);\n const diffTime = this._lastLog.time && logObj.date ? logObj.date.getTime() - this._lastLog.time.getTime() : 0;\n this._lastLog.time = logObj.date;\n if (diffTime < this.options.throttle) {\n try {\n const serializedLog = JSON.stringify([\n logObj.type,\n logObj.tag,\n logObj.args\n ]);\n const isSameLog = this._lastLog.serialized === serializedLog;\n this._lastLog.serialized = serializedLog;\n if (isSameLog) {\n this._lastLog.count = (this._lastLog.count || 0) + 1;\n if (this._lastLog.count > this.options.throttleMin) {\n this._lastLog.timeout = setTimeout(\n resolveLog,\n this.options.throttle\n );\n return;\n }\n }\n } catch {\n }\n }\n resolveLog(true);\n }\n _log(logObj) {\n for (const reporter of this.options.reporters) {\n reporter.log(logObj, {\n options: this.options\n });\n }\n }\n}\nfunction _normalizeLogLevel(input, types = {}, defaultLevel = 3) {\n if (input === void 0) {\n return defaultLevel;\n }\n if (typeof input === \"number\") {\n return input;\n }\n if (types[input] && types[input].level !== void 0) {\n return types[input].level;\n }\n return defaultLevel;\n}\nConsola.prototype.add = Consola.prototype.addReporter;\nConsola.prototype.remove = Consola.prototype.removeReporter;\nConsola.prototype.clear = Consola.prototype.removeReporter;\nConsola.prototype.withScope = Consola.prototype.withTag;\nConsola.prototype.mock = Consola.prototype.mockTypes;\nConsola.prototype.pause = Consola.prototype.pauseLogs;\nConsola.prototype.resume = Consola.prototype.resumeLogs;\nfunction createConsola(options = {}) {\n return new Consola(options);\n}\n\nexport { Consola, LogLevels, LogTypes, createConsola };\n","import { formatWithOptions } from 'node:util';\nimport { sep } from 'node:path';\n\nfunction parseStack(stack, message) {\n const cwd = process.cwd() + sep;\n const lines = stack.split(\"\\n\").splice(message.split(\"\\n\").length).map((l) => l.trim().replace(\"file://\", \"\").replace(cwd, \"\"));\n return lines;\n}\n\nfunction writeStream(data, stream) {\n const write = stream.__write || stream.write;\n return write.call(stream, data);\n}\n\nconst bracket = (x) => x ? `[${x}]` : \"\";\nclass BasicReporter {\n formatStack(stack, message, opts) {\n const indent = \" \".repeat((opts?.errorLevel || 0) + 1);\n return indent + parseStack(stack, message).join(`\n${indent}`);\n }\n formatError(err, opts) {\n const message = err.message ?? formatWithOptions(opts, err);\n const stack = err.stack ? this.formatStack(err.stack, message, opts) : \"\";\n const level = opts?.errorLevel || 0;\n const causedPrefix = level > 0 ? `${\" \".repeat(level)}[cause]: ` : \"\";\n const causedError = err.cause ? \"\\n\\n\" + this.formatError(err.cause, { ...opts, errorLevel: level + 1 }) : \"\";\n return causedPrefix + message + \"\\n\" + stack + causedError;\n }\n formatArgs(args, opts) {\n const _args = args.map((arg) => {\n if (arg && typeof arg.stack === \"string\") {\n return this.formatError(arg, opts);\n }\n return arg;\n });\n return formatWithOptions(opts, ..._args);\n }\n formatDate(date, opts) {\n return opts.date ? date.toLocaleTimeString() : \"\";\n }\n filterAndJoin(arr) {\n return arr.filter(Boolean).join(\" \");\n }\n formatLogObj(logObj, opts) {\n const message = this.formatArgs(logObj.args, opts);\n if (logObj.type === \"box\") {\n return \"\\n\" + [\n bracket(logObj.tag),\n logObj.title && logObj.title,\n ...message.split(\"\\n\")\n ].filter(Boolean).map((l) => \" > \" + l).join(\"\\n\") + \"\\n\";\n }\n return this.filterAndJoin([\n bracket(logObj.type),\n bracket(logObj.tag),\n message\n ]);\n }\n log(logObj, ctx) {\n const line = this.formatLogObj(logObj, {\n columns: ctx.options.stdout.columns || 0,\n ...ctx.options.formatOptions\n });\n return writeStream(\n line + \"\\n\",\n logObj.level < 2 ? ctx.options.stderr || process.stderr : ctx.options.stdout || process.stdout\n );\n }\n}\n\nexport { BasicReporter as B, parseStack as p };\n","import { createConsola as createConsola$1, LogLevels } from './core.mjs';\nexport { Consola, LogTypes } from './core.mjs';\nimport { B as BasicReporter, p as parseStack } from './shared/consola.DRwqZj3T.mjs';\nimport g$1 from 'node:process';\nimport { e as colors, d as box, s as stripAnsi$1 } from './shared/consola.DXBYu-KD.mjs';\nimport 'node:util';\nimport 'node:path';\nimport 'node:tty';\n\nconst r=Object.create(null),i=e=>globalThis.process?.env||import.meta.env||globalThis.Deno?.env.toObject()||globalThis.__env__||(e?r:globalThis),o=new Proxy(r,{get(e,s){return i()[s]??r[s]},has(e,s){const E=i();return s in E||s in r},set(e,s,E){const B=i(true);return B[s]=E,true},deleteProperty(e,s){if(!s)return false;const E=i(true);return delete E[s],true},ownKeys(){const e=i(true);return Object.keys(e)}}),t=typeof process<\"u\"&&process.env&&process.env.NODE_ENV||\"\",f=[[\"APPVEYOR\"],[\"AWS_AMPLIFY\",\"AWS_APP_ID\",{ci:true}],[\"AZURE_PIPELINES\",\"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI\"],[\"AZURE_STATIC\",\"INPUT_AZURE_STATIC_WEB_APPS_API_TOKEN\"],[\"APPCIRCLE\",\"AC_APPCIRCLE\"],[\"BAMBOO\",\"bamboo_planKey\"],[\"BITBUCKET\",\"BITBUCKET_COMMIT\"],[\"BITRISE\",\"BITRISE_IO\"],[\"BUDDY\",\"BUDDY_WORKSPACE_ID\"],[\"BUILDKITE\"],[\"CIRCLE\",\"CIRCLECI\"],[\"CIRRUS\",\"CIRRUS_CI\"],[\"CLOUDFLARE_PAGES\",\"CF_PAGES\",{ci:true}],[\"CODEBUILD\",\"CODEBUILD_BUILD_ARN\"],[\"CODEFRESH\",\"CF_BUILD_ID\"],[\"DRONE\"],[\"DRONE\",\"DRONE_BUILD_EVENT\"],[\"DSARI\"],[\"GITHUB_ACTIONS\"],[\"GITLAB\",\"GITLAB_CI\"],[\"GITLAB\",\"CI_MERGE_REQUEST_ID\"],[\"GOCD\",\"GO_PIPELINE_LABEL\"],[\"LAYERCI\"],[\"HUDSON\",\"HUDSON_URL\"],[\"JENKINS\",\"JENKINS_URL\"],[\"MAGNUM\"],[\"NETLIFY\"],[\"NETLIFY\",\"NETLIFY_LOCAL\",{ci:false}],[\"NEVERCODE\"],[\"RENDER\"],[\"SAIL\",\"SAILCI\"],[\"SEMAPHORE\"],[\"SCREWDRIVER\"],[\"SHIPPABLE\"],[\"SOLANO\",\"TDDIUM\"],[\"STRIDER\"],[\"TEAMCITY\",\"TEAMCITY_VERSION\"],[\"TRAVIS\"],[\"VERCEL\",\"NOW_BUILDER\"],[\"VERCEL\",\"VERCEL\",{ci:false}],[\"VERCEL\",\"VERCEL_ENV\",{ci:false}],[\"APPCENTER\",\"APPCENTER_BUILD_ID\"],[\"CODESANDBOX\",\"CODESANDBOX_SSE\",{ci:false}],[\"CODESANDBOX\",\"CODESANDBOX_HOST\",{ci:false}],[\"STACKBLITZ\"],[\"STORMKIT\"],[\"CLEAVR\"],[\"ZEABUR\"],[\"CODESPHERE\",\"CODESPHERE_APP_ID\",{ci:true}],[\"RAILWAY\",\"RAILWAY_PROJECT_ID\"],[\"RAILWAY\",\"RAILWAY_SERVICE_ID\"],[\"DENO-DEPLOY\",\"DENO_DEPLOYMENT_ID\"],[\"FIREBASE_APP_HOSTING\",\"FIREBASE_APP_HOSTING\",{ci:true}]];function b(){if(globalThis.process?.env)for(const e of f){const s=e[1]||e[0];if(globalThis.process?.env[s])return {name:e[0].toLowerCase(),...e[2]}}return globalThis.process?.env?.SHELL===\"/bin/jsh\"&&globalThis.process?.versions?.webcontainer?{name:\"stackblitz\",ci:false}:{name:\"\",ci:false}}const l=b();l.name;function n(e){return e?e!==\"false\":false}const I=globalThis.process?.platform||\"\",T=n(o.CI)||l.ci!==false,a=n(globalThis.process?.stdout&&globalThis.process?.stdout.isTTY),g=n(o.DEBUG),R=t===\"test\"||n(o.TEST);n(o.MINIMAL)||T||R||!a;const A=/^win/i.test(I);!n(o.NO_COLOR)&&(n(o.FORCE_COLOR)||(a||A)&&o.TERM!==\"dumb\"||T);const C=(globalThis.process?.versions?.node||\"\").replace(/^v/,\"\")||null;Number(C?.split(\".\")[0])||null;const y=globalThis.process||Object.create(null),_={versions:{}};new Proxy(y,{get(e,s){if(s===\"env\")return o;if(s in e)return e[s];if(s in _)return _[s]}});const c=globalThis.process?.release?.name===\"node\",O=!!globalThis.Bun||!!globalThis.process?.versions?.bun,D=!!globalThis.Deno,L=!!globalThis.fastly,S=!!globalThis.Netlify,u=!!globalThis.EdgeRuntime,N=globalThis.navigator?.userAgent===\"Cloudflare-Workers\",F=[[S,\"netlify\"],[u,\"edge-light\"],[N,\"workerd\"],[L,\"fastly\"],[D,\"deno\"],[O,\"bun\"],[c,\"node\"]];function G(){const e=F.find(s=>s[0]);if(e)return {name:e[1]}}const P=G();P?.name||\"\";\n\nfunction ansiRegex({onlyFirst = false} = {}) {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = '(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)';\n\tconst pattern = [\n\t\t`[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?${ST})`,\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]))',\n\t].join('|');\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n\nconst regex = ansiRegex();\n\nfunction stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n\n// Generated code.\n\nfunction isAmbiguous(x) {\n\treturn x === 0xA1\n\t\t|| x === 0xA4\n\t\t|| x === 0xA7\n\t\t|| x === 0xA8\n\t\t|| x === 0xAA\n\t\t|| x === 0xAD\n\t\t|| x === 0xAE\n\t\t|| x >= 0xB0 && x <= 0xB4\n\t\t|| x >= 0xB6 && x <= 0xBA\n\t\t|| x >= 0xBC && x <= 0xBF\n\t\t|| x === 0xC6\n\t\t|| x === 0xD0\n\t\t|| x === 0xD7\n\t\t|| x === 0xD8\n\t\t|| x >= 0xDE && x <= 0xE1\n\t\t|| x === 0xE6\n\t\t|| x >= 0xE8 && x <= 0xEA\n\t\t|| x === 0xEC\n\t\t|| x === 0xED\n\t\t|| x === 0xF0\n\t\t|| x === 0xF2\n\t\t|| x === 0xF3\n\t\t|| x >= 0xF7 && x <= 0xFA\n\t\t|| x === 0xFC\n\t\t|| x === 0xFE\n\t\t|| x === 0x101\n\t\t|| x === 0x111\n\t\t|| x === 0x113\n\t\t|| x === 0x11B\n\t\t|| x === 0x126\n\t\t|| x === 0x127\n\t\t|| x === 0x12B\n\t\t|| x >= 0x131 && x <= 0x133\n\t\t|| x === 0x138\n\t\t|| x >= 0x13F && x <= 0x142\n\t\t|| x === 0x144\n\t\t|| x >= 0x148 && x <= 0x14B\n\t\t|| x === 0x14D\n\t\t|| x === 0x152\n\t\t|| x === 0x153\n\t\t|| x === 0x166\n\t\t|| x === 0x167\n\t\t|| x === 0x16B\n\t\t|| x === 0x1CE\n\t\t|| x === 0x1D0\n\t\t|| x === 0x1D2\n\t\t|| x === 0x1D4\n\t\t|| x === 0x1D6\n\t\t|| x === 0x1D8\n\t\t|| x === 0x1DA\n\t\t|| x === 0x1DC\n\t\t|| x === 0x251\n\t\t|| x === 0x261\n\t\t|| x === 0x2C4\n\t\t|| x === 0x2C7\n\t\t|| x >= 0x2C9 && x <= 0x2CB\n\t\t|| x === 0x2CD\n\t\t|| x === 0x2D0\n\t\t|| x >= 0x2D8 && x <= 0x2DB\n\t\t|| x === 0x2DD\n\t\t|| x === 0x2DF\n\t\t|| x >= 0x300 && x <= 0x36F\n\t\t|| x >= 0x391 && x <= 0x3A1\n\t\t|| x >= 0x3A3 && x <= 0x3A9\n\t\t|| x >= 0x3B1 && x <= 0x3C1\n\t\t|| x >= 0x3C3 && x <= 0x3C9\n\t\t|| x === 0x401\n\t\t|| x >= 0x410 && x <= 0x44F\n\t\t|| x === 0x451\n\t\t|| x === 0x2010\n\t\t|| x >= 0x2013 && x <= 0x2016\n\t\t|| x === 0x2018\n\t\t|| x === 0x2019\n\t\t|| x === 0x201C\n\t\t|| x === 0x201D\n\t\t|| x >= 0x2020 && x <= 0x2022\n\t\t|| x >= 0x2024 && x <= 0x2027\n\t\t|| x === 0x2030\n\t\t|| x === 0x2032\n\t\t|| x === 0x2033\n\t\t|| x === 0x2035\n\t\t|| x === 0x203B\n\t\t|| x === 0x203E\n\t\t|| x === 0x2074\n\t\t|| x === 0x207F\n\t\t|| x >= 0x2081 && x <= 0x2084\n\t\t|| x === 0x20AC\n\t\t|| x === 0x2103\n\t\t|| x === 0x2105\n\t\t|| x === 0x2109\n\t\t|| x === 0x2113\n\t\t|| x === 0x2116\n\t\t|| x === 0x2121\n\t\t|| x === 0x2122\n\t\t|| x === 0x2126\n\t\t|| x === 0x212B\n\t\t|| x === 0x2153\n\t\t|| x === 0x2154\n\t\t|| x >= 0x215B && x <= 0x215E\n\t\t|| x >= 0x2160 && x <= 0x216B\n\t\t|| x >= 0x2170 && x <= 0x2179\n\t\t|| x === 0x2189\n\t\t|| x >= 0x2190 && x <= 0x2199\n\t\t|| x === 0x21B8\n\t\t|| x === 0x21B9\n\t\t|| x === 0x21D2\n\t\t|| x === 0x21D4\n\t\t|| x === 0x21E7\n\t\t|| x === 0x2200\n\t\t|| x === 0x2202\n\t\t|| x === 0x2203\n\t\t|| x === 0x2207\n\t\t|| x === 0x2208\n\t\t|| x === 0x220B\n\t\t|| x === 0x220F\n\t\t|| x === 0x2211\n\t\t|| x === 0x2215\n\t\t|| x === 0x221A\n\t\t|| x >= 0x221D && x <= 0x2220\n\t\t|| x === 0x2223\n\t\t|| x === 0x2225\n\t\t|| x >= 0x2227 && x <= 0x222C\n\t\t|| x === 0x222E\n\t\t|| x >= 0x2234 && x <= 0x2237\n\t\t|| x === 0x223C\n\t\t|| x === 0x223D\n\t\t|| x === 0x2248\n\t\t|| x === 0x224C\n\t\t|| x === 0x2252\n\t\t|| x === 0x2260\n\t\t|| x === 0x2261\n\t\t|| x >= 0x2264 && x <= 0x2267\n\t\t|| x === 0x226A\n\t\t|| x === 0x226B\n\t\t|| x === 0x226E\n\t\t|| x === 0x226F\n\t\t|| x === 0x2282\n\t\t|| x === 0x2283\n\t\t|| x === 0x2286\n\t\t|| x === 0x2287\n\t\t|| x === 0x2295\n\t\t|| x === 0x2299\n\t\t|| x === 0x22A5\n\t\t|| x === 0x22BF\n\t\t|| x === 0x2312\n\t\t|| x >= 0x2460 && x <= 0x24E9\n\t\t|| x >= 0x24EB && x <= 0x254B\n\t\t|| x >= 0x2550 && x <= 0x2573\n\t\t|| x >= 0x2580 && x <= 0x258F\n\t\t|| x >= 0x2592 && x <= 0x2595\n\t\t|| x === 0x25A0\n\t\t|| x === 0x25A1\n\t\t|| x >= 0x25A3 && x <= 0x25A9\n\t\t|| x === 0x25B2\n\t\t|| x === 0x25B3\n\t\t|| x === 0x25B6\n\t\t|| x === 0x25B7\n\t\t|| x === 0x25BC\n\t\t|| x === 0x25BD\n\t\t|| x === 0x25C0\n\t\t|| x === 0x25C1\n\t\t|| x >= 0x25C6 && x <= 0x25C8\n\t\t|| x === 0x25CB\n\t\t|| x >= 0x25CE && x <= 0x25D1\n\t\t|| x >= 0x25E2 && x <= 0x25E5\n\t\t|| x === 0x25EF\n\t\t|| x === 0x2605\n\t\t|| x === 0x2606\n\t\t|| x === 0x2609\n\t\t|| x === 0x260E\n\t\t|| x === 0x260F\n\t\t|| x === 0x261C\n\t\t|| x === 0x261E\n\t\t|| x === 0x2640\n\t\t|| x === 0x2642\n\t\t|| x === 0x2660\n\t\t|| x === 0x2661\n\t\t|| x >= 0x2663 && x <= 0x2665\n\t\t|| x >= 0x2667 && x <= 0x266A\n\t\t|| x === 0x266C\n\t\t|| x === 0x266D\n\t\t|| x === 0x266F\n\t\t|| x === 0x269E\n\t\t|| x === 0x269F\n\t\t|| x === 0x26BF\n\t\t|| x >= 0x26C6 && x <= 0x26CD\n\t\t|| x >= 0x26CF && x <= 0x26D3\n\t\t|| x >= 0x26D5 && x <= 0x26E1\n\t\t|| x === 0x26E3\n\t\t|| x === 0x26E8\n\t\t|| x === 0x26E9\n\t\t|| x >= 0x26EB && x <= 0x26F1\n\t\t|| x === 0x26F4\n\t\t|| x >= 0x26F6 && x <= 0x26F9\n\t\t|| x === 0x26FB\n\t\t|| x === 0x26FC\n\t\t|| x === 0x26FE\n\t\t|| x === 0x26FF\n\t\t|| x === 0x273D\n\t\t|| x >= 0x2776 && x <= 0x277F\n\t\t|| x >= 0x2B56 && x <= 0x2B59\n\t\t|| x >= 0x3248 && x <= 0x324F\n\t\t|| x >= 0xE000 && x <= 0xF8FF\n\t\t|| x >= 0xFE00 && x <= 0xFE0F\n\t\t|| x === 0xFFFD\n\t\t|| x >= 0x1F100 && x <= 0x1F10A\n\t\t|| x >= 0x1F110 && x <= 0x1F12D\n\t\t|| x >= 0x1F130 && x <= 0x1F169\n\t\t|| x >= 0x1F170 && x <= 0x1F18D\n\t\t|| x === 0x1F18F\n\t\t|| x === 0x1F190\n\t\t|| x >= 0x1F19B && x <= 0x1F1AC\n\t\t|| x >= 0xE0100 && x <= 0xE01EF\n\t\t|| x >= 0xF0000 && x <= 0xFFFFD\n\t\t|| x >= 0x100000 && x <= 0x10FFFD;\n}\n\nfunction isFullWidth(x) {\n\treturn x === 0x3000\n\t\t|| x >= 0xFF01 && x <= 0xFF60\n\t\t|| x >= 0xFFE0 && x <= 0xFFE6;\n}\n\nfunction isWide(x) {\n\treturn x >= 0x1100 && x <= 0x115F\n\t\t|| x === 0x231A\n\t\t|| x === 0x231B\n\t\t|| x === 0x2329\n\t\t|| x === 0x232A\n\t\t|| x >= 0x23E9 && x <= 0x23EC\n\t\t|| x === 0x23F0\n\t\t|| x === 0x23F3\n\t\t|| x === 0x25FD\n\t\t|| x === 0x25FE\n\t\t|| x === 0x2614\n\t\t|| x === 0x2615\n\t\t|| x >= 0x2630 && x <= 0x2637\n\t\t|| x >= 0x2648 && x <= 0x2653\n\t\t|| x === 0x267F\n\t\t|| x >= 0x268A && x <= 0x268F\n\t\t|| x === 0x2693\n\t\t|| x === 0x26A1\n\t\t|| x === 0x26AA\n\t\t|| x === 0x26AB\n\t\t|| x === 0x26BD\n\t\t|| x === 0x26BE\n\t\t|| x === 0x26C4\n\t\t|| x === 0x26C5\n\t\t|| x === 0x26CE\n\t\t|| x === 0x26D4\n\t\t|| x === 0x26EA\n\t\t|| x === 0x26F2\n\t\t|| x === 0x26F3\n\t\t|| x === 0x26F5\n\t\t|| x === 0x26FA\n\t\t|| x === 0x26FD\n\t\t|| x === 0x2705\n\t\t|| x === 0x270A\n\t\t|| x === 0x270B\n\t\t|| x === 0x2728\n\t\t|| x === 0x274C\n\t\t|| x === 0x274E\n\t\t|| x >= 0x2753 && x <= 0x2755\n\t\t|| x === 0x2757\n\t\t|| x >= 0x2795 && x <= 0x2797\n\t\t|| x === 0x27B0\n\t\t|| x === 0x27BF\n\t\t|| x === 0x2B1B\n\t\t|| x === 0x2B1C\n\t\t|| x === 0x2B50\n\t\t|| x === 0x2B55\n\t\t|| x >= 0x2E80 && x <= 0x2E99\n\t\t|| x >= 0x2E9B && x <= 0x2EF3\n\t\t|| x >= 0x2F00 && x <= 0x2FD5\n\t\t|| x >= 0x2FF0 && x <= 0x2FFF\n\t\t|| x >= 0x3001 && x <= 0x303E\n\t\t|| x >= 0x3041 && x <= 0x3096\n\t\t|| x >= 0x3099 && x <= 0x30FF\n\t\t|| x >= 0x3105 && x <= 0x312F\n\t\t|| x >= 0x3131 && x <= 0x318E\n\t\t|| x >= 0x3190 && x <= 0x31E5\n\t\t|| x >= 0x31EF && x <= 0x321E\n\t\t|| x >= 0x3220 && x <= 0x3247\n\t\t|| x >= 0x3250 && x <= 0xA48C\n\t\t|| x >= 0xA490 && x <= 0xA4C6\n\t\t|| x >= 0xA960 && x <= 0xA97C\n\t\t|| x >= 0xAC00 && x <= 0xD7A3\n\t\t|| x >= 0xF900 && x <= 0xFAFF\n\t\t|| x >= 0xFE10 && x <= 0xFE19\n\t\t|| x >= 0xFE30 && x <= 0xFE52\n\t\t|| x >= 0xFE54 && x <= 0xFE66\n\t\t|| x >= 0xFE68 && x <= 0xFE6B\n\t\t|| x >= 0x16FE0 && x <= 0x16FE4\n\t\t|| x === 0x16FF0\n\t\t|| x === 0x16FF1\n\t\t|| x >= 0x17000 && x <= 0x187F7\n\t\t|| x >= 0x18800 && x <= 0x18CD5\n\t\t|| x >= 0x18CFF && x <= 0x18D08\n\t\t|| x >= 0x1AFF0 && x <= 0x1AFF3\n\t\t|| x >= 0x1AFF5 && x <= 0x1AFFB\n\t\t|| x === 0x1AFFD\n\t\t|| x === 0x1AFFE\n\t\t|| x >= 0x1B000 && x <= 0x1B122\n\t\t|| x === 0x1B132\n\t\t|| x >= 0x1B150 && x <= 0x1B152\n\t\t|| x === 0x1B155\n\t\t|| x >= 0x1B164 && x <= 0x1B167\n\t\t|| x >= 0x1B170 && x <= 0x1B2FB\n\t\t|| x >= 0x1D300 && x <= 0x1D356\n\t\t|| x >= 0x1D360 && x <= 0x1D376\n\t\t|| x === 0x1F004\n\t\t|| x === 0x1F0CF\n\t\t|| x === 0x1F18E\n\t\t|| x >= 0x1F191 && x <= 0x1F19A\n\t\t|| x >= 0x1F200 && x <= 0x1F202\n\t\t|| x >= 0x1F210 && x <= 0x1F23B\n\t\t|| x >= 0x1F240 && x <= 0x1F248\n\t\t|| x === 0x1F250\n\t\t|| x === 0x1F251\n\t\t|| x >= 0x1F260 && x <= 0x1F265\n\t\t|| x >= 0x1F300 && x <= 0x1F320\n\t\t|| x >= 0x1F32D && x <= 0x1F335\n\t\t|| x >= 0x1F337 && x <= 0x1F37C\n\t\t|| x >= 0x1F37E && x <= 0x1F393\n\t\t|| x >= 0x1F3A0 && x <= 0x1F3CA\n\t\t|| x >= 0x1F3CF && x <= 0x1F3D3\n\t\t|| x >= 0x1F3E0 && x <= 0x1F3F0\n\t\t|| x === 0x1F3F4\n\t\t|| x >= 0x1F3F8 && x <= 0x1F43E\n\t\t|| x === 0x1F440\n\t\t|| x >= 0x1F442 && x <= 0x1F4FC\n\t\t|| x >= 0x1F4FF && x <= 0x1F53D\n\t\t|| x >= 0x1F54B && x <= 0x1F54E\n\t\t|| x >= 0x1F550 && x <= 0x1F567\n\t\t|| x === 0x1F57A\n\t\t|| x === 0x1F595\n\t\t|| x === 0x1F596\n\t\t|| x === 0x1F5A4\n\t\t|| x >= 0x1F5FB && x <= 0x1F64F\n\t\t|| x >= 0x1F680 && x <= 0x1F6C5\n\t\t|| x === 0x1F6CC\n\t\t|| x >= 0x1F6D0 && x <= 0x1F6D2\n\t\t|| x >= 0x1F6D5 && x <= 0x1F6D7\n\t\t|| x >= 0x1F6DC && x <= 0x1F6DF\n\t\t|| x === 0x1F6EB\n\t\t|| x === 0x1F6EC\n\t\t|| x >= 0x1F6F4 && x <= 0x1F6FC\n\t\t|| x >= 0x1F7E0 && x <= 0x1F7EB\n\t\t|| x === 0x1F7F0\n\t\t|| x >= 0x1F90C && x <= 0x1F93A\n\t\t|| x >= 0x1F93C && x <= 0x1F945\n\t\t|| x >= 0x1F947 && x <= 0x1F9FF\n\t\t|| x >= 0x1FA70 && x <= 0x1FA7C\n\t\t|| x >= 0x1FA80 && x <= 0x1FA89\n\t\t|| x >= 0x1FA8F && x <= 0x1FAC6\n\t\t|| x >= 0x1FACE && x <= 0x1FADC\n\t\t|| x >= 0x1FADF && x <= 0x1FAE9\n\t\t|| x >= 0x1FAF0 && x <= 0x1FAF8\n\t\t|| x >= 0x20000 && x <= 0x2FFFD\n\t\t|| x >= 0x30000 && x <= 0x3FFFD;\n}\n\nfunction validate(codePoint) {\n\tif (!Number.isSafeInteger(codePoint)) {\n\t\tthrow new TypeError(`Expected a code point, got \\`${typeof codePoint}\\`.`);\n\t}\n}\n\nfunction eastAsianWidth(codePoint, {ambiguousAsWide = false} = {}) {\n\tvalidate(codePoint);\n\n\tif (\n\t\tisFullWidth(codePoint)\n\t\t|| isWide(codePoint)\n\t\t|| (ambiguousAsWide && isAmbiguous(codePoint))\n\t) {\n\t\treturn 2;\n\t}\n\n\treturn 1;\n}\n\nconst emojiRegex = () => {\n\t// https://mths.be/emoji\n\treturn /[#*0-9]\\uFE0F?\\u20E3|[\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23ED-\\u23EF\\u23F1\\u23F2\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB\\u25FC\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692\\u2694-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A7\\u26AA\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C8\\u26CF\\u26D1\\u26E9\\u26F0-\\u26F5\\u26F7\\u26F8\\u26FA\\u2702\\u2708\\u2709\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2733\\u2734\\u2744\\u2747\\u2757\\u2763\\u27A1\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B55\\u3030\\u303D\\u3297\\u3299]\\uFE0F?|[\\u261D\\u270C\\u270D](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?|[\\u270A\\u270B](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u2693\\u26A1\\u26AB\\u26C5\\u26CE\\u26D4\\u26EA\\u26FD\\u2705\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2795-\\u2797\\u27B0\\u27BF\\u2B50]|\\u26D3\\uFE0F?(?:\\u200D\\uD83D\\uDCA5)?|\\u26F9(?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\u2764\\uFE0F?(?:\\u200D(?:\\uD83D\\uDD25|\\uD83E\\uDE79))?|\\uD83C(?:[\\uDC04\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDE02\\uDE37\\uDF21\\uDF24-\\uDF2C\\uDF36\\uDF7D\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E\\uDF9F\\uDFCD\\uDFCE\\uDFD4-\\uDFDF\\uDFF5\\uDFF7]\\uFE0F?|[\\uDF85\\uDFC2\\uDFC7](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDFC4\\uDFCA](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDFCB\\uDFCC](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF43\\uDF45-\\uDF4A\\uDF4C-\\uDF7C\\uDF7E-\\uDF84\\uDF86-\\uDF93\\uDFA0-\\uDFC1\\uDFC5\\uDFC6\\uDFC8\\uDFC9\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF8-\\uDFFF]|\\uDDE6\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF]|\\uDDE7\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF]|\\uDDE8\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF7\\uDDFA-\\uDDFF]|\\uDDE9\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF]|\\uDDEA\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA]|\\uDDEB\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7]|\\uDDEC\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE]|\\uDDED\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA]|\\uDDEE\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9]|\\uDDEF\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5]|\\uDDF0\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF]|\\uDDF1\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE]|\\uDDF2\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF]|\\uDDF3\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF]|\\uDDF4\\uD83C\\uDDF2|\\uDDF5\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE]|\\uDDF6\\uD83C\\uDDE6|\\uDDF7\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC]|\\uDDF8\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF]|\\uDDF9\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF]|\\uDDFA\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF]|\\uDDFB\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA]|\\uDDFC\\uD83C[\\uDDEB\\uDDF8]|\\uDDFD\\uD83C\\uDDF0|\\uDDFE\\uD83C[\\uDDEA\\uDDF9]|\\uDDFF\\uD83C[\\uDDE6\\uDDF2\\uDDFC]|\\uDF44(?:\\u200D\\uD83D\\uDFEB)?|\\uDF4B(?:\\u200D\\uD83D\\uDFE9)?|\\uDFC3(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDFF3\\uFE0F?(?:\\u200D(?:\\u26A7\\uFE0F?|\\uD83C\\uDF08))?|\\uDFF4(?:\\u200D\\u2620\\uFE0F?|\\uDB40\\uDC67\\uDB40\\uDC62\\uDB40(?:\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F)?)|\\uD83D(?:[\\uDC3F\\uDCFD\\uDD49\\uDD4A\\uDD6F\\uDD70\\uDD73\\uDD76-\\uDD79\\uDD87\\uDD8A-\\uDD8D\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA\\uDECB\\uDECD-\\uDECF\\uDEE0-\\uDEE5\\uDEE9\\uDEF0\\uDEF3]\\uFE0F?|[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDC8F\\uDC91\\uDCAA\\uDD7A\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDC6E\\uDC70\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4\\uDEB5](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD74\\uDD90](?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?|[\\uDC00-\\uDC07\\uDC09-\\uDC14\\uDC16-\\uDC25\\uDC27-\\uDC3A\\uDC3C-\\uDC3E\\uDC40\\uDC44\\uDC45\\uDC51-\\uDC65\\uDC6A\\uDC79-\\uDC7B\\uDC7D-\\uDC80\\uDC84\\uDC88-\\uDC8E\\uDC90\\uDC92-\\uDCA9\\uDCAB-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDDA4\\uDDFB-\\uDE2D\\uDE2F-\\uDE34\\uDE37-\\uDE41\\uDE43\\uDE44\\uDE48-\\uDE4A\\uDE80-\\uDEA2\\uDEA4-\\uDEB3\\uDEB7-\\uDEBF\\uDEC1-\\uDEC5\\uDED0-\\uDED2\\uDED5-\\uDED7\\uDEDC-\\uDEDF\\uDEEB\\uDEEC\\uDEF4-\\uDEFC\\uDFE0-\\uDFEB\\uDFF0]|\\uDC08(?:\\u200D\\u2B1B)?|\\uDC15(?:\\u200D\\uD83E\\uDDBA)?|\\uDC26(?:\\u200D(?:\\u2B1B|\\uD83D\\uDD25))?|\\uDC3B(?:\\u200D\\u2744\\uFE0F?)?|\\uDC41\\uFE0F?(?:\\u200D\\uD83D\\uDDE8\\uFE0F?)?|\\uDC68(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDC68\\uDC69]\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?)|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?\\uDC68\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDC69(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:\\uDC8B\\u200D\\uD83D)?[\\uDC68\\uDC69]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D(?:[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?|\\uDC69\\u200D\\uD83D(?:\\uDC66(?:\\u200D\\uD83D\\uDC66)?|\\uDC67(?:\\u200D\\uD83D[\\uDC66\\uDC67])?))|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFC-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D\\uD83D(?:[\\uDC68\\uDC69]|\\uDC8B\\u200D\\uD83D[\\uDC68\\uDC69])\\uD83C[\\uDFFB-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83D[\\uDC68\\uDC69]\\uD83C[\\uDFFB-\\uDFFE])))?))?|\\uDC6F(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDD75(?:\\uD83C[\\uDFFB-\\uDFFF]|\\uFE0F)?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|\\uDE2E(?:\\u200D\\uD83D\\uDCA8)?|\\uDE35(?:\\u200D\\uD83D\\uDCAB)?|\\uDE36(?:\\u200D\\uD83C\\uDF2B\\uFE0F?)?|\\uDE42(?:\\u200D[\\u2194\\u2195]\\uFE0F?)?|\\uDEB6(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?)|\\uD83E(?:[\\uDD0C\\uDD0F\\uDD18-\\uDD1F\\uDD30-\\uDD34\\uDD36\\uDD77\\uDDB5\\uDDB6\\uDDBB\\uDDD2\\uDDD3\\uDDD5\\uDEC3-\\uDEC5\\uDEF0\\uDEF2-\\uDEF8](?:\\uD83C[\\uDFFB-\\uDFFF])?|[\\uDD26\\uDD35\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD\\uDDCF\\uDDD4\\uDDD6-\\uDDDD](?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDDDE\\uDDDF](?:\\u200D[\\u2640\\u2642]\\uFE0F?)?|[\\uDD0D\\uDD0E\\uDD10-\\uDD17\\uDD20-\\uDD25\\uDD27-\\uDD2F\\uDD3A\\uDD3F-\\uDD45\\uDD47-\\uDD76\\uDD78-\\uDDB4\\uDDB7\\uDDBA\\uDDBC-\\uDDCC\\uDDD0\\uDDE0-\\uDDFF\\uDE70-\\uDE7C\\uDE80-\\uDE89\\uDE8F-\\uDEC2\\uDEC6\\uDECE-\\uDEDC\\uDEDF-\\uDEE9]|\\uDD3C(?:\\u200D[\\u2640\\u2642]\\uFE0F?|\\uD83C[\\uDFFB-\\uDFFF])?|\\uDDCE(?:\\uD83C[\\uDFFB-\\uDFFF])?(?:\\u200D(?:[\\u2640\\u2642]\\uFE0F?(?:\\u200D\\u27A1\\uFE0F?)?|\\u27A1\\uFE0F?))?|\\uDDD1(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1|\\uDDD1\\u200D\\uD83E\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?|\\uDDD2(?:\\u200D\\uD83E\\uDDD2)?))|\\uD83C(?:\\uDFFB(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFC-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFC(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFD-\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFD(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFE(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFD\\uDFFF]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?|\\uDFFF(?:\\u200D(?:[\\u2695\\u2696\\u2708]\\uFE0F?|\\u2764\\uFE0F?\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFE]|\\uD83C[\\uDF3E\\uDF73\\uDF7C\\uDF84\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E(?:[\\uDDAF\\uDDBC\\uDDBD](?:\\u200D\\u27A1\\uFE0F?)?|[\\uDDB0-\\uDDB3]|\\uDD1D\\u200D\\uD83E\\uDDD1\\uD83C[\\uDFFB-\\uDFFF])))?))?|\\uDEF1(?:\\uD83C(?:\\uDFFB(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFC-\\uDFFF])?|\\uDFFC(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])?|\\uDFFD(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])?|\\uDFFE(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])?|\\uDFFF(?:\\u200D\\uD83E\\uDEF2\\uD83C[\\uDFFB-\\uDFFE])?))?)/g;\n};\n\nconst segmenter = globalThis.Intl?.Segmenter ? new Intl.Segmenter() : { segment: (str) => str.split('') };\n\nconst defaultIgnorableCodePointRegex = /^\\p{Default_Ignorable_Code_Point}$/u;\n\nfunction stringWidth$1(string, options = {}) {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tconst {\n\t\tambiguousIsNarrow = true,\n\t\tcountAnsiEscapeCodes = false,\n\t} = options;\n\n\tif (!countAnsiEscapeCodes) {\n\t\tstring = stripAnsi(string);\n\t}\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tlet width = 0;\n\tconst eastAsianWidthOptions = {ambiguousAsWide: !ambiguousIsNarrow};\n\n\tfor (const {segment: character} of segmenter.segment(string)) {\n\t\tconst codePoint = character.codePointAt(0);\n\n\t\t// Ignore control characters\n\t\tif (codePoint <= 0x1F || (codePoint >= 0x7F && codePoint <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore zero-width characters\n\t\tif (\n\t\t\t(codePoint >= 0x20_0B && codePoint <= 0x20_0F) // Zero-width space, non-joiner, joiner, left-to-right mark, right-to-left mark\n\t\t\t|| codePoint === 0xFE_FF // Zero-width no-break space\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (\n\t\t\t(codePoint >= 0x3_00 && codePoint <= 0x3_6F) // Combining diacritical marks\n\t\t\t|| (codePoint >= 0x1A_B0 && codePoint <= 0x1A_FF) // Combining diacritical marks extended\n\t\t\t|| (codePoint >= 0x1D_C0 && codePoint <= 0x1D_FF) // Combining diacritical marks supplement\n\t\t\t|| (codePoint >= 0x20_D0 && codePoint <= 0x20_FF) // Combining diacritical marks for symbols\n\t\t\t|| (codePoint >= 0xFE_20 && codePoint <= 0xFE_2F) // Combining half marks\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore surrogate pairs\n\t\tif (codePoint >= 0xD8_00 && codePoint <= 0xDF_FF) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore variation selectors\n\t\tif (codePoint >= 0xFE_00 && codePoint <= 0xFE_0F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// This covers some of the above cases, but we still keep them for performance reasons.\n\t\tif (defaultIgnorableCodePointRegex.test(character)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// TODO: Use `/\\p{RGI_Emoji}/v` when targeting Node.js 20.\n\t\tif (emojiRegex().test(character)) {\n\t\t\twidth += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\twidth += eastAsianWidth(codePoint, eastAsianWidthOptions);\n\t}\n\n\treturn width;\n}\n\nfunction isUnicodeSupported() {\n\tconst {env} = g$1;\n\tconst {TERM, TERM_PROGRAM} = env;\n\n\tif (g$1.platform !== 'win32') {\n\t\treturn TERM !== 'linux'; // Linux console (kernel)\n\t}\n\n\treturn Boolean(env.WT_SESSION) // Windows Terminal\n\t\t|| Boolean(env.TERMINUS_SUBLIME) // Terminus (<0.2.27)\n\t\t|| env.ConEmuTask === '{cmd::Cmder}' // ConEmu and cmder\n\t\t|| TERM_PROGRAM === 'Terminus-Sublime'\n\t\t|| TERM_PROGRAM === 'vscode'\n\t\t|| TERM === 'xterm-256color'\n\t\t|| TERM === 'alacritty'\n\t\t|| TERM === 'rxvt-unicode'\n\t\t|| TERM === 'rxvt-unicode-256color'\n\t\t|| env.TERMINAL_EMULATOR === 'JetBrains-JediTerm';\n}\n\nconst TYPE_COLOR_MAP = {\n info: \"cyan\",\n fail: \"red\",\n success: \"green\",\n ready: \"green\",\n start: \"magenta\"\n};\nconst LEVEL_COLOR_MAP = {\n 0: \"red\",\n 1: \"yellow\"\n};\nconst unicode = isUnicodeSupported();\nconst s = (c, fallback) => unicode ? c : fallback;\nconst TYPE_ICONS = {\n error: s(\"\\u2716\", \"\\xD7\"),\n fatal: s(\"\\u2716\", \"\\xD7\"),\n ready: s(\"\\u2714\", \"\\u221A\"),\n warn: s(\"\\u26A0\", \"\\u203C\"),\n info: s(\"\\u2139\", \"i\"),\n success: s(\"\\u2714\", \"\\u221A\"),\n debug: s(\"\\u2699\", \"D\"),\n trace: s(\"\\u2192\", \"\\u2192\"),\n fail: s(\"\\u2716\", \"\\xD7\"),\n start: s(\"\\u25D0\", \"o\"),\n log: \"\"\n};\nfunction stringWidth(str) {\n const hasICU = typeof Intl === \"object\";\n if (!hasICU || !Intl.Segmenter) {\n return stripAnsi$1(str).length;\n }\n return stringWidth$1(str);\n}\nclass FancyReporter extends BasicReporter {\n formatStack(stack, message, opts) {\n const indent = \" \".repeat((opts?.errorLevel || 0) + 1);\n return `\n${indent}` + parseStack(stack, message).map(\n (line) => \" \" + line.replace(/^at +/, (m) => colors.gray(m)).replace(/\\((.+)\\)/, (_, m) => `(${colors.cyan(m)})`)\n ).join(`\n${indent}`);\n }\n formatType(logObj, isBadge, opts) {\n const typeColor = TYPE_COLOR_MAP[logObj.type] || LEVEL_COLOR_MAP[logObj.level] || \"gray\";\n if (isBadge) {\n return getBgColor(typeColor)(\n colors.black(` ${logObj.type.toUpperCase()} `)\n );\n }\n const _type = typeof TYPE_ICONS[logObj.type] === \"string\" ? TYPE_ICONS[logObj.type] : logObj.icon || logObj.type;\n return _type ? getColor(typeColor)(_type) : \"\";\n }\n formatLogObj(logObj, opts) {\n const [message, ...additional] = this.formatArgs(logObj.args, opts).split(\n \"\\n\"\n );\n if (logObj.type === \"box\") {\n return box(\n characterFormat(\n message + (additional.length > 0 ? \"\\n\" + additional.join(\"\\n\") : \"\")\n ),\n {\n title: logObj.title ? characterFormat(logObj.title) : void 0,\n style: logObj.style\n }\n );\n }\n const date = this.formatDate(logObj.date, opts);\n const coloredDate = date && colors.gray(date);\n const isBadge = logObj.badge ?? logObj.level < 2;\n const type = this.formatType(logObj, isBadge, opts);\n const tag = logObj.tag ? colors.gray(logObj.tag) : \"\";\n let line;\n const left = this.filterAndJoin([type, characterFormat(message)]);\n const right = this.filterAndJoin(opts.columns ? [tag, coloredDate] : [tag]);\n const space = (opts.columns || 0) - stringWidth(left) - stringWidth(right) - 2;\n line = space > 0 && (opts.columns || 0) >= 80 ? left + \" \".repeat(space) + right : (right ? `${colors.gray(`[${right}]`)} ` : \"\") + left;\n line += characterFormat(\n additional.length > 0 ? \"\\n\" + additional.join(\"\\n\") : \"\"\n );\n if (logObj.type === \"trace\") {\n const _err = new Error(\"Trace: \" + logObj.message);\n line += this.formatStack(_err.stack || \"\", _err.message);\n }\n return isBadge ? \"\\n\" + line + \"\\n\" : line;\n }\n}\nfunction characterFormat(str) {\n return str.replace(/`([^`]+)`/gm, (_, m) => colors.cyan(m)).replace(/\\s+_([^_]+)_\\s+/gm, (_, m) => ` ${colors.underline(m)} `);\n}\nfunction getColor(color = \"white\") {\n return colors[color] || colors.white;\n}\nfunction getBgColor(color = \"bgWhite\") {\n return colors[`bg${color[0].toUpperCase()}${color.slice(1)}`] || colors.bgWhite;\n}\n\nfunction createConsola(options = {}) {\n let level = _getDefaultLogLevel();\n if (process.env.CONSOLA_LEVEL) {\n level = Number.parseInt(process.env.CONSOLA_LEVEL) ?? level;\n }\n const consola2 = createConsola$1({\n level,\n defaults: { level },\n stdout: process.stdout,\n stderr: process.stderr,\n prompt: (...args) => import('./chunks/prompt.mjs').then((m) => m.prompt(...args)),\n reporters: options.reporters || [\n options.fancy ?? !(T || R) ? new FancyReporter() : new BasicReporter()\n ],\n ...options\n });\n return consola2;\n}\nfunction _getDefaultLogLevel() {\n if (g) {\n return LogLevels.debug;\n }\n if (R) {\n return LogLevels.warn;\n }\n return LogLevels.info;\n}\nconst consola = createConsola();\n\nexport { LogLevels, consola, createConsola, consola as default };\n","import * as tty from 'node:tty';\n\nconst {\n env = {},\n argv = [],\n platform = \"\"\n} = typeof process === \"undefined\" ? {} : process;\nconst isDisabled = \"NO_COLOR\" in env || argv.includes(\"--no-color\");\nconst isForced = \"FORCE_COLOR\" in env || argv.includes(\"--color\");\nconst isWindows = platform === \"win32\";\nconst isDumbTerminal = env.TERM === \"dumb\";\nconst isCompatibleTerminal = tty && tty.isatty && tty.isatty(1) && env.TERM && !isDumbTerminal;\nconst isCI = \"CI\" in env && (\"GITHUB_ACTIONS\" in env || \"GITLAB_CI\" in env || \"CIRCLECI\" in env);\nconst isColorSupported = !isDisabled && (isForced || isWindows && !isDumbTerminal || isCompatibleTerminal || isCI);\nfunction replaceClose(index, string, close, replace, head = string.slice(0, Math.max(0, index)) + replace, tail = string.slice(Math.max(0, index + close.length)), next = tail.indexOf(close)) {\n return head + (next < 0 ? tail : replaceClose(next, tail, close, replace));\n}\nfunction clearBleed(index, string, open, close, replace) {\n return index < 0 ? open + string + close : open + replaceClose(index, string, close, replace) + close;\n}\nfunction filterEmpty(open, close, replace = open, at = open.length + 1) {\n return (string) => string || !(string === \"\" || string === void 0) ? clearBleed(\n (\"\" + string).indexOf(close, at),\n string,\n open,\n close,\n replace\n ) : \"\";\n}\nfunction init(open, close, replace) {\n return filterEmpty(`\\x1B[${open}m`, `\\x1B[${close}m`, replace);\n}\nconst colorDefs = {\n reset: init(0, 0),\n bold: init(1, 22, \"\\x1B[22m\\x1B[1m\"),\n dim: init(2, 22, \"\\x1B[22m\\x1B[2m\"),\n italic: init(3, 23),\n underline: init(4, 24),\n inverse: init(7, 27),\n hidden: init(8, 28),\n strikethrough: init(9, 29),\n black: init(30, 39),\n red: init(31, 39),\n green: init(32, 39),\n yellow: init(33, 39),\n blue: init(34, 39),\n magenta: init(35, 39),\n cyan: init(36, 39),\n white: init(37, 39),\n gray: init(90, 39),\n bgBlack: init(40, 49),\n bgRed: init(41, 49),\n bgGreen: init(42, 49),\n bgYellow: init(43, 49),\n bgBlue: init(44, 49),\n bgMagenta: init(45, 49),\n bgCyan: init(46, 49),\n bgWhite: init(47, 49),\n blackBright: init(90, 39),\n redBright: init(91, 39),\n greenBright: init(92, 39),\n yellowBright: init(93, 39),\n blueBright: init(94, 39),\n magentaBright: init(95, 39),\n cyanBright: init(96, 39),\n whiteBright: init(97, 39),\n bgBlackBright: init(100, 49),\n bgRedBright: init(101, 49),\n bgGreenBright: init(102, 49),\n bgYellowBright: init(103, 49),\n bgBlueBright: init(104, 49),\n bgMagentaBright: init(105, 49),\n bgCyanBright: init(106, 49),\n bgWhiteBright: init(107, 49)\n};\nfunction createColors(useColor = isColorSupported) {\n return useColor ? colorDefs : Object.fromEntries(Object.keys(colorDefs).map((key) => [key, String]));\n}\nconst colors = createColors();\nfunction getColor(color, fallback = \"reset\") {\n return colors[color] || colors[fallback];\n}\nfunction colorize(color, text) {\n return getColor(color)(text);\n}\n\nconst ansiRegex = [\n String.raw`[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)`,\n String.raw`(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]))`\n].join(\"|\");\nfunction stripAnsi(text) {\n return text.replace(new RegExp(ansiRegex, \"g\"), \"\");\n}\nfunction centerAlign(str, len, space = \" \") {\n const free = len - str.length;\n if (free <= 0) {\n return str;\n }\n const freeLeft = Math.floor(free / 2);\n let _str = \"\";\n for (let i = 0; i < len; i++) {\n _str += i < freeLeft || i >= freeLeft + str.length ? space : str[i - freeLeft];\n }\n return _str;\n}\nfunction rightAlign(str, len, space = \" \") {\n const free = len - str.length;\n if (free <= 0) {\n return str;\n }\n let _str = \"\";\n for (let i = 0; i < len; i++) {\n _str += i < free ? space : str[i - free];\n }\n return _str;\n}\nfunction leftAlign(str, len, space = \" \") {\n let _str = \"\";\n for (let i = 0; i < len; i++) {\n _str += i < str.length ? str[i] : space;\n }\n return _str;\n}\nfunction align(alignment, str, len, space = \" \") {\n switch (alignment) {\n case \"left\": {\n return leftAlign(str, len, space);\n }\n case \"right\": {\n return rightAlign(str, len, space);\n }\n case \"center\": {\n return centerAlign(str, len, space);\n }\n default: {\n return str;\n }\n }\n}\n\nconst boxStylePresets = {\n solid: {\n tl: \"\\u250C\",\n tr: \"\\u2510\",\n bl: \"\\u2514\",\n br: \"\\u2518\",\n h: \"\\u2500\",\n v: \"\\u2502\"\n },\n double: {\n tl: \"\\u2554\",\n tr: \"\\u2557\",\n bl: \"\\u255A\",\n br: \"\\u255D\",\n h: \"\\u2550\",\n v: \"\\u2551\"\n },\n doubleSingle: {\n tl: \"\\u2553\",\n tr: \"\\u2556\",\n bl: \"\\u2559\",\n br: \"\\u255C\",\n h: \"\\u2500\",\n v: \"\\u2551\"\n },\n doubleSingleRounded: {\n tl: \"\\u256D\",\n tr: \"\\u256E\",\n bl: \"\\u2570\",\n br: \"\\u256F\",\n h: \"\\u2500\",\n v: \"\\u2551\"\n },\n singleThick: {\n tl: \"\\u250F\",\n tr: \"\\u2513\",\n bl: \"\\u2517\",\n br: \"\\u251B\",\n h: \"\\u2501\",\n v: \"\\u2503\"\n },\n singleDouble: {\n tl: \"\\u2552\",\n tr: \"\\u2555\",\n bl: \"\\u2558\",\n br: \"\\u255B\",\n h: \"\\u2550\",\n v: \"\\u2502\"\n },\n singleDoubleRounded: {\n tl: \"\\u256D\",\n tr: \"\\u256E\",\n bl: \"\\u2570\",\n br: \"\\u256F\",\n h: \"\\u2550\",\n v: \"\\u2502\"\n },\n rounded: {\n tl: \"\\u256D\",\n tr: \"\\u256E\",\n bl: \"\\u2570\",\n br: \"\\u256F\",\n h: \"\\u2500\",\n v: \"\\u2502\"\n }\n};\nconst defaultStyle = {\n borderColor: \"white\",\n borderStyle: \"rounded\",\n valign: \"center\",\n padding: 2,\n marginLeft: 1,\n marginTop: 1,\n marginBottom: 1\n};\nfunction box(text, _opts = {}) {\n const opts = {\n ..._opts,\n style: {\n ...defaultStyle,\n ..._opts.style\n }\n };\n const textLines = text.split(\"\\n\");\n const boxLines = [];\n const _color = getColor(opts.style.borderColor);\n const borderStyle = {\n ...typeof opts.style.borderStyle === \"string\" ? boxStylePresets[opts.style.borderStyle] || boxStylePresets.solid : opts.style.borderStyle\n };\n if (_color) {\n for (const key in borderStyle) {\n borderStyle[key] = _color(\n borderStyle[key]\n );\n }\n }\n const paddingOffset = opts.style.padding % 2 === 0 ? opts.style.padding : opts.style.padding + 1;\n const height = textLines.length + paddingOffset;\n const width = Math.max(\n ...textLines.map((line) => stripAnsi(line).length),\n opts.title ? stripAnsi(opts.title).length : 0\n ) + paddingOffset;\n const widthOffset = width + paddingOffset;\n const leftSpace = opts.style.marginLeft > 0 ? \" \".repeat(opts.style.marginLeft) : \"\";\n if (opts.style.marginTop > 0) {\n boxLines.push(\"\".repeat(opts.style.marginTop));\n }\n if (opts.title) {\n const title = _color ? _color(opts.title) : opts.title;\n const left = borderStyle.h.repeat(\n Math.floor((width - stripAnsi(opts.title).length) / 2)\n );\n const right = borderStyle.h.repeat(\n width - stripAnsi(opts.title).length - stripAnsi(left).length + paddingOffset\n );\n boxLines.push(\n `${leftSpace}${borderStyle.tl}${left}${title}${right}${borderStyle.tr}`\n );\n } else {\n boxLines.push(\n `${leftSpace}${borderStyle.tl}${borderStyle.h.repeat(widthOffset)}${borderStyle.tr}`\n );\n }\n const valignOffset = opts.style.valign === \"center\" ? Math.floor((height - textLines.length) / 2) : opts.style.valign === \"top\" ? height - textLines.length - paddingOffset : height - textLines.length;\n for (let i = 0; i < height; i++) {\n if (i < valignOffset || i >= valignOffset + textLines.length) {\n boxLines.push(\n `${leftSpace}${borderStyle.v}${\" \".repeat(widthOffset)}${borderStyle.v}`\n );\n } else {\n const line = textLines[i - valignOffset];\n const left = \" \".repeat(paddingOffset);\n const right = \" \".repeat(width - stripAnsi(line).length);\n boxLines.push(\n `${leftSpace}${borderStyle.v}${left}${line}${right}${borderStyle.v}`\n );\n }\n }\n boxLines.push(\n `${leftSpace}${borderStyle.bl}${borderStyle.h.repeat(widthOffset)}${borderStyle.br}`\n );\n if (opts.style.marginBottom > 0) {\n boxLines.push(\"\".repeat(opts.style.marginBottom));\n }\n return boxLines.join(\"\\n\");\n}\n\nexport { centerAlign as a, align as b, colorize as c, box as d, colors as e, getColor as g, leftAlign as l, rightAlign as r, stripAnsi as s };\n","import path from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport consola from \"consola\";\nimport {\n getGameBySlug,\n getLatestGameRule,\n getManifest,\n findManifests,\n} from \"@dreamboard/api-client\";\nimport {\n resolveConfig,\n requireAuth,\n configureClient,\n} from \"../config/resolve.js\";\nimport { parseCloneCommandArgs } from \"../flags.js\";\nimport { loadGlobalConfig } from \"../config/global-config.js\";\nimport { getStoredSession } from \"../config/credential-store.js\";\nimport { normalizeSlug } from \"../utils/strings.js\";\nimport { ensureDir } from \"../utils/fs.js\";\nimport { CONFIG_FLAG_ARGS } from \"../command-args.js\";\nimport {\n findCompiledResultsForAuthoringState,\n getAuthoringHeadSdk,\n getLatestRuleIdSdk,\n} from \"../services/api/index.js\";\nimport {\n writeManifest,\n writeRule,\n writeSnapshot,\n} from \"../services/project/local-files.js\";\nimport { updateProjectState } from \"../config/project-config.js\";\nimport { scaffoldStaticWorkspace } from \"../services/project/static-scaffold.js\";\nimport { pullIntoDirectory } from \"../services/project/sync.js\";\nimport {\n setLatestCompileAttempt,\n updateProjectLocalMaintainerRegistry,\n updateProjectAuthoringState,\n} from \"../services/project/project-state.js\";\nimport { toDreamboardApiError } from \"../utils/errors.js\";\nimport { applyWorkspaceCodegen } from \"../services/project/workspace-codegen.js\";\nimport {\n ensureLocalMaintainerSnapshot,\n readWorkspaceLocalMaintainerRegistry,\n} from \"../services/project/local-maintainer-registry.js\";\nimport { installWorkspaceDependencies } from \"../services/project/workspace-dependencies.js\";\n\nexport default defineCommand({\n meta: { name: \"clone\", description: \"Clone an existing game by slug\" },\n args: {\n slug: { type: \"positional\", description: \"Game slug\", required: true },\n ...CONFIG_FLAG_ARGS,\n },\n async run({ args }) {\n const parsedArgs = parseCloneCommandArgs(args);\n const slugInput = parsedArgs.slug;\n\n const normalizedSlug = normalizeSlug(slugInput);\n if (!normalizedSlug) {\n throw new Error(\"Slug must contain at least one alphanumeric character.\");\n }\n\n const [globalConfig, storedSession] = await Promise.all([\n loadGlobalConfig(),\n getStoredSession(),\n ]);\n const config = resolveConfig(\n globalConfig,\n parsedArgs,\n undefined,\n storedSession,\n );\n requireAuth(config);\n await configureClient(config);\n const localMaintainerRegistry = await ensureLocalMaintainerSnapshot(\n config.apiBaseUrl,\n );\n\n const {\n data: game,\n error,\n response,\n } = await getGameBySlug({\n path: { slug: normalizedSlug },\n });\n if (error || !game) {\n throw toDreamboardApiError(\n error,\n response,\n `Game '${normalizedSlug}' not found`,\n );\n }\n\n const authoringHead = await getAuthoringHeadSdk(game.id);\n\n const targetDir = path.resolve(process.cwd(), normalizedSlug);\n await ensureDir(targetDir);\n\n if (!authoringHead?.authoringStateId) {\n consola.info(\"No remote authored state found. Scaffolding sources...\");\n\n const ruleId = await getLatestRuleIdSdk(game.id);\n const { data: manifestsResponse } = await findManifests({\n path: { gameId: game.id },\n query: { ruleId },\n });\n const manifestId = manifestsResponse?.currentManifestId;\n if (!manifestId) {\n throw new Error(\n \"No manifest found for this game. Create one first with 'dreamboard new'.\",\n );\n }\n\n const { data: manifestResponse, error: manifestError } =\n await getManifest({\n path: { manifestId },\n });\n if (manifestError || !manifestResponse) {\n throw new Error(\"Failed to fetch latest manifest content for clone.\");\n }\n\n const { data: latestRuleResponse, error: latestRuleError } =\n await getLatestGameRule({\n path: { gameId: game.id },\n });\n if (latestRuleError || !latestRuleResponse) {\n throw new Error(\"Failed to fetch latest rule content for clone.\");\n }\n\n await writeManifest(targetDir, manifestResponse.manifest);\n await writeRule(targetDir, latestRuleResponse.ruleText);\n await scaffoldStaticWorkspace(targetDir, \"update\", {\n localMaintainerRegistry,\n });\n await applyWorkspaceCodegen({\n projectRoot: targetDir,\n manifest: manifestResponse.manifest,\n });\n await installWorkspaceDependencies(targetDir);\n await updateProjectState(\n targetDir,\n updateProjectLocalMaintainerRegistry(\n updateProjectAuthoringState(\n {\n gameId: game.id,\n slug: normalizedSlug,\n apiBaseUrl: config.apiBaseUrl,\n webBaseUrl: config.webBaseUrl,\n },\n {\n ruleId,\n manifestId,\n manifestContentHash: manifestResponse.contentHash,\n },\n ),\n localMaintainerRegistry ?? undefined,\n ),\n );\n await writeSnapshot(targetDir);\n } else {\n const pulledProjectConfig = await pullIntoDirectory(config, targetDir, {\n gameId: game.id,\n slug: normalizedSlug,\n apiBaseUrl: config.apiBaseUrl,\n webBaseUrl: config.webBaseUrl,\n });\n const fallbackRegistryUrl = localMaintainerRegistry?.registryUrl;\n const workspaceLocalMaintainerRegistry =\n localMaintainerRegistry ??\n (await readWorkspaceLocalMaintainerRegistry(\n targetDir,\n fallbackRegistryUrl,\n ));\n await scaffoldStaticWorkspace(targetDir, \"update\", {\n localMaintainerRegistry: workspaceLocalMaintainerRegistry,\n });\n if (workspaceLocalMaintainerRegistry) {\n await installWorkspaceDependencies(targetDir);\n }\n await updateProjectState(\n targetDir,\n updateProjectLocalMaintainerRegistry(\n pulledProjectConfig,\n workspaceLocalMaintainerRegistry ?? undefined,\n ),\n );\n\n const remoteResults = await findCompiledResultsForAuthoringState({\n gameId: game.id,\n authoringStateId: authoringHead.authoringStateId,\n });\n const latestSuccess = remoteResults.find(\n (result: { success: boolean }) => result.success,\n );\n if (latestSuccess) {\n const configWithLatestCompileAttempt = setLatestCompileAttempt(\n pulledProjectConfig,\n {\n resultId: latestSuccess.id,\n authoringStateId: latestSuccess.authoringStateId,\n status: \"successful\",\n },\n );\n await updateProjectState(\n targetDir,\n updateProjectLocalMaintainerRegistry(\n configWithLatestCompileAttempt,\n workspaceLocalMaintainerRegistry ?? undefined,\n ),\n );\n }\n }\n\n consola.success(`Cloned ${normalizedSlug} into ${targetDir}`);\n },\n});\n","declare const __DREAMBOARD_BUILD_CHANNEL__: string | undefined;\n\nconst injectedBuildChannel =\n typeof __DREAMBOARD_BUILD_CHANNEL__ === \"string\"\n ? __DREAMBOARD_BUILD_CHANNEL__\n : undefined;\n\nexport const BUILD_CHANNEL =\n injectedBuildChannel === \"published\" ? \"published\" : \"development\";\n\nexport const IS_PUBLISHED_BUILD = BUILD_CHANNEL === \"published\";\nexport const PUBLISHED_ENVIRONMENT = \"prod\" as const;\n","import path from \"node:path\";\nimport type { ProjectConfig } from \"../types.js\";\nimport { PROJECT_DIR_NAME, PROJECT_CONFIG_FILE } from \"../constants.js\";\nimport { ensureDir, exists, readJsonFile } from \"../utils/fs.js\";\nimport { atomicWriteFile } from \"../utils/atomic-file.js\";\n\nfunction normalizeProjectConfig(config: ProjectConfig): ProjectConfig {\n return {\n gameId: config.gameId,\n slug: config.slug,\n authoring: config.authoring,\n compile: config.compile,\n localMaintainerRegistry: config.localMaintainerRegistry,\n apiBaseUrl: config.apiBaseUrl,\n webBaseUrl: config.webBaseUrl,\n };\n}\n\nexport async function loadProjectConfig(\n rootDir: string,\n): Promise<ProjectConfig> {\n const filePath = path.join(rootDir, PROJECT_DIR_NAME, PROJECT_CONFIG_FILE);\n return normalizeProjectConfig(await readJsonFile<ProjectConfig>(filePath));\n}\n\nexport async function updateProjectState(\n rootDir: string,\n config: ProjectConfig,\n): Promise<void> {\n const dir = path.join(rootDir, PROJECT_DIR_NAME);\n await ensureDir(dir);\n // Use the atomic-file primitive so a crash during `dreamboard sync`\n // cannot leave `.dreamboard/project.json` truncated. A truncated\n // project file would break `findProjectRoot` and force the user to\n // re-clone the workspace. `0o644` (world-readable) is intentional:\n // this file is not secret and users frequently mount workspaces into\n // containers running under a different uid.\n await atomicWriteFile(\n path.join(dir, PROJECT_CONFIG_FILE),\n `${JSON.stringify(normalizeProjectConfig(config), null, 2)}\\n`,\n { mode: 0o644 },\n );\n}\n\nexport async function findProjectRoot(\n startDir: string,\n): Promise<string | null> {\n let current = path.resolve(startDir);\n for (let i = 0; i < 25; i++) {\n const candidate = path.join(current, PROJECT_DIR_NAME, PROJECT_CONFIG_FILE);\n if (await exists(candidate)) {\n return current;\n }\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return null;\n}\n","/**\n * Classification of Supabase `setSession` errors for the refresh path.\n *\n * The previous `isInvalidRefreshTokenMessage` helper returned a boolean\n * and was used to decide whether to wipe the stored refresh token. That\n * classification was too aggressive: Supabase returns \"refresh token\n * not found / reuse / expired\" strings for genuinely transient reasons\n * (clock skew on a laptop lid-open, momentary 5xx retried internally,\n * benign rotation races when two CLI processes hit the endpoint within\n * a few ms). In those cases wiping disk state made the bug worse: the\n * user now had to re-login even though the refresh token was still\n * valid on the server.\n *\n * We keep the classification narrow and default ambiguous cases to\n * `transient` so the CLI retains the stored refresh token and the\n * user's next retry has a chance to succeed.\n */\n\nexport type RefreshErrorKind =\n /** Supabase indicated the refresh token is permanently invalid. */\n | \"permanent_invalid\"\n /** Network / DNS / timeout. Retryable. */\n | \"network\"\n /** Anything else. Treated as transient; disk state preserved. */\n | \"transient\";\n\nexport type RefreshErrorClassification = {\n readonly kind: RefreshErrorKind;\n readonly message: string;\n};\n\nexport class PermanentRefreshError extends Error {\n readonly kind = \"permanent_invalid\" as const;\n constructor(message: string) {\n super(message);\n this.name = \"PermanentRefreshError\";\n }\n}\n\nconst NETWORK_HINTS = [\n \"fetch failed\",\n \"network request failed\",\n \"getaddrinfo\",\n \"enotfound\",\n \"econnrefused\",\n \"econnreset\",\n \"etimedout\",\n \"socket hang up\",\n \"und_err\",\n];\n\n// Supabase refresh errors we treat as permanent: the server has\n// authoritatively stated that this refresh token will never work again.\n// Note: this list is intentionally narrow. \"invalid\" by itself is too\n// broad - 5xx responses sometimes include that word.\nconst PERMANENT_INVALID_HINTS = [\n \"refresh token not found\",\n \"refresh token is invalid\",\n \"refresh token has been revoked\",\n \"refresh token already used\",\n \"refresh token reuse\",\n \"refresh_token_already_used\",\n \"invalid_grant\",\n];\n\nexport function classifyRefreshError(\n error: unknown,\n): RefreshErrorClassification {\n const message = extractMessage(error);\n const normalized = message.toLowerCase();\n\n for (const hint of PERMANENT_INVALID_HINTS) {\n if (normalized.includes(hint)) {\n return { kind: \"permanent_invalid\", message };\n }\n }\n\n for (const hint of NETWORK_HINTS) {\n if (normalized.includes(hint)) {\n return { kind: \"network\", message };\n }\n }\n\n return { kind: \"transient\", message };\n}\n\nfunction extractMessage(error: unknown): string {\n if (error === null || error === undefined) return \"\";\n if (typeof error === \"string\") return error;\n if (typeof error === \"object\" && error !== null) {\n const candidate = (error as { message?: unknown }).message;\n if (typeof candidate === \"string\") return candidate;\n }\n return String(error);\n}\n","/**\n * Single-flight, lock-aware coordinator for Supabase session refreshes.\n *\n * Replaces the ad-hoc refresh logic that used to live in\n * `config/resolve.ts` and was responsible for the refresh-token-wipe\n * bug. Guarantees:\n *\n * - In-process single-flight: concurrent call sites within the same\n * CLI process share a single `setSession` call.\n * - Cross-process serialization via `withCredentialLock`: two CLI\n * invocations (e.g. `sync` + `compile`) cannot both rotate Supabase\n * refresh tokens and clobber each other on disk.\n * - Read-modify-write happens INSIDE the lock: we re-read credentials\n * after acquiring the lock, because another process may already have\n * rotated them.\n * - No disk mutation on transient or network errors. The stored refresh\n * token is only overwritten on a successful rotation.\n * - Permanent-invalid errors throw `PermanentRefreshError`. The stored\n * refresh token is left in place so the user can still inspect state\n * with `dreamboard auth status`. `dreamboard login` is the only path\n * that should replace it, via `setCredentials`.\n */\n\nimport { createClient as createSupabaseClient } from \"@supabase/supabase-js\";\nimport {\n type Credentials,\n type CredentialLockOps,\n type StoredSessionSnapshot,\n withCredentialLock,\n} from \"../config/credential-store.js\";\nimport {\n PermanentRefreshError,\n classifyRefreshError,\n} from \"./refresh-error.js\";\n\nexport type RefreshContext = {\n readonly supabaseUrl: string;\n readonly supabaseAnonKey: string;\n /**\n * How close to access-token expiry (in ms) we should proactively\n * rotate. Keeping a conservative window avoids doing a network round\n * trip on every command while still catching \"about to expire\".\n */\n readonly refreshWindowMs?: number;\n};\n\nexport const DEFAULT_REFRESH_WINDOW_MS = 5 * 60 * 1000;\n\nexport type RefreshResult =\n /** Existing credentials are fresh; no rotation performed. */\n | { readonly kind: \"unchanged\"; readonly credentials: Credentials }\n /** Credentials were rotated and persisted. */\n | { readonly kind: \"rotated\"; readonly credentials: Credentials }\n /**\n * Credentials are expiring/expired but Supabase returned a transient\n * error. We did NOT modify disk state; caller can decide whether to\n * proceed with the stale access token or bail.\n */\n | {\n readonly kind: \"transient_failure\";\n readonly credentials: Credentials;\n readonly message: string;\n }\n /** No credentials available to refresh. */\n | { readonly kind: \"missing\"; readonly credentials: null };\n\nlet inflight: Promise<RefreshResult> | null = null;\n\nexport async function ensureFreshAccessToken(\n context: RefreshContext,\n): Promise<RefreshResult> {\n if (inflight) return inflight;\n inflight = runRefresh(context).finally(() => {\n inflight = null;\n });\n return inflight;\n}\n\nasync function runRefresh(context: RefreshContext): Promise<RefreshResult> {\n return withCredentialLock(async (ops) => {\n const existing = await ops.read();\n const refreshable = toRefreshable(existing);\n if (!refreshable) {\n return { kind: \"missing\", credentials: null };\n }\n\n const shouldRefresh = isAccessTokenExpiringSoon(\n refreshable.accessToken,\n context.refreshWindowMs ?? DEFAULT_REFRESH_WINDOW_MS,\n );\n if (!shouldRefresh) {\n return { kind: \"unchanged\", credentials: refreshable };\n }\n\n return attemptRotation(context, refreshable, ops);\n });\n}\n\nfunction toRefreshable(\n snapshot: StoredSessionSnapshot | null,\n): Credentials | null {\n if (!snapshot) return null;\n if (!snapshot.accessToken || !snapshot.refreshToken) return null;\n return {\n accessToken: snapshot.accessToken,\n refreshToken: snapshot.refreshToken,\n };\n}\n\nasync function attemptRotation(\n context: RefreshContext,\n existing: Credentials,\n ops: CredentialLockOps,\n): Promise<RefreshResult> {\n const supabase = createSupabaseClient(\n context.supabaseUrl,\n context.supabaseAnonKey,\n );\n\n let data: {\n session: {\n access_token?: string;\n refresh_token?: string | null;\n } | null;\n };\n let error: { message?: string } | null;\n try {\n const result = await supabase.auth.setSession({\n access_token: existing.accessToken,\n refresh_token: existing.refreshToken,\n });\n data = result.data;\n error = result.error;\n } catch (thrown) {\n // Supabase SDK threw (network/abort). Classify and decide.\n const classification = classifyRefreshError(thrown);\n if (classification.kind === \"permanent_invalid\") {\n throw new PermanentRefreshError(classification.message);\n }\n return {\n kind: \"transient_failure\",\n credentials: existing,\n message: classification.message,\n };\n }\n\n if (error) {\n const classification = classifyRefreshError(error);\n if (classification.kind === \"permanent_invalid\") {\n throw new PermanentRefreshError(classification.message);\n }\n return {\n kind: \"transient_failure\",\n credentials: existing,\n message: classification.message,\n };\n }\n\n const session = data.session;\n const rotatedAccessToken = session?.access_token;\n if (!rotatedAccessToken) {\n // Supabase returned success but no session. Treat as transient so\n // we do not touch disk on an ambiguous response.\n return {\n kind: \"transient_failure\",\n credentials: existing,\n message: \"Supabase returned no session on refresh\",\n };\n }\n\n const rotated: Credentials = {\n accessToken: rotatedAccessToken,\n refreshToken: session?.refresh_token ?? existing.refreshToken,\n };\n await ops.writeFull(rotated);\n return { kind: \"rotated\", credentials: rotated };\n}\n\nfunction isAccessTokenExpiringSoon(\n accessToken: string,\n refreshWindowMs: number,\n): boolean {\n const expiry = getAccessTokenExpiry(accessToken);\n if (!expiry) {\n // If we cannot parse the expiry, assume it is ok. A refresh attempt\n // for an opaque/non-JWT access token would fail anyway.\n return false;\n }\n return expiry.getTime() - Date.now() <= refreshWindowMs;\n}\n\nexport function getAccessTokenExpiry(\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/** Test-only reset. */\nexport function _resetRefreshCoordinatorForTests(): void {\n inflight = null;\n}\n","import { client } from \"@dreamboard/api-client/client.gen\";\nimport type {\n Environment,\n GlobalConfig,\n ProjectConfig,\n ResolvedConfig,\n} from \"../types.js\";\nimport type { ConfigFlags } from \"../flags.js\";\nimport { IS_PUBLISHED_BUILD, PUBLISHED_ENVIRONMENT } 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 Credentials,\n type StoredSessionSnapshot,\n getStoredSession,\n} from \"./credential-store.js\";\nimport {\n PermanentRefreshError,\n classifyRefreshError,\n} from \"../auth/refresh-error.js\";\nimport {\n DEFAULT_REFRESH_WINDOW_MS,\n ensureFreshAccessToken,\n getAccessTokenExpiry,\n} from \"../auth/refresh-coordinator.js\";\n\nconst LOGIN_HINT = \"Run `dreamboard login` to authenticate again.\";\n\nexport type CredentialSnapshot = {\n accessToken?: string;\n refreshToken?: 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/persisting credentials\n * is the job of `configureClient` + `RefreshCoordinator`.\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 = IS_PUBLISHED_BUILD\n ? undefined\n : environmentFromProcess();\n const environment = IS_PUBLISHED_BUILD\n ? PUBLISHED_ENVIRONMENT\n : flags.env || envEnvironment || globalConfig.environment || \"dev\";\n const envConfig = ENVIRONMENT_CONFIGS[environment];\n const publishedEnvConfig = ENVIRONMENT_CONFIGS[PUBLISHED_ENVIRONMENT];\n const hasExplicitEnvironmentOverride =\n !IS_PUBLISHED_BUILD && Boolean(flags.env || envEnvironment);\n\n const resolvedApiBaseUrl = IS_PUBLISHED_BUILD\n ? (publishedEnvConfig?.apiBaseUrl ?? DEFAULT_API_BASE_URL)\n : hasExplicitEnvironmentOverride\n ? envConfig?.apiBaseUrl || 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 = IS_PUBLISHED_BUILD\n ? (publishedEnvConfig?.webBaseUrl ?? DEFAULT_WEB_BASE_URL)\n : hasExplicitEnvironmentOverride\n ? envConfig?.webBaseUrl || 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 supabaseUrl = envConfig?.supabaseUrl;\n const supabaseAnonKey = envConfig?.supabaseAnonKey;\n\n const snapshot = buildCredentialSnapshot(flags, credentials);\n\n return {\n apiBaseUrl,\n webBaseUrl,\n supabaseUrl,\n supabaseAnonKey,\n authToken: snapshot.accessToken,\n refreshToken: snapshot.refreshToken,\n authTokenSource: snapshot.authTokenSource,\n refreshTokenSource: snapshot.refreshTokenSource,\n };\n}\n\nfunction buildCredentialSnapshot(\n flags: ConfigFlags,\n storedCredentials?: StoredSessionSnapshot | null,\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 envRefreshToken = valueOrUndefined(\n process.env.DREAMBOARD_REFRESH_TOKEN,\n );\n\n if (IS_PUBLISHED_BUILD) {\n const stored = storedCredentials ?? null;\n if (agentEnvToken) {\n return {\n accessToken: agentEnvToken,\n refreshToken: undefined,\n authTokenSource: \"agent-env\",\n refreshTokenSource: \"none\",\n };\n }\n return {\n accessToken: stored?.accessToken,\n refreshToken: stored?.refreshToken,\n authTokenSource: stored?.accessToken ? \"global\" : \"none\",\n refreshTokenSource: stored?.refreshToken ? \"global\" : \"none\",\n };\n }\n\n const accessToken =\n flagToken || agentEnvToken || envToken || storedCredentials?.accessToken;\n const refreshToken = envRefreshToken || storedCredentials?.refreshToken;\n\n const authTokenSource: ResolvedConfig[\"authTokenSource\"] = flagToken\n ? \"flag\"\n : agentEnvToken\n ? \"agent-env\"\n : envToken\n ? \"env\"\n : storedCredentials?.accessToken\n ? \"global\"\n : \"none\";\n\n const refreshTokenSource: ResolvedConfig[\"refreshTokenSource\"] =\n envRefreshToken\n ? \"env\"\n : storedCredentials?.refreshToken\n ? \"global\"\n : \"none\";\n\n return {\n accessToken,\n refreshToken,\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 === \"dev\" || value === \"prod\") {\n return value;\n }\n throw new Error(\n `Invalid DREAMBOARD_ENV '${value}'. Valid options: local, dev, prod`,\n );\n}\n\nfunction assertPublicRuntimeFlags(flags: ConfigFlags): void {\n const argv = process.argv.slice(2);\n\n if (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 login` so the CLI can store and refresh your session.\",\n );\n }\n\n if (process.env.DREAMBOARD_TOKEN || process.env.DREAMBOARD_REFRESH_TOKEN) {\n throw new Error(\n \"The published Dreamboard CLI ignores direct token environment variables. Use `dreamboard 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 Supabase session first if it is close to expiry.\n *\n * The refresh path never mutates `config`. It goes through\n * `RefreshCoordinator`, which owns the cross-process lock and the\n * CredentialStore writes. After a successful 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 effectiveAccessToken = await ensureEffectiveAccessToken(config);\n\n client.setConfig({\n baseUrl: config.apiBaseUrl,\n headers: effectiveAccessToken\n ? { Authorization: `Bearer ${effectiveAccessToken}` }\n : {},\n });\n}\n\nasync function ensureEffectiveAccessToken(\n config: ResolvedConfig,\n): Promise<string | undefined> {\n if (!usesStoredSession(config)) {\n // Env/flag-provided tokens are not owned by CredentialStore and must\n // not be written back. Use them as-is.\n return config.authToken;\n }\n\n if (!config.supabaseUrl || !config.supabaseAnonKey) {\n return config.authToken;\n }\n\n try {\n const result = await ensureFreshAccessToken({\n supabaseUrl: config.supabaseUrl,\n supabaseAnonKey: config.supabaseAnonKey,\n refreshWindowMs: DEFAULT_REFRESH_WINDOW_MS,\n });\n switch (result.kind) {\n case \"missing\":\n return config.authToken;\n case \"unchanged\":\n case \"rotated\":\n return result.credentials.accessToken;\n case \"transient_failure\": {\n const expiry = getAccessTokenExpiry(config.authToken);\n const isExpired = expiry !== null && expiry.getTime() <= Date.now();\n if (isExpired) {\n throw new Error(\n `Access token refresh failed: ${result.message}. ${LOGIN_HINT}`,\n );\n }\n console.warn(\n `Token refresh failed: ${result.message}. Continuing with the existing access token until it expires.`,\n );\n return config.authToken;\n }\n }\n } catch (error) {\n if (error instanceof PermanentRefreshError) {\n throw new Error(formatStoredSessionInvalidMessage(error.message));\n }\n throw error;\n }\n}\n\n/**\n * Explicit \"force a refresh attempt right now\" entrypoint used by\n * `dreamboard auth status`. Returns the resulting credentials or throws\n * a classified error.\n */\nexport async function refreshResolvedAuthSession(\n config: ResolvedConfig,\n): Promise<Credentials | null> {\n if (!usesStoredSession(config)) return null;\n if (!config.supabaseUrl || !config.supabaseAnonKey) return null;\n try {\n const result = await ensureFreshAccessToken({\n supabaseUrl: config.supabaseUrl,\n supabaseAnonKey: config.supabaseAnonKey,\n });\n switch (result.kind) {\n case \"missing\":\n return null;\n case \"unchanged\":\n case \"rotated\":\n return result.credentials;\n case \"transient_failure\":\n return result.credentials;\n }\n } catch (error) {\n if (error instanceof PermanentRefreshError) {\n throw new Error(formatStoredSessionInvalidMessage(error.message));\n }\n throw error;\n }\n}\n\nexport function requireAuth(config: ResolvedConfig): void {\n if (!config.authToken) {\n throw new Error(\n \"Missing Dreamboard session. Run `dreamboard 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 { getAccessTokenExpiry as getAuthTokenExpiry } from \"../auth/refresh-coordinator.js\";\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\nfunction usesStoredSession(config: ResolvedConfig): boolean {\n return (\n config.authTokenSource === \"global\" &&\n config.refreshTokenSource === \"global\"\n );\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 [globalConfig, credentials] = await Promise.all([\n loadGlobalConfig(),\n getStoredSession(),\n ]);\n const config = resolveConfig(globalConfig, flags, projectConfig, credentials);\n\n if (opts?.requireAuth !== false) {\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\", \"dev\", \"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});\n\nconst cloneCommandArgsSchema = configFlagsSchema.extend({\n slug: z.string().min(1),\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 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});\n\nconst authCommandArgsSchema = z.object({\n action: z.enum([\"set\", \"clear\", \"login\", \"env\", \"status\"]),\n tokenValue: z.string().optional(),\n token: z.string().optional(),\n jwt: z.boolean().optional(),\n env: z.enum([\"local\", \"dev\", \"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 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 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","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","export const CONFIG_FLAG_ARGS = {\n env: {\n type: \"string\" as const,\n description: \"Environment: local | dev | prod\",\n },\n token: {\n type: \"string\" as const,\n description: \"Auth token (Supabase JWT)\",\n },\n};\n","import {\n CLIENT_PROBLEM_TYPES,\n SERVER_PROBLEM_TYPES,\n} from \"@dreamboard/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 { ProblemDetails, ProblemViolation } from \"@dreamboard/api-client\";\nimport { zProblemDetails } from \"@dreamboard/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\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\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 \"Run `dreamboard sync --force` to recreate the remote game state from your current local files if this is a local workspace.\",\n \"If you meant to use an existing remote game, check that your selected `--env` points at the backend that has that game.\",\n ].join(\" \");\n }\n\n switch (problem.type) {\n case CLI_PROBLEM_TYPES.UNAUTHORIZED:\n return \"Run `dreamboard 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 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 \"Run `dreamboard sync --force` to recreate the remote source revision from your current local files.\";\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 \"Run `dreamboard pull` to reconcile remote changes before retrying. If this local workspace is the source of truth, rerun the command with `--force` when supported.\";\n case CLI_PROBLEM_TYPES.SOURCE_REVISION_BASE_MISSING:\n case CLI_PROBLEM_TYPES.AUTHORING_STATE_BASE_MISSING:\n return \"Run `dreamboard pull --force` in a clean workspace to recover the remote authored state. If the remote has no authored state, run `dreamboard sync --force` from the local source-of-truth workspace.\";\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 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 {\n createAuthoringState,\n getAuthoringHead,\n type AuthoringState,\n type CreateAuthoringStateRequest,\n} from \"@dreamboard/api-client\";\nimport { toApiProblem, toDreamboardApiError } from \"../../utils/errors.js\";\nimport { CLI_PROBLEM_TYPES } from \"../../utils/problem-types.js\";\n\nexport async function getAuthoringHeadSdk(\n gameId: string,\n): Promise<AuthoringState | null> {\n const { data, error, response } = await getAuthoringHead({\n path: { gameId },\n });\n if (\n error &&\n toApiProblem(error, response, \"Failed to fetch authoring head\").type ===\n CLI_PROBLEM_TYPES.RESOURCE_NOT_FOUND\n ) {\n return null;\n }\n if (error || !data) {\n throw toDreamboardApiError(\n error,\n response,\n \"Failed to fetch authoring head\",\n );\n }\n return data;\n}\n\nexport async function createAuthoringStateSdk(\n gameId: string,\n request: CreateAuthoringStateRequest,\n): Promise<AuthoringState> {\n const { data, error, response } = await createAuthoringState({\n path: { gameId },\n body: request,\n });\n if (error || !data) {\n throw toDreamboardApiError(\n error,\n response,\n \"Failed to create authoring state\",\n );\n }\n return data;\n}\n","import {\n getCompiledResult,\n getJob,\n getLatestCompiledResult,\n listCompiledResults,\n type CompiledResult,\n type JobDetailResponse,\n} from \"@dreamboard/api-client\";\nimport { toDreamboardApiError } from \"../../utils/errors.js\";\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 gameId: string;\n job: Pick<JobDetailResponse, \"createdAt\">;\n}): Promise<CompiledResult | null> {\n const { gameId, job } = options;\n const results = await listCompiledResults({\n path: { gameId },\n query: {\n limit: 100,\n },\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 gameId: string,\n): Promise<CompiledResult | null> {\n const { data } = await getLatestCompiledResult({\n path: { gameId },\n query: { successOnly: true },\n });\n return data ?? null;\n}\n\nexport async function findCompiledResultsForAuthoringState(options: {\n gameId: string;\n authoringStateId: string;\n}): Promise<CompiledResult[]> {\n const { gameId, authoringStateId } = options;\n const { data, error, response } = await listCompiledResults({\n path: { gameId },\n query: {\n limit: 100,\n authoringStateId,\n },\n });\n if (error || !data) {\n throw toDreamboardApiError(\n error,\n response,\n \"Failed to list compiled results\",\n );\n }\n return data.results;\n}\n\nexport async function getCompiledResultSdk(\n gameId: string,\n compiledResultId: string,\n): Promise<CompiledResult> {\n const { data, error, response } = await getCompiledResult({\n path: {\n gameId,\n compiledResultId,\n },\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 waitForCompiledResultJobSdk(options: {\n gameId: string;\n jobId: string;\n onProgress?: (job: JobDetailResponse) => void;\n}): Promise<{\n job: JobDetailResponse;\n compiledResult: CompiledResult;\n}> {\n const { gameId, jobId, onProgress } = options;\n let previousTransitionKey: string | null = null;\n\n for (let attempt = 0; attempt < 180; attempt += 1) {\n const {\n data: job,\n error,\n response,\n } = await getJob({\n path: { jobId },\n });\n if (error || !job) {\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 getCompiledResultSdk(\n gameId,\n compiledResultId,\n );\n return { job, compiledResult };\n }\n\n const fallbackCompiledResult = await findFallbackCompiledResultForJob({\n gameId,\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(1000);\n }\n\n throw new Error(`Compile job ${jobId} did not complete in time.`);\n}\n","import {\n createGame,\n getGame,\n getGameBySlug,\n type CreateGameRequest,\n type Game,\n} from \"@dreamboard/api-client\";\nimport { toApiProblem, toDreamboardApiError } from \"../../utils/errors.js\";\nimport { CLI_PROBLEM_TYPES } from \"../../utils/problem-types.js\";\n\nexport async function getGameSdk(gameId: string): Promise<Game | null> {\n const { data, error, response } = await getGame({\n path: { gameId },\n });\n if (error) {\n const problem = toApiProblem(\n error,\n response,\n `Failed to look up game '${gameId}'`,\n );\n if (problem.type === CLI_PROBLEM_TYPES.RESOURCE_NOT_FOUND) {\n return null;\n }\n throw toDreamboardApiError(\n error,\n response,\n `Failed to look up game '${gameId}'`,\n );\n }\n return data ?? null;\n}\n\nexport async function createGameSdk(request: CreateGameRequest): Promise<Game> {\n const { data, error, response } = await createGame({\n body: request,\n });\n if (error || !data) {\n throw toDreamboardApiError(error, response, \"Failed to create game\");\n }\n return data;\n}\n\n/**\n * Look up a game by slug, returning null only for genuine 404s.\n * Other errors (auth, network, 5xx) are thrown so callers don't\n * silently proceed as if the game doesn't exist.\n */\nexport async function tryGetGameBySlug(\n slug: string,\n opts?: { includeDeleted?: boolean },\n): Promise<Game | null> {\n const { data, error, response } = await getGameBySlug({\n path: { slug },\n query: { includeDeleted: opts?.includeDeleted },\n });\n if (error) {\n const problem = toApiProblem(\n error,\n response,\n `Failed to look up game by slug '${slug}'`,\n );\n if (problem.type === CLI_PROBLEM_TYPES.RESOURCE_NOT_FOUND) {\n return null;\n }\n throw toDreamboardApiError(\n error,\n response,\n `Failed to look up game by slug '${slug}'`,\n );\n }\n return data ?? null;\n}\n","import {\n findManifests,\n getManifest,\n saveManifest,\n} from \"@dreamboard/api-client\";\nimport type { GameTopologyManifest } from \"@dreamboard/sdk-types\";\nimport { toApiProblem, toDreamboardApiError } from \"../../utils/errors.js\";\nimport { CLI_PROBLEM_TYPES } from \"../../utils/problem-types.js\";\n\nexport async function saveManifestSdk(\n gameId: string,\n manifest: GameTopologyManifest,\n ruleId: string,\n): Promise<{ manifestId: string; contentHash: string }> {\n const { data, error, response } = await saveManifest({\n path: { gameId },\n body: {\n manifest,\n ruleId,\n },\n });\n if (error || !data) {\n throw toDreamboardApiError(error, response, \"Failed to save manifest\");\n }\n return { manifestId: data.manifestId, contentHash: data.contentHash };\n}\n\n/**\n * Fetch the latest manifest ID for a game without creating a new version.\n * Returns null if no manifest exists yet.\n */\nexport async function getLatestManifestIdSdk(\n gameId: string,\n ruleId: string,\n): Promise<string | null> {\n const { data, error, response } = await findManifests({\n path: { gameId },\n query: { ruleId, limit: 1 },\n });\n if (error || !data) {\n throw toDreamboardApiError(\n error,\n response,\n \"Failed to get latest manifest\",\n );\n }\n return data.currentManifestId ?? null;\n}\n\n/**\n * Fetch the contentHash of a manifest from the server.\n * The hash is computed server-side (SHA-256 of canonical JSON), so comparing\n * two values returned by this function is always reliable.\n * Returns null if the manifest does not exist.\n */\nexport async function getManifestSdk(\n manifestId: string,\n): Promise<{ contentHash: string } | null> {\n const { data, error, response } = await getManifest({\n path: { manifestId },\n });\n if (error) {\n const problem = toApiProblem(error, response, \"Failed to fetch manifest\");\n if (problem.type === CLI_PROBLEM_TYPES.RESOURCE_NOT_FOUND) {\n return null;\n }\n throw toDreamboardApiError(error, response, \"Failed to fetch manifest\");\n }\n if (!data) return null;\n return { contentHash: data.contentHash };\n}\n\n/**\n * Returns true if the server's current manifest differs from the last push.\n *\n * Both hashes are produced by the backend (SHA-256 of canonical JSON), so\n * there is no cross-language serialisation risk.\n *\n * - `manifestId`: the server-side ID of the manifest to check.\n * - `storedContentHash`: the hash returned by the server after the last\n * `saveManifest` call, stored in project config as `manifestContentHash`.\n *\n * Returns true (treat as changed) when no manifestId or stored hash is known.\n */\nexport async function isManifestDifferentFromServer(\n manifestId: string | null | undefined,\n storedContentHash: string | null | undefined,\n): Promise<boolean> {\n if (!manifestId || !storedContentHash) return true;\n const server = await getManifestSdk(manifestId);\n if (!server) return true;\n return storedContentHash !== server.contentHash;\n}\n","import { getLatestGameRule, createGameRule } from \"@dreamboard/api-client\";\nimport { toDreamboardApiError } from \"../../utils/errors.js\";\n\nexport async function getLatestRuleIdSdk(gameId: string): Promise<string> {\n const { data, error, response } = await getLatestGameRule({\n path: { gameId },\n });\n if (error || !data) {\n throw toDreamboardApiError(error, response, \"Failed to get latest rule\");\n }\n return data.ruleId;\n}\n\nexport async function saveRuleSdk(\n gameId: string,\n ruleText: string,\n): Promise<{ ruleId: string }> {\n const { data, error, response } = await createGameRule({\n path: { gameId },\n body: { ruleText },\n });\n if (error || !data) {\n throw toDreamboardApiError(error, response, \"Failed to save game rule\");\n }\n return { ruleId: data.ruleId };\n}\n","import { uploadInitialProjection } from \"@dreamboard/api-client\";\nimport { toDreamboardApiError } from \"../../utils/errors.js\";\n\nexport async function uploadInitialProjectionSdk(\n gameId: string,\n projectionJson: string,\n): Promise<void> {\n const { error, response } = await uploadInitialProjection({\n path: { gameId },\n body: { projectionJson },\n });\n if (error) {\n throw toDreamboardApiError(\n error,\n response,\n \"Failed to upload initial preview projection\",\n );\n }\n}\n","import { createSourceBlobUploadSession } from \"./sdk.gen.js\";\nimport type {\n SourceBlobUploadDescriptor,\n SourceBlobUploadTarget,\n SourceChangeOperation,\n} from \"./types.gen.js\";\n\nexport type SourceContentChangeOperation =\n | {\n kind: \"upsert\";\n path: string;\n content: string;\n }\n | {\n kind: \"delete\";\n path: string;\n };\n\nconst textEncoder = new TextEncoder();\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\n\nasync function sha256Hex(bytes: Uint8Array): Promise<string> {\n const normalizedBytes = new Uint8Array(bytes.byteLength);\n normalizedBytes.set(bytes);\n const digest = await crypto.subtle.digest(\n \"SHA-256\",\n normalizedBytes.buffer,\n );\n return bytesToHex(new Uint8Array(digest));\n}\n\nfunction getUtf8ByteSize(content: string): number {\n return textEncoder.encode(content).byteLength;\n}\n\nasync function computeSourceContentHash(content: string): Promise<string> {\n return sha256Hex(textEncoder.encode(content));\n}\n\nasync function describeSourceBlob(\n content: string,\n): Promise<SourceBlobUploadDescriptor> {\n return {\n contentHash: await computeSourceContentHash(content),\n byteSize: getUtf8ByteSize(content),\n };\n}\n\nexport async function materializeSourceChangeOperations(\n changes: Iterable<SourceContentChangeOperation>,\n): Promise<{\n blobs: SourceBlobUploadDescriptor[];\n changes: SourceChangeOperation[];\n}> {\n const blobsByHash = new Map<string, SourceBlobUploadDescriptor>();\n const materialized = await Promise.all(\n Array.from(changes, async (change): Promise<SourceChangeOperation> => {\n if (change.kind === \"delete\") {\n return change;\n }\n\n const blob = await describeSourceBlob(change.content);\n const existing = blobsByHash.get(blob.contentHash);\n if (!existing) {\n blobsByHash.set(blob.contentHash, blob);\n }\n\n return {\n kind: \"upsert\",\n path: change.path,\n contentHash: blob.contentHash,\n byteSize: blob.byteSize,\n };\n }),\n );\n\n return {\n blobs: Array.from(blobsByHash.values()).sort((left, right) =>\n left.contentHash.localeCompare(right.contentHash),\n ),\n changes: materialized,\n };\n}\n\nexport type SourceBlobUploadInput = SourceBlobUploadDescriptor & {\n content: string;\n};\n\nexport function mapUpsertBlobContentsByContentHash(\n localChanges: readonly SourceContentChangeOperation[],\n materializedChanges: readonly SourceChangeOperation[],\n): Map<string, SourceBlobUploadInput> {\n const uploadBlobs = new Map<string, SourceBlobUploadInput>();\n const length = Math.min(localChanges.length, materializedChanges.length);\n for (let index = 0; index < length; index += 1) {\n const localChange = localChanges[index];\n const materializedChange = materializedChanges[index];\n if (\n localChange?.kind !== \"upsert\" ||\n materializedChange?.kind !== \"upsert\"\n ) {\n continue;\n }\n\n uploadBlobs.set(materializedChange.contentHash, {\n contentHash: materializedChange.contentHash,\n byteSize: materializedChange.byteSize,\n content: localChange.content,\n });\n }\n\n return uploadBlobs;\n}\n\nclass SourceBlobUploadError extends Error {\n readonly status: number;\n readonly details: string;\n\n constructor(status: number, details: string) {\n const suffix = details.trim().length > 0 ? `: ${details.trim()}` : \"\";\n super(`Failed to upload source blob (HTTP ${status}${suffix})`);\n this.name = \"SourceBlobUploadError\";\n this.status = status;\n this.details = details;\n }\n}\n\nfunction isDuplicateDirectUploadError(\n error: unknown,\n): error is SourceBlobUploadError {\n if (!(error instanceof SourceBlobUploadError)) {\n return false;\n }\n\n if (error.status === 409) {\n return true;\n }\n\n const normalizedDetails = error.details.toLowerCase();\n return (\n normalizedDetails.includes(\"duplicate\") ||\n normalizedDetails.includes(\"already exists\") ||\n normalizedDetails.includes(\"resource already exists\")\n );\n}\n\nasync function uploadSourceBlob(\n uploadTarget: SourceBlobUploadTarget,\n content: string,\n): Promise<void> {\n const response = await fetch(uploadTarget.url, {\n method: uploadTarget.method,\n headers: uploadTarget.headers,\n body: textEncoder.encode(content),\n });\n\n if (response.ok) {\n return;\n }\n\n const details = await response.text().catch(() => \"\");\n throw new SourceBlobUploadError(response.status, details);\n}\n\nexport class SourceBlobSessionRequestError extends Error {\n readonly apiError: unknown;\n readonly response: Response | undefined;\n\n constructor(\n message: string,\n apiError: unknown,\n response: Response | undefined,\n ) {\n super(message);\n this.name = \"SourceBlobSessionRequestError\";\n this.apiError = apiError;\n this.response = response;\n }\n}\n\nasync function confirmSourceBlobAlreadyExists(options: {\n gameId: string;\n blob: SourceBlobUploadInput;\n}): Promise<boolean> {\n const { gameId, blob } = options;\n const { data, error, response } = await createSourceBlobUploadSession({\n path: { gameId },\n body: {\n blobs: [\n {\n contentHash: blob.contentHash,\n byteSize: blob.byteSize,\n },\n ],\n },\n });\n\n if (error || !data) {\n throw new SourceBlobSessionRequestError(\n \"Failed to create source blob upload session\",\n error,\n response,\n );\n }\n\n return data.uploads[0]?.status === \"exists\";\n}\n\nexport async function uploadGameSourceBlobs(options: {\n gameId: string;\n blobs: SourceBlobUploadInput[];\n}): Promise<void> {\n const { gameId, blobs } = options;\n const uniqueBlobs = new Map<string, SourceBlobUploadInput>();\n for (const blob of blobs) {\n const existing = uniqueBlobs.get(blob.contentHash);\n if (!existing) {\n uniqueBlobs.set(blob.contentHash, blob);\n continue;\n }\n\n if (existing.byteSize !== blob.byteSize) {\n throw new Error(\n `Source blob ${blob.contentHash} has conflicting byte sizes.`,\n );\n }\n }\n\n if (uniqueBlobs.size === 0) {\n return;\n }\n\n const { data, error, response } = await createSourceBlobUploadSession({\n path: { gameId },\n body: {\n blobs: Array.from(uniqueBlobs.values(), ({ contentHash, byteSize }) => ({\n contentHash,\n byteSize,\n })),\n },\n });\n\n if (error || !data) {\n throw new SourceBlobSessionRequestError(\n \"Failed to create source blob upload session\",\n error,\n response,\n );\n }\n\n for (const upload of data.uploads) {\n if (upload.status !== \"upload_required\") {\n continue;\n }\n\n const blob = uniqueBlobs.get(upload.contentHash);\n if (!blob) {\n throw new Error(\n `Upload session referenced unknown source blob ${upload.contentHash}.`,\n );\n }\n if (!upload.uploadTarget) {\n throw new Error(\n `Upload target missing for source blob ${upload.contentHash}.`,\n );\n }\n\n try {\n await uploadSourceBlob(upload.uploadTarget, blob.content);\n } catch (error) {\n if (\n isDuplicateDirectUploadError(error) &&\n (await confirmSourceBlobAlreadyExists({ gameId, blob }))\n ) {\n continue;\n }\n throw error;\n }\n }\n}\n","import {\n createSourceRevision,\n type CreateSourceRevisionRequest,\n queueCompiledResultJob,\n type QueueCompiledResultJobResponse,\n type SourceRevision,\n} from \"@dreamboard/api-client\";\nimport {\n SourceBlobSessionRequestError,\n uploadGameSourceBlobs,\n type SourceBlobUploadInput,\n} from \"@dreamboard/api-client/source-revisions\";\nimport { toDreamboardApiError } from \"../../utils/errors.js\";\n\nexport async function createSourceRevisionSdk(\n gameId: string,\n request: CreateSourceRevisionRequest,\n): Promise<SourceRevision> {\n const response = await createSourceRevision({\n path: { gameId },\n body: request,\n });\n\n if (response.error || !response.data) {\n throw toDreamboardApiError(\n response.error,\n response.response,\n \"Failed to create source revision\",\n );\n }\n\n return response.data;\n}\n\nexport async function uploadSourceBlobsSdk(\n gameId: string,\n blobs: SourceBlobUploadInput[],\n): Promise<void> {\n try {\n await uploadGameSourceBlobs({ gameId, blobs });\n } catch (error) {\n if (error instanceof SourceBlobSessionRequestError) {\n throw toDreamboardApiError(\n error.apiError as Parameters<typeof toDreamboardApiError>[0],\n error.response,\n error.message,\n );\n }\n throw error;\n }\n}\n\nexport async function queueCompiledResultJobSdk(options: {\n gameId: string;\n authoringStateId: string;\n}): Promise<QueueCompiledResultJobResponse> {\n const { gameId, authoringStateId } = options;\n const { data, error, response } = await queueCompiledResultJob({\n path: { gameId },\n body: {\n authoringStateId,\n },\n });\n\n if (error || !data) {\n throw toDreamboardApiError(error, response, \"Failed to create compile job\");\n }\n\n return data;\n}\n","import { readdir, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { GameTopologyManifest } from \"@dreamboard/sdk-types\";\nimport {\n PROJECT_DIR_NAME,\n MANIFEST_FILE,\n RULE_FILE,\n SNAPSHOT_FILE,\n LOCAL_IGNORE_DIRS,\n} from \"../../constants.js\";\nimport type { Snapshot } from \"../../types.js\";\nimport {\n readJsonFile,\n readTextFile,\n readTextFileIfExists,\n writeTextFile,\n} from \"../../utils/fs.js\";\nimport { atomicWriteFile } from \"../../utils/atomic-file.js\";\nimport { hashContent } from \"../../utils/crypto.js\";\nimport {\n computeManifestHash,\n materializeManifest,\n writeManifestSource,\n} from \"./manifest-authoring.js\";\nimport {\n isAllowedGamePath as isAllowedPathFromOwnership,\n isDynamicGeneratedPath,\n isLibraryPath as isLibraryPathFromOwnership,\n} from \"./scaffold-ownership.js\";\n\n/**\n * Returns true when a path is inside the canonical game project structure.\n * Anything outside app/, ui/, shared/, or the known root files is rejected.\n */\nexport function isAllowedGamePath(filePath: string): boolean {\n return isAllowedPathFromOwnership(filePath);\n}\n\nexport function isLibraryPath(filePath: string): boolean {\n return isLibraryPathFromOwnership(filePath);\n}\n\ntype WriteDecision = \"write\" | \"skip\";\n\n/**\n * Decide whether a file from the scaffold response should be written to disk.\n *\n * - Library files → always overwrite (they are fully generated).\n * - Everything else → only write if the file does not yet exist or is empty\n * locally (first-time seeding; preserves user edits).\n */\nfunction shouldWriteScaffoldFile(\n filePath: string,\n existingContent: string | null,\n): WriteDecision {\n if (isLibraryPath(filePath)) return \"write\";\n const hasContent =\n existingContent !== null && existingContent.trim().length > 0;\n return hasContent ? \"skip\" : \"write\";\n}\n\nexport async function writeSourceFiles(\n rootDir: string,\n files: Record<string, string | null>,\n): Promise<void> {\n for (const [relativePath, content] of Object.entries(files)) {\n if (content === null || content === undefined) continue;\n const filePath = path.join(rootDir, relativePath);\n await writeTextFile(filePath, content);\n }\n}\n\nexport interface ScaffoldWriteResult {\n written: string[];\n skipped: string[];\n}\n\n/**\n * Write scaffold files using local-merge logic.\n *\n * - Library files are always overwritten.\n * - User-owned files (phases, components, etc.) are only written when the\n * local file does not exist or is empty. Files with content are skipped\n * so user edits are never lost.\n *\n * Returns lists of files that were written (and actually changed) and files\n * that were skipped because a non-empty local copy already exists.\n */\nexport async function writeScaffoldFiles(\n rootDir: string,\n files: Record<string, string | null>,\n): Promise<ScaffoldWriteResult> {\n const written: string[] = [];\n const skipped: string[] = [];\n\n for (const [relativePath, content] of Object.entries(files)) {\n if (content === null || content === undefined) continue;\n\n const fullPath = path.join(rootDir, relativePath);\n const existingContent = await readTextFileIfExists(fullPath);\n\n const decision = shouldWriteScaffoldFile(relativePath, existingContent);\n\n if (decision === \"skip\") {\n skipped.push(relativePath);\n continue;\n }\n\n await writeTextFile(fullPath, content);\n\n if (existingContent !== content) {\n written.push(relativePath);\n }\n }\n\n written.sort();\n skipped.sort();\n return { written, skipped };\n}\n\nexport async function removeExtraneousFiles(\n rootDir: string,\n keep: Set<string>,\n): Promise<void> {\n const localFiles = await collectLocalFiles(rootDir);\n for (const filePath of Object.keys(localFiles)) {\n if (filePath === MANIFEST_FILE || filePath === RULE_FILE) continue;\n if (!keep.has(filePath)) {\n await unlink(path.join(rootDir, filePath));\n }\n }\n}\n\nexport async function collectLocalFiles(\n rootDir: string,\n): Promise<Record<string, string>> {\n const result: Record<string, string> = {};\n await walkDir(rootDir, rootDir, result);\n return result;\n}\n\nexport async function walkDir(\n rootDir: string,\n currentDir: string,\n result: Record<string, string>,\n): Promise<void> {\n const entries = await readdir(currentDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (LOCAL_IGNORE_DIRS.has(entry.name)) continue;\n await walkDir(rootDir, path.join(currentDir, entry.name), result);\n } else if (entry.isFile()) {\n const filePath = path.join(currentDir, entry.name);\n const relativePath = path.relative(rootDir, filePath);\n result[relativePath] = await readTextFile(filePath);\n }\n }\n}\n\nexport async function writeManifest(\n rootDir: string,\n manifest: GameTopologyManifest,\n): Promise<void> {\n await writeManifestSource(rootDir, manifest);\n}\n\nexport async function writeRule(\n rootDir: string,\n ruleText: string,\n): Promise<void> {\n const filePath = path.join(rootDir, RULE_FILE);\n await writeTextFile(filePath, ruleText);\n}\n\nexport async function loadManifest(\n rootDir: string,\n): Promise<GameTopologyManifest> {\n return materializeManifest(rootDir);\n}\n\nexport { computeManifestHash };\n\nexport async function loadRule(rootDir: string): Promise<string> {\n const filePath = path.join(rootDir, RULE_FILE);\n return readTextFile(filePath);\n}\n\nexport async function writeSnapshot(rootDir: string): Promise<void> {\n const files = await collectLocalFiles(rootDir);\n await writeSnapshotFromFiles(rootDir, files);\n}\n\nexport async function writeSnapshotFromFiles(\n rootDir: string,\n files: Record<string, string>,\n): Promise<void> {\n const snapshot: Snapshot = {\n files: {},\n };\n\n for (const [filePath, content] of Object.entries(files)) {\n if (filePath.startsWith(`${PROJECT_DIR_NAME}/`)) continue;\n if (isDynamicGeneratedPath(filePath)) continue;\n snapshot.files[filePath] = hashContent(content);\n }\n\n const snapshotPath = path.join(rootDir, PROJECT_DIR_NAME, SNAPSHOT_FILE);\n // Atomic write: a crash mid-snapshot (e.g. user kills a long `dreamboard\n // sync`) must not leave `.dreamboard/snapshot.json` truncated, or\n // `getLocalDiff` will silently report everything as \"added\" on the\n // next run and force a full re-sync.\n await atomicWriteFile(\n snapshotPath,\n `${JSON.stringify(snapshot, null, 2)}\\n`,\n { mode: 0o644 },\n );\n}\n\nfunction isIgnorableLocalDiffPath(filePath: string): boolean {\n return (\n filePath.startsWith(\"test/generated/\") ||\n filePath.startsWith(\".playwright-cli/\")\n );\n}\n\nexport async function getLocalDiff(rootDir: string): Promise<{\n modified: string[];\n added: string[];\n deleted: string[];\n}> {\n const snapshotPath = path.join(rootDir, PROJECT_DIR_NAME, SNAPSHOT_FILE);\n const snapshot = await readJsonFile<Snapshot>(snapshotPath).catch(() => null);\n if (!snapshot) {\n return { modified: [], added: [], deleted: [] };\n }\n\n const files = await collectLocalFiles(rootDir);\n const currentHashes: Record<string, string> = {};\n\n for (const [filePath, content] of Object.entries(files)) {\n if (filePath.startsWith(`${PROJECT_DIR_NAME}/`)) continue;\n if (isIgnorableLocalDiffPath(filePath)) continue;\n if (isDynamicGeneratedPath(filePath)) continue;\n currentHashes[filePath] = hashContent(content);\n }\n\n const modified: string[] = [];\n const added: string[] = [];\n const deleted: string[] = [];\n\n for (const [filePath, hash] of Object.entries(currentHashes)) {\n const prevHash = snapshot.files[filePath];\n if (!prevHash) {\n added.push(filePath);\n } else if (prevHash !== hash) {\n modified.push(filePath);\n }\n }\n\n for (const filePath of Object.keys(snapshot.files)) {\n if (isIgnorableLocalDiffPath(filePath)) continue;\n if (isDynamicGeneratedPath(filePath)) continue;\n if (!currentHashes[filePath]) {\n deleted.push(filePath);\n }\n }\n\n return { modified, added, deleted };\n}\n","import crypto from \"node:crypto\";\n\nexport function hashContent(content: string): string {\n return crypto.createHash(\"sha256\").update(content, \"utf8\").digest(\"hex\");\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 { zGameTopologyManifest } from \"@dreamboard/api-client\";\nimport type { GameTopologyManifest } from \"@dreamboard/sdk-types\";\nimport { validateManifestAuthoring } from \"@dreamboard/workspace-codegen\";\nimport { MANIFEST_FILE, MATERIALIZED_MANIFEST_FILE } from \"../../constants.js\";\nimport { createRepoLocalPackageResolutionPlugin } from \"../../utils/repo-local-package-resolution.js\";\nimport { hashContent } from \"../../utils/crypto.js\";\nimport {\n exists,\n readTextFile,\n writeJsonFile,\n writeTextFile,\n} from \"../../utils/fs.js\";\n\nfunction formatIssuePath(pathSegments: ReadonlyArray<string | number>): string {\n if (pathSegments.length === 0) {\n return \"manifest\";\n }\n\n return `manifest${pathSegments\n .map((segment) =>\n typeof segment === \"number\" ? `[${segment}]` : `.${segment}`,\n )\n .join(\"\")}`;\n}\n\nfunction formatManifestValidationError(manifest: unknown): string {\n const parsedManifest = zGameTopologyManifest.strict().safeParse(manifest);\n if (!parsedManifest.success) {\n const lines = parsedManifest.error.issues.map((issue) => {\n const issuePath = formatIssuePath(\n issue.path.filter(\n (segment): segment is string | number =>\n typeof segment === \"string\" || typeof segment === \"number\",\n ),\n );\n return `${issuePath}: ${issue.message}`;\n });\n\n return `Invalid manifest:\\n- ${lines.join(\"\\n- \")}`;\n }\n\n const validationResult = validateManifestAuthoring(\n parsedManifest.data as GameTopologyManifest,\n );\n if (validationResult.errors.length > 0) {\n return `Invalid manifest:\\n- ${validationResult.errors.join(\"\\n- \")}`;\n }\n if (validationResult.warnings.length > 0) {\n console.warn(\n `Manifest warnings:\\n- ${validationResult.warnings.join(\"\\n- \")}`,\n );\n }\n\n return \"\";\n}\n\nfunction sortJsonKeys(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((item) => sortJsonKeys(item));\n }\n\n if (value && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, item]) => [key, sortJsonKeys(item)]),\n );\n }\n\n return value;\n}\n\nexport function computeManifestHash(manifest: GameTopologyManifest): string {\n return hashContent(JSON.stringify(sortJsonKeys(manifest)));\n}\n\nasync function evaluateManifestSource(\n projectRoot: string,\n): Promise<GameTopologyManifest> {\n const manifestPath = `${projectRoot}/${MANIFEST_FILE}`;\n if (!(await exists(manifestPath))) {\n throw new Error(`Missing ${MANIFEST_FILE}.`);\n }\n\n let outputText: string | undefined;\n try {\n const buildResult = await build({\n absWorkingDir: projectRoot,\n entryPoints: [MANIFEST_FILE],\n bundle: true,\n format: \"esm\",\n platform: \"node\",\n target: [\"node20\"],\n write: false,\n logLevel: \"silent\",\n plugins: [createRepoLocalPackageResolutionPlugin()],\n });\n outputText = buildResult.outputFiles[0]?.text;\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown bundle failure\";\n throw new Error(`Failed to evaluate ${MANIFEST_FILE}: ${message}`);\n }\n\n if (!outputText) {\n throw new Error(\n `Failed to evaluate ${MANIFEST_FILE}: no bundled module was produced.`,\n );\n }\n\n let moduleRecord: { default?: unknown };\n const tempRoot = await mkdtemp(path.join(tmpdir(), \"dreamboard-manifest-\"));\n const bundlePath = path.join(tempRoot, \"manifest.mjs\");\n try {\n await writeFile(bundlePath, outputText, \"utf8\");\n moduleRecord = (await import(\n `${pathToFileURL(bundlePath).href}?t=${Date.now()}`\n )) as {\n default?: unknown;\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`Failed to evaluate ${MANIFEST_FILE}: ${message}`);\n } finally {\n await rm(tempRoot, { recursive: true, force: true });\n }\n\n if (moduleRecord.default === undefined) {\n throw new Error(\n `${MANIFEST_FILE} must default-export defineTopologyManifest(...).`,\n );\n }\n\n const validationError = formatManifestValidationError(moduleRecord.default);\n if (validationError) {\n throw new Error(validationError);\n }\n\n return moduleRecord.default as GameTopologyManifest;\n}\n\nexport function renderManifestSource(manifest: GameTopologyManifest): string {\n return [\n 'import { defineTopologyManifest } from \"@dreamboard/sdk-types\";',\n \"\",\n \"export default defineTopologyManifest(\",\n `${JSON.stringify(manifest, null, 2)}`,\n \");\",\n \"\",\n ].join(\"\\n\");\n}\n\nexport async function materializeManifest(\n projectRoot: string,\n): Promise<GameTopologyManifest> {\n const manifest = await evaluateManifestSource(projectRoot);\n await writeJsonFile(`${projectRoot}/${MATERIALIZED_MANIFEST_FILE}`, manifest);\n return manifest;\n}\n\nexport async function readMaterializedManifestText(\n projectRoot: string,\n): Promise<string> {\n await materializeManifest(projectRoot);\n return readTextFile(`${projectRoot}/${MATERIALIZED_MANIFEST_FILE}`);\n}\n\nexport async function writeManifestSource(\n projectRoot: string,\n manifest: GameTopologyManifest,\n): Promise<void> {\n await writeTextFile(\n `${projectRoot}/${MANIFEST_FILE}`,\n renderManifestSource(manifest),\n );\n await writeJsonFile(`${projectRoot}/${MATERIALIZED_MANIFEST_FILE}`, manifest);\n}\n","import type { HexSpaceSpec, HexVertexRef } from \"@dreamboard/sdk-types\";\n\nconst HEX_CORNERS = [\"ne-e\", \"e-se\", \"se-sw\", \"sw-w\", \"w-nw\", \"nw-ne\"] as const;\ntype HexCorner = (typeof HEX_CORNERS)[number];\n\nconst HEX_CORNER_OFFSETS: Record<HexCorner, readonly [number, number, number]> =\n {\n \"ne-e\": [2, -1, -1],\n \"e-se\": [1, -2, 1],\n \"se-sw\": [-1, -1, 2],\n \"sw-w\": [-2, 1, 1],\n \"w-nw\": [-1, 2, -1],\n \"nw-ne\": [1, 1, -2],\n };\n\nfunction cubeFromAxial(\n space: Pick<HexSpaceSpec, \"q\" | \"r\">,\n): readonly [number, number, number] {\n const x = space.q;\n const z = space.r;\n return [x, -x - z, z] as const;\n}\n\nfunction cornerGeometryKey(\n space: Pick<HexSpaceSpec, \"q\" | \"r\">,\n corner: HexCorner,\n): string {\n const [x, y, z] = cubeFromAxial(space);\n const [dx, dy, dz] = HEX_CORNER_OFFSETS[corner];\n return `${3 * x + dx},${3 * y + dy},${3 * z + dz}`;\n}\n\nexport function resolveHexVertexGeometryKey(\n ref: HexVertexRef,\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\n): string {\n const resolvedSpaces = [...ref.spaces]\n .sort((left, right) => left.localeCompare(right))\n .map((spaceId) => {\n const space = spacesById.get(spaceId);\n if (!space) {\n throw new Error(\n `Hex vertex ref references unknown space '${spaceId}'.`,\n );\n }\n return space;\n });\n const keyCounts = new Map<string, number>();\n for (const space of resolvedSpaces) {\n for (const corner of HEX_CORNERS) {\n const key = cornerGeometryKey(space, corner);\n keyCounts.set(key, (keyCounts.get(key) ?? 0) + 1);\n }\n }\n const candidates = [...keyCounts.entries()]\n .filter(([, count]) => count === resolvedSpaces.length)\n .map(([key]) => key)\n .sort((left, right) => left.localeCompare(right));\n if (candidates.length !== 1) {\n throw new Error(\n `Hex vertex ref spaces '${ref.spaces.join(\", \")}' do not resolve to exactly one shared vertex.`,\n );\n }\n const vertexKey = candidates[0];\n if (vertexKey === undefined) {\n throw new Error(\"internal: expected exactly one hex vertex geometry key\");\n }\n return vertexKey;\n}\n","import type {\n BoardCard,\n GameTopologyManifest,\n ManualCardSetDefinition,\n ObjectSchema,\n PresetCardSetDefinition,\n PropertySchema,\n} from \"@dreamboard/sdk-types\";\n\nconst STANDARD_DECK_ID = \"standard_52_deck\";\n\nfunction createEnumPropertySchema(\n enums: string[],\n description: string,\n): PropertySchema {\n return {\n type: \"enum\",\n description,\n enums,\n };\n}\n\nfunction createStringPropertySchema(description: string): PropertySchema {\n return {\n type: \"string\",\n description,\n };\n}\n\nexport function createStandard52CardDeck(): ManualCardSetDefinition {\n const suits = [\"SPADES\", \"HEARTS\", \"CLUBS\", \"DIAMONDS\"];\n const ranks = [\n \"3\",\n \"4\",\n \"5\",\n \"6\",\n \"7\",\n \"8\",\n \"9\",\n \"10\",\n \"J\",\n \"Q\",\n \"K\",\n \"A\",\n \"2\",\n ];\n\n const cards: BoardCard[] = [];\n for (const suit of suits) {\n for (const rank of ranks) {\n cards.push({\n type: `${suit}_${rank}`,\n name: `${rank} of ${suit}`,\n imageUrl: `/cards/${suit.toLowerCase()}_${rank.toLowerCase()}.png`,\n text: `A playing card: ${rank} of ${suit}. Value: ${getBigTwoCardValue(rank)}, Suit value: ${getSuitValue(suit)}`,\n count: 1,\n cardType: `${suit}_${rank}`,\n properties: {\n suit,\n rank,\n },\n });\n }\n }\n\n return {\n id: STANDARD_DECK_ID,\n name: \"Standard 52-Card Deck\",\n type: \"manual\",\n cards,\n cardSchema: {\n properties: {\n suit: createEnumPropertySchema(\n [\"SPADES\", \"HEARTS\", \"CLUBS\", \"DIAMONDS\"],\n \"The suit of the card\",\n ),\n rank: createStringPropertySchema(\"The rank of the card\"),\n },\n } satisfies ObjectSchema,\n };\n}\n\nexport function addStandardDecksIfNeeded(\n manifest: GameTopologyManifest,\n): GameTopologyManifest {\n return {\n ...manifest,\n cardSets: manifest.cardSets.map((cardSet) =>\n cardSet.type === \"preset\" && cardSet.presetId === STANDARD_DECK_ID\n ? {\n ...createStandard52CardDeck(),\n id: cardSet.id,\n name: cardSet.name,\n }\n : cardSet,\n ),\n };\n}\n\nexport function materializePresetCardSet(\n presetCardSet: PresetCardSetDefinition,\n): ManualCardSetDefinition {\n if (presetCardSet.presetId !== STANDARD_DECK_ID) {\n throw new Error(`Unsupported preset deck: ${presetCardSet.presetId}`);\n }\n\n const standardDeck = createStandard52CardDeck();\n return {\n ...standardDeck,\n id: presetCardSet.id,\n name: presetCardSet.name,\n };\n}\n\nexport function materializeCardSet(\n cardSet: GameTopologyManifest[\"cardSets\"][number],\n): ManualCardSetDefinition {\n return cardSet.type === \"manual\"\n ? cardSet\n : materializePresetCardSet(cardSet);\n}\n\nfunction getBigTwoCardValue(rank: string): number {\n switch (rank) {\n case \"3\":\n return 3;\n case \"4\":\n return 4;\n case \"5\":\n return 5;\n case \"6\":\n return 6;\n case \"7\":\n return 7;\n case \"8\":\n return 8;\n case \"9\":\n return 9;\n case \"10\":\n return 10;\n case \"J\":\n return 11;\n case \"Q\":\n return 12;\n case \"K\":\n return 13;\n case \"A\":\n return 14;\n case \"2\":\n return 15;\n default:\n return 0;\n }\n}\n\nfunction getSuitValue(suit: string): number {\n switch (suit) {\n case \"DIAMONDS\":\n return 1;\n case \"CLUBS\":\n return 2;\n case \"HEARTS\":\n return 3;\n case \"SPADES\":\n return 4;\n default:\n return 0;\n }\n}\n","import type {\n BoardEdgeRef,\n BoardContainerSpec,\n BoardCard,\n BoardRelationSpec,\n BoardSpec,\n BoardSpaceSpec,\n BoardTemplateSpec,\n BoardVertexRef,\n GameTopologyManifest,\n GenericBoardSpec,\n GenericBoardTemplateSpec,\n HexBoardSpec,\n HexBoardTemplateSpec,\n HexEdgeRef,\n HexEdgeSpec,\n HexSpaceSpec,\n HexVertexRef,\n HexVertexSpec,\n DieSeedSpec,\n ManualCardSetDefinition,\n ObjectSchema,\n PieceSeedSpec,\n PropertySchema,\n SquareBoardSpec,\n SquareBoardTemplateSpec,\n SquareEdgeSpec,\n SquareSpaceSpec,\n SquareVertexSpec,\n ZoneSpec,\n} from \"@dreamboard/sdk-types\";\nimport { resolveHexVertexGeometryKey } from \"./hex-geometry.js\";\nimport {\n addStandardDecksIfNeeded,\n materializeCardSet,\n} from \"./preset-card-sets.js\";\n\ninterface AnalyzedGenericBoard {\n layout: \"generic\";\n board: GenericBoardSpec;\n template?: GenericBoardTemplateSpec;\n boardTypeId?: string | null;\n runtimeBoardIds: string[];\n boardFieldsSchema?: ObjectSchema | null;\n spaceFieldsSchema?: ObjectSchema | null;\n relationFieldsSchema?: ObjectSchema | null;\n containerFieldsSchema?: ObjectSchema | null;\n spaces: BoardSpaceSpec[];\n relations: BoardRelationSpec[];\n containers: BoardContainerSpec[];\n}\n\ninterface AnalyzedHexBoard {\n layout: \"hex\";\n board: HexBoardSpec;\n template?: HexBoardTemplateSpec;\n boardTypeId?: string | null;\n runtimeBoardIds: string[];\n boardFieldsSchema?: ObjectSchema | null;\n spaceFieldsSchema?: ObjectSchema | null;\n edgeFieldsSchema?: ObjectSchema | null;\n vertexFieldsSchema?: ObjectSchema | null;\n spaces: HexSpaceSpec[];\n authoredEdges: Array<{\n id: string;\n ref: HexEdgeRef;\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n authoredVertices: Array<{\n id: string;\n ref: HexVertexRef;\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n edges: Array<{\n id: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n vertices: Array<{\n id: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n}\n\ninterface AnalyzedSquareBoard {\n layout: \"square\";\n board: SquareBoardSpec;\n template?: SquareBoardTemplateSpec;\n boardTypeId?: string | null;\n runtimeBoardIds: string[];\n boardFieldsSchema?: ObjectSchema | null;\n spaceFieldsSchema?: ObjectSchema | null;\n relationFieldsSchema?: ObjectSchema | null;\n containerFieldsSchema?: ObjectSchema | null;\n edgeFieldsSchema?: ObjectSchema | null;\n vertexFieldsSchema?: ObjectSchema | null;\n spaces: SquareSpaceSpec[];\n relations: BoardRelationSpec[];\n containers: BoardContainerSpec[];\n edges: Array<{\n id: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n vertices: Array<{\n id: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n }>;\n}\n\ntype AnalyzedBoard =\n | AnalyzedGenericBoard\n | AnalyzedHexBoard\n | AnalyzedSquareBoard;\n\ninterface ManifestAnalysis {\n manifest: GameTopologyManifest;\n playerIds: string[];\n sharedZones: ZoneSpec[];\n playerZones: ZoneSpec[];\n zoneIds: string[];\n cardSets: ManualCardSetDefinition[];\n cardSetIds: string[];\n cardTypes: string[];\n cardIds: string[];\n cardSetIdByCardId: Map<string, string>;\n cardTypeByCardId: Map<string, string>;\n sharedZoneCardSetIds: Map<string, string[]>;\n sharedZoneIdsByCardSetId: Map<string, string[]>;\n homeSharedZoneIdsByCardType: Map<string, string[]>;\n homeSharedZoneIdByCardType: Map<string, string>;\n playerZoneCardSetIds: Map<string, string[]>;\n zoneCardSetIdsById: Map<string, string[]>;\n zoneVisibilityById: Map<string, string>;\n resourceIds: string[];\n resourcePresentationById: Record<\n string,\n { label: string; icon?: string | null }\n >;\n setupOptionIds: string[];\n setupProfileIds: string[];\n setupChoiceIdsByOptionId: Map<string, string[]>;\n setupOptionsById: Record<\n string,\n {\n id: string;\n name: string;\n description?: string | null;\n choices: ReadonlyArray<{\n id: string;\n label: string;\n description?: string | null;\n }>;\n }\n >;\n setupProfilesById: Record<\n string,\n {\n id: string;\n name: string;\n description?: string | null;\n optionValues?: Record<string, string> | null;\n }\n >;\n pieceTypeIds: string[];\n pieceIds: string[];\n pieceTypeIdByPieceId: Map<string, string>;\n dieTypeIds: string[];\n dieIds: string[];\n dieTypeIdByDieId: Map<string, string>;\n strictSlotHosts: Array<{\n kind: \"piece\" | \"die\";\n id: string;\n slotIds: string[];\n }>;\n boardTemplateIds: string[];\n boardBaseIds: string[];\n boardIds: string[];\n boardContainerIds: string[];\n boardTypeIds: string[];\n boardLayoutById: Map<string, string>;\n boardIdsByLayout: Map<string, string[]>;\n boardBaseIdsByLayout: Map<string, string[]>;\n boardIdsByBaseId: Map<string, string[]>;\n boardBaseIdsByTemplateId: Map<string, string[]>;\n boardTemplateLayoutById: Map<string, string>;\n boardIdsByTypeId: Map<string, string[]>;\n spaceIdsByBoardId: Map<string, string[]>;\n spaceTypeIdByBoardId: Map<string, Record<string, string | null>>;\n spaceIdsByTypeId: Map<string, string[]>;\n containerIdsByBoardId: Map<string, string[]>;\n containerHostByBoardId: Map<\n string,\n Record<string, { type: \"board\" } | { type: \"space\"; spaceId: string }>\n >;\n relationTypeIds: string[];\n relationTypeIdsByBoardId: Map<string, string[]>;\n edgeIds: string[];\n edgeTypeIds: string[];\n edgeIdsByTypeId: Map<string, string[]>;\n edgeIdsByBoardIdAndTypeId: Map<string, Record<string, string[]>>;\n vertexIds: string[];\n vertexTypeIds: string[];\n vertexIdsByTypeId: Map<string, string[]>;\n vertexIdsByBoardIdAndTypeId: Map<string, Record<string, string[]>>;\n spaceIds: string[];\n spaceTypeIds: string[];\n analyzedBoards: AnalyzedBoard[];\n pieceTypeSchemasById: Map<string, ObjectSchema | null | undefined>;\n dieTypeSchemasById: Map<string, ObjectSchema | null | undefined>;\n}\n\ntype CardPropertySchemaVariants = {\n shared?: Record<string, PropertySchema>;\n variants: Record<string, ObjectSchema>;\n};\n\ntype CardPropertySchema = ObjectSchema | CardPropertySchemaVariants;\n\nfunction isCardPropertySchemaVariants(\n schema: CardPropertySchema | null | undefined,\n): schema is CardPropertySchemaVariants {\n return Boolean(schema && \"variants\" in schema);\n}\n\nfunction mergeSharedCardProperties(\n schema: CardPropertySchemaVariants,\n cardType: string,\n): ObjectSchema | null {\n const variant = schema.variants[cardType];\n if (!variant) {\n return null;\n }\n return {\n properties: {\n ...(schema.shared ?? {}),\n ...variant.properties,\n },\n };\n}\n\nfunction hasPropertySchemaDefault(\n property: PropertySchema | null | undefined,\n): property is PropertySchema & { default: unknown } {\n return Boolean(property && \"default\" in property);\n}\n\nfunction quote(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction toPascalCase(input: string): string {\n return input\n .split(/[_-]/g)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n}\n\nfunction toHandleKey(input: string): string {\n if (!/[_-]/.test(input)) {\n return input.charAt(0).toLowerCase() + input.slice(1);\n }\n const [first = \"\", ...rest] = input.split(/[_-]/g).filter(Boolean);\n return [\n first.toLowerCase(),\n ...rest.map((part) => {\n const lower = part.toLowerCase();\n return lower.charAt(0).toUpperCase() + lower.slice(1);\n }),\n ].join(\"\");\n}\n\nfunction renderBlocks(blocks: Array<string | null | undefined>): string {\n return blocks.filter((block): block is string => Boolean(block)).join(\"\\n\\n\");\n}\n\nfunction dedupeSorted(values: Iterable<string>): string[] {\n return Array.from(new Set(values)).sort();\n}\n\nfunction renderConstArray(values: readonly string[]): string {\n return `[${values.map((value) => quote(value)).join(\", \")}] as const`;\n}\n\nfunction renderStringUnion(\n values: readonly string[],\n fallback = \"never\",\n): string {\n return values.length > 0\n ? values.map((value) => quote(value)).join(\" | \")\n : fallback;\n}\n\nfunction renderStringRecord(\n entries: Iterable<readonly [string, string]>,\n): string {\n const lines = Array.from(entries)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, value]) => ` ${quote(key)}: ${quote(value)},`);\n return `{\\n${lines.join(\"\\n\")}\\n} as const`;\n}\n\nfunction renderReadonlyArrayRecord(\n entries: Iterable<readonly [string, readonly string[]]>,\n): string {\n const lines = Array.from(entries)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(\n ([key, values]) =>\n ` ${quote(key)}: [${values.map((value) => quote(value)).join(\", \")}] as const,`,\n );\n return `{\\n${lines.join(\"\\n\")}\\n} as const`;\n}\n\nfunction renderJsonConst(value: unknown): string {\n return `${JSON.stringify(value, null, 2)} as const`;\n}\n\ninterface GeneratedIdFamily {\n literalKey: string;\n typeName: string;\n guardName: string;\n description: string;\n}\n\nconst GENERATED_ID_FAMILIES: readonly GeneratedIdFamily[] = [\n {\n literalKey: \"playerIds\",\n typeName: \"PlayerId\",\n guardName: \"PlayerId\",\n description: \"player id\",\n },\n {\n literalKey: \"boardLayouts\",\n typeName: \"BoardLayout\",\n guardName: \"BoardLayout\",\n description: \"board layout\",\n },\n {\n literalKey: \"setupOptionIds\",\n typeName: \"SetupOptionId\",\n guardName: \"SetupOptionId\",\n description: \"setup option id\",\n },\n {\n literalKey: \"setupProfileIds\",\n typeName: \"SetupProfileId\",\n guardName: \"SetupProfileId\",\n description: \"setup profile id\",\n },\n {\n literalKey: \"cardSetIds\",\n typeName: \"CardSetId\",\n guardName: \"CardSetId\",\n description: \"card set id\",\n },\n {\n literalKey: \"cardTypes\",\n typeName: \"CardType\",\n guardName: \"CardType\",\n description: \"card type\",\n },\n {\n literalKey: \"cardIds\",\n typeName: \"CardId\",\n guardName: \"CardId\",\n description: \"card id\",\n },\n {\n literalKey: \"deckIds\",\n typeName: \"DeckId\",\n guardName: \"DeckId\",\n description: \"deck id\",\n },\n {\n literalKey: \"handIds\",\n typeName: \"HandId\",\n guardName: \"HandId\",\n description: \"hand id\",\n },\n {\n literalKey: \"sharedZoneIds\",\n typeName: \"SharedZoneId\",\n guardName: \"SharedZoneId\",\n description: \"shared zone id\",\n },\n {\n literalKey: \"playerZoneIds\",\n typeName: \"PlayerZoneId\",\n guardName: \"PlayerZoneId\",\n description: \"player zone id\",\n },\n {\n literalKey: \"zoneIds\",\n typeName: \"ZoneId\",\n guardName: \"ZoneId\",\n description: \"zone id\",\n },\n {\n literalKey: \"resourceIds\",\n typeName: \"ResourceId\",\n guardName: \"ResourceId\",\n description: \"resource id\",\n },\n {\n literalKey: \"pieceTypeIds\",\n typeName: \"PieceTypeId\",\n guardName: \"PieceTypeId\",\n description: \"piece type id\",\n },\n {\n literalKey: \"pieceIds\",\n typeName: \"PieceId\",\n guardName: \"PieceId\",\n description: \"piece id\",\n },\n {\n literalKey: \"dieTypeIds\",\n typeName: \"DieTypeId\",\n guardName: \"DieTypeId\",\n description: \"die type id\",\n },\n {\n literalKey: \"dieIds\",\n typeName: \"DieId\",\n guardName: \"DieId\",\n description: \"die id\",\n },\n {\n literalKey: \"boardTypeIds\",\n typeName: \"BoardTypeId\",\n guardName: \"BoardTypeId\",\n description: \"board type id\",\n },\n {\n literalKey: \"boardBaseIds\",\n typeName: \"BoardBaseId\",\n guardName: \"BoardBaseId\",\n description: \"board base id\",\n },\n {\n literalKey: \"boardIds\",\n typeName: \"BoardId\",\n guardName: \"BoardId\",\n description: \"board id\",\n },\n {\n literalKey: \"boardContainerIds\",\n typeName: \"BoardContainerId\",\n guardName: \"BoardContainerId\",\n description: \"board container id\",\n },\n {\n literalKey: \"relationTypeIds\",\n typeName: \"RelationTypeId\",\n guardName: \"RelationTypeId\",\n description: \"relation type id\",\n },\n {\n literalKey: \"edgeIds\",\n typeName: \"EdgeId\",\n guardName: \"EdgeId\",\n description: \"edge id\",\n },\n {\n literalKey: \"edgeTypeIds\",\n typeName: \"EdgeTypeId\",\n guardName: \"EdgeTypeId\",\n description: \"edge type id\",\n },\n {\n literalKey: \"vertexIds\",\n typeName: \"VertexId\",\n guardName: \"VertexId\",\n description: \"vertex id\",\n },\n {\n literalKey: \"vertexTypeIds\",\n typeName: \"VertexTypeId\",\n guardName: \"VertexTypeId\",\n description: \"vertex type id\",\n },\n {\n literalKey: \"spaceIds\",\n typeName: \"SpaceId\",\n guardName: \"SpaceId\",\n description: \"space id\",\n },\n {\n literalKey: \"spaceTypeIds\",\n typeName: \"SpaceTypeId\",\n guardName: \"SpaceTypeId\",\n description: \"space type id\",\n },\n] as const;\n\n// `playerIds` are excluded from the generated `records`/`idGuards` surfaces:\n// `PlayerId` is now an opaque brand whose runtime roster comes from the active\n// session, not `manifest.players.maxPlayers`. Authors must use\n// `perPlayer(runtimeIds, init)` and `asPlayerId` from `@dreamboard/app-sdk/reducer`\n// instead of a `Record<PlayerId, T>` keyed on the max-players set.\nconst GENERATED_ID_FAMILIES_WITHOUT_PLAYERS: readonly GeneratedIdFamily[] =\n GENERATED_ID_FAMILIES.filter((family) => family.literalKey !== \"playerIds\");\n\nfunction renderGeneratedRecordsHelpers(): string {\n return `export const records = {\n${GENERATED_ID_FAMILIES_WITHOUT_PLAYERS.map(\n ({ literalKey, typeName }) => ` ${literalKey}<Value>(\n initial: Value | ((${literalKey.slice(0, -1)}: ${typeName}) => Value),\n ): Record<${typeName}, Value> {\n return buildTypedRecord(literals.${literalKey}, initial);\n },`,\n).join(\"\\n\")}\n} as const;`;\n}\n\nfunction renderGeneratedIdGuards(): string {\n return `export const idGuards = {\n${GENERATED_ID_FAMILIES_WITHOUT_PLAYERS.map(\n ({\n literalKey,\n typeName,\n guardName,\n description,\n }) => ` is${guardName}(value: string): value is ${typeName} {\n return isTypedId(literals.${literalKey}, value);\n },\n expect${guardName}(value: string): ${typeName} {\n return expectTypedId(literals.${literalKey}, value, ${quote(description)});\n },`,\n).join(\"\\n\")}\n} as const;`;\n}\n\nfunction renderGeneratedIdHandles(analysis: ManifestAnalysis): string {\n return `export const cardTypes = ${renderHandleObject(\n \"CardType\",\n analysis.cardTypes,\n )};\n\nexport const zones = ${renderHandleObject(\"ZoneId\", analysis.zoneIds)};`;\n}\n\nfunction renderHandleObject(\n typeName: string,\n values: readonly string[],\n): string {\n const lines = Array.from(values)\n .sort((left, right) => left.localeCompare(right))\n .map((value) => ` ${quote(toHandleKey(value))}: ${quote(value)},`);\n return `{\\n${lines.join(\"\\n\")}\\n} as const satisfies Record<string, ${typeName}>`;\n}\n\nfunction sortedObject<Value>(\n entries: Iterable<readonly [string, Value]>,\n): Record<string, Value> {\n return Object.fromEntries(\n Array.from(entries).sort(([left], [right]) => left.localeCompare(right)),\n );\n}\n\nfunction renderCardInstanceIds(card: BoardCard): string[] {\n if (card.count > 1) {\n return Array.from(\n { length: card.count },\n (_, index) => `${card.type}-${index + 1}`,\n );\n }\n return [card.type];\n}\n\nfunction expandSeedIds(\n seeds: ReadonlyArray<\n | PieceSeedSpec\n | { id?: string | null; typeId: string; count?: number | null }\n >,\n): string[] {\n const expanded: string[] = [];\n for (const seed of seeds) {\n const count = seed.count ?? 1;\n const baseId = seed.id ?? seed.typeId;\n if (count <= 1) {\n expanded.push(baseId);\n continue;\n }\n for (let index = 1; index <= count; index += 1) {\n expanded.push(`${baseId}-${index}`);\n }\n }\n return expanded;\n}\n\nfunction isHexBoardTemplateSpec(\n boardTemplate: BoardTemplateSpec,\n): boardTemplate is HexBoardTemplateSpec {\n return boardTemplate.layout === \"hex\";\n}\n\nfunction isSquareBoardTemplateSpec(\n boardTemplate: BoardTemplateSpec,\n): boardTemplate is SquareBoardTemplateSpec {\n return boardTemplate.layout === \"square\";\n}\n\nfunction isGenericBoardTemplateSpec(\n boardTemplate: BoardTemplateSpec,\n): boardTemplate is GenericBoardTemplateSpec {\n return boardTemplate.layout === \"generic\";\n}\n\nfunction isHexBoardSpec(board: BoardSpec): board is HexBoardSpec {\n return board.layout === \"hex\";\n}\n\nfunction isSquareBoardSpec(board: BoardSpec): board is SquareBoardSpec {\n return board.layout === \"square\";\n}\n\nconst HEX_SIDES = [\"e\", \"ne\", \"nw\", \"w\", \"sw\", \"se\"] as const;\nconst HEX_CORNERS = [\"ne-e\", \"e-se\", \"se-sw\", \"sw-w\", \"w-nw\", \"nw-ne\"] as const;\n\ntype HexSide = (typeof HEX_SIDES)[number];\ntype HexCorner = (typeof HEX_CORNERS)[number];\n\nconst HEX_SIDE_OFFSETS: Record<HexSide, readonly [number, number]> = {\n e: [1, 0],\n ne: [1, -1],\n nw: [0, -1],\n w: [-1, 0],\n sw: [-1, 1],\n se: [0, 1],\n};\n\nconst HEX_CORNER_OFFSETS: Record<HexCorner, readonly [number, number, number]> =\n {\n \"ne-e\": [2, -1, -1],\n \"e-se\": [1, -2, 1],\n \"se-sw\": [-1, -1, 2],\n \"sw-w\": [-2, 1, 1],\n \"w-nw\": [-1, 2, -1],\n \"nw-ne\": [1, 1, -2],\n };\n\nconst HEX_SIDE_CORNERS: Record<HexSide, readonly [HexCorner, HexCorner]> = {\n e: [\"ne-e\", \"e-se\"],\n ne: [\"nw-ne\", \"ne-e\"],\n nw: [\"w-nw\", \"nw-ne\"],\n w: [\"sw-w\", \"w-nw\"],\n sw: [\"se-sw\", \"sw-w\"],\n se: [\"e-se\", \"se-sw\"],\n};\n\nconst HEX_CORNER_SIDES: Record<HexCorner, readonly [HexSide, HexSide]> = {\n \"ne-e\": [\"ne\", \"e\"],\n \"e-se\": [\"e\", \"se\"],\n \"se-sw\": [\"se\", \"sw\"],\n \"sw-w\": [\"sw\", \"w\"],\n \"w-nw\": [\"w\", \"nw\"],\n \"nw-ne\": [\"nw\", \"ne\"],\n};\n\ninterface ResolvedHexEdge {\n id: string;\n geometryKey: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n}\n\ninterface ResolvedHexVertex {\n id: string;\n geometryKey: string;\n spaceIds: string[];\n typeId?: string | null;\n label?: string | null;\n fields?: Record<string, unknown> | null;\n}\n\nfunction cubeFromAxial(\n space: Pick<HexSpaceSpec, \"q\" | \"r\">,\n): readonly [number, number, number] {\n const x = space.q;\n const z = space.r;\n return [x, -x - z, z] as const;\n}\n\nfunction cornerGeometryKey(\n space: Pick<HexSpaceSpec, \"q\" | \"r\">,\n corner: HexCorner,\n) {\n const [x, y, z] = cubeFromAxial(space);\n const [dx, dy, dz] = HEX_CORNER_OFFSETS[corner];\n return `${3 * x + dx},${3 * y + dy},${3 * z + dz}`;\n}\n\nfunction edgeGeometryKey(space: Pick<HexSpaceSpec, \"q\" | \"r\">, side: HexSide) {\n const [leftCorner, rightCorner] = HEX_SIDE_CORNERS[side];\n return [\n cornerGeometryKey(space, leftCorner),\n cornerGeometryKey(space, rightCorner),\n ]\n .sort((left, right) => left.localeCompare(right))\n .join(\"::\");\n}\n\nfunction edgeIdFromGeometryKey(key: string): string {\n return `hex-edge:${key}`;\n}\n\nfunction vertexIdFromGeometryKey(key: string): string {\n return `hex-vertex:${key}`;\n}\n\nconst SQUARE_SIDES = [\"north\", \"east\", \"south\", \"west\"] as const;\nconst SQUARE_CORNERS = [\"nw\", \"ne\", \"se\", \"sw\"] as const;\n\ntype SquareSide = (typeof SQUARE_SIDES)[number];\ntype SquareCorner = (typeof SQUARE_CORNERS)[number];\n\nfunction squareEdgeIdFromGeometryKey(key: string): string {\n return `square-edge:${key}`;\n}\n\nfunction squareVertexIdFromGeometryKey(key: string): string {\n return `square-vertex:${key}`;\n}\n\nfunction squareCornerGeometryKey(\n space: Pick<SquareSpaceSpec, \"row\" | \"col\">,\n corner: SquareCorner,\n): string {\n switch (corner) {\n case \"nw\":\n return `${space.col},${space.row}`;\n case \"ne\":\n return `${space.col + 1},${space.row}`;\n case \"se\":\n return `${space.col + 1},${space.row + 1}`;\n case \"sw\":\n return `${space.col},${space.row + 1}`;\n }\n}\n\nfunction squareEdgeGeometryKey(\n space: Pick<SquareSpaceSpec, \"row\" | \"col\">,\n side: SquareSide,\n): string {\n const endpoints =\n side === \"north\"\n ? [`${space.col},${space.row}`, `${space.col + 1},${space.row}`]\n : side === \"east\"\n ? [`${space.col + 1},${space.row}`, `${space.col + 1},${space.row + 1}`]\n : side === \"south\"\n ? [\n `${space.col},${space.row + 1}`,\n `${space.col + 1},${space.row + 1}`,\n ]\n : [`${space.col},${space.row}`, `${space.col},${space.row + 1}`];\n return endpoints.sort((left, right) => left.localeCompare(right)).join(\"::\");\n}\n\nfunction geometryKeyFromSquareEdgeRef(\n ref: BoardEdgeRef,\n spacesById: ReadonlyMap<string, SquareSpaceSpec>,\n): string {\n const resolvedSpaces = [...ref.spaces]\n .sort((a, b) => a.localeCompare(b))\n .map((spaceId) => {\n const space = spacesById.get(spaceId);\n if (!space) {\n throw new Error(\n `Square edge ref references unknown space '${spaceId}'.`,\n );\n }\n return space;\n });\n const keyCounts = new Map<string, number>();\n for (const space of resolvedSpaces) {\n for (const side of SQUARE_SIDES) {\n const key = squareEdgeGeometryKey(space, side);\n keyCounts.set(key, (keyCounts.get(key) ?? 0) + 1);\n }\n }\n const candidates = [...keyCounts.entries()]\n .filter(([, count]) => count === resolvedSpaces.length)\n .map(([key]) => key)\n .sort((left, right) => left.localeCompare(right));\n if (candidates.length !== 1) {\n throw new Error(\n `Square edge ref spaces '${ref.spaces.join(\", \")}' do not resolve to exactly one shared edge.`,\n );\n }\n const [only] = candidates;\n if (only === undefined) {\n throw new Error(\n \"unreachable: candidates.length === 1 but first is undefined\",\n );\n }\n return only;\n}\n\nfunction geometryKeyFromSquareVertexRef(\n ref: BoardVertexRef,\n spacesById: ReadonlyMap<string, SquareSpaceSpec>,\n): string {\n const resolvedSpaces = [...ref.spaces]\n .sort((a, b) => a.localeCompare(b))\n .map((spaceId) => {\n const space = spacesById.get(spaceId);\n if (!space) {\n throw new Error(\n `Square vertex ref references unknown space '${spaceId}'.`,\n );\n }\n return space;\n });\n const keyCounts = new Map<string, number>();\n for (const space of resolvedSpaces) {\n for (const corner of SQUARE_CORNERS) {\n const key = squareCornerGeometryKey(space, corner);\n keyCounts.set(key, (keyCounts.get(key) ?? 0) + 1);\n }\n }\n const candidates = [...keyCounts.entries()]\n .filter(([, count]) => count === resolvedSpaces.length)\n .map(([key]) => key)\n .sort((left, right) => left.localeCompare(right));\n if (candidates.length !== 1) {\n throw new Error(\n `Square vertex ref spaces '${ref.spaces.join(\", \")}' do not resolve to exactly one shared vertex.`,\n );\n }\n const [only] = candidates;\n if (only === undefined) {\n throw new Error(\n \"unreachable: candidates.length === 1 but first is undefined\",\n );\n }\n return only;\n}\n\nfunction geometryKeyFromEdgeRef(\n ref: HexEdgeRef,\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\n): string {\n const [leftId, rightId] = [...ref.spaces].sort((a, b) => a.localeCompare(b));\n const leftSpace = spacesById.get(leftId);\n const rightSpace = spacesById.get(rightId);\n if (!leftSpace || !rightSpace) {\n throw new Error(\n `Hex edge ref references unknown spaces: ${ref.spaces.join(\", \")}.`,\n );\n }\n const [dq, dr] = [rightSpace.q - leftSpace.q, rightSpace.r - leftSpace.r];\n const side = (\n Object.entries(HEX_SIDE_OFFSETS) as Array<\n readonly [HexSide, readonly [number, number]]\n >\n ).find(([, [sideQ, sideR]]) => sideQ === dq && sideR === dr)?.[0];\n if (!side) {\n throw new Error(\n `Hex edge ref spaces '${leftId}' and '${rightId}' are not adjacent.`,\n );\n }\n return edgeGeometryKey(leftSpace, side);\n}\n\nfunction geometryKeyFromVertexRef(\n ref: HexVertexRef,\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\n): string {\n return resolveHexVertexGeometryKey(ref, spacesById);\n}\n\nfunction deriveHexEdges(spaces: readonly HexSpaceSpec[]): ResolvedHexEdge[] {\n const spacesByCoordinate = new Map<string, HexSpaceSpec>();\n for (const space of spaces) {\n spacesByCoordinate.set(`${space.q},${space.r}`, space);\n }\n\n const edgeMap = new Map<string, ResolvedHexEdge>();\n for (const space of spaces) {\n for (const side of HEX_SIDES) {\n const [dq, dr] = HEX_SIDE_OFFSETS[side];\n const neighbor = spacesByCoordinate.get(\n `${space.q + dq},${space.r + dr}`,\n );\n const geometryKey = edgeGeometryKey(space, side);\n const existing = edgeMap.get(geometryKey);\n const nextSpaceIds = dedupeSorted([\n ...(existing?.spaceIds ?? []),\n space.id,\n ...(neighbor ? [neighbor.id] : []),\n ]);\n edgeMap.set(geometryKey, {\n id: edgeIdFromGeometryKey(geometryKey),\n geometryKey,\n spaceIds: nextSpaceIds,\n typeId: existing?.typeId ?? null,\n label: existing?.label ?? null,\n fields: existing?.fields ?? null,\n });\n }\n }\n\n return [...edgeMap.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction deriveHexVertices(\n spaces: readonly HexSpaceSpec[],\n): ResolvedHexVertex[] {\n const spacesByCoordinate = new Map<string, HexSpaceSpec>();\n for (const space of spaces) {\n spacesByCoordinate.set(`${space.q},${space.r}`, space);\n }\n\n const vertexMap = new Map<string, ResolvedHexVertex>();\n for (const space of spaces) {\n for (const corner of HEX_CORNERS) {\n const [leftSide, rightSide] = HEX_CORNER_SIDES[corner];\n const [leftQ, leftR] = HEX_SIDE_OFFSETS[leftSide];\n const [rightQ, rightR] = HEX_SIDE_OFFSETS[rightSide];\n const leftNeighbor = spacesByCoordinate.get(\n `${space.q + leftQ},${space.r + leftR}`,\n );\n const rightNeighbor = spacesByCoordinate.get(\n `${space.q + rightQ},${space.r + rightR}`,\n );\n const geometryKey = cornerGeometryKey(space, corner);\n const existing = vertexMap.get(geometryKey);\n const nextSpaceIds = dedupeSorted([\n ...(existing?.spaceIds ?? []),\n space.id,\n ...(leftNeighbor ? [leftNeighbor.id] : []),\n ...(rightNeighbor ? [rightNeighbor.id] : []),\n ]);\n vertexMap.set(geometryKey, {\n id: vertexIdFromGeometryKey(geometryKey),\n geometryKey,\n spaceIds: nextSpaceIds,\n typeId: existing?.typeId ?? null,\n label: existing?.label ?? null,\n fields: existing?.fields ?? null,\n });\n }\n }\n\n return [...vertexMap.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction mergeBoardSpaces(\n templateSpaces: readonly BoardSpaceSpec[],\n boardSpaces: readonly BoardSpaceSpec[],\n): BoardSpaceSpec[] {\n return Array.from(\n [...templateSpaces, ...boardSpaces]\n .reduce<Map<string, BoardSpaceSpec>>((accumulator, space) => {\n accumulator.set(space.id, space);\n return accumulator;\n }, new Map<string, BoardSpaceSpec>())\n .values(),\n ).sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction mergeBoardContainers(\n templateContainers: readonly BoardContainerSpec[],\n boardContainers: readonly BoardContainerSpec[],\n): BoardContainerSpec[] {\n return Array.from(\n [...templateContainers, ...boardContainers]\n .reduce<Map<string, BoardContainerSpec>>((accumulator, container) => {\n accumulator.set(container.id, container);\n return accumulator;\n }, new Map<string, BoardContainerSpec>())\n .values(),\n ).sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction resolveHexSpaces(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n): HexSpaceSpec[] {\n if (!template) {\n return [...(board.spaces ?? [])].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n }\n\n const templateSpacesById = new Map(\n (template.spaces ?? []).map((space) => [space.id, space] as const),\n );\n const overridesById = new Map(\n (board.spaces ?? []).map((space) => [space.id, space] as const),\n );\n for (const overrideId of overridesById.keys()) {\n if (!templateSpacesById.has(overrideId)) {\n throw new Error(\n `Hex board '${board.id}' overrides unknown space '${overrideId}' from template '${template.id}'.`,\n );\n }\n }\n\n return (template.spaces ?? [])\n .map((templateSpace) => {\n const override = overridesById.get(templateSpace.id);\n if (!override) {\n return templateSpace;\n }\n const templateMatch = templateSpacesById.get(override.id);\n if (!templateMatch) {\n throw new Error(\n `Hex board '${board.id}' overrides unknown space '${override.id}' from template '${template.id}'.`,\n );\n }\n if (templateMatch.q !== override.q || templateMatch.r !== override.r) {\n throw new Error(\n `Hex board '${board.id}' cannot change coordinates for space '${override.id}' from template '${template.id}'.`,\n );\n }\n return {\n ...templateSpace,\n ...override,\n id: templateSpace.id,\n q: templateSpace.q,\n r: templateSpace.r,\n };\n })\n .sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction indexHexEdgeMetadata(\n specs: readonly HexEdgeSpec[],\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\n ownerLabel: string,\n): Map<string, Omit<ResolvedHexEdge, \"id\" | \"spaceIds\">> {\n const metadataByKey = new Map<\n string,\n Omit<ResolvedHexEdge, \"id\" | \"spaceIds\">\n >();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromEdgeRef(spec.ref, spacesById);\n if (metadataByKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate hex edge refs.`);\n }\n metadataByKey.set(geometryKey, {\n geometryKey,\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n });\n }\n return metadataByKey;\n}\n\nfunction indexHexVertexMetadata(\n specs: readonly HexVertexSpec[],\n spacesById: ReadonlyMap<string, HexSpaceSpec>,\n ownerLabel: string,\n): Map<string, Omit<ResolvedHexVertex, \"id\" | \"spaceIds\">> {\n const metadataByKey = new Map<\n string,\n Omit<ResolvedHexVertex, \"id\" | \"spaceIds\">\n >();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromVertexRef(spec.ref, spacesById);\n if (metadataByKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate hex vertex refs.`);\n }\n metadataByKey.set(geometryKey, {\n geometryKey,\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n });\n }\n return metadataByKey;\n}\n\nfunction resolveAuthoredHexEdges(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n spaces: readonly HexSpaceSpec[],\n): AnalyzedHexBoard[\"authoredEdges\"] {\n const spacesById = new Map(spaces.map((space) => [space.id, space] as const));\n const derivedByGeometryKey = new Map(\n deriveHexEdges(spaces).map((edge) => [edge.geometryKey, edge] as const),\n );\n const collectSpecsByGeometryKey = (\n specs: readonly HexEdgeSpec[],\n ownerLabel: string,\n ) => {\n const specsByGeometryKey = new Map<string, HexEdgeSpec>();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromEdgeRef(spec.ref, spacesById);\n if (specsByGeometryKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate hex edge refs.`);\n }\n specsByGeometryKey.set(geometryKey, spec);\n }\n return specsByGeometryKey;\n };\n\n const templateSpecsByGeometryKey = template\n ? collectSpecsByGeometryKey(\n template.edges ?? [],\n `Hex board template '${template.id}'`,\n )\n : new Map<string, HexEdgeSpec>();\n const overrideSpecsByGeometryKey = collectSpecsByGeometryKey(\n board.edges ?? [],\n `Hex board '${board.id}'`,\n );\n\n if (template) {\n for (const overrideKey of overrideSpecsByGeometryKey.keys()) {\n if (!templateSpecsByGeometryKey.has(overrideKey)) {\n throw new Error(\n `Hex board '${board.id}' overrides unknown edge ref from template '${template.id}'.`,\n );\n }\n }\n }\n\n const mergedSpecs = template\n ? Array.from(templateSpecsByGeometryKey.entries()).map(\n ([geometryKey, templateSpec]) =>\n [\n geometryKey,\n overrideSpecsByGeometryKey.get(geometryKey) ?? templateSpec,\n ] as const,\n )\n : Array.from(overrideSpecsByGeometryKey.entries());\n\n return mergedSpecs.map(([geometryKey, spec]) => {\n const derivedEdge = derivedByGeometryKey.get(geometryKey);\n if (!derivedEdge) {\n throw new Error(\n `Hex edge ref on board '${board.id}' does not resolve to a derived edge.`,\n );\n }\n return {\n id: derivedEdge.id,\n ref: cloneJson(spec.ref),\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n };\n });\n}\n\nfunction resolveAuthoredHexVertices(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n spaces: readonly HexSpaceSpec[],\n): AnalyzedHexBoard[\"authoredVertices\"] {\n const spacesById = new Map(spaces.map((space) => [space.id, space] as const));\n const derivedByGeometryKey = new Map(\n deriveHexVertices(spaces).map(\n (vertex) => [vertex.geometryKey, vertex] as const,\n ),\n );\n const collectSpecsByGeometryKey = (\n specs: readonly HexVertexSpec[],\n ownerLabel: string,\n ) => {\n const specsByGeometryKey = new Map<string, HexVertexSpec>();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromVertexRef(spec.ref, spacesById);\n if (specsByGeometryKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate hex vertex refs.`);\n }\n specsByGeometryKey.set(geometryKey, spec);\n }\n return specsByGeometryKey;\n };\n\n const templateSpecsByGeometryKey = template\n ? collectSpecsByGeometryKey(\n template.vertices ?? [],\n `Hex board template '${template.id}'`,\n )\n : new Map<string, HexVertexSpec>();\n const overrideSpecsByGeometryKey = collectSpecsByGeometryKey(\n board.vertices ?? [],\n `Hex board '${board.id}'`,\n );\n\n if (template) {\n for (const overrideKey of overrideSpecsByGeometryKey.keys()) {\n if (!templateSpecsByGeometryKey.has(overrideKey)) {\n throw new Error(\n `Hex board '${board.id}' overrides unknown vertex ref from template '${template.id}'.`,\n );\n }\n }\n }\n\n const mergedSpecs = template\n ? Array.from(templateSpecsByGeometryKey.entries()).map(\n ([geometryKey, templateSpec]) =>\n [\n geometryKey,\n overrideSpecsByGeometryKey.get(geometryKey) ?? templateSpec,\n ] as const,\n )\n : Array.from(overrideSpecsByGeometryKey.entries());\n\n return mergedSpecs.map(([geometryKey, spec]) => {\n const derivedVertex = derivedByGeometryKey.get(geometryKey);\n if (!derivedVertex) {\n throw new Error(\n `Hex vertex ref on board '${board.id}' does not resolve to a derived vertex.`,\n );\n }\n return {\n id: derivedVertex.id,\n ref: cloneJson(spec.ref),\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n };\n });\n}\n\nfunction resolveHexEdges(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n spaces: readonly HexSpaceSpec[],\n): ResolvedHexEdge[] {\n const derived = deriveHexEdges(spaces);\n const edgesById = new Map(derived.map((edge) => [edge.id, edge] as const));\n for (const authoredEdge of resolveAuthoredHexEdges(board, template, spaces)) {\n const edge = edgesById.get(authoredEdge.id);\n if (!edge) {\n throw new Error(\n `Hex edge ref on board '${board.id}' does not resolve to a derived edge.`,\n );\n }\n edgesById.set(authoredEdge.id, {\n ...edge,\n typeId: authoredEdge.typeId ?? null,\n label: authoredEdge.label ?? null,\n fields: authoredEdge.fields ?? null,\n });\n }\n\n return [...edgesById.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction resolveHexVertices(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n spaces: readonly HexSpaceSpec[],\n): ResolvedHexVertex[] {\n const derived = deriveHexVertices(spaces);\n const verticesById = new Map(\n derived.map((vertex) => [vertex.id, vertex] as const),\n );\n for (const authoredVertex of resolveAuthoredHexVertices(\n board,\n template,\n spaces,\n )) {\n const vertex = verticesById.get(authoredVertex.id);\n if (!vertex) {\n throw new Error(\n `Hex vertex ref on board '${board.id}' does not resolve to a derived vertex.`,\n );\n }\n verticesById.set(authoredVertex.id, {\n ...vertex,\n typeId: authoredVertex.typeId ?? null,\n label: authoredVertex.label ?? null,\n fields: authoredVertex.fields ?? null,\n });\n }\n\n return [...verticesById.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction resolveSquareSpaces(\n board: SquareBoardSpec,\n template: SquareBoardTemplateSpec | undefined,\n): SquareSpaceSpec[] {\n if (!template) {\n return [...(board.spaces ?? [])].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n }\n\n const templateSpacesById = new Map(\n (template.spaces ?? []).map((space) => [space.id, space] as const),\n );\n const overridesById = new Map(\n (board.spaces ?? []).map((space) => [space.id, space] as const),\n );\n for (const overrideId of overridesById.keys()) {\n if (!templateSpacesById.has(overrideId)) {\n throw new Error(\n `Square board '${board.id}' overrides unknown space '${overrideId}' from template '${template.id}'.`,\n );\n }\n }\n\n return (template.spaces ?? [])\n .map((templateSpace) => {\n const override = overridesById.get(templateSpace.id);\n if (!override) {\n return templateSpace;\n }\n const templateMatch = templateSpacesById.get(override.id);\n if (!templateMatch) {\n throw new Error(\n `Square board '${board.id}' overrides unknown space '${override.id}' from template '${template.id}'.`,\n );\n }\n if (\n templateMatch.row !== override.row ||\n templateMatch.col !== override.col\n ) {\n throw new Error(\n `Square board '${board.id}' cannot change coordinates for space '${override.id}' from template '${template.id}'.`,\n );\n }\n return {\n ...templateSpace,\n ...override,\n id: templateSpace.id,\n row: templateSpace.row,\n col: templateSpace.col,\n };\n })\n .sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction deriveSquareEdges(\n spaces: readonly SquareSpaceSpec[],\n): ResolvedHexEdge[] {\n const edgeMap = new Map<string, ResolvedHexEdge>();\n for (const space of spaces) {\n for (const side of SQUARE_SIDES) {\n const geometryKey = squareEdgeGeometryKey(space, side);\n const existing = edgeMap.get(geometryKey);\n const nextSpaceIds = dedupeSorted([\n ...(existing?.spaceIds ?? []),\n space.id,\n ]);\n edgeMap.set(geometryKey, {\n id: squareEdgeIdFromGeometryKey(geometryKey),\n geometryKey,\n spaceIds: nextSpaceIds,\n typeId: existing?.typeId ?? null,\n label: existing?.label ?? null,\n fields: existing?.fields ?? null,\n });\n }\n }\n return [...edgeMap.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction deriveSquareVertices(\n spaces: readonly SquareSpaceSpec[],\n): ResolvedHexVertex[] {\n const vertexMap = new Map<string, ResolvedHexVertex>();\n for (const space of spaces) {\n for (const corner of SQUARE_CORNERS) {\n const geometryKey = squareCornerGeometryKey(space, corner);\n const existing = vertexMap.get(geometryKey);\n const nextSpaceIds = dedupeSorted([\n ...(existing?.spaceIds ?? []),\n space.id,\n ]);\n vertexMap.set(geometryKey, {\n id: squareVertexIdFromGeometryKey(geometryKey),\n geometryKey,\n spaceIds: nextSpaceIds,\n typeId: existing?.typeId ?? null,\n label: existing?.label ?? null,\n fields: existing?.fields ?? null,\n });\n }\n }\n return [...vertexMap.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction indexSquareEdgeMetadata(\n specs: readonly SquareEdgeSpec[],\n spacesById: ReadonlyMap<string, SquareSpaceSpec>,\n ownerLabel: string,\n): Map<string, Omit<ResolvedHexEdge, \"id\" | \"spaceIds\">> {\n const metadataByKey = new Map<\n string,\n Omit<ResolvedHexEdge, \"id\" | \"spaceIds\">\n >();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromSquareEdgeRef(spec.ref, spacesById);\n if (metadataByKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate square edge refs.`);\n }\n metadataByKey.set(geometryKey, {\n geometryKey,\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n });\n }\n return metadataByKey;\n}\n\nfunction indexSquareVertexMetadata(\n specs: readonly SquareVertexSpec[],\n spacesById: ReadonlyMap<string, SquareSpaceSpec>,\n ownerLabel: string,\n): Map<string, Omit<ResolvedHexVertex, \"id\" | \"spaceIds\">> {\n const metadataByKey = new Map<\n string,\n Omit<ResolvedHexVertex, \"id\" | \"spaceIds\">\n >();\n for (const spec of specs) {\n const geometryKey = geometryKeyFromSquareVertexRef(spec.ref, spacesById);\n if (metadataByKey.has(geometryKey)) {\n throw new Error(`${ownerLabel} contains duplicate square vertex refs.`);\n }\n metadataByKey.set(geometryKey, {\n geometryKey,\n typeId: spec.typeId ?? null,\n label: spec.label ?? null,\n fields:\n (spec.fields as Record<string, unknown> | null | undefined) ?? null,\n });\n }\n return metadataByKey;\n}\n\nfunction resolveSquareEdges(\n board: SquareBoardSpec,\n template: SquareBoardTemplateSpec | undefined,\n spaces: readonly SquareSpaceSpec[],\n): ResolvedHexEdge[] {\n const spacesById = new Map(spaces.map((space) => [space.id, space] as const));\n const derived = deriveSquareEdges(spaces);\n const edgesByGeometryKey = new Map(\n derived.map((edge) => [edge.geometryKey, edge] as const),\n );\n const templateMetadata = template\n ? indexSquareEdgeMetadata(\n template.edges ?? [],\n spacesById,\n `Square board template '${template.id}'`,\n )\n : new Map();\n const overrideMetadata = indexSquareEdgeMetadata(\n board.edges ?? [],\n spacesById,\n `Square board '${board.id}'`,\n );\n\n if (template) {\n for (const overrideKey of overrideMetadata.keys()) {\n if (!templateMetadata.has(overrideKey)) {\n throw new Error(\n `Square board '${board.id}' overrides unknown edge ref from template '${template.id}'.`,\n );\n }\n }\n }\n\n const mergedMetadata = template\n ? new Map(\n [...templateMetadata.entries()].map(([key, metadata]) => [\n key,\n {\n ...metadata,\n ...(overrideMetadata.get(key) ?? {}),\n geometryKey: key,\n },\n ]),\n )\n : overrideMetadata;\n\n for (const [geometryKey, metadata] of mergedMetadata.entries()) {\n const edge = edgesByGeometryKey.get(geometryKey);\n if (!edge) {\n throw new Error(\n `Square edge ref on board '${board.id}' does not resolve to a derived edge.`,\n );\n }\n edgesByGeometryKey.set(geometryKey, {\n ...edge,\n typeId: metadata.typeId ?? null,\n label: metadata.label ?? null,\n fields: metadata.fields ?? null,\n });\n }\n\n return [...edgesByGeometryKey.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction resolveSquareVertices(\n board: SquareBoardSpec,\n template: SquareBoardTemplateSpec | undefined,\n spaces: readonly SquareSpaceSpec[],\n): ResolvedHexVertex[] {\n const spacesById = new Map(spaces.map((space) => [space.id, space] as const));\n const derived = deriveSquareVertices(spaces);\n const verticesByGeometryKey = new Map(\n derived.map((vertex) => [vertex.geometryKey, vertex] as const),\n );\n const templateMetadata = template\n ? indexSquareVertexMetadata(\n template.vertices ?? [],\n spacesById,\n `Square board template '${template.id}'`,\n )\n : new Map();\n const overrideMetadata = indexSquareVertexMetadata(\n board.vertices ?? [],\n spacesById,\n `Square board '${board.id}'`,\n );\n\n if (template) {\n for (const overrideKey of overrideMetadata.keys()) {\n if (!templateMetadata.has(overrideKey)) {\n throw new Error(\n `Square board '${board.id}' overrides unknown vertex ref from template '${template.id}'.`,\n );\n }\n }\n }\n\n const mergedMetadata = template\n ? new Map(\n [...templateMetadata.entries()].map(([key, metadata]) => [\n key,\n {\n ...metadata,\n ...(overrideMetadata.get(key) ?? {}),\n geometryKey: key,\n },\n ]),\n )\n : overrideMetadata;\n\n for (const [geometryKey, metadata] of mergedMetadata.entries()) {\n const vertex = verticesByGeometryKey.get(geometryKey);\n if (!vertex) {\n throw new Error(\n `Square vertex ref on board '${board.id}' does not resolve to a derived vertex.`,\n );\n }\n verticesByGeometryKey.set(geometryKey, {\n ...vertex,\n typeId: metadata.typeId ?? null,\n label: metadata.label ?? null,\n fields: metadata.fields ?? null,\n });\n }\n\n return [...verticesByGeometryKey.values()].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n}\n\nfunction analyzeBoards(manifest: GameTopologyManifest, playerIds: string[]) {\n const boardTemplates = manifest.boardTemplates ?? [];\n const genericTemplateById = new Map(\n boardTemplates\n .filter(isGenericBoardTemplateSpec)\n .map((boardTemplate) => [boardTemplate.id, boardTemplate] as const),\n );\n const hexTemplateById = new Map(\n boardTemplates\n .filter(isHexBoardTemplateSpec)\n .map((boardTemplate) => [boardTemplate.id, boardTemplate] as const),\n );\n const squareTemplateById = new Map(\n boardTemplates\n .filter(isSquareBoardTemplateSpec)\n .map((boardTemplate) => [boardTemplate.id, boardTemplate] as const),\n );\n\n return (manifest.boards ?? []).map((board): AnalyzedBoard => {\n const runtimeBoardIds =\n board.scope === \"perPlayer\"\n ? playerIds.map((playerId) => `${board.id}:${playerId}`)\n : [board.id];\n\n if (isHexBoardSpec(board)) {\n const hexBoard = board;\n const template = board.templateId\n ? hexTemplateById.get(board.templateId)\n : undefined;\n const spaces = resolveHexSpaces(hexBoard, template);\n return {\n layout: \"hex\",\n board: hexBoard,\n template,\n boardTypeId: hexBoard.typeId ?? template?.typeId,\n runtimeBoardIds,\n boardFieldsSchema:\n hexBoard.boardFieldsSchema ?? template?.boardFieldsSchema,\n spaceFieldsSchema:\n hexBoard.spaceFieldsSchema ?? template?.spaceFieldsSchema,\n edgeFieldsSchema:\n hexBoard.edgeFieldsSchema ?? template?.edgeFieldsSchema,\n vertexFieldsSchema:\n hexBoard.vertexFieldsSchema ?? template?.vertexFieldsSchema,\n spaces,\n authoredEdges: resolveAuthoredHexEdges(hexBoard, template, spaces),\n authoredVertices: resolveAuthoredHexVertices(\n hexBoard,\n template,\n spaces,\n ),\n edges: resolveHexEdges(hexBoard, template, spaces),\n vertices: resolveHexVertices(hexBoard, template, spaces),\n };\n }\n\n if (isSquareBoardSpec(board)) {\n const squareBoard = board;\n const template = board.templateId\n ? squareTemplateById.get(board.templateId)\n : undefined;\n const spaces = resolveSquareSpaces(squareBoard, template);\n return {\n layout: \"square\",\n board: squareBoard,\n template,\n boardTypeId: squareBoard.typeId ?? template?.typeId,\n runtimeBoardIds,\n boardFieldsSchema:\n squareBoard.boardFieldsSchema ?? template?.boardFieldsSchema,\n spaceFieldsSchema:\n squareBoard.spaceFieldsSchema ?? template?.spaceFieldsSchema,\n relationFieldsSchema:\n squareBoard.relationFieldsSchema ?? template?.relationFieldsSchema,\n containerFieldsSchema:\n squareBoard.containerFieldsSchema ?? template?.containerFieldsSchema,\n edgeFieldsSchema:\n squareBoard.edgeFieldsSchema ?? template?.edgeFieldsSchema,\n vertexFieldsSchema:\n squareBoard.vertexFieldsSchema ?? template?.vertexFieldsSchema,\n spaces,\n relations: [\n ...(template?.relations ?? []),\n ...(squareBoard.relations ?? []),\n ],\n containers: mergeBoardContainers(\n template?.containers ?? [],\n squareBoard.containers ?? [],\n ),\n edges: resolveSquareEdges(squareBoard, template, spaces),\n vertices: resolveSquareVertices(squareBoard, template, spaces),\n };\n }\n\n const genericBoard = board;\n const template = board.templateId\n ? genericTemplateById.get(board.templateId)\n : undefined;\n return {\n layout: \"generic\",\n board: genericBoard,\n template,\n boardTypeId: genericBoard.typeId ?? template?.typeId,\n runtimeBoardIds,\n boardFieldsSchema:\n genericBoard.boardFieldsSchema ?? template?.boardFieldsSchema,\n spaceFieldsSchema:\n genericBoard.spaceFieldsSchema ?? template?.spaceFieldsSchema,\n relationFieldsSchema:\n genericBoard.relationFieldsSchema ?? template?.relationFieldsSchema,\n containerFieldsSchema:\n genericBoard.containerFieldsSchema ?? template?.containerFieldsSchema,\n spaces: mergeBoardSpaces(\n template?.spaces ?? [],\n genericBoard.spaces ?? [],\n ),\n relations: [\n ...(template?.relations ?? []),\n ...(genericBoard.relations ?? []),\n ],\n containers: mergeBoardContainers(\n template?.containers ?? [],\n genericBoard.containers ?? [],\n ),\n };\n });\n}\n\nfunction isSingletonExplicitSeed(seed: {\n id?: string | null;\n count?: number | null;\n}): seed is typeof seed & { id: string } {\n return (\n typeof seed.id === \"string\" && seed.id.length > 0 && (seed.count ?? 1) === 1\n );\n}\n\nfunction renderStrictSlotLocationSchema(\n hosts: ReadonlyArray<{\n kind: \"piece\" | \"die\";\n id: string;\n slotIds: readonly string[];\n }>,\n): string {\n const branches = hosts.flatMap((host) =>\n host.slotIds.map(\n (slotId) => `z.object({\n type: z.literal(\"InSlot\"),\n host: z.object({\n kind: z.literal(${quote(host.kind)}),\n id: z.literal(${quote(host.id)}),\n }),\n slotId: z.literal(${quote(slotId)}),\n position: z.number().int().nullable().optional(),\n })`,\n ),\n );\n\n if (branches.length === 0) {\n return `z.object({\n type: z.literal(\"InSlot\"),\n host: z.never(),\n slotId: z.never(),\n position: z.number().int().nullable().optional(),\n })`;\n }\n\n return branches.join(\",\\n \");\n}\n\nfunction analyzeManifest(\n inputManifest: GameTopologyManifest,\n): ManifestAnalysis {\n const manifest = addStandardDecksIfNeeded(inputManifest);\n const playerIds = Array.from(\n { length: manifest.players.maxPlayers },\n (_, index) => `player-${index + 1}`,\n );\n const sharedZones = (manifest.zones ?? []).filter(\n (zone) => zone.scope === \"shared\",\n );\n const playerZones = (manifest.zones ?? []).filter(\n (zone) => zone.scope === \"perPlayer\",\n );\n const zoneIds = dedupeSorted((manifest.zones ?? []).map((zone) => zone.id));\n const cardSets = manifest.cardSets.map(materializeCardSet);\n const cardSetIds = dedupeSorted(cardSets.map((cardSet) => cardSet.id));\n const cardTypes = dedupeSorted(\n cardSets.flatMap((cardSet) => cardSet.cards.map((card) => card.type)),\n );\n const cardIds = dedupeSorted(\n cardSets.flatMap((cardSet) => cardSet.cards.flatMap(renderCardInstanceIds)),\n );\n const cardSetIdByCardId = new Map<string, string>();\n const cardTypeByCardId = new Map<string, string>();\n for (const cardSet of cardSets) {\n for (const card of cardSet.cards) {\n for (const cardId of renderCardInstanceIds(card)) {\n cardSetIdByCardId.set(cardId, cardSet.id);\n cardTypeByCardId.set(cardId, card.cardType ?? card.type);\n }\n }\n }\n\n const sharedZoneCardSetIds = new Map<string, string[]>();\n for (const zone of sharedZones) {\n sharedZoneCardSetIds.set(\n zone.id,\n dedupeSorted(zone.allowedCardSetIds ?? []),\n );\n }\n const playerZoneCardSetIds = new Map<string, string[]>();\n for (const zone of playerZones) {\n playerZoneCardSetIds.set(\n zone.id,\n dedupeSorted(zone.allowedCardSetIds ?? []),\n );\n }\n const zoneCardSetIdsById = new Map<string, string[]>();\n for (const [zoneId, cardSetIds] of sharedZoneCardSetIds.entries()) {\n zoneCardSetIdsById.set(zoneId, cardSetIds);\n }\n for (const [zoneId, cardSetIds] of playerZoneCardSetIds.entries()) {\n zoneCardSetIdsById.set(zoneId, cardSetIds);\n }\n\n const sharedZoneIdsByCardSetId = new Map<string, string[]>(\n cardSetIds.map((cardSetId): [string, string[]] => [cardSetId, []]),\n );\n for (const [zoneId, allowedCardSetIds] of sharedZoneCardSetIds.entries()) {\n for (const cardSetId of allowedCardSetIds) {\n const zoneIds = sharedZoneIdsByCardSetId.get(cardSetId) ?? [];\n zoneIds.push(zoneId);\n sharedZoneIdsByCardSetId.set(cardSetId, zoneIds);\n }\n }\n for (const [cardSetId, zoneIds] of sharedZoneIdsByCardSetId.entries()) {\n sharedZoneIdsByCardSetId.set(cardSetId, dedupeSorted(zoneIds));\n }\n\n const sharedZoneIdSet = new Set(sharedZones.map((zone) => zone.id));\n const homeSharedZoneIdsByCardType = new Map<string, string[]>(\n cardTypes.map((cardType): [string, string[]] => [cardType, []]),\n );\n for (const cardSet of cardSets) {\n for (const card of cardSet.cards) {\n if (\n card.home?.type !== \"zone\" ||\n !sharedZoneIdSet.has(card.home.zoneId)\n ) {\n continue;\n }\n const zoneIds = homeSharedZoneIdsByCardType.get(card.type) ?? [];\n zoneIds.push(card.home.zoneId);\n homeSharedZoneIdsByCardType.set(card.type, zoneIds);\n }\n }\n const homeSharedZoneIdByCardType = new Map<string, string>();\n for (const [cardType, zoneIds] of homeSharedZoneIdsByCardType.entries()) {\n const uniqueZoneIds = dedupeSorted(zoneIds);\n homeSharedZoneIdsByCardType.set(cardType, uniqueZoneIds);\n const [homeZoneId] = uniqueZoneIds;\n if (uniqueZoneIds.length === 1 && homeZoneId !== undefined) {\n homeSharedZoneIdByCardType.set(cardType, homeZoneId);\n }\n }\n\n const zoneVisibilityById = new Map<string, string>(\n (manifest.zones ?? []).map((zone) => [\n zone.id,\n zone.visibility ?? \"public\",\n ]),\n );\n const resourceIds = dedupeSorted(\n (manifest.resources ?? []).map((resource) => resource.id),\n );\n const resourcePresentationById = sortedObject(\n (manifest.resources ?? []).map((resource) => [\n resource.id,\n {\n label: resource.name,\n ...(resource.icon ? { icon: resource.icon } : {}),\n },\n ]),\n );\n const setupOptionIds = dedupeSorted(\n (manifest.setupOptions ?? []).map((option) => option.id),\n );\n const setupProfileIds = dedupeSorted(\n (manifest.setupProfiles ?? []).map((profile) => profile.id),\n );\n const setupChoiceIdsByOptionId = new Map(\n (manifest.setupOptions ?? []).map((option) => [\n option.id,\n dedupeSorted((option.choices ?? []).map((choice) => choice.id)),\n ]),\n );\n const setupOptionsById = Object.fromEntries(\n (manifest.setupOptions ?? [])\n .slice()\n .sort((left, right) => left.id.localeCompare(right.id))\n .map((option) => [\n option.id,\n {\n id: option.id,\n name: option.name,\n description: option.description ?? null,\n choices: (option.choices ?? []).map((choice) => ({\n id: choice.id,\n label: choice.label,\n description: choice.description ?? null,\n })),\n },\n ]),\n );\n const setupProfilesById = Object.fromEntries(\n (manifest.setupProfiles ?? [])\n .slice()\n .sort((left, right) => left.id.localeCompare(right.id))\n .map((profile) => [\n profile.id,\n {\n id: profile.id,\n name: profile.name,\n description: profile.description ?? null,\n optionValues: profile.optionValues\n ? Object.fromEntries(\n Object.entries(profile.optionValues).filter(\n (entry): entry is [string, string] =>\n typeof entry[1] === \"string\",\n ),\n )\n : null,\n },\n ]),\n );\n const pieceTypeIds = dedupeSorted(\n (manifest.pieceTypes ?? []).map((pieceType) => pieceType.id),\n );\n const pieceTypeSchemasById = new Map(\n (manifest.pieceTypes ?? []).map((pieceType) => [\n pieceType.id,\n pieceType.fieldsSchema,\n ]),\n );\n const pieceTypeSlotIdsById = new Map(\n (manifest.pieceTypes ?? []).map((pieceType) => [\n pieceType.id,\n dedupeSorted((pieceType.slots ?? []).map((slot) => slot.id)),\n ]),\n );\n const pieceTypeIdByPieceId = new Map<string, string>();\n for (const seed of manifest.pieceSeeds ?? []) {\n for (const pieceId of expandSeedIds([seed])) {\n pieceTypeIdByPieceId.set(pieceId, seed.typeId);\n }\n }\n const pieceIds = dedupeSorted(pieceTypeIdByPieceId.keys());\n const dieTypeIds = dedupeSorted(\n (manifest.dieTypes ?? []).map((dieType) => dieType.id),\n );\n const dieTypeSchemasById = new Map(\n (manifest.dieTypes ?? []).map((dieType) => [\n dieType.id,\n dieType.fieldsSchema,\n ]),\n );\n const dieTypeSlotIdsById = new Map(\n (manifest.dieTypes ?? []).map((dieType) => [\n dieType.id,\n dedupeSorted((dieType.slots ?? []).map((slot) => slot.id)),\n ]),\n );\n const dieTypeIdByDieId = new Map<string, string>();\n for (const seed of manifest.dieSeeds ?? []) {\n for (const dieId of expandSeedIds([seed])) {\n dieTypeIdByDieId.set(dieId, seed.typeId);\n }\n }\n const dieIds = dedupeSorted(dieTypeIdByDieId.keys());\n const strictSlotHosts = [\n ...(manifest.pieceSeeds ?? []).flatMap((seed) => {\n if (!isSingletonExplicitSeed(seed)) {\n return [];\n }\n const slotIds = pieceTypeSlotIdsById.get(seed.typeId) ?? [];\n return slotIds.length > 0\n ? [\n {\n kind: \"piece\" as const,\n id: seed.id,\n slotIds,\n },\n ]\n : [];\n }),\n ...(manifest.dieSeeds ?? []).flatMap((seed) => {\n if (!isSingletonExplicitSeed(seed)) {\n return [];\n }\n const slotIds = dieTypeSlotIdsById.get(seed.typeId) ?? [];\n return slotIds.length > 0\n ? [\n {\n kind: \"die\" as const,\n id: seed.id,\n slotIds,\n },\n ]\n : [];\n }),\n ].sort(\n (left, right) =>\n left.kind.localeCompare(right.kind) || left.id.localeCompare(right.id),\n );\n const analyzedBoards = analyzeBoards(manifest, playerIds);\n const boardTemplateIds = dedupeSorted(\n (manifest.boardTemplates ?? []).map((boardTemplate) => boardTemplate.id),\n );\n const boardBaseIds = dedupeSorted(\n analyzedBoards.map(({ board }) => board.id),\n );\n const boardIds = dedupeSorted(\n analyzedBoards.flatMap((entry) => entry.runtimeBoardIds),\n );\n const boardTypeIds = dedupeSorted(\n analyzedBoards\n .map((board) => board.boardTypeId)\n .filter((typeId): typeId is string => typeof typeId === \"string\"),\n );\n const boardLayoutById = new Map<string, string>();\n const boardIdsByLayout = new Map<string, string[]>();\n const boardBaseIdsByLayout = new Map<string, string[]>();\n const boardIdsByBaseId = new Map<string, string[]>();\n const boardBaseIdsByTemplateId = new Map<string, string[]>();\n const boardTemplateLayoutById = new Map<string, string>();\n const boardIdsByTypeId = new Map<string, string[]>();\n const spaceIdsByBoardId = new Map<string, string[]>();\n const spaceTypeIdByBoardId = new Map<string, Record<string, string | null>>();\n const spaceIdsByTypeId = new Map<string, string[]>();\n const containerIdsByBoardId = new Map<string, string[]>();\n const containerHostByBoardId = new Map<\n string,\n Record<string, { type: \"board\" } | { type: \"space\"; spaceId: string }>\n >();\n const relationTypeIdsByBoardId = new Map<string, string[]>();\n const edgeIdsByTypeId = new Map<string, string[]>();\n const edgeIdsByBoardIdAndTypeId = new Map<string, Record<string, string[]>>();\n const vertexIdsByTypeId = new Map<string, string[]>();\n const vertexIdsByBoardIdAndTypeId = new Map<\n string,\n Record<string, string[]>\n >();\n for (const boardTemplate of manifest.boardTemplates ?? []) {\n boardTemplateLayoutById.set(boardTemplate.id, boardTemplate.layout);\n boardBaseIdsByLayout.set(\n boardTemplate.layout,\n dedupeSorted([...(boardBaseIdsByLayout.get(boardTemplate.layout) ?? [])]),\n );\n }\n for (const analyzedBoard of analyzedBoards) {\n boardIdsByBaseId.set(analyzedBoard.board.id, analyzedBoard.runtimeBoardIds);\n boardIdsByLayout.set(\n analyzedBoard.board.layout,\n dedupeSorted([\n ...(boardIdsByLayout.get(analyzedBoard.board.layout) ?? []),\n ...analyzedBoard.runtimeBoardIds,\n ]),\n );\n boardBaseIdsByLayout.set(\n analyzedBoard.board.layout,\n dedupeSorted([\n ...(boardBaseIdsByLayout.get(analyzedBoard.board.layout) ?? []),\n analyzedBoard.board.id,\n ]),\n );\n if (analyzedBoard.board.templateId) {\n boardBaseIdsByTemplateId.set(\n analyzedBoard.board.templateId,\n dedupeSorted([\n ...(boardBaseIdsByTemplateId.get(analyzedBoard.board.templateId) ??\n []),\n analyzedBoard.board.id,\n ]),\n );\n }\n const runtimeSpaceIds = analyzedBoard.spaces.map((space) => space.id);\n const runtimeSpaceTypeIds: Record<string, string | null> = sortedObject(\n analyzedBoard.spaces.map(\n (space) => [space.id, space.typeId ?? null] as const,\n ),\n );\n const runtimeContainerIds =\n analyzedBoard.layout === \"hex\"\n ? []\n : analyzedBoard.containers.map((container) => container.id);\n const runtimeContainerHosts: Record<\n string,\n { type: \"board\" } | { type: \"space\"; spaceId: string }\n > =\n analyzedBoard.layout === \"hex\"\n ? {}\n : sortedObject(\n analyzedBoard.containers.map((container) => [\n container.id,\n container.host.type === \"space\"\n ? { type: \"space\" as const, spaceId: container.host.spaceId }\n : { type: \"board\" as const },\n ]),\n );\n const runtimeRelationTypeIds =\n analyzedBoard.layout === \"hex\"\n ? [\"adjacent\"]\n : analyzedBoard.layout === \"square\"\n ? dedupeSorted([\n \"adjacent\",\n ...analyzedBoard.relations.map((relation) => relation.typeId),\n ])\n : dedupeSorted(\n analyzedBoard.relations.map((relation) => relation.typeId),\n );\n for (const runtimeBoardId of analyzedBoard.runtimeBoardIds) {\n boardLayoutById.set(runtimeBoardId, analyzedBoard.board.layout);\n spaceIdsByBoardId.set(runtimeBoardId, runtimeSpaceIds);\n spaceTypeIdByBoardId.set(runtimeBoardId, runtimeSpaceTypeIds);\n containerIdsByBoardId.set(runtimeBoardId, runtimeContainerIds);\n containerHostByBoardId.set(runtimeBoardId, runtimeContainerHosts);\n relationTypeIdsByBoardId.set(runtimeBoardId, runtimeRelationTypeIds);\n }\n if (analyzedBoard.boardTypeId) {\n boardIdsByTypeId.set(\n analyzedBoard.boardTypeId,\n dedupeSorted([\n ...(boardIdsByTypeId.get(analyzedBoard.boardTypeId) ?? []),\n ...analyzedBoard.runtimeBoardIds,\n ]),\n );\n }\n for (const space of analyzedBoard.spaces) {\n if (!space.typeId) {\n continue;\n }\n spaceIdsByTypeId.set(\n space.typeId,\n dedupeSorted([...(spaceIdsByTypeId.get(space.typeId) ?? []), space.id]),\n );\n }\n if (analyzedBoard.layout !== \"generic\") {\n const edgeIdsForBoardByType: Record<string, string[]> = {};\n for (const edge of analyzedBoard.edges) {\n if (!edge.typeId) {\n continue;\n }\n edgeIdsByTypeId.set(\n edge.typeId,\n dedupeSorted([...(edgeIdsByTypeId.get(edge.typeId) ?? []), edge.id]),\n );\n edgeIdsForBoardByType[edge.typeId] = dedupeSorted([\n ...(edgeIdsForBoardByType[edge.typeId] ?? []),\n edge.id,\n ]);\n }\n const vertexIdsForBoardByType: Record<string, string[]> = {};\n for (const vertex of analyzedBoard.vertices) {\n if (!vertex.typeId) {\n continue;\n }\n vertexIdsByTypeId.set(\n vertex.typeId,\n dedupeSorted([\n ...(vertexIdsByTypeId.get(vertex.typeId) ?? []),\n vertex.id,\n ]),\n );\n vertexIdsForBoardByType[vertex.typeId] = dedupeSorted([\n ...(vertexIdsForBoardByType[vertex.typeId] ?? []),\n vertex.id,\n ]);\n }\n for (const runtimeBoardId of analyzedBoard.runtimeBoardIds) {\n edgeIdsByBoardIdAndTypeId.set(runtimeBoardId, edgeIdsForBoardByType);\n vertexIdsByBoardIdAndTypeId.set(\n runtimeBoardId,\n vertexIdsForBoardByType,\n );\n }\n }\n }\n const relationTypeIds = dedupeSorted(\n Array.from(relationTypeIdsByBoardId.values()).flat(),\n );\n const edgeIds = dedupeSorted(\n analyzedBoards.flatMap((board) =>\n board.layout === \"generic\" ? [] : board.edges.map((edge) => edge.id),\n ),\n );\n const edgeTypeIds = dedupeSorted(edgeIdsByTypeId.keys());\n const vertexIds = dedupeSorted(\n analyzedBoards.flatMap((board) =>\n board.layout === \"generic\"\n ? []\n : board.vertices.map((vertex) => vertex.id),\n ),\n );\n const vertexTypeIds = dedupeSorted(vertexIdsByTypeId.keys());\n const boardContainerIds = dedupeSorted(\n analyzedBoards.flatMap((board) =>\n board.layout === \"hex\"\n ? []\n : board.containers.map((container) => container.id),\n ),\n );\n const spaceIds = dedupeSorted(\n analyzedBoards.flatMap((board) => board.spaces.map((space) => space.id)),\n );\n const spaceTypeIds = dedupeSorted(\n analyzedBoards.flatMap((board) =>\n board.spaces\n .map((space) => space.typeId)\n .filter((typeId): typeId is string => typeof typeId === \"string\"),\n ),\n );\n\n return {\n manifest,\n playerIds,\n sharedZones,\n playerZones,\n zoneIds,\n cardSets,\n cardSetIds,\n cardTypes,\n cardIds,\n cardSetIdByCardId,\n cardTypeByCardId,\n sharedZoneCardSetIds,\n sharedZoneIdsByCardSetId,\n homeSharedZoneIdsByCardType,\n homeSharedZoneIdByCardType,\n playerZoneCardSetIds,\n zoneCardSetIdsById,\n zoneVisibilityById,\n resourceIds,\n resourcePresentationById,\n setupOptionIds,\n setupProfileIds,\n setupChoiceIdsByOptionId,\n setupOptionsById,\n setupProfilesById,\n pieceTypeIds,\n pieceIds,\n pieceTypeIdByPieceId,\n dieTypeIds,\n dieIds,\n dieTypeIdByDieId,\n strictSlotHosts,\n boardTemplateIds,\n boardBaseIds,\n boardIds,\n boardContainerIds,\n boardTypeIds,\n boardLayoutById,\n boardIdsByLayout,\n boardBaseIdsByLayout,\n boardIdsByBaseId,\n boardBaseIdsByTemplateId,\n boardTemplateLayoutById,\n boardIdsByTypeId,\n spaceIdsByBoardId,\n spaceTypeIdByBoardId,\n spaceIdsByTypeId,\n containerIdsByBoardId,\n containerHostByBoardId,\n relationTypeIds,\n relationTypeIdsByBoardId,\n edgeIds,\n edgeTypeIds,\n edgeIdsByTypeId,\n edgeIdsByBoardIdAndTypeId,\n vertexIds,\n vertexTypeIds,\n vertexIdsByTypeId,\n vertexIdsByBoardIdAndTypeId,\n spaceIds,\n spaceTypeIds,\n analyzedBoards,\n pieceTypeSchemasById,\n dieTypeSchemasById,\n };\n}\n\nfunction cloneJson<Value>(value: Value): Value {\n return JSON.parse(JSON.stringify(value)) as Value;\n}\n\nfunction boardSpaceRefKey(spaceIds: readonly string[]): string {\n return [...spaceIds]\n .sort((left, right) => left.localeCompare(right))\n .join(\"$$\");\n}\n\nfunction materializePropertySchemaDefault(\n property: PropertySchema,\n analysis: ManifestAnalysis,\n runtimeBoardId?: string,\n): unknown {\n if (hasPropertySchemaDefault(property)) {\n return cloneJson(property.default);\n }\n if (property.optional) {\n return undefined;\n }\n if (property.nullable) {\n return null;\n }\n\n switch (property.type) {\n case \"string\":\n return \"\";\n case \"integer\":\n case \"number\":\n return 0;\n case \"boolean\":\n return false;\n case \"enum\":\n return property.enums?.[0] ?? \"\";\n case \"array\":\n return [];\n case \"object\":\n return materializeObjectSchemaDefaults(\n property.properties ? { properties: property.properties } : undefined,\n analysis,\n runtimeBoardId,\n );\n case \"record\":\n return {};\n case \"zoneId\":\n return analysis.zoneIds[0] ?? \"\";\n case \"cardId\":\n return analysis.cardIds[0] ?? \"\";\n case \"playerId\":\n return analysis.playerIds[0] ?? \"\";\n case \"boardId\":\n return runtimeBoardId ?? analysis.boardIds[0] ?? \"\";\n case \"edgeId\":\n return analysis.edgeIds[0] ?? \"\";\n case \"vertexId\":\n return analysis.vertexIds[0] ?? \"\";\n case \"spaceId\":\n return (\n (runtimeBoardId\n ? analysis.spaceIdsByBoardId.get(runtimeBoardId)?.[0]\n : undefined) ??\n analysis.spaceIds[0] ??\n \"\"\n );\n case \"pieceId\":\n return analysis.pieceIds[0] ?? \"\";\n case \"dieId\":\n return analysis.dieIds[0] ?? \"\";\n case \"resourceId\":\n return analysis.resourceIds[0] ?? \"\";\n }\n}\n\nfunction materializeObjectSchemaDefaults(\n schema: ObjectSchema | null | undefined,\n analysis: ManifestAnalysis,\n runtimeBoardId?: string,\n): Record<string, unknown> {\n if (!schema?.properties) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(schema.properties).flatMap(([key, property]) => {\n const value = materializePropertySchemaDefault(\n property,\n analysis,\n runtimeBoardId,\n );\n return value === undefined ? [] : [[key, value]];\n }),\n );\n}\n\nfunction materializeCardPropertiesDefaults(\n schema: CardPropertySchema | null | undefined,\n cardType: string,\n analysis: ManifestAnalysis,\n): Record<string, unknown> {\n const objectSchema = isCardPropertySchemaVariants(schema)\n ? mergeSharedCardProperties(schema, cardType)\n : schema;\n return materializeObjectSchemaDefaults(objectSchema, analysis);\n}\n\nexport function materializeManifestTable(options: {\n manifest: GameTopologyManifest;\n playerIds: readonly string[];\n shuffleItems: <Value>(values: readonly Value[]) => Value[];\n}): Record<string, unknown> {\n const analysis = analyzeManifest(options.manifest);\n const manifest = analysis.manifest;\n const playerIds = [...options.playerIds];\n\n const cards: Record<string, Record<string, unknown>> = {};\n const pieces: Record<string, Record<string, unknown>> = {};\n const dice: Record<string, Record<string, unknown>> = {};\n const componentLocations: Record<string, Record<string, unknown>> = {};\n const locationOrder = new Map<string, number>();\n const cardIdsByCardSetId = new Map<string, string[]>();\n\n const boardAnalysisByBaseId = new Map(\n analysis.analyzedBoards.map((board) => [board.board.id, board] as const),\n );\n const edgeIdByBoardBaseIdAndSpaces = new Map<string, Map<string, string>>();\n const vertexIdByBoardBaseIdAndSpaces = new Map<string, Map<string, string>>();\n\n for (const analyzedBoard of analysis.analyzedBoards) {\n if (analyzedBoard.layout === \"generic\") {\n continue;\n }\n edgeIdByBoardBaseIdAndSpaces.set(\n analyzedBoard.board.id,\n new Map(\n analyzedBoard.edges.map((edge) => [\n boardSpaceRefKey(edge.spaceIds),\n edge.id,\n ]),\n ),\n );\n vertexIdByBoardBaseIdAndSpaces.set(\n analyzedBoard.board.id,\n new Map(\n analyzedBoard.vertices.map((vertex) => [\n boardSpaceRefKey(vertex.spaceIds),\n vertex.id,\n ]),\n ),\n );\n }\n\n const nextLocationPosition = (location: Record<string, unknown>): number => {\n const key = JSON.stringify(location);\n const position = locationOrder.get(key) ?? 0;\n locationOrder.set(key, position + 1);\n return position;\n };\n const zoneScopeById = new Map<string, \"shared\" | \"perPlayer\">([\n ...analysis.sharedZones.map((zone) => [zone.id, \"shared\"] as const),\n ...analysis.playerZones.map((zone) => [zone.id, \"perPlayer\"] as const),\n ]);\n const nextDeckPositionByZoneId = new Map<string, number>();\n\n const resolveRuntimeBoardId = (\n boardBaseId: string,\n ownerId: string | null | undefined,\n context?: string,\n ) => {\n const analyzedBoard = boardAnalysisByBaseId.get(boardBaseId);\n if (analyzedBoard?.board.scope === \"perPlayer\") {\n if (!ownerId) {\n throw new Error(\n `${context ?? `Home on board '${boardBaseId}'`} requires ownerId because board '${boardBaseId}' has scope 'perPlayer'. Add ownerId to resolve the player-scoped destination.`,\n );\n }\n return `${boardBaseId}:${ownerId}`;\n }\n return boardBaseId;\n };\n\n const resolveBoardEdgeId = (\n boardBaseId: string,\n spaceIds: readonly string[],\n ) =>\n edgeIdByBoardBaseIdAndSpaces\n .get(boardBaseId)\n ?.get(boardSpaceRefKey(spaceIds)) ?? boardSpaceRefKey(spaceIds);\n\n const resolveBoardVertexId = (\n boardBaseId: string,\n spaceIds: readonly string[],\n ) =>\n vertexIdByBoardBaseIdAndSpaces\n .get(boardBaseId)\n ?.get(boardSpaceRefKey(spaceIds)) ?? boardSpaceRefKey(spaceIds);\n\n for (const cardSet of manifest.cardSets) {\n const materializedCardSet = materializeCardSet(cardSet);\n const cardIds: string[] = [];\n for (const card of materializedCardSet.cards) {\n const cardInstanceIds = renderCardInstanceIds(card);\n for (const cardId of cardInstanceIds) {\n cardIds.push(cardId);\n cards[cardId] = {\n id: cardId,\n cardSetId: materializedCardSet.id,\n cardType: card.type,\n name: card.name,\n text: card.text,\n properties: {\n ...materializeCardPropertiesDefaults(\n materializedCardSet.cardSchema,\n card.type,\n analysis,\n ),\n ...(card.properties ?? {}),\n },\n };\n if (card.home?.type === \"zone\") {\n const nextPosition =\n nextDeckPositionByZoneId.get(card.home.zoneId) ?? 0;\n nextDeckPositionByZoneId.set(card.home.zoneId, nextPosition + 1);\n componentLocations[cardId] = {\n type: \"InDeck\",\n deckId: card.home.zoneId,\n playedBy: null,\n position: nextPosition,\n };\n } else if (card.home?.type === \"detached\") {\n componentLocations[cardId] = {\n type: \"Detached\",\n position: nextLocationPosition({ type: \"Detached\" }),\n };\n }\n }\n }\n cardIdsByCardSetId.set(materializedCardSet.id, cardIds);\n }\n\n for (const zone of analysis.sharedZones) {\n const primaryCardSetId = zone.allowedCardSetIds?.[0];\n if (!primaryCardSetId) {\n continue;\n }\n const shuffled = options.shuffleItems(\n (cardIdsByCardSetId.get(primaryCardSetId) ?? []).filter(\n (cardId) => componentLocations[cardId] === undefined,\n ),\n );\n shuffled.forEach((cardId, index) => {\n componentLocations[cardId] = {\n type: \"InDeck\",\n deckId: zone.id,\n playedBy: null,\n position: index,\n };\n });\n }\n\n const pieceTypesById = new Map(\n (manifest.pieceTypes ?? []).map((pieceType) => [pieceType.id, pieceType]),\n );\n const dieTypesById = new Map(\n (manifest.dieTypes ?? []).map((dieType) => [dieType.id, dieType]),\n );\n\n const assignSeedLocation = (\n componentId: string,\n ownerId: string | null | undefined,\n home: PieceSeedSpec[\"home\"] | DieSeedSpec[\"home\"] | undefined,\n context: {\n path: string;\n label: string;\n },\n ) => {\n if (!home) {\n componentLocations[componentId] = { type: \"Detached\" };\n return;\n }\n\n if (home.type === \"slot\") {\n componentLocations[componentId] = {\n type: \"InSlot\",\n host: home.host,\n slotId: home.slotId,\n position: nextLocationPosition({\n type: \"InSlot\",\n host: home.host,\n slotId: home.slotId,\n }),\n };\n return;\n }\n\n if (home.type === \"zone\") {\n if (zoneScopeById.get(home.zoneId) === \"perPlayer\") {\n if (!ownerId) {\n throw new Error(\n `${context.path}.zoneId: ${context.label} requires ownerId because zone '${home.zoneId}' has scope 'perPlayer'. Add ownerId to resolve the player-scoped destination.`,\n );\n }\n componentLocations[componentId] = {\n type: \"InHand\",\n handId: home.zoneId,\n playerId: ownerId,\n position: nextLocationPosition({\n type: \"InHand\",\n handId: home.zoneId,\n playerId: ownerId,\n }),\n };\n return;\n }\n\n componentLocations[componentId] = {\n type: \"InZone\",\n zoneId: home.zoneId,\n playedBy: null,\n position: nextLocationPosition({\n type: \"InZone\",\n zoneId: home.zoneId,\n }),\n };\n return;\n }\n\n if (home.type === \"space\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n ownerId,\n `${context.path}.boardId: ${context.label}`,\n );\n componentLocations[componentId] = {\n type: \"OnSpace\",\n boardId,\n spaceId: home.spaceId,\n position: nextLocationPosition({\n type: \"OnSpace\",\n boardId,\n spaceId: home.spaceId,\n }),\n };\n return;\n }\n\n if (home.type === \"container\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n ownerId,\n `${context.path}.boardId: ${context.label}`,\n );\n componentLocations[componentId] = {\n type: \"InContainer\",\n boardId,\n containerId: home.containerId,\n position: nextLocationPosition({\n type: \"InContainer\",\n boardId,\n containerId: home.containerId,\n }),\n };\n return;\n }\n\n if (home.type === \"edge\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n ownerId,\n `${context.path}.boardId: ${context.label}`,\n );\n const edgeId = resolveBoardEdgeId(home.boardId, home.ref.spaces);\n componentLocations[componentId] = {\n type: \"OnEdge\",\n boardId,\n edgeId,\n position: nextLocationPosition({\n type: \"OnEdge\",\n boardId,\n edgeId,\n }),\n };\n return;\n }\n\n if (home.type === \"vertex\") {\n const boardId = resolveRuntimeBoardId(\n home.boardId,\n ownerId,\n `${context.path}.boardId: ${context.label}`,\n );\n const vertexId = resolveBoardVertexId(home.boardId, home.ref.spaces);\n componentLocations[componentId] = {\n type: \"OnVertex\",\n boardId,\n vertexId,\n position: nextLocationPosition({\n type: \"OnVertex\",\n boardId,\n vertexId,\n }),\n };\n return;\n }\n\n componentLocations[componentId] = { type: \"Detached\" };\n };\n\n for (const [seedIndex, seed] of (manifest.pieceSeeds ?? []).entries()) {\n const pieceType = pieceTypesById.get(seed.typeId);\n for (const componentId of expandSeedIds([seed])) {\n pieces[componentId] = {\n componentType: \"piece\",\n id: componentId,\n pieceTypeId: seed.typeId,\n pieceName: pieceType?.name ?? seed.typeId,\n ownerId: seed.ownerId ?? null,\n properties: {\n ...materializeObjectSchemaDefaults(\n analysis.pieceTypeSchemasById.get(seed.typeId),\n analysis,\n ),\n ...(seed.fields ?? {}),\n },\n };\n assignSeedLocation(componentId, seed.ownerId, seed.home, {\n path: `manifest.pieceSeeds[${seedIndex}].home`,\n label: `Piece seed '${seed.id ?? seed.typeId}'`,\n });\n }\n }\n\n for (const [seedIndex, seed] of (manifest.dieSeeds ?? []).entries()) {\n const dieType = dieTypesById.get(seed.typeId);\n for (const componentId of expandSeedIds([seed])) {\n dice[componentId] = {\n componentType: \"die\",\n id: componentId,\n dieTypeId: seed.typeId,\n dieName: dieType?.name ?? seed.typeId,\n ownerId: seed.ownerId ?? null,\n sides: dieType?.sides ?? 6,\n value: null,\n properties: {\n ...materializeObjectSchemaDefaults(\n analysis.dieTypeSchemasById.get(seed.typeId),\n analysis,\n ),\n ...(seed.fields ?? {}),\n },\n };\n assignSeedLocation(componentId, seed.ownerId, seed.home, {\n path: `manifest.dieSeeds[${seedIndex}].home`,\n label: `Die seed '${seed.id ?? seed.typeId}'`,\n });\n }\n }\n\n const boardStatesById: Record<string, Record<string, unknown>> = {};\n const hexBoardStatesById: Record<string, Record<string, unknown>> = {};\n const squareBoardStatesById: Record<string, Record<string, unknown>> = {};\n\n for (const analyzedBoard of analysis.analyzedBoards) {\n const sharedBoardState = {\n baseId: analyzedBoard.board.id,\n layout: analyzedBoard.layout,\n typeId: analyzedBoard.boardTypeId ?? null,\n scope: analyzedBoard.board.scope,\n templateId: analyzedBoard.board.templateId ?? null,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.boardFieldsSchema,\n analysis,\n ),\n ...(analyzedBoard.board.fields ?? {}),\n },\n };\n\n const buildSpaces = () =>\n Object.fromEntries(\n analysis.spaceIds.map((spaceId) => {\n const space = analyzedBoard.spaces.find(\n (entry) => entry.id === spaceId,\n );\n const baseSpaceState = {\n id: spaceId,\n name: space && \"name\" in space ? (space.name ?? null) : null,\n typeId: space?.typeId ?? null,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.spaceFieldsSchema,\n analysis,\n ),\n ...(space?.fields ?? {}),\n },\n zoneId: space && \"zoneId\" in space ? (space.zoneId ?? null) : null,\n };\n\n if (analyzedBoard.layout === \"hex\") {\n const hexSpace = space as HexSpaceSpec | undefined;\n return [\n spaceId,\n {\n ...baseSpaceState,\n q: hexSpace?.q ?? 0,\n r: hexSpace?.r ?? 0,\n },\n ];\n }\n\n if (analyzedBoard.layout === \"square\") {\n const squareSpace = space as SquareSpaceSpec | undefined;\n return [\n spaceId,\n {\n ...baseSpaceState,\n row: squareSpace?.row ?? 0,\n col: squareSpace?.col ?? 0,\n },\n ];\n }\n\n return [spaceId, baseSpaceState];\n }),\n );\n\n const relations =\n analyzedBoard.layout === \"hex\"\n ? []\n : analyzedBoard.relations.map((relation) => ({\n id: relation.id ?? null,\n typeId: relation.typeId,\n fromSpaceId: relation.fromSpaceId,\n toSpaceId: relation.toSpaceId,\n directed: relation.directed ?? false,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.relationFieldsSchema,\n analysis,\n ),\n ...(relation.fields ?? {}),\n },\n }));\n\n const buildContainers = (runtimeBoardId: string) =>\n analyzedBoard.layout === \"hex\"\n ? {}\n : Object.fromEntries(\n analysis.boardContainerIds.map((containerId) => {\n const container = analyzedBoard.containers.find(\n (entry) => entry.id === containerId,\n );\n return [\n containerId,\n {\n id: containerId,\n name: container?.name ?? containerId,\n host:\n container?.host.type === \"space\"\n ? { type: \"space\", spaceId: container.host.spaceId }\n : { type: \"board\" },\n allowedCardSetIds: container?.allowedCardSetIds,\n zoneId: `board:${runtimeBoardId}:container:${containerId}`,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.containerFieldsSchema,\n analysis,\n runtimeBoardId,\n ),\n ...(container?.fields ?? {}),\n },\n },\n ];\n }),\n );\n\n const edges =\n analyzedBoard.layout === \"generic\"\n ? []\n : analyzedBoard.edges.map((edge) => ({\n id: edge.id,\n spaceIds: [...edge.spaceIds],\n typeId: edge.typeId ?? null,\n label: edge.label ?? null,\n ownerId: null,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.edgeFieldsSchema,\n analysis,\n ),\n ...(edge.fields ?? {}),\n },\n }));\n\n const vertices =\n analyzedBoard.layout === \"generic\"\n ? []\n : analyzedBoard.vertices.map((vertex) => ({\n id: vertex.id,\n spaceIds: [...vertex.spaceIds],\n typeId: vertex.typeId ?? null,\n label: vertex.label ?? null,\n ownerId: null,\n fields: {\n ...materializeObjectSchemaDefaults(\n analyzedBoard.vertexFieldsSchema,\n analysis,\n ),\n ...(vertex.fields ?? {}),\n },\n }));\n\n for (const runtimeBoardId of analyzedBoard.runtimeBoardIds) {\n const playerId =\n analyzedBoard.board.scope === \"perPlayer\"\n ? runtimeBoardId.slice(analyzedBoard.board.id.length + 1)\n : null;\n const boardState = {\n id: runtimeBoardId,\n ...sharedBoardState,\n playerId,\n spaces: cloneJson(buildSpaces()),\n relations: cloneJson(relations),\n containers: cloneJson(buildContainers(runtimeBoardId)),\n ...(analyzedBoard.layout === \"hex\"\n ? {\n orientation: analyzedBoard.board.orientation ?? \"pointy-top\",\n edges: cloneJson(edges),\n vertices: cloneJson(vertices),\n }\n : analyzedBoard.layout === \"square\"\n ? {\n edges: cloneJson(edges),\n vertices: cloneJson(vertices),\n }\n : {}),\n };\n\n boardStatesById[runtimeBoardId] = boardState;\n if (analyzedBoard.layout === \"hex\") {\n hexBoardStatesById[runtimeBoardId] = boardState;\n }\n if (analyzedBoard.layout === \"square\") {\n squareBoardStatesById[runtimeBoardId] = boardState;\n }\n }\n }\n\n const sharedZones = Object.fromEntries(\n analysis.sharedZones.map((zone) => [zone.id, [] as string[]]),\n );\n const perPlayerZones = Object.fromEntries(\n analysis.playerZones.map((zone) => [\n zone.id,\n Object.fromEntries(\n playerIds.map((playerId) => [playerId, [] as string[]]),\n ),\n ]),\n );\n const zoneVisibility = Object.fromEntries(\n (manifest.zones ?? []).map((zone) => [\n zone.id,\n zone.visibility ?? \"public\",\n ]),\n );\n const zoneCardSetIdsByZoneId = Object.fromEntries(\n Array.from(analysis.zoneCardSetIdsById.entries()).sort(([left], [right]) =>\n left.localeCompare(right),\n ),\n );\n const handVisibility = Object.fromEntries(\n analysis.playerZones.map((zone) => [\n zone.id,\n zone.visibility ?? \"ownerOnly\",\n ]),\n );\n const componentSortPosition = (position: unknown) =>\n typeof position === \"number\" ? position : Number.MAX_SAFE_INTEGER;\n const pushSharedComponent = (\n zoneId: string,\n componentId: string,\n position: unknown,\n ) => {\n const zone = sharedZones[zoneId];\n if (!zone) {\n return;\n }\n zone.push(componentId);\n zone.sort(\n (left, right) =>\n componentSortPosition(componentLocations[left]?.position) -\n componentSortPosition(componentLocations[right]?.position),\n );\n };\n const pushPlayerComponent = (\n zoneId: string,\n playerId: string,\n componentId: string,\n position: unknown,\n ) => {\n const zone = perPlayerZones[zoneId]?.[playerId];\n if (!zone) {\n return;\n }\n zone.push(componentId);\n zone.sort(\n (left, right) =>\n componentSortPosition(componentLocations[left]?.position) -\n componentSortPosition(componentLocations[right]?.position),\n );\n };\n\n for (const [componentId, location] of Object.entries(componentLocations)) {\n switch (location.type) {\n case \"InDeck\":\n pushSharedComponent(\n location.deckId as string,\n componentId,\n location.position,\n );\n break;\n case \"InHand\":\n pushPlayerComponent(\n location.handId as string,\n location.playerId as string,\n componentId,\n location.position,\n );\n break;\n case \"InZone\":\n pushSharedComponent(\n location.zoneId as string,\n componentId,\n location.position,\n );\n break;\n default:\n break;\n }\n }\n const ownerOfCard = Object.fromEntries(\n Object.keys(cards).map((cardId) => [cardId, null]),\n );\n const visibility = Object.fromEntries(\n Object.keys(cards).map((cardId) => [cardId, { faceUp: true }]),\n );\n const resourcesByPlayer = Object.fromEntries(\n playerIds.map((playerId) => [\n playerId,\n Object.fromEntries(\n analysis.resourceIds.map((resourceId) => [resourceId, 0]),\n ),\n ]),\n );\n // PerPlayer<T> wire shape only: { __perPlayer: true, entries: [[playerId, value], ...] }.\n const toPerPlayerWireFormat = <Value>(\n entries: Record<string, Value>,\n ): {\n readonly __perPlayer: true;\n readonly entries: ReadonlyArray<readonly [string, Value]>;\n } => ({\n __perPlayer: true,\n entries: playerIds.map(\n (playerId) => [playerId, entries[playerId] as Value] as const,\n ),\n });\n\n const perPlayerZonesWire = Object.fromEntries(\n Object.entries(perPlayerZones).map(([zoneId, entries]) => [\n zoneId,\n toPerPlayerWireFormat(entries),\n ]),\n );\n const resourcesWire = toPerPlayerWireFormat(resourcesByPlayer);\n\n return {\n playerOrder: playerIds,\n zones: {\n shared: sharedZones,\n perPlayer: perPlayerZonesWire,\n visibility: zoneVisibility,\n cardSetIdsByZoneId: zoneCardSetIdsByZoneId,\n },\n decks: cloneJson(sharedZones),\n hands: cloneJson(perPlayerZonesWire),\n handVisibility,\n cards,\n pieces,\n componentLocations,\n ownerOfCard,\n visibility,\n resources: resourcesWire,\n boards: {\n byId: boardStatesById,\n hex: hexBoardStatesById,\n square: squareBoardStatesById,\n network: {},\n track: {},\n },\n dice,\n };\n}\n\nfunction renderTypeForPropertySchema(\n schema: PropertySchema | null | undefined,\n): string {\n if (!schema) {\n return \"RuntimePayload\";\n }\n let rendered: string;\n switch (schema.type) {\n case \"string\":\n rendered = \"string\";\n break;\n case \"integer\":\n case \"number\":\n rendered = \"number\";\n break;\n case \"boolean\":\n rendered = \"boolean\";\n break;\n case \"cardId\":\n rendered = \"CardId\";\n break;\n case \"playerId\":\n rendered = \"PlayerId\";\n break;\n case \"zoneId\":\n rendered = \"ZoneId\";\n break;\n case \"boardId\":\n rendered = \"BoardId\";\n break;\n case \"edgeId\":\n rendered = \"EdgeId\";\n break;\n case \"vertexId\":\n rendered = \"VertexId\";\n break;\n case \"spaceId\":\n rendered = \"SpaceId\";\n break;\n case \"pieceId\":\n rendered = \"PieceId\";\n break;\n case \"dieId\":\n rendered = \"DieId\";\n break;\n case \"resourceId\":\n rendered = \"ResourceId\";\n break;\n case \"enum\":\n rendered =\n schema.enums && schema.enums.length > 0\n ? schema.enums.map((value) => quote(value)).join(\" | \")\n : \"string\";\n break;\n case \"array\":\n rendered = `Array<${renderTypeForPropertySchema(schema.items)}>`;\n break;\n case \"object\":\n rendered = renderTypeForObjectSchema(\n schema.properties\n ? {\n properties: schema.properties,\n }\n : null,\n );\n break;\n case \"record\":\n rendered = `Record<string, ${renderTypeForPropertySchema(schema.values)}>`;\n break;\n default:\n rendered = \"RuntimePayload\";\n break;\n }\n return schema.nullable ? `${rendered} | null` : rendered;\n}\n\nfunction renderZodForPropertySchema(\n schema: PropertySchema | null | undefined,\n): string {\n if (!schema) {\n return \"z.unknown()\";\n }\n let rendered: string;\n switch (schema.type) {\n case \"string\":\n rendered = \"z.string()\";\n break;\n case \"integer\":\n rendered = \"z.number().int()\";\n break;\n case \"number\":\n rendered = \"z.number()\";\n break;\n case \"boolean\":\n rendered = \"z.boolean()\";\n break;\n case \"cardId\":\n rendered = \"ids.cardId\";\n break;\n case \"playerId\":\n rendered = \"ids.playerId\";\n break;\n case \"zoneId\":\n rendered = \"ids.zoneId\";\n break;\n case \"boardId\":\n rendered = \"ids.boardId\";\n break;\n case \"edgeId\":\n rendered = \"ids.edgeId\";\n break;\n case \"vertexId\":\n rendered = \"ids.vertexId\";\n break;\n case \"spaceId\":\n rendered = \"ids.spaceId\";\n break;\n case \"pieceId\":\n rendered = \"ids.pieceId\";\n break;\n case \"dieId\":\n rendered = \"ids.dieId\";\n break;\n case \"resourceId\":\n rendered = \"ids.resourceId\";\n break;\n case \"enum\":\n rendered =\n schema.enums && schema.enums.length > 0\n ? `z.enum([${schema.enums.map((value) => quote(value)).join(\", \")}])`\n : \"z.string()\";\n break;\n case \"array\":\n rendered = `z.array(${renderZodForPropertySchema(schema.items)})`;\n break;\n case \"object\":\n rendered = renderZodForObjectSchema(\n schema.properties\n ? {\n properties: schema.properties,\n }\n : null,\n );\n break;\n case \"record\":\n rendered = `z.record(z.string(), ${renderZodForPropertySchema(schema.values)})`;\n break;\n default:\n rendered = \"z.unknown()\";\n break;\n }\n if (schema.nullable) {\n rendered = `${rendered}.nullable()`;\n }\n if (schema.optional) {\n rendered = `${rendered}.optional()`;\n }\n if (hasPropertySchemaDefault(schema)) {\n rendered = `${rendered}.default(${JSON.stringify(schema.default)})`;\n }\n return rendered;\n}\n\nfunction renderTypeForObjectSchema(\n schema: ObjectSchema | null | undefined,\n): string {\n if (!schema || Object.keys(schema.properties).length === 0) {\n return \"RuntimeRecord\";\n }\n\n return `{\\n${Object.entries(schema.properties)\n .map(([key, value]) => {\n const optional =\n value?.optional && !hasPropertySchemaDefault(value) ? \"?\" : \"\";\n return ` ${quote(key)}${optional}: ${renderTypeForPropertySchema(value)};`;\n })\n .join(\"\\n\")}\\n}`;\n}\n\nfunction renderZodForObjectSchema(\n schema: ObjectSchema | null | undefined,\n): string {\n if (!schema || Object.keys(schema.properties).length === 0) {\n return \"z.record(z.string(), z.unknown())\";\n }\n\n return `z.object({\\n${Object.entries(schema.properties)\n .map(\n ([key, value]) =>\n ` ${quote(key)}: ${renderZodForPropertySchema(value)},`,\n )\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderCardSetPropertySections(\n cardSets: readonly ManualCardSetDefinition[],\n): string {\n return cardSets\n .map((cardSet) => {\n const typeName = `${toPascalCase(cardSet.id)}CardProperties`;\n const schemaName = `${typeName}Schema`;\n\n if (isCardPropertySchemaVariants(cardSet.cardSchema)) {\n const cardSchema = cardSet.cardSchema;\n const variantBlocks = Object.entries(cardSchema.variants).map(\n ([cardType]) => {\n const variantTypeName = cardPropertiesTypeName(cardSet, cardType);\n const variantSchemaName = cardPropertiesSchemaName(\n cardSet,\n cardType,\n );\n const schema = mergeSharedCardProperties(cardSchema, cardType);\n return renderBlocks([\n `export type ${variantTypeName} = ${renderTypeForObjectSchema(schema)};`,\n `export const ${variantSchemaName} = ${renderZodForObjectSchema(schema)};`,\n ]);\n },\n );\n const variantTypeNames = Object.keys(cardSchema.variants).map(\n (cardType) => cardPropertiesTypeName(cardSet, cardType),\n );\n const variantSchemaNames = Object.keys(cardSchema.variants).map(\n (cardType) => cardPropertiesSchemaName(cardSet, cardType),\n );\n const unionSchema =\n variantSchemaNames.length === 0\n ? \"z.record(z.string(), z.unknown())\"\n : variantSchemaNames.length === 1\n ? variantSchemaNames[0]\n : `z.union([${variantSchemaNames.join(\", \")}])`;\n\n return renderBlocks([\n ...variantBlocks,\n `export type ${typeName} = ${variantTypeNames.join(\" | \") || \"RuntimeRecord\"};`,\n `export const ${schemaName} = ${unionSchema};`,\n `export type ${toPascalCase(cardSet.id)}CardId = ${\n cardSet.cards\n .flatMap(renderCardInstanceIds)\n .map((cardId) => quote(cardId))\n .join(\" | \") || \"never\"\n };`,\n ]);\n }\n\n return renderBlocks([\n `export type ${typeName} = ${renderTypeForObjectSchema(cardSet.cardSchema)};`,\n `export const ${schemaName} = ${renderZodForObjectSchema(cardSet.cardSchema)};`,\n `export type ${toPascalCase(cardSet.id)}CardId = ${\n cardSet.cards\n .flatMap(renderCardInstanceIds)\n .map((cardId) => quote(cardId))\n .join(\" | \") || \"never\"\n };`,\n ]);\n })\n .join(\"\\n\\n\");\n}\n\nfunction cardPropertiesTypeName(\n cardSet: ManualCardSetDefinition,\n cardType: string,\n): string {\n if (!isCardPropertySchemaVariants(cardSet.cardSchema)) {\n return `${toPascalCase(cardSet.id)}CardProperties`;\n }\n return `${toPascalCase(cardSet.id)}${toPascalCase(cardType)}CardProperties`;\n}\n\nfunction cardPropertiesSchemaName(\n cardSet: ManualCardSetDefinition,\n cardType: string,\n): string {\n if (!isCardPropertySchemaVariants(cardSet.cardSchema)) {\n return `${toPascalCase(cardSet.id)}CardPropertiesSchema`;\n }\n return `${cardPropertiesTypeName(cardSet, cardType)}Schema`;\n}\n\nfunction renderCardPropertiesSchemaByCardSetId(\n cardSets: readonly ManualCardSetDefinition[],\n): string {\n const entries = cardSets.flatMap((cardSet) => {\n if (isCardPropertySchemaVariants(cardSet.cardSchema)) {\n return Object.keys(cardSet.cardSchema.variants).map(\n (cardType) =>\n ` ${quote(`${cardSet.id}:${cardType}`)}: ${cardPropertiesSchemaName(cardSet, cardType)},`,\n );\n }\n return [\n ` ${quote(cardSet.id)}: ${toPascalCase(cardSet.id)}CardPropertiesSchema,`,\n ];\n });\n return `const cardPropertiesSchemaByCardSetId: Record<string, z.ZodType<unknown>> = {\\n${entries.join(\"\\n\")}\\n};`;\n}\n\nfunction renderObjectSchemaSection(\n typeName: string,\n schemaName: string,\n schema: ObjectSchema | null | undefined,\n): string {\n return renderBlocks([\n `export type ${typeName} = ${renderTypeForObjectSchema(schema)};`,\n `export const ${schemaName} = ${renderZodForObjectSchema(schema)};`,\n ]);\n}\n\nfunction boardPrefix(boardId: string): string {\n return toPascalCase(boardId);\n}\n\nfunction boardFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}BoardFields`;\n}\n\nfunction boardSpaceFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}SpaceFields`;\n}\n\nfunction boardRelationFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}RelationFields`;\n}\n\nfunction boardContainerFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}ContainerFields`;\n}\n\nfunction hexEdgeFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}EdgeFields`;\n}\n\nfunction hexVertexFieldsTypeName(boardId: string): string {\n return `${boardPrefix(boardId)}VertexFields`;\n}\n\nfunction pieceFieldsTypeName(typeId: string): string {\n return `${toPascalCase(typeId)}PieceFields`;\n}\n\nfunction dieFieldsTypeName(typeId: string): string {\n return `${toPascalCase(typeId)}DieFields`;\n}\n\nfunction renderTopologyFieldSections(analysis: ManifestAnalysis): string {\n const sections: string[] = [];\n\n for (const board of analysis.analyzedBoards) {\n sections.push(\n renderObjectSchemaSection(\n boardFieldsTypeName(board.board.id),\n `${boardFieldsTypeName(board.board.id)}Schema`,\n board.boardFieldsSchema,\n ),\n );\n sections.push(\n renderObjectSchemaSection(\n boardSpaceFieldsTypeName(board.board.id),\n `${boardSpaceFieldsTypeName(board.board.id)}Schema`,\n board.spaceFieldsSchema,\n ),\n );\n if (board.layout !== \"hex\") {\n sections.push(\n renderObjectSchemaSection(\n boardRelationFieldsTypeName(board.board.id),\n `${boardRelationFieldsTypeName(board.board.id)}Schema`,\n board.relationFieldsSchema,\n ),\n renderObjectSchemaSection(\n boardContainerFieldsTypeName(board.board.id),\n `${boardContainerFieldsTypeName(board.board.id)}Schema`,\n board.containerFieldsSchema,\n ),\n );\n }\n if (board.layout !== \"generic\") {\n sections.push(\n renderObjectSchemaSection(\n hexEdgeFieldsTypeName(board.board.id),\n `${hexEdgeFieldsTypeName(board.board.id)}Schema`,\n board.edgeFieldsSchema,\n ),\n renderObjectSchemaSection(\n hexVertexFieldsTypeName(board.board.id),\n `${hexVertexFieldsTypeName(board.board.id)}Schema`,\n board.vertexFieldsSchema,\n ),\n );\n }\n }\n\n for (const pieceTypeId of analysis.pieceTypeIds) {\n sections.push(\n renderObjectSchemaSection(\n pieceFieldsTypeName(pieceTypeId),\n `${pieceFieldsTypeName(pieceTypeId)}Schema`,\n analysis.pieceTypeSchemasById.get(pieceTypeId),\n ),\n );\n }\n\n for (const dieTypeId of analysis.dieTypeIds) {\n sections.push(\n renderObjectSchemaSection(\n dieFieldsTypeName(dieTypeId),\n `${dieFieldsTypeName(dieTypeId)}Schema`,\n analysis.dieTypeSchemasById.get(dieTypeId),\n ),\n );\n }\n\n return sections.join(\"\\n\\n\");\n}\n\nfunction renderBoardFieldMapTypes(analysis: ManifestAnalysis): string {\n const boardEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${boardFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const spaceEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${boardSpaceFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const relationEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${\n board.layout === \"hex\"\n ? \"RuntimeRecord\"\n : boardRelationFieldsTypeName(board.board.id)\n };`,\n ),\n )\n .join(\"\\n\");\n const containerEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${\n board.layout === \"hex\"\n ? \"RuntimeRecord\"\n : boardContainerFieldsTypeName(board.board.id)\n };`,\n ),\n )\n .join(\"\\n\");\n const edgeEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexEdgeFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const squareEdgeEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedSquareBoard => board.layout === \"square\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexEdgeFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const tiledEdgeEntries = analysis.analyzedBoards\n .filter(\n (board): board is AnalyzedHexBoard | AnalyzedSquareBoard =>\n board.layout !== \"generic\",\n )\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexEdgeFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const vertexEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexVertexFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const squareVertexEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedSquareBoard => board.layout === \"square\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexVertexFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const tiledVertexEntries = analysis.analyzedBoards\n .filter(\n (board): board is AnalyzedHexBoard | AnalyzedSquareBoard =>\n board.layout !== \"generic\",\n )\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${hexVertexFieldsTypeName(board.board.id)};`,\n ),\n )\n .join(\"\\n\");\n const pieceEntries = analysis.pieceTypeIds\n .map((typeId) => ` ${quote(typeId)}: ${pieceFieldsTypeName(typeId)};`)\n .join(\"\\n\");\n const dieEntries = analysis.dieTypeIds\n .map((typeId) => ` ${quote(typeId)}: ${dieFieldsTypeName(typeId)};`)\n .join(\"\\n\");\n\n return renderBlocks([\n `export type BoardFieldsByBoardId = {\\n${boardEntries}\\n};`,\n `export type BoardSpaceFieldsByBoardId = {\\n${spaceEntries}\\n};`,\n `export type BoardRelationFieldsByBoardId = {\\n${relationEntries}\\n};`,\n `export type BoardContainerFieldsByBoardId = {\\n${containerEntries}\\n};`,\n `export type HexEdgeFieldsByBoardId = ${\n edgeEntries.length > 0 ? `{\\n${edgeEntries}\\n}` : \"Record<string, never>\"\n };`,\n `export type HexVertexFieldsByBoardId = ${\n vertexEntries.length > 0\n ? `{\\n${vertexEntries}\\n}`\n : \"Record<string, never>\"\n };`,\n `export type SquareEdgeFieldsByBoardId = ${\n squareEdgeEntries.length > 0\n ? `{\\n${squareEdgeEntries}\\n}`\n : \"Record<string, never>\"\n };`,\n `export type SquareVertexFieldsByBoardId = ${\n squareVertexEntries.length > 0\n ? `{\\n${squareVertexEntries}\\n}`\n : \"Record<string, never>\"\n };`,\n `export type TiledEdgeFieldsByBoardId = ${\n tiledEdgeEntries.length > 0\n ? `{\\n${tiledEdgeEntries}\\n}`\n : \"Record<string, never>\"\n };`,\n `export type TiledVertexFieldsByBoardId = ${\n tiledVertexEntries.length > 0\n ? `{\\n${tiledVertexEntries}\\n}`\n : \"Record<string, never>\"\n };`,\n `export type PieceFieldsByTypeId = ${\n pieceEntries.length > 0\n ? `{\\n${pieceEntries}\\n}`\n : \"Record<string, RuntimeRecord>\"\n };`,\n `export type DieFieldsByTypeId = ${\n dieEntries.length > 0\n ? `{\\n${dieEntries}\\n}`\n : \"Record<string, RuntimeRecord>\"\n };`,\n ]);\n}\n\nfunction renderCardStateSchemaById(analysis: ManifestAnalysis): string {\n if (analysis.cardIds.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object(\n Object.fromEntries(\n literals.cardIds.map((cardId) => [cardId, createCardStateSchema(cardId)]),\n ) as Record<CardId, z.ZodType<unknown>>,\n)`;\n}\n\nfunction renderCardStateSchemaFactory(analysis: ManifestAnalysis): string {\n if (analysis.cardIds.length === 0) {\n return \"\";\n }\n\n return `function createCardStateSchema<CardIdValue extends CardId>(\n cardId: CardIdValue,\n): z.ZodType<CardStateById[CardIdValue]> {\n const cardSetId = literals.cardSetIdByCardId[cardId];\n const cardType = literals.cardTypeByCardId[cardId];\n const cardPropertiesSchema =\n cardPropertiesSchemaByCardSetId[cardSetId + \":\" + cardType] ??\n cardPropertiesSchemaByCardSetId[cardSetId] ??\n unknownRecordSchema;\n return assumeManifestSchema<CardStateById[CardIdValue]>(\n cardStateSchema.extend({\n id: z.literal(cardId),\n cardSetId: z.literal(cardSetId),\n cardType: z.literal(cardType),\n properties: cardPropertiesSchema,\n }),\n );\n}`;\n}\n\nfunction renderPieceStateSchemaById(analysis: ManifestAnalysis): string {\n if (analysis.pieceIds.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object({\\n${analysis.pieceIds\n .map((pieceId) => {\n const pieceTypeId = analysis.pieceTypeIdByPieceId.get(pieceId) ?? \"\";\n return ` ${quote(pieceId)}: z.object({\n componentType: z.string().optional(),\n id: z.literal(${quote(pieceId)}),\n pieceTypeId: z.literal(${quote(pieceTypeId)}),\n pieceName: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n properties: ${\n pieceTypeId\n ? `${pieceFieldsTypeName(pieceTypeId)}Schema`\n : \"unknownRecordSchema\"\n },\n }),`;\n })\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderDieStateSchemaById(analysis: ManifestAnalysis): string {\n if (analysis.dieIds.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object({\\n${analysis.dieIds\n .map((dieId) => {\n const dieTypeId = analysis.dieTypeIdByDieId.get(dieId) ?? \"\";\n const dieType = (analysis.manifest.dieTypes ?? []).find(\n (candidate) => candidate.id === dieTypeId,\n );\n return ` ${quote(dieId)}: z.object({\n componentType: z.string().optional(),\n id: z.literal(${quote(dieId)}),\n dieTypeId: z.literal(${quote(dieTypeId)}),\n dieName: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n sides: z.literal(${dieType?.sides ?? 6}),\n value: z.number().int().nullable().optional(),\n properties: ${\n dieTypeId\n ? `${dieFieldsTypeName(dieTypeId)}Schema`\n : \"unknownRecordSchema\"\n },\n }),`;\n })\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderGenericBoardStateSchema(\n board: AnalyzedGenericBoard,\n runtimeBoardId: string,\n): string {\n const playerId =\n board.board.scope === \"perPlayer\"\n ? runtimeBoardId.slice(board.board.id.length + 1)\n : null;\n return `z.object({\n id: z.literal(${quote(runtimeBoardId)}),\n baseId: z.literal(${quote(board.board.id)}),\n layout: z.literal(\"generic\"),\n typeId: ${\n board.boardTypeId\n ? `z.literal(${quote(board.boardTypeId)})`\n : \"ids.boardTypeId.nullable().optional()\"\n },\n scope: z.literal(${quote(board.board.scope)}),\n playerId: ${\n playerId\n ? `z.literal(${quote(playerId)})`\n : \"ids.playerId.nullable().optional()\"\n },\n templateId: z.string().nullable().optional(),\n fields: ${`${boardFieldsTypeName(board.board.id)}Schema`},\n // T220: per-board state.spaces is loose-keyed by string. The\n // canonical narrow id (\\`ids.spaceId\\`) is a Zod enum of EVERY\n // space id across every board, which makes a strict\n // \\`z.record(enum, …)\\` reject any board whose spaces are a\n // proper subset of that enum. Loose keying matches the JSON wire\n // shape (\\`additionalProperties\\`); the inner \\`id: ids.spaceId\\`\n // narrows the value's spaceId at parse time. A future per-board\n // branded-id refactor (option B) can re-tighten this without a\n // wire change.\n spaces: z.record(\n z.string(),\n z.object({\n id: ids.spaceId,\n name: z.string().nullable().optional(),\n typeId: ids.spaceTypeId.nullable().optional(),\n fields: ${`${boardSpaceFieldsTypeName(board.board.id)}Schema`},\n zoneId: z.string().nullable().optional(),\n }),\n ),\n relations: z.array(\n z.object({\n id: z.string().nullable().optional(),\n typeId: ids.relationTypeId,\n fromSpaceId: ids.spaceId,\n toSpaceId: ids.spaceId,\n directed: z.boolean(),\n fields: ${`${boardRelationFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n containers: z.record(\n ids.boardContainerId,\n z.object({\n id: ids.boardContainerId,\n name: z.string(),\n host: z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"board\") }),\n z.object({ type: z.literal(\"space\"), spaceId: ids.spaceId }),\n ]),\n allowedCardSetIds: z.array(ids.cardSetId).optional(),\n zoneId: z.string(),\n fields: ${`${boardContainerFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n })`;\n}\n\nfunction renderHexBoardStateSchema(\n board: AnalyzedHexBoard,\n runtimeBoardId: string,\n): string {\n const playerId =\n board.board.scope === \"perPlayer\"\n ? runtimeBoardId.slice(board.board.id.length + 1)\n : null;\n return `z.object({\n id: z.literal(${quote(runtimeBoardId)}),\n baseId: z.literal(${quote(board.board.id)}),\n layout: z.literal(\"hex\"),\n typeId: ${\n board.boardTypeId\n ? `z.literal(${quote(board.boardTypeId)})`\n : \"ids.boardTypeId.nullable().optional()\"\n },\n scope: z.literal(${quote(board.board.scope)}),\n playerId: ${\n playerId\n ? `z.literal(${quote(playerId)})`\n : \"ids.playerId.nullable().optional()\"\n },\n templateId: z.string().nullable().optional(),\n fields: ${`${boardFieldsTypeName(board.board.id)}Schema`},\n // T220: see generic-board comment on the loose-keying choice.\n spaces: z.record(\n z.string(),\n z.object({\n id: ids.spaceId,\n name: z.string().nullable().optional(),\n typeId: ids.spaceTypeId.nullable().optional(),\n q: z.number().int(),\n r: z.number().int(),\n fields: ${`${boardSpaceFieldsTypeName(board.board.id)}Schema`},\n zoneId: z.string().nullable().optional(),\n }),\n ),\n relations: z.array(\n z.object({\n id: z.string().nullable().optional(),\n typeId: z.literal(\"adjacent\"),\n fromSpaceId: ids.spaceId,\n toSpaceId: ids.spaceId,\n directed: z.boolean(),\n fields: unknownRecordSchema,\n }),\n ),\n containers: z.object({}),\n orientation: z.enum([\"pointy-top\", \"flat-top\"]),\n edges: z.array(\n z.object({\n id: ids.edgeId,\n spaceIds: z.array(ids.spaceId).min(1).max(2),\n typeId: ids.edgeTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: ${`${hexEdgeFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n vertices: z.array(\n z.object({\n id: ids.vertexId,\n spaceIds: z.array(ids.spaceId).min(1).max(3),\n typeId: ids.vertexTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: ${`${hexVertexFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n })`;\n}\n\nfunction renderSquareBoardStateSchema(\n board: AnalyzedSquareBoard,\n runtimeBoardId: string,\n): string {\n const playerId =\n board.board.scope === \"perPlayer\"\n ? runtimeBoardId.slice(board.board.id.length + 1)\n : null;\n return `z.object({\n id: z.literal(${quote(runtimeBoardId)}),\n baseId: z.literal(${quote(board.board.id)}),\n layout: z.literal(\"square\"),\n typeId: ${\n board.boardTypeId\n ? `z.literal(${quote(board.boardTypeId)})`\n : \"ids.boardTypeId.nullable().optional()\"\n },\n scope: z.literal(${quote(board.board.scope)}),\n playerId: ${\n playerId\n ? `z.literal(${quote(playerId)})`\n : \"ids.playerId.nullable().optional()\"\n },\n templateId: z.string().nullable().optional(),\n fields: ${`${boardFieldsTypeName(board.board.id)}Schema`},\n // T220: see generic-board comment on the loose-keying choice.\n spaces: z.record(\n z.string(),\n z.object({\n id: ids.spaceId,\n name: z.string().nullable().optional(),\n typeId: ids.spaceTypeId.nullable().optional(),\n row: z.number().int(),\n col: z.number().int(),\n fields: ${`${boardSpaceFieldsTypeName(board.board.id)}Schema`},\n zoneId: z.string().nullable().optional(),\n }),\n ),\n relations: z.array(\n z.object({\n id: z.string().nullable().optional(),\n typeId: ids.relationTypeId,\n fromSpaceId: ids.spaceId,\n toSpaceId: ids.spaceId,\n directed: z.boolean(),\n fields: ${`${boardRelationFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n containers: z.record(\n ids.boardContainerId,\n z.object({\n id: ids.boardContainerId,\n name: z.string(),\n host: z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"board\") }),\n z.object({ type: z.literal(\"space\"), spaceId: ids.spaceId }),\n ]),\n allowedCardSetIds: z.array(ids.cardSetId).optional(),\n zoneId: z.string(),\n fields: ${`${boardContainerFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n edges: z.array(\n z.object({\n id: ids.edgeId,\n spaceIds: z.array(ids.spaceId).min(1).max(2),\n typeId: ids.edgeTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: ${`${hexEdgeFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n vertices: z.array(\n z.object({\n id: ids.vertexId,\n spaceIds: z.array(ids.spaceId).min(1).max(4),\n typeId: ids.vertexTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: ${`${hexVertexFieldsTypeName(board.board.id)}Schema`},\n }),\n ),\n })`;\n}\n\nfunction renderBoardStateSchemaById(analysis: ManifestAnalysis): string {\n if (analysis.boardIds.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object({\\n${analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => {\n const schema =\n board.layout === \"hex\"\n ? renderHexBoardStateSchema(board, runtimeBoardId)\n : board.layout === \"square\"\n ? renderSquareBoardStateSchema(board, runtimeBoardId)\n : renderGenericBoardStateSchema(board, runtimeBoardId);\n return ` ${quote(runtimeBoardId)}: ${schema},`;\n }),\n )\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderHexBoardStateSchemaById(analysis: ManifestAnalysis): string {\n const hexBoards = analysis.analyzedBoards.filter(\n (board): board is AnalyzedHexBoard => board.layout === \"hex\",\n );\n if (hexBoards.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object({\\n${hexBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${renderHexBoardStateSchema(\n board,\n runtimeBoardId,\n )},`,\n ),\n )\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderSquareBoardStateSchemaById(analysis: ManifestAnalysis): string {\n const squareBoards = analysis.analyzedBoards.filter(\n (board): board is AnalyzedSquareBoard => board.layout === \"square\",\n );\n if (squareBoards.length === 0) {\n return \"z.object({})\";\n }\n\n return `z.object({\\n${squareBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: ${renderSquareBoardStateSchema(\n board,\n runtimeBoardId,\n )},`,\n ),\n )\n .join(\"\\n\")}\\n})`;\n}\n\nfunction renderBoardLiteralHelpers(analysis: ManifestAnalysis): string {\n const boardIdsByLayout = renderReadonlyArrayRecord(analysis.boardIdsByLayout);\n const boardBaseIdsByLayout = renderReadonlyArrayRecord(\n analysis.boardBaseIdsByLayout,\n );\n const boardIdsByBaseId = renderReadonlyArrayRecord(analysis.boardIdsByBaseId);\n const boardBaseIdsByTemplateId = renderReadonlyArrayRecord(\n analysis.boardBaseIdsByTemplateId,\n );\n const boardLayoutById = renderStringRecord(analysis.boardLayoutById);\n const boardTemplateLayoutById = renderStringRecord(\n analysis.boardTemplateLayoutById,\n );\n const boardIdsByTypeId = renderReadonlyArrayRecord(analysis.boardIdsByTypeId);\n const spaceIdsByBoardId = renderReadonlyArrayRecord(\n analysis.spaceIdsByBoardId,\n );\n const spaceTypeIdByBoardId = renderJsonConst(\n sortedObject(analysis.spaceTypeIdByBoardId),\n );\n const spaceIdsByTypeId = renderReadonlyArrayRecord(analysis.spaceIdsByTypeId);\n const containerIdsByBoardId = renderReadonlyArrayRecord(\n analysis.containerIdsByBoardId,\n );\n const containerHostByBoardId = renderJsonConst(\n sortedObject(analysis.containerHostByBoardId),\n );\n const relationTypeIdsByBoardId = renderReadonlyArrayRecord(\n analysis.relationTypeIdsByBoardId,\n );\n const edgeIdsByTypeId = renderReadonlyArrayRecord(analysis.edgeIdsByTypeId);\n const edgeIdsByBoardIdAndTypeId = renderJsonConst(\n sortedObject(analysis.edgeIdsByBoardIdAndTypeId),\n );\n const vertexIdsByTypeId = renderReadonlyArrayRecord(\n analysis.vertexIdsByTypeId,\n );\n const vertexIdsByBoardIdAndTypeId = renderJsonConst(\n sortedObject(analysis.vertexIdsByBoardIdAndTypeId),\n );\n const authoredHexEdgesByBoardId = renderJsonConst(\n sortedObject(\n analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => [\n runtimeBoardId,\n board.authoredEdges.map((edge) => {\n const renderedSite: {\n ref: HexEdgeRef;\n typeId?: string;\n label?: string;\n fields: Record<string, unknown>;\n } = {\n ref: cloneJson(edge.ref),\n fields: {\n ...materializeObjectSchemaDefaults(\n board.edgeFieldsSchema,\n analysis,\n ),\n ...(edge.fields ?? {}),\n },\n };\n if (edge.typeId !== null && edge.typeId !== undefined) {\n renderedSite.typeId = edge.typeId;\n }\n if (edge.label !== null && edge.label !== undefined) {\n renderedSite.label = edge.label;\n }\n return renderedSite;\n }),\n ]),\n ),\n ),\n );\n const authoredHexVerticesByBoardId = renderJsonConst(\n sortedObject(\n analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => [\n runtimeBoardId,\n board.authoredVertices.map((vertex) => {\n const renderedSite: {\n ref: HexVertexRef;\n typeId?: string;\n label?: string;\n fields: Record<string, unknown>;\n } = {\n ref: cloneJson(vertex.ref),\n fields: {\n ...materializeObjectSchemaDefaults(\n board.vertexFieldsSchema,\n analysis,\n ),\n ...(vertex.fields ?? {}),\n },\n };\n if (vertex.typeId !== null && vertex.typeId !== undefined) {\n renderedSite.typeId = vertex.typeId;\n }\n if (vertex.label !== null && vertex.label !== undefined) {\n renderedSite.label = vertex.label;\n }\n return renderedSite;\n }),\n ]),\n ),\n ),\n );\n const authoredHexEdgeIdsByBoardIdAndRef = renderJsonConst(\n sortedObject(\n analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => [\n runtimeBoardId,\n sortedObject(\n board.authoredEdges.map((edge) => [\n boardSpaceRefKey(edge.ref.spaces),\n edge.id,\n ]),\n ),\n ]),\n ),\n ),\n );\n const authoredHexVertexIdsByBoardIdAndRef = renderJsonConst(\n sortedObject(\n analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => [\n runtimeBoardId,\n sortedObject(\n board.authoredVertices.map((vertex) => [\n boardSpaceRefKey(vertex.ref.spaces),\n vertex.id,\n ]),\n ),\n ]),\n ),\n ),\n );\n // `perPlayerBoardIdsByBaseIdAndPlayerIdLookup` has been retired. The old\n // static lookup keyed on the max-players roster at generate time, which is\n // incompatible with the PerPlayer model where the runtime roster decides\n // which seats exist. `boardRefForPlayer(baseId, playerId)` now produces a\n // `PerPlayerBoardRef` at runtime using the active session's seats.\n\n return `const boardIdsByLayoutLookup = ${boardIdsByLayout};\nconst boardBaseIdsByLayoutLookup = ${boardBaseIdsByLayout};\nconst boardIdsByBaseIdLookup = ${boardIdsByBaseId};\nconst boardBaseIdsByTemplateIdLookup = ${boardBaseIdsByTemplateId};\nconst boardLayoutByIdLookup = ${boardLayoutById};\nconst boardTemplateLayoutByIdLookup = ${boardTemplateLayoutById};\nconst boardIdsByTypeIdLookup = ${boardIdsByTypeId};\nconst spaceIdsByBoardIdLookup = ${spaceIdsByBoardId};\nconst spaceTypeIdByBoardIdLookup = ${spaceTypeIdByBoardId};\nconst spaceIdsByTypeIdLookup = ${spaceIdsByTypeId};\nconst containerIdsByBoardIdLookup = ${containerIdsByBoardId};\nconst containerHostByBoardIdLookup = ${containerHostByBoardId};\nconst relationTypeIdsByBoardIdLookup = ${relationTypeIdsByBoardId};\nconst edgeIdsByTypeIdLookup = ${edgeIdsByTypeId};\nconst edgeIdsByBoardIdAndTypeIdLookup = ${edgeIdsByBoardIdAndTypeId};\nconst vertexIdsByTypeIdLookup = ${vertexIdsByTypeId};\nconst vertexIdsByBoardIdAndTypeIdLookup = ${vertexIdsByBoardIdAndTypeId};\nconst authoredHexEdgesByBoardIdLookup = ${authoredHexEdgesByBoardId};\nconst authoredHexVerticesByBoardIdLookup = ${authoredHexVerticesByBoardId};\nconst authoredHexEdgeIdsByBoardIdAndRefLookup = ${authoredHexEdgeIdsByBoardIdAndRef};\nconst authoredHexVertexIdsByBoardIdAndRefLookup = ${authoredHexVertexIdsByBoardIdAndRef};\n\nfunction authoredHexRefKey(spaceIds: readonly string[]): string {\n return [...spaceIds]\n .sort((left, right) => left.localeCompare(right))\n .join(\"$$\");\n}\n\ntype BoardLookupIdValue<\n Lookup extends Record<string, Record<string, readonly string[]>>,\n Key extends keyof Lookup,\n> = Extract<Lookup[Key][keyof Lookup[Key]], readonly string[]>[number];\n\nfunction flattenBoardScopedIds<\n Lookup extends Record<string, Record<string, readonly string[]>>,\n Key extends keyof Lookup,\n>(lookup: Lookup, key: Key): ReadonlyArray<BoardLookupIdValue<Lookup, Key>> {\n return Object.values(lookup[key] ?? {}).flat() as ReadonlyArray<\n BoardLookupIdValue<Lookup, Key>\n >;\n}\n\nexport const boardHelpers = {\n boardIdsForLayout<\n LayoutValue extends keyof typeof boardIdsByLayoutLookup,\n >(layout: LayoutValue): (typeof boardIdsByLayoutLookup)[LayoutValue] {\n return boardIdsByLayoutLookup[layout];\n },\n boardBaseIdsForLayout<\n LayoutValue extends keyof typeof boardBaseIdsByLayoutLookup,\n >(layout: LayoutValue): (typeof boardBaseIdsByLayoutLookup)[LayoutValue] {\n return boardBaseIdsByLayoutLookup[layout];\n },\n boardIdsForBase<\n BoardBaseIdValue extends keyof typeof boardIdsByBaseIdLookup,\n >(\n boardBaseId: BoardBaseIdValue,\n ): (typeof boardIdsByBaseIdLookup)[BoardBaseIdValue] {\n return boardIdsByBaseIdLookup[boardBaseId];\n },\n boardBaseIdsForTemplate<\n TemplateIdValue extends keyof typeof boardBaseIdsByTemplateIdLookup,\n >(\n templateId: TemplateIdValue,\n ): (typeof boardBaseIdsByTemplateIdLookup)[TemplateIdValue] {\n return boardBaseIdsByTemplateIdLookup[templateId];\n },\n boardIdsForType<TypeIdValue extends keyof typeof boardIdsByTypeIdLookup>(\n typeId: TypeIdValue,\n ): (typeof boardIdsByTypeIdLookup)[TypeIdValue] {\n return boardIdsByTypeIdLookup[typeId];\n },\n boardLayout<BoardIdValue extends keyof typeof boardLayoutByIdLookup>(\n boardId: BoardIdValue,\n ): (typeof boardLayoutByIdLookup)[BoardIdValue] {\n return boardLayoutByIdLookup[boardId];\n },\n boardTemplateLayout<\n TemplateIdValue extends keyof typeof boardTemplateLayoutByIdLookup,\n >(\n templateId: TemplateIdValue,\n ): (typeof boardTemplateLayoutByIdLookup)[TemplateIdValue] {\n return boardTemplateLayoutByIdLookup[templateId];\n },\n spaceIds<BoardIdValue extends keyof typeof spaceIdsByBoardIdLookup>(\n boardId: BoardIdValue,\n ): (typeof spaceIdsByBoardIdLookup)[BoardIdValue] {\n return spaceIdsByBoardIdLookup[boardId];\n },\n spaceRecord<\n BoardIdValue extends keyof typeof spaceIdsByBoardIdLookup,\n Value,\n >(\n boardId: BoardIdValue,\n initial:\n | Value\n | ((\n spaceId: (typeof spaceIdsByBoardIdLookup)[BoardIdValue][number],\n ) => Value),\n ): Record<(typeof spaceIdsByBoardIdLookup)[BoardIdValue][number], Value> {\n const spaceIds = spaceIdsByBoardIdLookup[boardId];\n if (!spaceIds) {\n throw new Error(\\`Unknown board '\\${String(boardId)}'.\\`);\n }\n return buildTypedRecord(spaceIds, initial) as Record<\n (typeof spaceIdsByBoardIdLookup)[BoardIdValue][number],\n Value\n >;\n },\n isSpaceId<BoardIdValue extends keyof typeof spaceIdsByBoardIdLookup>(\n boardId: BoardIdValue,\n value: string,\n ): value is (typeof spaceIdsByBoardIdLookup)[BoardIdValue][number] {\n const spaceIds = spaceIdsByBoardIdLookup[boardId];\n return spaceIds ? isTypedId(spaceIds, value) : false;\n },\n expectSpaceId<BoardIdValue extends keyof typeof spaceIdsByBoardIdLookup>(\n boardId: BoardIdValue,\n value: string,\n ): (typeof spaceIdsByBoardIdLookup)[BoardIdValue][number] {\n const spaceIds = spaceIdsByBoardIdLookup[boardId];\n if (!spaceIds || !isTypedId(spaceIds, value)) {\n throw new Error(\n \\`Unknown space id '\\${value}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return value as (typeof spaceIdsByBoardIdLookup)[BoardIdValue][number];\n },\n spaceKinds<BoardIdValue extends keyof typeof spaceTypeIdByBoardIdLookup>(\n boardId: BoardIdValue,\n ): (typeof spaceTypeIdByBoardIdLookup)[BoardIdValue] {\n return spaceTypeIdByBoardIdLookup[boardId];\n },\n spaceIdsForType<TypeIdValue extends keyof typeof spaceIdsByTypeIdLookup>(\n typeId: TypeIdValue,\n ): (typeof spaceIdsByTypeIdLookup)[TypeIdValue] {\n return spaceIdsByTypeIdLookup[typeId];\n },\n containerIds<BoardIdValue extends keyof typeof containerIdsByBoardIdLookup>(\n boardId: BoardIdValue,\n ): (typeof containerIdsByBoardIdLookup)[BoardIdValue] {\n return containerIdsByBoardIdLookup[boardId];\n },\n containerRecord<\n BoardIdValue extends keyof typeof containerIdsByBoardIdLookup,\n Value,\n >(\n boardId: BoardIdValue,\n initial:\n | Value\n | ((\n containerId: (typeof containerIdsByBoardIdLookup)[BoardIdValue][number],\n ) => Value),\n ): Record<\n (typeof containerIdsByBoardIdLookup)[BoardIdValue][number],\n Value\n > {\n const containerIds = containerIdsByBoardIdLookup[boardId];\n if (!containerIds) {\n throw new Error(\\`Unknown board '\\${String(boardId)}'.\\`);\n }\n return buildTypedRecord(containerIds, initial) as Record<\n (typeof containerIdsByBoardIdLookup)[BoardIdValue][number],\n Value\n >;\n },\n isContainerId<\n BoardIdValue extends keyof typeof containerIdsByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): value is (typeof containerIdsByBoardIdLookup)[BoardIdValue][number] {\n const containerIds = containerIdsByBoardIdLookup[boardId];\n return containerIds ? isTypedId(containerIds, value) : false;\n },\n expectContainerId<\n BoardIdValue extends keyof typeof containerIdsByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): (typeof containerIdsByBoardIdLookup)[BoardIdValue][number] {\n const containerIds = containerIdsByBoardIdLookup[boardId];\n if (!containerIds || !isTypedId(containerIds, value)) {\n throw new Error(\n \\`Unknown container id '\\${value}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return value as (typeof containerIdsByBoardIdLookup)[BoardIdValue][number];\n },\n containerHost<\n BoardIdValue extends keyof typeof containerHostByBoardIdLookup,\n ContainerIdValue extends keyof (typeof containerHostByBoardIdLookup)[BoardIdValue],\n >(\n boardId: BoardIdValue,\n containerId: ContainerIdValue,\n ): (typeof containerHostByBoardIdLookup)[BoardIdValue][ContainerIdValue] {\n const containers = containerHostByBoardIdLookup[boardId];\n const containerHost = containers?.[containerId];\n if (!containerHost) {\n throw new Error(\n \\`Unknown container '\\${String(containerId)}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return containerHost as (typeof containerHostByBoardIdLookup)[BoardIdValue][ContainerIdValue];\n },\n relationTypeIds<\n BoardIdValue extends keyof typeof relationTypeIdsByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n ): (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue] {\n return relationTypeIdsByBoardIdLookup[boardId];\n },\n relationTypeRecord<\n BoardIdValue extends keyof typeof relationTypeIdsByBoardIdLookup,\n Value,\n >(\n boardId: BoardIdValue,\n initial:\n | Value\n | ((\n relationTypeId: (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number],\n ) => Value),\n ): Record<\n (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number],\n Value\n > {\n const relationTypeIds = relationTypeIdsByBoardIdLookup[boardId];\n if (!relationTypeIds) {\n throw new Error(\\`Unknown board '\\${String(boardId)}'.\\`);\n }\n return buildTypedRecord(relationTypeIds, initial) as Record<\n (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number],\n Value\n >;\n },\n isRelationTypeId<\n BoardIdValue extends keyof typeof relationTypeIdsByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): value is (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number] {\n const relationTypeIds = relationTypeIdsByBoardIdLookup[boardId];\n return relationTypeIds ? isTypedId(relationTypeIds, value) : false;\n },\n expectRelationTypeId<\n BoardIdValue extends keyof typeof relationTypeIdsByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number] {\n const relationTypeIds = relationTypeIdsByBoardIdLookup[boardId];\n if (!relationTypeIds || !isTypedId(relationTypeIds, value)) {\n throw new Error(\n \\`Unknown relation type id '\\${value}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return value as (typeof relationTypeIdsByBoardIdLookup)[BoardIdValue][number];\n },\n authoredHexEdges<\n BoardIdValue extends keyof typeof authoredHexEdgesByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n ): (typeof authoredHexEdgesByBoardIdLookup)[BoardIdValue] {\n const authoredHexEdges = authoredHexEdgesByBoardIdLookup[boardId];\n if (!authoredHexEdges) {\n throw new Error(\\`Unknown hex board '\\${String(boardId)}'.\\`);\n }\n return authoredHexEdges;\n },\n authoredHexVertices<\n BoardIdValue extends keyof typeof authoredHexVerticesByBoardIdLookup,\n >(\n boardId: BoardIdValue,\n ): (typeof authoredHexVerticesByBoardIdLookup)[BoardIdValue] {\n const authoredHexVertices = authoredHexVerticesByBoardIdLookup[boardId];\n if (!authoredHexVertices) {\n throw new Error(\\`Unknown hex board '\\${String(boardId)}'.\\`);\n }\n return authoredHexVertices;\n },\n resolveHexEdgeId<\n BoardIdValue extends keyof typeof authoredHexEdgeIdsByBoardIdAndRefLookup,\n >(\n boardId: BoardIdValue,\n ref: HexAuthoredEdgeRef<BoardIdValue>,\n ): HexEdgeState<BoardIdValue>[\"id\"] {\n const boardEdges = authoredHexEdgeIdsByBoardIdAndRefLookup[boardId];\n if (!boardEdges) {\n throw new Error(\\`Unknown hex board '\\${String(boardId)}'.\\`);\n }\n const edgeRef = ref as { spaces: readonly string[] };\n const edgeId = (boardEdges as Record<string, HexEdgeState<BoardIdValue>[\"id\"]>)[\n authoredHexRefKey(edgeRef.spaces)\n ];\n if (!edgeId) {\n throw new Error(\n \\`Unknown authored hex edge ref '\\${edgeRef.spaces.join(\", \")}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return edgeId as HexEdgeState<BoardIdValue>[\"id\"];\n },\n resolveHexVertexId<\n BoardIdValue extends keyof typeof authoredHexVertexIdsByBoardIdAndRefLookup,\n >(\n boardId: BoardIdValue,\n ref: HexAuthoredVertexRef<BoardIdValue>,\n ): HexVertexState<BoardIdValue>[\"id\"] {\n const boardVertices = authoredHexVertexIdsByBoardIdAndRefLookup[boardId];\n if (!boardVertices) {\n throw new Error(\\`Unknown hex board '\\${String(boardId)}'.\\`);\n }\n const vertexRef = ref as { spaces: readonly string[] };\n const vertexId = (\n boardVertices as Record<string, HexVertexState<BoardIdValue>[\"id\"]>\n )[authoredHexRefKey(vertexRef.spaces)];\n if (!vertexId) {\n throw new Error(\n \\`Unknown authored hex vertex ref '\\${vertexRef.spaces.join(\", \")}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return vertexId as HexVertexState<BoardIdValue>[\"id\"];\n },\n edgeIdsForType<TypeIdValue extends keyof typeof edgeIdsByTypeIdLookup>(\n typeId: TypeIdValue,\n ): (typeof edgeIdsByTypeIdLookup)[TypeIdValue] {\n return edgeIdsByTypeIdLookup[typeId];\n },\n edgeRecord<\n BoardIdValue extends keyof typeof edgeIdsByBoardIdAndTypeIdLookup,\n Value,\n >(\n boardId: BoardIdValue,\n initial:\n | Value\n | ((\n edgeId: BoardLookupIdValue<\n typeof edgeIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n >,\n ) => Value),\n ): Record<\n BoardLookupIdValue<typeof edgeIdsByBoardIdAndTypeIdLookup, BoardIdValue>,\n Value\n > {\n const boardEdges = edgeIdsByBoardIdAndTypeIdLookup[boardId];\n const edgeIds = boardEdges\n ? flattenBoardScopedIds(edgeIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n if (!edgeIds) {\n throw new Error(\\`Unknown board '\\${String(boardId)}'.\\`);\n }\n return buildTypedRecord(edgeIds, initial) as Record<\n BoardLookupIdValue<typeof edgeIdsByBoardIdAndTypeIdLookup, BoardIdValue>,\n Value\n >;\n },\n isEdgeId<BoardIdValue extends keyof typeof edgeIdsByBoardIdAndTypeIdLookup>(\n boardId: BoardIdValue,\n value: string,\n ): value is BoardLookupIdValue<\n typeof edgeIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n > {\n const boardEdges = edgeIdsByBoardIdAndTypeIdLookup[boardId];\n const edgeIds = boardEdges\n ? flattenBoardScopedIds(edgeIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n return edgeIds ? isTypedId(edgeIds, value) : false;\n },\n expectEdgeId<\n BoardIdValue extends keyof typeof edgeIdsByBoardIdAndTypeIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): BoardLookupIdValue<\n typeof edgeIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n > {\n const boardEdges = edgeIdsByBoardIdAndTypeIdLookup[boardId];\n const edgeIds = boardEdges\n ? flattenBoardScopedIds(edgeIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n if (!edgeIds || !isTypedId(edgeIds, value)) {\n throw new Error(\n \\`Unknown edge id '\\${value}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return value as BoardLookupIdValue<\n typeof edgeIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n >;\n },\n edgeIds<\n BoardIdValue extends keyof typeof edgeIdsByBoardIdAndTypeIdLookup,\n TypeIdValue extends keyof (typeof edgeIdsByBoardIdAndTypeIdLookup)[BoardIdValue],\n >(\n boardId: BoardIdValue,\n typeId: TypeIdValue,\n ): (typeof edgeIdsByBoardIdAndTypeIdLookup)[BoardIdValue][TypeIdValue] {\n const boardEdges = edgeIdsByBoardIdAndTypeIdLookup[boardId];\n const edgeIds = boardEdges?.[typeId];\n if (!edgeIds) {\n throw new Error(\n \\`Unknown edge type '\\${String(typeId)}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return edgeIds as (typeof edgeIdsByBoardIdAndTypeIdLookup)[BoardIdValue][TypeIdValue];\n },\n vertexIdsForType<TypeIdValue extends keyof typeof vertexIdsByTypeIdLookup>(\n typeId: TypeIdValue,\n ): (typeof vertexIdsByTypeIdLookup)[TypeIdValue] {\n return vertexIdsByTypeIdLookup[typeId];\n },\n vertexRecord<\n BoardIdValue extends keyof typeof vertexIdsByBoardIdAndTypeIdLookup,\n Value,\n >(\n boardId: BoardIdValue,\n initial:\n | Value\n | ((\n vertexId: BoardLookupIdValue<\n typeof vertexIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n >,\n ) => Value),\n ): Record<\n BoardLookupIdValue<typeof vertexIdsByBoardIdAndTypeIdLookup, BoardIdValue>,\n Value\n > {\n const boardVertices = vertexIdsByBoardIdAndTypeIdLookup[boardId];\n const vertexIds = boardVertices\n ? flattenBoardScopedIds(vertexIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n if (!vertexIds) {\n throw new Error(\\`Unknown board '\\${String(boardId)}'.\\`);\n }\n return buildTypedRecord(vertexIds, initial) as Record<\n BoardLookupIdValue<typeof vertexIdsByBoardIdAndTypeIdLookup, BoardIdValue>,\n Value\n >;\n },\n isVertexId<\n BoardIdValue extends keyof typeof vertexIdsByBoardIdAndTypeIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): value is BoardLookupIdValue<\n typeof vertexIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n > {\n const boardVertices = vertexIdsByBoardIdAndTypeIdLookup[boardId];\n const vertexIds = boardVertices\n ? flattenBoardScopedIds(vertexIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n return vertexIds ? isTypedId(vertexIds, value) : false;\n },\n expectVertexId<\n BoardIdValue extends keyof typeof vertexIdsByBoardIdAndTypeIdLookup,\n >(\n boardId: BoardIdValue,\n value: string,\n ): BoardLookupIdValue<\n typeof vertexIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n > {\n const boardVertices = vertexIdsByBoardIdAndTypeIdLookup[boardId];\n const vertexIds = boardVertices\n ? flattenBoardScopedIds(vertexIdsByBoardIdAndTypeIdLookup, boardId)\n : undefined;\n if (!vertexIds || !isTypedId(vertexIds, value)) {\n throw new Error(\n \\`Unknown vertex id '\\${value}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return value as BoardLookupIdValue<\n typeof vertexIdsByBoardIdAndTypeIdLookup,\n BoardIdValue\n >;\n },\n vertexIds<\n BoardIdValue extends keyof typeof vertexIdsByBoardIdAndTypeIdLookup,\n TypeIdValue extends keyof (typeof vertexIdsByBoardIdAndTypeIdLookup)[BoardIdValue],\n >(\n boardId: BoardIdValue,\n typeId: TypeIdValue,\n ): (typeof vertexIdsByBoardIdAndTypeIdLookup)[BoardIdValue][TypeIdValue] {\n const boardVertices = vertexIdsByBoardIdAndTypeIdLookup[boardId];\n const vertexIds = boardVertices?.[typeId];\n if (!vertexIds) {\n throw new Error(\n \\`Unknown vertex type '\\${String(typeId)}' on board '\\${String(boardId)}'.\\`,\n );\n }\n return vertexIds as (typeof vertexIdsByBoardIdAndTypeIdLookup)[BoardIdValue][TypeIdValue];\n },\n // Returns a \\`BoardRef\\` describing a per-player board scoped to the supplied\n // seat. The old \\`boardIdForPlayer\\` returned a concrete runtime-board-id\n // string, which encoded the \"one board per maxPlayers seat\" assumption in\n // static data. Under the PerPlayer model the runtime roster is not known at\n // generate time, so consumers deal with \\`BoardRef\\` and let the runtime\n // resolve the actual owner seat.\n boardRefForPlayer(\n boardBaseId: BoardBaseId,\n playerId: PlayerId,\n ): PerPlayerBoardRef<BoardBaseId, PlayerId> {\n return boardRef(boardBaseId, playerId) as PerPlayerBoardRef<\n BoardBaseId,\n PlayerId\n >;\n },\n sharedBoardRef(\n boardBaseId: BoardBaseId,\n ): SharedBoardRef<BoardBaseId> {\n return boardRef(boardBaseId) as SharedBoardRef<BoardBaseId>;\n },\n} as const;`;\n}\n\nfunction renderManifestContractSource(manifest: GameTopologyManifest): string {\n const analysis = analyzeManifest(manifest);\n const initialTableTemplate = materializeManifestTable({\n manifest,\n playerIds: analysis.playerIds,\n shuffleItems: <Value>(values: readonly Value[]) => [...values],\n });\n const initialTableBoards = (\n initialTableTemplate as {\n boards: {\n byId: unknown;\n hex: unknown;\n square: unknown;\n };\n }\n ).boards;\n const staticBoardsTemplate = {\n byId: initialTableBoards.byId,\n hex: initialTableBoards.hex,\n square: initialTableBoards.square,\n };\n const sharedZoneIds = analysis.sharedZones.map((zone) => zone.id).sort();\n const playerZoneIds = analysis.playerZones.map((zone) => zone.id).sort();\n const zoneVisibilityById = Object.fromEntries(\n Array.from(analysis.zoneVisibilityById.entries()).sort(([left], [right]) =>\n left.localeCompare(right),\n ),\n );\n\n const emptySharedZonesTemplate = Object.fromEntries(\n sharedZoneIds.map((zoneId) => [zoneId, []]),\n );\n const defaultVisibilityTemplate = Object.fromEntries(\n analysis.cardIds.map((cardId) => [cardId, { faceUp: true }]),\n );\n const defaultOwnerTemplate = Object.fromEntries(\n analysis.cardIds.map((cardId) => [cardId, null]),\n );\n const cardIdsByCardSetId = new Map<string, string[]>();\n for (const cardId of analysis.cardIds) {\n const cardSetId = analysis.cardSetIdByCardId.get(cardId);\n if (!cardSetId) {\n continue;\n }\n const cardIds = cardIdsByCardSetId.get(cardSetId) ?? [];\n cardIds.push(cardId);\n cardIdsByCardSetId.set(cardSetId, cardIds);\n }\n const renderZoneCardIdArrayType = (cardSetIds: readonly string[]) =>\n `Array<${renderStringUnion(\n cardSetIds.flatMap(\n (cardSetId) => cardIdsByCardSetId.get(cardSetId) ?? [],\n ),\n )}>`;\n const sharedZoneCardIdEntries = sharedZoneIds\n .map((zoneId) => {\n const allowedCardSetIds = analysis.sharedZoneCardSetIds.get(zoneId) ?? [];\n return ` ${quote(zoneId)}: ${renderZoneCardIdArrayType(allowedCardSetIds)};`;\n })\n .join(\"\\n\");\n const playerZoneCardIdEntries = playerZoneIds\n .map((zoneId) => {\n const allowedCardSetIds = analysis.playerZoneCardSetIds.get(zoneId) ?? [];\n return ` ${quote(zoneId)}: PerPlayer<${renderZoneCardIdArrayType(allowedCardSetIds)}>;`;\n })\n .join(\"\\n\");\n\n const cardSetById = new Map(\n analysis.cardSets.map((cardSet) => [cardSet.id, cardSet] as const),\n );\n\n const perCardStateEntries = analysis.cardIds\n .map((cardId) => {\n const cardSetId = analysis.cardSetIdByCardId.get(cardId) ?? \"\";\n const cardType = analysis.cardTypeByCardId.get(cardId) ?? cardId;\n const cardSet = cardSetById.get(cardSetId);\n const propertiesType = cardSet\n ? cardPropertiesTypeName(cardSet, cardType)\n : cardSetId\n ? `${toPascalCase(cardSetId)}CardProperties`\n : \"RuntimeRecord\";\n return ` ${quote(cardId)}: CardStateRecord<${quote(cardId)}, ${quote(\n cardSetId,\n )}, ${quote(cardType)}, ${propertiesType}>;`;\n })\n .join(\"\\n\");\n const perPieceStateEntries = analysis.pieceIds\n .map((pieceId) => {\n const pieceTypeId = analysis.pieceTypeIdByPieceId.get(pieceId) ?? \"\";\n return ` ${quote(pieceId)}: PieceStateRecord<${quote(pieceId)}, ${quote(\n pieceTypeId,\n )}, ${\n pieceTypeId ? pieceFieldsTypeName(pieceTypeId) : \"RuntimeRecord\"\n }>;`;\n })\n .join(\"\\n\");\n const perDieStateEntries = analysis.dieIds\n .map((dieId) => {\n const dieTypeId = analysis.dieTypeIdByDieId.get(dieId) ?? \"\";\n return ` ${quote(dieId)}: DieStateRecord<${quote(dieId)}, ${quote(\n dieTypeId,\n )}, ${dieTypeId ? dieFieldsTypeName(dieTypeId) : \"RuntimeRecord\"}>;`;\n })\n .join(\"\\n\");\n const perBoardStateEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => {\n if (board.layout === \"hex\") {\n return ` ${quote(runtimeBoardId)}: HexBoardStateRecord<${quote(\n runtimeBoardId,\n )}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(\n board.edges.map((edge) => edge.id),\n )}, ${renderStringUnion(\n board.vertices.map((vertex) => vertex.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${hexEdgeFieldsTypeName(board.board.id)}, ${hexVertexFieldsTypeName(\n board.board.id,\n )}>;`;\n }\n if (board.layout === \"square\") {\n return ` ${quote(runtimeBoardId)}: SquareBoardStateRecord<${quote(\n runtimeBoardId,\n )}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(\n board.containers.map((container) => container.id),\n )}, ${renderStringUnion(\n board.edges.map((edge) => edge.id),\n )}, ${renderStringUnion(\n board.vertices.map((vertex) => vertex.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${boardRelationFieldsTypeName(\n board.board.id,\n )}, ${boardContainerFieldsTypeName(\n board.board.id,\n )}, ${hexEdgeFieldsTypeName(board.board.id)}, ${hexVertexFieldsTypeName(\n board.board.id,\n )}>;`;\n }\n\n return ` ${quote(runtimeBoardId)}: GenericBoardStateRecord<${quote(\n runtimeBoardId,\n )}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(\n board.containers.map((container) => container.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${boardRelationFieldsTypeName(\n board.board.id,\n )}, ${boardContainerFieldsTypeName(board.board.id)}>;`;\n }),\n )\n .join(\"\\n\");\n const perHexBoardStateEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedHexBoard => board.layout === \"hex\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: BoardStateById[${quote(\n runtimeBoardId,\n )}];`,\n ),\n )\n .join(\"\\n\");\n const perSquareBoardStateEntries = analysis.analyzedBoards\n .filter((board): board is AnalyzedSquareBoard => board.layout === \"square\")\n .flatMap((board) =>\n board.runtimeBoardIds.map(\n (runtimeBoardId) =>\n ` ${quote(runtimeBoardId)}: BoardStateById[${quote(\n runtimeBoardId,\n )}];`,\n ),\n )\n .join(\"\\n\");\n\n return `/**\n * Generated file.\n * Do not edit directly.\n */\n\nimport { z } from \"zod\";\nimport {\n buildTypedRecord,\n expectTypedId,\n isTypedId,\n} from \"@dreamboard/sdk-types\";\nimport {\n asPlayerId,\n assumeManifestSchema,\n boardRef,\n boardRefKey,\n boardRefSchema,\n cloneManifestDefault,\n createManifestGameStateSchema,\n createManifestRuntimeSchema,\n createManifestStringLiteralSchema,\n dealToPlayerBoardContainer as createDealToPlayerBoardContainerStep,\n dealToPlayerZone as createDealToPlayerZoneStep,\n perPlayer,\n perPlayerEntries,\n perPlayerGet,\n perPlayerHas,\n perPlayerKeys,\n perPlayerSchema,\n markManifestScopedSchema,\n resolveManifestPlayerIds,\n seedSharedBoardContainer as createSeedSharedBoardContainerStep,\n seedSharedBoardSpace as createSeedSharedBoardSpaceStep,\n shuffle as createShuffleStep,\n type CardIdOfManifest,\n type DieIdOfManifest,\n type PieceIdOfManifest,\n type BoardRef,\n type PerPlayer,\n type PerPlayerBoardRef,\n type PlayerId,\n type ReducerManifestContract,\n type RuntimeCardData,\n type RuntimeCardVisibility,\n type RuntimeComponentLocation,\n type RuntimeDieData,\n type RuntimeHandVisibilityMode,\n type RuntimePieceData,\n type RuntimeRecord,\n type RuntimeTableRecord,\n type SetupBootstrapContainerRef,\n type SetupBootstrapDestinationRef,\n type SetupBootstrapPerPlayerContainerTemplateRef,\n type SetupBootstrapStep,\n type SetupProfileDefinition,\n type SharedBoardRef,\n type StaticBoards,\n} from \"@dreamboard/app-sdk/reducer\";\n\nconst unknownRecordSchema = assumeManifestSchema<RuntimeRecord>(\n z.record(z.string(), z.unknown()),\n);\n\nfunction resolveDefaultPlayerIds(\n playerIds: readonly string[] | undefined,\n): readonly PlayerId[] {\n return resolveManifestPlayerIds(\n literals.playerIds as unknown as readonly PlayerId[],\n playerIds,\n );\n}\n\nexport const literals = {\n // literals satisfy \\`ManifestLiterals<PlayerId, ...>\\`. The cast is safe\n // because the runtime values are the exact player-id strings the manifest\n // authored; branding is purely a type-level discipline.\n playerIds: ${renderConstArray(analysis.playerIds)} as unknown as readonly PlayerId[],\n phaseNames: [] as readonly string[],\n boardLayouts: [\"generic\", \"hex\", \"square\"] as const,\n setupOptionIds: ${renderConstArray(analysis.setupOptionIds)},\n setupProfileIds: ${renderConstArray(analysis.setupProfileIds)},\n cardSetIds: ${renderConstArray(analysis.cardSetIds)},\n cardTypes: ${renderConstArray(analysis.cardTypes)},\n cardIds: ${renderConstArray(analysis.cardIds)},\n deckIds: ${renderConstArray(sharedZoneIds)},\n handIds: ${renderConstArray(playerZoneIds)},\n sharedZoneIds: ${renderConstArray(sharedZoneIds)},\n playerZoneIds: ${renderConstArray(playerZoneIds)},\n zoneIds: ${renderConstArray(analysis.zoneIds)},\n resourceIds: ${renderConstArray(analysis.resourceIds)},\n resourcePresentationById: ${renderJsonConst(analysis.resourcePresentationById)},\n pieceTypeIds: ${renderConstArray(analysis.pieceTypeIds)},\n pieceIds: ${renderConstArray(analysis.pieceIds)},\n dieTypeIds: ${renderConstArray(analysis.dieTypeIds)},\n dieIds: ${renderConstArray(analysis.dieIds)},\n boardTemplateIds: ${renderConstArray(analysis.boardTemplateIds)},\n boardTypeIds: ${renderConstArray(analysis.boardTypeIds)},\n boardBaseIds: ${renderConstArray(analysis.boardBaseIds)},\n boardIds: ${renderConstArray(analysis.boardIds)},\n boardContainerIds: ${renderConstArray(analysis.boardContainerIds)},\n relationTypeIds: ${renderConstArray(analysis.relationTypeIds)},\n edgeIds: ${renderConstArray(analysis.edgeIds)},\n edgeTypeIds: ${renderConstArray(analysis.edgeTypeIds)},\n vertexIds: ${renderConstArray(analysis.vertexIds)},\n vertexTypeIds: ${renderConstArray(analysis.vertexTypeIds)},\n spaceIds: ${renderConstArray(analysis.spaceIds)},\n spaceTypeIds: ${renderConstArray(analysis.spaceTypeIds)},\n handVisibilityById: ${renderStringRecord(\n playerZoneIds.map(\n (zoneId) => [zoneId, zoneVisibilityById[zoneId] ?? \"ownerOnly\"] as const,\n ),\n )},\n zoneVisibilityById: ${renderStringRecord(analysis.zoneVisibilityById)},\n cardSetIdByCardId: ${renderStringRecord(analysis.cardSetIdByCardId)},\n cardTypeByCardId: ${renderStringRecord(analysis.cardTypeByCardId)},\n setupChoiceIdsByOptionId: ${renderReadonlyArrayRecord(\n analysis.setupChoiceIdsByOptionId,\n )},\n cardSetIdsBySharedZoneId: ${renderReadonlyArrayRecord(\n analysis.sharedZoneCardSetIds,\n )},\n sharedZoneIdsByCardSetId: ${renderReadonlyArrayRecord(\n analysis.sharedZoneIdsByCardSetId,\n )},\n homeSharedZoneIdsByCardType: ${renderReadonlyArrayRecord(\n analysis.homeSharedZoneIdsByCardType,\n )},\n homeSharedZoneIdByCardType: ${renderStringRecord(\n analysis.homeSharedZoneIdByCardType,\n )},\n cardSetIdsByPlayerZoneId: ${renderReadonlyArrayRecord(\n analysis.playerZoneCardSetIds,\n )},\n} as const;\n\n// PlayerId is an opaque brand imported from @dreamboard/app-sdk/reducer.\n// We intentionally do NOT enumerate the manifest's max-players roster here:\n// the runtime session may have fewer active seats than the manifest declares,\n// and requiring ingress to pick a literal from the max-players set reintroduces\n// the \"total-record\" assumption the refactor is meant to eliminate. Runtime\n// roster validation is done through perPlayerSchema(runtimePlayerIds, ...)\n// instead, which can be bound to the actual active roster.\nconst playerIdSchema = markManifestScopedSchema(\n z\n .string()\n .min(1)\n .transform((value) => asPlayerId(value)),\n);\nconst phaseNameSchema = markManifestScopedSchema(z.string());\nconst boardLayoutSchema = createManifestStringLiteralSchema(literals.boardLayouts);\nconst setupOptionIdSchema = createManifestStringLiteralSchema(literals.setupOptionIds);\nconst setupProfileIdSchema = createManifestStringLiteralSchema(\n literals.setupProfileIds,\n);\nconst cardSetIdSchema = createManifestStringLiteralSchema(literals.cardSetIds);\nconst cardTypeSchema = createManifestStringLiteralSchema(literals.cardTypes);\nconst cardIdSchema = createManifestStringLiteralSchema(literals.cardIds);\nconst deckIdSchema = createManifestStringLiteralSchema(literals.deckIds);\nconst handIdSchema = createManifestStringLiteralSchema(literals.handIds);\nconst sharedZoneIdSchema = createManifestStringLiteralSchema(literals.sharedZoneIds);\nconst playerZoneIdSchema = createManifestStringLiteralSchema(literals.playerZoneIds);\nconst zoneIdSchema = createManifestStringLiteralSchema(literals.zoneIds);\nconst resourceIdSchema = createManifestStringLiteralSchema(literals.resourceIds);\nconst pieceTypeIdSchema = createManifestStringLiteralSchema(literals.pieceTypeIds);\nconst pieceIdSchema = createManifestStringLiteralSchema(literals.pieceIds);\nconst dieTypeIdSchema = createManifestStringLiteralSchema(literals.dieTypeIds);\nconst dieIdSchema = createManifestStringLiteralSchema(literals.dieIds);\nconst boardTypeIdSchema = createManifestStringLiteralSchema(literals.boardTypeIds);\nconst boardBaseIdSchema = createManifestStringLiteralSchema(literals.boardBaseIds);\nconst boardIdSchema = createManifestStringLiteralSchema(literals.boardIds);\nconst boardContainerIdSchema = createManifestStringLiteralSchema(\n literals.boardContainerIds,\n);\nconst relationTypeIdSchema = createManifestStringLiteralSchema(literals.relationTypeIds);\nconst edgeIdSchema = createManifestStringLiteralSchema(literals.edgeIds);\nconst edgeTypeIdSchema = createManifestStringLiteralSchema(literals.edgeTypeIds);\nconst vertexIdSchema = createManifestStringLiteralSchema(literals.vertexIds);\nconst vertexTypeIdSchema = createManifestStringLiteralSchema(literals.vertexTypeIds);\nconst spaceIdSchema = createManifestStringLiteralSchema(literals.spaceIds);\nconst spaceTypeIdSchema = createManifestStringLiteralSchema(literals.spaceTypeIds);\n\nexport const ids = {\n playerId: playerIdSchema,\n phaseName: phaseNameSchema,\n boardLayout: boardLayoutSchema,\n setupOptionId: setupOptionIdSchema,\n setupProfileId: setupProfileIdSchema,\n cardSetId: cardSetIdSchema,\n cardType: cardTypeSchema,\n cardId: cardIdSchema as unknown as z.ZodType<CardId>,\n deckId: deckIdSchema as unknown as z.ZodType<DeckId>,\n handId: handIdSchema as unknown as z.ZodType<HandId>,\n sharedZoneId: sharedZoneIdSchema,\n playerZoneId: playerZoneIdSchema,\n zoneId: zoneIdSchema,\n resourceId: resourceIdSchema,\n pieceTypeId: pieceTypeIdSchema,\n pieceId: pieceIdSchema,\n dieTypeId: dieTypeIdSchema,\n dieId: dieIdSchema,\n boardTypeId: boardTypeIdSchema,\n boardBaseId: boardBaseIdSchema,\n boardId: boardIdSchema,\n boardContainerId: boardContainerIdSchema,\n relationTypeId: relationTypeIdSchema,\n edgeId: edgeIdSchema,\n edgeTypeId: edgeTypeIdSchema,\n vertexId: vertexIdSchema,\n vertexTypeId: vertexTypeIdSchema,\n spaceId: spaceIdSchema,\n spaceTypeId: spaceTypeIdSchema,\n} as const;\n\nexport type { PlayerId };\nexport type PhaseName = string;\nexport type BoardLayout = (typeof literals.boardLayouts)[number];\nexport type SetupOptionId = (typeof literals.setupOptionIds)[number];\nexport type SetupProfileId = (typeof literals.setupProfileIds)[number];\nexport type CardSetId = (typeof literals.cardSetIds)[number];\nexport type CardType = (typeof literals.cardTypes)[number];\nexport type CardId = (typeof literals.cardIds)[number];\nexport type DeckId = (typeof literals.deckIds)[number];\nexport type HandId = (typeof literals.handIds)[number];\nexport type SharedZoneId = (typeof literals.sharedZoneIds)[number];\nexport type PlayerZoneId = (typeof literals.playerZoneIds)[number];\nexport type ZoneId = (typeof literals.zoneIds)[number];\nexport type ResourceId = (typeof literals.resourceIds)[number];\nexport type PieceTypeId = (typeof literals.pieceTypeIds)[number];\nexport type PieceId = (typeof literals.pieceIds)[number];\nexport type DieTypeId = (typeof literals.dieTypeIds)[number];\nexport type DieId = (typeof literals.dieIds)[number];\nexport type BoardTypeId = (typeof literals.boardTypeIds)[number];\nexport type BoardBaseId = (typeof literals.boardBaseIds)[number];\nexport type BoardId = (typeof literals.boardIds)[number];\nexport type BoardContainerId = (typeof literals.boardContainerIds)[number];\nexport type RelationTypeId = (typeof literals.relationTypeIds)[number];\nexport type EdgeId = (typeof literals.edgeIds)[number];\nexport type EdgeTypeId = (typeof literals.edgeTypeIds)[number];\nexport type VertexId = (typeof literals.vertexIds)[number];\nexport type VertexTypeId = (typeof literals.vertexTypeIds)[number];\nexport type SpaceId = (typeof literals.spaceIds)[number];\nexport type SpaceTypeId = (typeof literals.spaceTypeIds)[number];\n\n${renderGeneratedIdHandles(analysis)}\n\n${renderGeneratedRecordsHelpers()}\n\n${renderGeneratedIdGuards()}\n\n// Historically this emitted PlayerRecord<T> = Record<PlayerId, T>, but that\n// type reified the \"total roster\" assumption (one entry per max-player). It has\n// been replaced throughout the generated contract with PerPlayer<T> from\n// @dreamboard/app-sdk/reducer, whose entries array matches the\n// actual runtime seat list.\nexport type SharedZoneRecord<T> = Record<SharedZoneId, T>;\nexport type PlayerZoneRecord<T> = Record<PlayerZoneId, PerPlayer<T>>;\nexport type ComponentId = CardId | PieceId | DieId;\nexport type ComponentIdsBySharedZoneId = {\n${sharedZoneIds.map((zoneId) => ` ${quote(zoneId)}: ComponentId[];`).join(\"\\n\")}\n};\nexport type ComponentIdsByPlayerZoneId = {\n${playerZoneIds.map((zoneId) => ` ${quote(zoneId)}: PerPlayer<ComponentId[]>;`).join(\"\\n\")}\n};\nexport type SetupOptionChoice = {\n id: string;\n label: string;\n description?: string | null;\n};\nexport type SetupOption = {\n id: SetupOptionId;\n name: string;\n description?: string | null;\n choices: readonly SetupOptionChoice[];\n};\nexport type SetupProfile = {\n id: SetupProfileId;\n name: string;\n description?: string | null;\n optionValues?: Partial<Record<SetupOptionId, string>> | null;\n};\nexport const setupOptionsById = ${renderJsonConst(analysis.setupOptionsById)};\nexport const setupChoiceIdsByOptionId = ${renderReadonlyArrayRecord(\n analysis.setupChoiceIdsByOptionId,\n )};\nexport const setupProfilesById = ${renderJsonConst(analysis.setupProfilesById)};\n\n${renderCardSetPropertySections(analysis.cardSets)}\n\n${renderTopologyFieldSections(analysis)}\n\n${renderBoardFieldMapTypes(analysis)}\n\nexport type CardProperties = ${\n analysis.cardSets.length > 0\n ? analysis.cardSets\n .map((cardSet) => `${toPascalCase(cardSet.id)}CardProperties`)\n .join(\" | \")\n : \"RuntimeRecord\"\n };\n\nexport type CardStateRecord<\n CardIdValue extends CardId = CardId,\n CardSetIdValue extends CardSetId = CardSetId,\n CardTypeValue extends CardType = CardType,\n Properties = RuntimeRecord,\n> = Omit<RuntimeCardData, \"id\" | \"cardSetId\" | \"cardType\" | \"properties\"> & {\n id: CardIdValue;\n cardSetId: CardSetIdValue;\n cardType: CardTypeValue;\n properties: Properties;\n};\n\nexport type CardStateById = ${\n perCardStateEntries.length > 0\n ? `{\\n${perCardStateEntries}\\n}`\n : \"Record<string, never>\"\n };\n\nexport type PieceStateRecord<\n PieceIdValue extends PieceId = PieceId,\n PieceTypeIdValue extends PieceTypeId = PieceTypeId,\n Fields = RuntimeRecord,\n> = Omit<RuntimePieceData, \"id\" | \"pieceTypeId\" | \"properties\"> & {\n id: PieceIdValue;\n pieceTypeId: PieceTypeIdValue;\n properties: Fields;\n};\n\nexport type DieStateRecord<\n DieIdValue extends DieId = DieId,\n DieTypeIdValue extends DieTypeId = DieTypeId,\n Fields = RuntimeRecord,\n> = Omit<RuntimeDieData, \"id\" | \"dieTypeId\" | \"properties\"> & {\n id: DieIdValue;\n dieTypeId: DieTypeIdValue;\n properties: Fields;\n};\n\nexport type PieceStateById = ${\n perPieceStateEntries.length > 0\n ? `{\\n${perPieceStateEntries}\\n}`\n : \"Record<string, never>\"\n };\n\nexport type DieStateById = ${\n perDieStateEntries.length > 0\n ? `{\\n${perDieStateEntries}\\n}`\n : \"Record<string, never>\"\n };\nexport type CardIdsBySharedZoneId = {\n${sharedZoneCardIdEntries}\n};\nexport type CardIdsByPlayerZoneId = {\n${playerZoneCardIdEntries}\n};\nexport type CardIdsByDeckId = CardIdsBySharedZoneId;\n\nexport interface BoardSpaceStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n Fields = RuntimeRecord,\n> {\n id: SpaceIdValue;\n name?: string | null;\n typeId?: SpaceTypeId | null;\n fields: Fields;\n zoneId?: string | null;\n}\n\nexport interface BoardRelationStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n Fields = RuntimeRecord,\n> {\n id?: string | null;\n typeId: RelationTypeId;\n fromSpaceId: SpaceIdValue;\n toSpaceId: SpaceIdValue;\n directed: boolean;\n fields: Fields;\n}\n\nexport interface BoardContainerStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n ContainerIdValue extends BoardContainerId = BoardContainerId,\n Fields = RuntimeRecord,\n> {\n id: ContainerIdValue;\n name: string;\n host:\n | { type: \"board\" }\n | {\n type: \"space\";\n spaceId: SpaceIdValue;\n };\n allowedCardSetIds?: readonly CardSetId[];\n zoneId: string;\n fields: Fields;\n}\n\nexport interface BoardStateRecordBase<\n BoardIdValue extends BoardId = BoardId,\n SpaceIdValue extends SpaceId = SpaceId,\n ContainerIdValue extends BoardContainerId = BoardContainerId,\n BoardFields = RuntimeRecord,\n SpaceFields = RuntimeRecord,\n RelationFields = RuntimeRecord,\n ContainerFields = RuntimeRecord,\n> {\n id: BoardIdValue;\n baseId: BoardBaseId;\n typeId?: BoardTypeId | null;\n scope: \"shared\" | \"perPlayer\";\n playerId?: PlayerId | null;\n templateId?: string | null;\n fields: BoardFields;\n}\n\nexport interface GenericBoardStateRecord<\n BoardIdValue extends BoardId = BoardId,\n SpaceIdValue extends SpaceId = SpaceId,\n ContainerIdValue extends BoardContainerId = BoardContainerId,\n BoardFields = RuntimeRecord,\n SpaceFields = RuntimeRecord,\n RelationFields = RuntimeRecord,\n ContainerFields = RuntimeRecord,\n> extends BoardStateRecordBase<\n BoardIdValue,\n SpaceIdValue,\n ContainerIdValue,\n BoardFields,\n SpaceFields,\n RelationFields,\n ContainerFields\n > {\n layout: \"generic\";\n spaces: Record<\n SpaceIdValue,\n BoardSpaceStateRecord<SpaceIdValue, SpaceFields>\n >;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RelationFields>>;\n containers: Record<\n ContainerIdValue,\n BoardContainerStateRecord<SpaceIdValue, ContainerIdValue, ContainerFields>\n >;\n}\n\nexport interface HexSpaceStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n Fields = RuntimeRecord,\n> extends BoardSpaceStateRecord<SpaceIdValue, Fields> {\n q: number;\n r: number;\n}\n\nexport interface SquareSpaceStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n Fields = RuntimeRecord,\n> extends BoardSpaceStateRecord<SpaceIdValue, Fields> {\n row: number;\n col: number;\n}\n\nexport interface TiledEdgeStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n EdgeIdValue extends EdgeId = EdgeId,\n Fields = RuntimeRecord,\n> {\n id: EdgeIdValue;\n spaceIds: readonly SpaceIdValue[];\n typeId?: EdgeTypeId | null;\n label?: string | null;\n ownerId?: PlayerId | null;\n fields: Fields;\n}\n\nexport interface TiledVertexStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n VertexIdValue extends VertexId = VertexId,\n Fields = RuntimeRecord,\n> {\n id: VertexIdValue;\n spaceIds: readonly SpaceIdValue[];\n typeId?: VertexTypeId | null;\n label?: string | null;\n ownerId?: PlayerId | null;\n fields: Fields;\n}\n\nexport type HexEdgeStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n EdgeIdValue extends EdgeId = EdgeId,\n Fields = RuntimeRecord,\n> = TiledEdgeStateRecord<SpaceIdValue, EdgeIdValue, Fields>;\n\nexport type HexVertexStateRecord<\n SpaceIdValue extends SpaceId = SpaceId,\n VertexIdValue extends VertexId = VertexId,\n Fields = RuntimeRecord,\n> = TiledVertexStateRecord<SpaceIdValue, VertexIdValue, Fields>;\n\nexport interface HexBoardStateRecord<\n BoardIdValue extends BoardId = BoardId,\n SpaceIdValue extends SpaceId = SpaceId,\n EdgeIdValue extends EdgeId = EdgeId,\n VertexIdValue extends VertexId = VertexId,\n BoardFields = RuntimeRecord,\n SpaceFields = RuntimeRecord,\n EdgeFields = RuntimeRecord,\n VertexFields = RuntimeRecord,\n> extends BoardStateRecordBase<\n BoardIdValue,\n SpaceIdValue,\n never,\n BoardFields,\n SpaceFields,\n RuntimeRecord,\n RuntimeRecord\n > {\n layout: \"hex\";\n spaces: Record<SpaceIdValue, HexSpaceStateRecord<SpaceIdValue, SpaceFields>>;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RuntimeRecord>>;\n containers: Record<never, never>;\n orientation: \"pointy-top\" | \"flat-top\";\n edges: Array<HexEdgeStateRecord<SpaceIdValue, EdgeIdValue, EdgeFields>>;\n vertices: Array<\n HexVertexStateRecord<SpaceIdValue, VertexIdValue, VertexFields>\n >;\n}\n\nexport interface SquareBoardStateRecord<\n BoardIdValue extends BoardId = BoardId,\n SpaceIdValue extends SpaceId = SpaceId,\n ContainerIdValue extends BoardContainerId = BoardContainerId,\n EdgeIdValue extends EdgeId = EdgeId,\n VertexIdValue extends VertexId = VertexId,\n BoardFields = RuntimeRecord,\n SpaceFields = RuntimeRecord,\n RelationFields = RuntimeRecord,\n ContainerFields = RuntimeRecord,\n EdgeFields = RuntimeRecord,\n VertexFields = RuntimeRecord,\n> extends BoardStateRecordBase<\n BoardIdValue,\n SpaceIdValue,\n ContainerIdValue,\n BoardFields,\n SpaceFields,\n RelationFields,\n ContainerFields\n > {\n layout: \"square\";\n spaces: Record<\n SpaceIdValue,\n SquareSpaceStateRecord<SpaceIdValue, SpaceFields>\n >;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RelationFields>>;\n containers: Record<\n ContainerIdValue,\n BoardContainerStateRecord<SpaceIdValue, ContainerIdValue, ContainerFields>\n >;\n edges: Array<TiledEdgeStateRecord<SpaceIdValue, EdgeIdValue, EdgeFields>>;\n vertices: Array<\n TiledVertexStateRecord<SpaceIdValue, VertexIdValue, VertexFields>\n >;\n}\n\nexport type TiledBoardStateRecord =\n | HexBoardStateRecord\n | SquareBoardStateRecord;\n\nexport type BoardStateById = {\n${perBoardStateEntries}\n};\n\nexport type HexBoardStateById = ${\n perHexBoardStateEntries.length > 0\n ? `{\\n${perHexBoardStateEntries}\\n}`\n : \"Record<string, never>\"\n };\n\nexport type SquareBoardStateById = ${\n perSquareBoardStateEntries.length > 0\n ? `{\\n${perSquareBoardStateEntries}\\n}`\n : \"Record<string, never>\"\n };\n\ntype ManifestRecordValue<T> = T[keyof T];\ntype ManifestArrayElement<T> =\n T extends readonly (infer Item)[]\n ? Item\n : T extends (infer Item)[]\n ? Item\n : never;\n\nexport type BoardState<BoardIdValue extends BoardId = BoardId> =\n BoardIdValue extends keyof BoardStateById ? BoardStateById[BoardIdValue] : never;\n\nexport type BoardFields<BoardIdValue extends BoardId = BoardId> =\n BoardState<BoardIdValue> extends { fields: infer Fields } ? Fields : never;\n\nexport type BoardSpaceStateByBoardId = {\n [BoardIdValue in keyof BoardStateById]: ManifestRecordValue<\n BoardStateById[BoardIdValue][\"spaces\"]\n >;\n};\n\nexport type BoardSpaceState<BoardIdValue extends BoardId = BoardId> =\n BoardIdValue extends keyof BoardSpaceStateByBoardId\n ? BoardSpaceStateByBoardId[BoardIdValue]\n : never;\n\nexport type BoardSpaceFields<BoardIdValue extends BoardId = BoardId> =\n BoardSpaceState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type BoardRelationStateByBoardId = {\n [BoardIdValue in keyof BoardStateById]: ManifestArrayElement<\n BoardStateById[BoardIdValue][\"relations\"]\n >;\n};\n\nexport type BoardRelationState<BoardIdValue extends BoardId = BoardId> =\n BoardIdValue extends keyof BoardRelationStateByBoardId\n ? BoardRelationStateByBoardId[BoardIdValue]\n : never;\n\nexport type BoardRelationFields<BoardIdValue extends BoardId = BoardId> =\n BoardRelationState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type BoardContainerStateByBoardId = {\n [BoardIdValue in keyof BoardStateById]: ManifestRecordValue<\n BoardStateById[BoardIdValue][\"containers\"]\n >;\n};\n\nexport type BoardContainerState<BoardIdValue extends BoardId = BoardId> =\n BoardIdValue extends keyof BoardContainerStateByBoardId\n ? BoardContainerStateByBoardId[BoardIdValue]\n : never;\n\nexport type BoardContainerFields<BoardIdValue extends BoardId = BoardId> =\n BoardContainerState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\ntype HexAuthoredEdgesByBoardId = typeof authoredHexEdgesByBoardIdLookup;\ntype HexAuthoredVerticesByBoardId = typeof authoredHexVerticesByBoardIdLookup;\n\nexport type HexAuthoredEdgeState<\n BoardIdValue extends keyof HexAuthoredEdgesByBoardId = keyof HexAuthoredEdgesByBoardId,\n> = BoardIdValue extends keyof HexAuthoredEdgesByBoardId\n ? ManifestArrayElement<HexAuthoredEdgesByBoardId[BoardIdValue]>\n : never;\n\nexport type HexAuthoredEdgeRef<\n BoardIdValue extends keyof HexAuthoredEdgesByBoardId = keyof HexAuthoredEdgesByBoardId,\n> = HexAuthoredEdgeState<BoardIdValue> extends { ref: infer Ref } ? Ref : never;\n\nexport type HexAuthoredVertexState<\n BoardIdValue extends keyof HexAuthoredVerticesByBoardId = keyof HexAuthoredVerticesByBoardId,\n> = BoardIdValue extends keyof HexAuthoredVerticesByBoardId\n ? ManifestArrayElement<HexAuthoredVerticesByBoardId[BoardIdValue]>\n : never;\n\nexport type HexAuthoredVertexRef<\n BoardIdValue extends keyof HexAuthoredVerticesByBoardId = keyof HexAuthoredVerticesByBoardId,\n> = HexAuthoredVertexState<BoardIdValue> extends { ref: infer Ref }\n ? Ref\n : never;\n\nexport type HexEdgeState<\n BoardIdValue extends keyof HexBoardStateById = keyof HexBoardStateById,\n> = BoardIdValue extends keyof HexBoardStateById\n ? ManifestArrayElement<HexBoardStateById[BoardIdValue][\"edges\"]>\n : never;\n\nexport type HexEdgeFields<\n BoardIdValue extends keyof HexBoardStateById = keyof HexBoardStateById,\n> = HexEdgeState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type HexVertexState<\n BoardIdValue extends keyof HexBoardStateById = keyof HexBoardStateById,\n> = BoardIdValue extends keyof HexBoardStateById\n ? ManifestArrayElement<HexBoardStateById[BoardIdValue][\"vertices\"]>\n : never;\n\nexport type HexVertexFields<\n BoardIdValue extends keyof HexBoardStateById = keyof HexBoardStateById,\n> = HexVertexState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type SquareEdgeState<\n BoardIdValue extends keyof SquareBoardStateById = keyof SquareBoardStateById,\n> = BoardIdValue extends keyof SquareBoardStateById\n ? ManifestArrayElement<SquareBoardStateById[BoardIdValue][\"edges\"]>\n : never;\n\nexport type SquareEdgeFields<\n BoardIdValue extends keyof SquareBoardStateById = keyof SquareBoardStateById,\n> = SquareEdgeState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type SquareVertexState<\n BoardIdValue extends keyof SquareBoardStateById = keyof SquareBoardStateById,\n> = BoardIdValue extends keyof SquareBoardStateById\n ? ManifestArrayElement<SquareBoardStateById[BoardIdValue][\"vertices\"]>\n : never;\n\nexport type SquareVertexFields<\n BoardIdValue extends keyof SquareBoardStateById = keyof SquareBoardStateById,\n> = SquareVertexState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type TiledBoardId = keyof HexBoardStateById | keyof SquareBoardStateById;\n\nexport type TiledEdgeState<BoardIdValue extends TiledBoardId = TiledBoardId> =\n BoardIdValue extends keyof HexBoardStateById\n ? HexEdgeState<BoardIdValue>\n : BoardIdValue extends keyof SquareBoardStateById\n ? SquareEdgeState<BoardIdValue>\n : never;\n\nexport type TiledEdgeFields<BoardIdValue extends TiledBoardId = TiledBoardId> =\n TiledEdgeState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type TiledVertexState<\n BoardIdValue extends TiledBoardId = TiledBoardId,\n> = BoardIdValue extends keyof HexBoardStateById\n ? HexVertexState<BoardIdValue>\n : BoardIdValue extends keyof SquareBoardStateById\n ? SquareVertexState<BoardIdValue>\n : never;\n\nexport type TiledVertexFields<\n BoardIdValue extends TiledBoardId = TiledBoardId,\n> = TiledVertexState<BoardIdValue> extends { fields: infer Fields }\n ? Fields\n : never;\n\nexport type BoardStateRecord = ${\n analysis.boardIds.length > 0 ? \"BoardStateById[BoardId]\" : \"never\"\n };\n\nexport type TableState = RuntimeTableRecord & {\n playerOrder: PlayerId[];\n zones: RuntimeTableRecord[\"zones\"] & {\n visibility: Record<ZoneId, RuntimeHandVisibilityMode>;\n cardSetIdsByZoneId?: Record<ZoneId, readonly CardSetId[]>;\n };\n decks: Record<SharedZoneId, CardId[]>;\n hands: Record<PlayerZoneId, PerPlayer<CardId[]>>;\n handVisibility: Record<PlayerZoneId, RuntimeHandVisibilityMode>;\n cards: CardStateById;\n pieces: Record<PieceId, RuntimePieceData>;\n componentLocations: Record<ComponentId, RuntimeComponentLocation>;\n ownerOfCard: Record<CardId, PlayerId | null>;\n visibility: Record<CardId, RuntimeCardVisibility>;\n resources: PerPlayer<Record<ResourceId, number>>;\n boards: RuntimeTableRecord[\"boards\"];\n dice: Record<DieId, RuntimeDieData>;\n};\n\nconst sharedZoneSchema = z.record(sharedZoneIdSchema, z.array(z.string()));\n// PerPlayer<Array<string>> wire shape only: { __perPlayer: true, entries: [[playerId, value], ...] }.\nconst playerZoneSchema = z.record(\n playerZoneIdSchema,\n perPlayerSchema(z.array(z.string())),\n);\nconst cardStateSchema = z.object({\n componentType: z.string().optional(),\n id: ids.cardId,\n cardSetId: ids.cardSetId,\n cardType: ids.cardType,\n name: z.string().optional(),\n text: z.string().optional(),\n properties: unknownRecordSchema,\n});\n${renderCardPropertiesSchemaByCardSetId(analysis.cardSets)}\n${renderCardStateSchemaFactory(analysis)}\nconst cardStateByIdSchema = ${renderCardStateSchemaById(analysis)};\nconst pieceStateByIdSchema = ${renderPieceStateSchemaById(analysis)};\nconst dieStateByIdSchema = ${renderDieStateSchemaById(analysis)};\nconst boardStateByIdSchema = ${renderBoardStateSchemaById(analysis)};\nconst hexBoardStateByIdSchema = ${renderHexBoardStateSchemaById(analysis)};\nconst squareBoardStateByIdSchema = ${renderSquareBoardStateSchemaById(\n analysis,\n )};\nconst boardSpaceTypeIdSchema = ids.spaceTypeId.nullable().optional();\nconst boardSpaceStateSchema = z.object({\n id: ids.spaceId,\n name: z.string().nullable().optional(),\n typeId: boardSpaceTypeIdSchema,\n fields: unknownRecordSchema,\n zoneId: z.string().nullable().optional(),\n});\nconst hexSpaceStateSchema = boardSpaceStateSchema.extend({\n q: z.number().int(),\n r: z.number().int(),\n});\nconst squareSpaceStateSchema = boardSpaceStateSchema.extend({\n row: z.number().int(),\n col: z.number().int(),\n});\nconst boardRelationStateSchema = z.object({\n id: z.string().nullable().optional(),\n typeId: ids.relationTypeId,\n fromSpaceId: ids.spaceId,\n toSpaceId: ids.spaceId,\n directed: z.boolean(),\n fields: unknownRecordSchema,\n});\nconst boardContainerStateSchema = z.object({\n id: ids.boardContainerId,\n name: z.string(),\n host: z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"board\") }),\n z.object({ type: z.literal(\"space\"), spaceId: ids.spaceId }),\n ]),\n allowedCardSetIds: z.array(ids.cardSetId).optional(),\n zoneId: z.string(),\n fields: unknownRecordSchema,\n});\nconst runtimeGenericBoardStateSchema = z.object({\n id: ids.boardId,\n baseId: ids.boardBaseId,\n layout: z.literal(\"generic\"),\n typeId: ids.boardTypeId.nullable().optional(),\n scope: z.enum([\"shared\", \"perPlayer\"]),\n playerId: ids.playerId.nullable().optional(),\n templateId: z.string().nullable().optional(),\n fields: unknownRecordSchema,\n // T220: per-board state.spaces is loose-keyed by string. See the\n // codegen-template comment in renderGenericBoardStateSchema for\n // the rationale; the wire shape is unchanged (additionalProperties\n // JSON), and the inner id field narrows at parse time.\n spaces: z.record(z.string(), boardSpaceStateSchema),\n relations: z.array(boardRelationStateSchema),\n containers: z.record(ids.boardContainerId, boardContainerStateSchema),\n});\nconst hexEdgeStateSchema = z.object({\n id: ids.edgeId,\n spaceIds: z.array(ids.spaceId).min(1).max(2),\n typeId: ids.edgeTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: unknownRecordSchema,\n});\nconst hexVertexStateSchema = z.object({\n id: ids.vertexId,\n spaceIds: z.array(ids.spaceId).min(1).max(3),\n typeId: ids.vertexTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: unknownRecordSchema,\n});\nconst squareVertexStateSchema = z.object({\n id: ids.vertexId,\n spaceIds: z.array(ids.spaceId).min(1).max(4),\n typeId: ids.vertexTypeId.nullable().optional(),\n label: z.string().nullable().optional(),\n ownerId: ids.playerId.nullable().optional(),\n fields: unknownRecordSchema,\n});\nconst runtimeHexBoardStateSchema = runtimeGenericBoardStateSchema.extend({\n layout: z.literal(\"hex\"),\n // T220: loose-keyed by string — see comment above.\n spaces: z.record(z.string(), hexSpaceStateSchema),\n relations: z.array(boardRelationStateSchema),\n containers: z.object({}),\n orientation: z.enum([\"pointy-top\", \"flat-top\"]),\n edges: z.array(hexEdgeStateSchema),\n vertices: z.array(hexVertexStateSchema),\n});\nconst runtimeSquareBoardStateSchema = runtimeGenericBoardStateSchema.extend({\n layout: z.literal(\"square\"),\n // T220: loose-keyed by string — see comment above.\n spaces: z.record(z.string(), squareSpaceStateSchema),\n relations: z.array(boardRelationStateSchema),\n containers: z.record(ids.boardContainerId, boardContainerStateSchema),\n edges: z.array(hexEdgeStateSchema),\n vertices: z.array(squareVertexStateSchema),\n});\nconst runtimeBoardStateSchema = z.union([\n runtimeGenericBoardStateSchema,\n runtimeHexBoardStateSchema,\n runtimeSquareBoardStateSchema,\n]);\nconst rawTableSchema = z.object({\n playerOrder: z.array(ids.playerId),\n zones: z.object({\n shared: sharedZoneSchema,\n perPlayer: playerZoneSchema,\n visibility: z.record(zoneIdSchema, z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"])),\n cardSetIdsByZoneId: z.record(zoneIdSchema, z.array(ids.cardSetId)).optional(),\n }),\n decks: sharedZoneSchema,\n hands: playerZoneSchema,\n handVisibility: z.record(\n playerZoneIdSchema,\n z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"]),\n ),\n cards: cardStateByIdSchema,\n pieces: pieceStateByIdSchema,\n componentLocations: z.record(\n z.string(),\n z.union([\n z.object({ type: z.literal(\"Detached\") }),\n z.object({\n type: z.literal(\"InDeck\"),\n deckId: ids.deckId,\n playedBy: ids.playerId.nullable(),\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"InHand\"),\n handId: ids.handId,\n playerId: ids.playerId,\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"InZone\"),\n zoneId: z.string(),\n playedBy: ids.playerId.nullable().optional(),\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"OnSpace\"),\n boardId: ids.boardId,\n spaceId: ids.spaceId,\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"InContainer\"),\n boardId: ids.boardId,\n containerId: ids.boardContainerId,\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"OnEdge\"),\n boardId: ids.boardId,\n edgeId: ids.edgeId,\n position: z.number().int().nullable().optional(),\n }),\n z.object({\n type: z.literal(\"OnVertex\"),\n boardId: ids.boardId,\n vertexId: ids.vertexId,\n position: z.number().int().nullable().optional(),\n }),\n ${renderStrictSlotLocationSchema(analysis.strictSlotHosts)},\n ]),\n ),\n ownerOfCard: z.record(ids.cardId, ids.playerId.nullable()),\n visibility: z.record(\n ids.cardId,\n z.object({\n faceUp: z.boolean(),\n visibleTo: z.array(ids.playerId).nullable().optional(),\n }),\n ),\n resources: perPlayerSchema(z.record(ids.resourceId, z.number().int())),\n boards: z.object({\n byId: boardStateByIdSchema,\n hex: hexBoardStateByIdSchema,\n square: squareBoardStateByIdSchema,\n }),\n dice: dieStateByIdSchema,\n});\n\nexport const tableSchema = assumeManifestSchema<TableState>(rawTableSchema);\n\nexport const runtimeSchema = createManifestRuntimeSchema({\n phaseNameSchema: z.string(),\n playerIdSchema: ids.playerId,\n setupProfileIdSchema: ids.setupProfileId,\n});\n\n// Produces an empty PerPlayer<CardId[]> for every player zone. The entries\n// array is seeded from the resolved runtime roster so the generated default\n// never creates a record for a player the session does not have.\nfunction buildPerPlayerCardIds(\n playerIds: readonly PlayerId[],\n): CardIdsByPlayerZoneId {\n return Object.fromEntries(\n literals.playerZoneIds.map((zoneId) => [\n zoneId,\n perPlayer(playerIds, () => [] as CardId[]),\n ]),\n ) as CardIdsByPlayerZoneId;\n}\n\nfunction buildPlayerResources(\n playerIds: readonly PlayerId[],\n): PerPlayer<Record<ResourceId, number>> {\n return perPlayer(playerIds, () =>\n Object.fromEntries(\n literals.resourceIds.map((resourceId) => [resourceId, 0]),\n ) as Record<ResourceId, number>,\n );\n}\n\nexport const defaults = {\n zones: (playerIds?: readonly string[]) => ({\n shared: cloneManifestDefault(${JSON.stringify(emptySharedZonesTemplate)}),\n perPlayer: buildPerPlayerCardIds(resolveDefaultPlayerIds(playerIds)),\n visibility: cloneManifestDefault(${JSON.stringify(zoneVisibilityById)}),\n cardSetIdsByZoneId: cloneManifestDefault(${JSON.stringify(\n Object.fromEntries(\n Array.from(analysis.zoneCardSetIdsById.entries()).sort(\n ([left], [right]) => left.localeCompare(right),\n ),\n ),\n )}),\n }) as TableState[\"zones\"],\n decks: () => cloneManifestDefault(${JSON.stringify(emptySharedZonesTemplate)}) as TableState[\"decks\"],\n hands: (playerIds?: readonly string[]) =>\n buildPerPlayerCardIds(resolveDefaultPlayerIds(playerIds)) as TableState[\"hands\"],\n handVisibility: () => cloneManifestDefault(${JSON.stringify(\n Object.fromEntries(\n playerZoneIds.map((zoneId) => [\n zoneId,\n zoneVisibilityById[zoneId] ?? \"ownerOnly\",\n ]),\n ),\n )}) as TableState[\"handVisibility\"],\n ownerOfCard: () => cloneManifestDefault(${JSON.stringify(defaultOwnerTemplate)}) as TableState[\"ownerOfCard\"],\n visibility: () => cloneManifestDefault(${JSON.stringify(defaultVisibilityTemplate)}) as TableState[\"visibility\"],\n resources: (playerIds?: readonly string[]) =>\n buildPlayerResources(resolveDefaultPlayerIds(playerIds)),\n} as const;\n\nexport const staticBoards = ${renderJsonConst(staticBoardsTemplate)};\n\nconst baseInitialTable = ${renderJsonConst(initialTableTemplate)} as unknown as TableState;\nconst baseDeckCardsByZoneId: Record<SharedZoneId, readonly CardId[]> = ${renderJsonConst(\n Object.fromEntries(\n sharedZoneIds.map((zoneId) => [\n zoneId,\n (\n initialTableTemplate as {\n decks: Record<string, readonly string[]>;\n }\n ).decks[zoneId] ?? [],\n ]),\n ),\n )};\n\nexport function createInitialTable(options: {\n playerIds?: readonly string[];\n shuffleItems?: <Value>(values: readonly Value[]) => Value[];\n} = {}): TableState {\n const resolvedPlayerIds = resolveDefaultPlayerIds(options.playerIds);\n const shuffleItems =\n options.shuffleItems ?? (<Value>(values: readonly Value[]) => [...values]);\n const table = cloneManifestDefault(baseInitialTable) as TableState;\n table.playerOrder = [...resolvedPlayerIds];\n table.zones = defaults.zones(resolvedPlayerIds);\n table.decks = defaults.decks();\n table.hands = defaults.hands(resolvedPlayerIds);\n table.resources = defaults.resources(resolvedPlayerIds);\n const componentLocations = cloneManifestDefault(\n baseInitialTable.componentLocations,\n ) as TableState[\"componentLocations\"];\n\n for (const [zoneId, baseDeckCardIds] of Object.entries(\n baseDeckCardsByZoneId,\n ) as Array<[SharedZoneId, readonly CardId[]]>) {\n const shuffled = shuffleItems(baseDeckCardIds);\n (table.decks as Record<string, CardId[]>)[zoneId] = [...shuffled];\n (table.zones.shared as Record<string, CardId[]>)[zoneId] = [...shuffled];\n shuffled.forEach((componentId, position) => {\n const location = componentLocations[componentId];\n if (!location || location.type !== \"InDeck\") {\n return;\n }\n componentLocations[componentId] = {\n ...location,\n position,\n };\n });\n }\n\n table.componentLocations = componentLocations;\n return tableSchema.parse(table);\n}\n\nexport const schemas = {\n table: tableSchema,\n runtime: runtimeSchema,\n} as const;\n\nexport function createGameStateSchema<\n PhaseNameSchema extends z.ZodType<unknown>,\n PublicSchema extends z.ZodType<unknown>,\n PrivateSchema extends z.ZodType<unknown>,\n HiddenSchema extends z.ZodType<unknown>,\n PhasesSchema extends z.ZodType<unknown>,\n>({\n phaseNameSchema,\n publicSchema,\n privateSchema,\n hiddenSchema,\n phasesSchema,\n}: {\n phaseNameSchema: PhaseNameSchema;\n publicSchema: PublicSchema;\n privateSchema: PrivateSchema;\n hiddenSchema: HiddenSchema;\n phasesSchema: PhasesSchema;\n}) {\n return createManifestGameStateSchema({\n tableSchema,\n playerIdSchema: ids.playerId,\n setupProfileIdSchema: ids.setupProfileId,\n phaseNameSchema,\n publicSchema,\n privateSchema,\n hiddenSchema,\n phasesSchema,\n });\n}\n\nexport const manifestContract: ReducerManifestContract<\n RuntimeTableRecord,\n string,\n PlayerId,\n DeckId,\n HandId,\n CardId\n> = {\n literals,\n ids,\n defaults,\n staticBoards: staticBoards as unknown as StaticBoards<TableState>,\n setupOptionsById,\n setupChoiceIdsByOptionId,\n setupProfilesById,\n tableSchema,\n runtimeSchema,\n createGameStateSchema,\n};\n\n${renderBoardLiteralHelpers(analysis)}\n\nexport type SetupProfilesDefinition = Record<\n SetupProfileId,\n SetupProfileDefinition<string, typeof manifestContract>\n>;\n\nexport function setupProfiles<const Profiles extends SetupProfilesDefinition>(\n profiles: Profiles,\n): Profiles {\n return profiles;\n}\n\nexport function shuffle(\n container: SetupBootstrapContainerRef<typeof manifestContract>,\n): SetupBootstrapStep<typeof manifestContract> {\n return createShuffleStep<typeof manifestContract>(container);\n}\n\nexport function dealToPlayerZone(options: {\n from: Extract<\n SetupBootstrapContainerRef<typeof manifestContract>,\n { type: \"sharedZone\" | \"sharedBoardContainer\" }\n >;\n zoneId: Extract<\n SetupBootstrapPerPlayerContainerTemplateRef<typeof manifestContract>,\n { type: \"playerZone\" }\n >[\"zoneId\"];\n count: number;\n playerIds?: readonly PlayerId[];\n}): SetupBootstrapStep<typeof manifestContract> {\n return createDealToPlayerZoneStep<typeof manifestContract>(options);\n}\n\nexport function dealToPlayerBoardContainer(options: {\n from: Extract<\n SetupBootstrapContainerRef<typeof manifestContract>,\n { type: \"sharedZone\" | \"sharedBoardContainer\" }\n >;\n boardId: Extract<\n SetupBootstrapPerPlayerContainerTemplateRef<typeof manifestContract>,\n { type: \"playerBoardContainer\" }\n >[\"boardId\"];\n containerId: Extract<\n SetupBootstrapPerPlayerContainerTemplateRef<typeof manifestContract>,\n { type: \"playerBoardContainer\" }\n >[\"containerId\"];\n count: number;\n playerIds?: readonly PlayerId[];\n}): SetupBootstrapStep<typeof manifestContract> {\n return createDealToPlayerBoardContainerStep<typeof manifestContract>(options);\n}\n\nexport function seedSharedBoardContainer(options: {\n from: SetupBootstrapContainerRef<typeof manifestContract>;\n boardId: Extract<\n SetupBootstrapDestinationRef<typeof manifestContract>,\n { type: \"sharedBoardContainer\" }\n >[\"boardId\"];\n containerId: Extract<\n SetupBootstrapDestinationRef<typeof manifestContract>,\n { type: \"sharedBoardContainer\" }\n >[\"containerId\"];\n count?: number;\n componentIds?: readonly (\n | CardIdOfManifest<typeof manifestContract>\n | PieceIdOfManifest<typeof manifestContract>\n | DieIdOfManifest<typeof manifestContract>\n )[];\n}): SetupBootstrapStep<typeof manifestContract> {\n return createSeedSharedBoardContainerStep<typeof manifestContract>(options);\n}\n\nexport function seedSharedBoardSpace(options: {\n from: SetupBootstrapContainerRef<typeof manifestContract>;\n boardId: Extract<\n SetupBootstrapDestinationRef<typeof manifestContract>,\n { type: \"sharedBoardSpace\" }\n >[\"boardId\"];\n spaceId: Extract<\n SetupBootstrapDestinationRef<typeof manifestContract>,\n { type: \"sharedBoardSpace\" }\n >[\"spaceId\"];\n count?: number;\n componentIds?: readonly (\n | CardIdOfManifest<typeof manifestContract>\n | PieceIdOfManifest<typeof manifestContract>\n | DieIdOfManifest<typeof manifestContract>\n )[];\n}): SetupBootstrapStep<typeof manifestContract> {\n return createSeedSharedBoardSpaceStep<typeof manifestContract>(options);\n}\n\nexport default manifestContract;\n`;\n}\n\nexport function generateManifestContractSource(\n manifest: GameTopologyManifest,\n): string {\n return renderManifestContractSource(manifest);\n}\n\nexport type GeneratedManifestContractSources = {\n \"shared/manifest-literals.ts\": string;\n \"shared/manifest-types.ts\": string;\n \"shared/manifest-runtime.ts\": string;\n \"shared/manifest-contract.ts\": string;\n};\n\nconst generatedFileBanner = `/**\n * Generated file.\n * Do not edit directly.\n */`;\n\nfunction extractGeneratedLiteralsBlock(source: string): string {\n const startMarker = \"export const literals = {\";\n const endMarker =\n \"\\n\\n// PlayerId is an opaque brand imported from @dreamboard/app-sdk/reducer.\";\n const start = source.indexOf(startMarker);\n const end = source.indexOf(endMarker, start);\n\n if (start === -1 || end === -1) {\n throw new Error(\"Unable to locate generated manifest literals block.\");\n }\n\n return source.slice(start, end).trim();\n}\n\nfunction renderSplitLiteralsBlock(legacySource: string): string {\n return extractGeneratedLiteralsBlock(legacySource).replace(\n / \\/\\/ literals satisfy `ManifestLiterals<PlayerId, \\.\\.\\.>`\\. The cast is safe\\n \\/\\/ because the runtime values are the exact player-id strings the manifest\\n \\/\\/ authored; branding is purely a type-level discipline\\.\\n playerIds: ([\\s\\S]*?) as unknown as readonly PlayerId\\[],\\n phaseNames:/,\n \" playerIds: $1,\\n phaseNames:\",\n );\n}\n\nfunction renderManifestLiteralsSource(legacySource: string): string {\n return `${generatedFileBanner}\n\n${renderSplitLiteralsBlock(legacySource)}\n`;\n}\n\nfunction renderManifestRuntimeSource(legacySource: string): string {\n const literalsBlock = extractGeneratedLiteralsBlock(legacySource);\n const withoutLiterals = legacySource.replace(\n literalsBlock,\n \"export { literals };\",\n );\n return withoutLiterals\n .replace(generatedFileBanner, `${generatedFileBanner}\\n// @ts-nocheck`)\n .replace(\n `} from \"@dreamboard/app-sdk/reducer\";\\n\\nconst unknownRecordSchema`,\n `} from \"@dreamboard/app-sdk/reducer\";\\nimport { literals } from \"./manifest-literals\";\\nimport type { PlayerId as PublicPlayerId, TableState as PublicTableState } from \"./manifest-types\";\\n\\nconst unknownRecordSchema`,\n )\n .replaceAll(\n \"literals.playerIds as unknown as readonly PlayerId[]\",\n \"literals.playerIds\",\n )\n .replaceAll(\n \"cardId: cardIdSchema as unknown as z.ZodType<CardId>,\",\n \"cardId: assumeManifestSchema<CardId>(cardIdSchema),\",\n )\n .replaceAll(\n \"deckId: deckIdSchema as unknown as z.ZodType<DeckId>,\",\n \"deckId: assumeManifestSchema<DeckId>(deckIdSchema),\",\n )\n .replaceAll(\n \"handId: handIdSchema as unknown as z.ZodType<HandId>,\",\n \"handId: assumeManifestSchema<HandId>(handIdSchema),\",\n )\n .replace(\n /export const staticBoards = ([\\s\\S]*?) as const;\\n\\nconst baseInitialTable = /,\n \"export const staticBoards = $1 as const satisfies StaticBoards<PublicTableState>;\\n\\nconst baseInitialTable = \",\n )\n .replace(\n /const baseInitialTable = ([\\s\\S]*?) as const as unknown as TableState;\\nconst baseDeckCardsByZoneId:/,\n \"const baseInitialTable = cloneManifestDefault<PublicTableState>($1);\\nconst baseDeckCardsByZoneId:\",\n )\n .replace(\n \"staticBoards: staticBoards as unknown as StaticBoards<TableState>,\",\n \"staticBoards,\",\n )\n .replace(\n `export const manifestContract: ReducerManifestContract<\\n RuntimeTableRecord,`,\n `export const manifestContract: ReducerManifestContract<\\n PublicTableState,`,\n )\n .replace(\n `export const manifestContract: ReducerManifestContract<\\n PublicTableState,\\n string,\\n PlayerId,`,\n `export const manifestContract: ReducerManifestContract<\\n PublicTableState,\\n string,\\n PublicPlayerId,`,\n )\n .replace(\n `const playerIdSchema = markManifestScopedSchema(\\n z\\n .string()\\n .min(1)\\n .transform((value) => asPlayerId(value)),\\n);`,\n `const playerIdSchema = assumeManifestSchema<PublicPlayerId>(\\n markManifestScopedSchema(\\n z\\n .string()\\n .min(1)\\n .transform((value) => asPlayerId(value)),\\n ),\\n);`,\n );\n}\n\nfunction renderCardSetTypeSections(analysis: ManifestAnalysis): string {\n return analysis.cardSets\n .map((cardSet) => {\n const cardIdType = `export type ${toPascalCase(cardSet.id)}CardId = ${\n cardSet.cards\n .flatMap(renderCardInstanceIds)\n .map((cardId) => quote(cardId))\n .join(\" | \") || \"never\"\n };`;\n\n if (isCardPropertySchemaVariants(cardSet.cardSchema)) {\n const variantBlocks = Object.keys(cardSet.cardSchema.variants).map(\n (cardType) =>\n `export type ${cardPropertiesTypeName(cardSet, cardType)} = ${renderTypeForObjectSchema(\n mergeSharedCardProperties(\n cardSet.cardSchema as CardPropertySchemaVariants,\n cardType,\n ),\n )};`,\n );\n const variantTypeNames = Object.keys(cardSet.cardSchema.variants).map(\n (cardType) => cardPropertiesTypeName(cardSet, cardType),\n );\n return renderBlocks([\n ...variantBlocks,\n `export type ${toPascalCase(cardSet.id)}CardProperties = ${variantTypeNames.join(\" | \") || \"RuntimeRecord\"};`,\n cardIdType,\n ]);\n }\n\n return renderBlocks([\n `export type ${toPascalCase(cardSet.id)}CardProperties = ${renderTypeForObjectSchema(cardSet.cardSchema)};`,\n cardIdType,\n ]);\n })\n .join(\"\\n\\n\");\n}\n\nfunction renderTopologyFieldTypeSections(analysis: ManifestAnalysis): string {\n const sections: string[] = [];\n for (const board of analysis.analyzedBoards) {\n sections.push(\n `export type ${boardFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.boardFieldsSchema)};`,\n `export type ${boardSpaceFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.spaceFieldsSchema)};`,\n );\n if (board.layout !== \"hex\") {\n sections.push(\n `export type ${boardRelationFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.relationFieldsSchema)};`,\n `export type ${boardContainerFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.containerFieldsSchema)};`,\n );\n }\n if (board.layout !== \"generic\") {\n sections.push(\n `export type ${hexEdgeFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.edgeFieldsSchema)};`,\n `export type ${hexVertexFieldsTypeName(board.board.id)} = ${renderTypeForObjectSchema(board.vertexFieldsSchema)};`,\n );\n }\n }\n\n for (const pieceTypeId of analysis.pieceTypeIds) {\n sections.push(\n `export type ${pieceFieldsTypeName(pieceTypeId)} = ${renderTypeForObjectSchema(\n analysis.pieceTypeSchemasById.get(pieceTypeId),\n )};`,\n );\n }\n for (const dieTypeId of analysis.dieTypeIds) {\n sections.push(\n `export type ${dieFieldsTypeName(dieTypeId)} = ${renderTypeForObjectSchema(\n analysis.dieTypeSchemasById.get(dieTypeId),\n )};`,\n );\n }\n return sections.join(\"\\n\");\n}\n\nfunction renderManifestTypesSource(manifest: GameTopologyManifest): string {\n const analysis = analyzeManifest(manifest);\n const sharedZoneIds = analysis.sharedZones.map((zone) => zone.id).sort();\n const playerZoneIds = analysis.playerZones.map((zone) => zone.id).sort();\n const cardSetCardIdAlias = (cardSetId: string) =>\n `${toPascalCase(cardSetId)}CardId`;\n const renderCardIdsForCardSets = (cardSetIds: readonly string[]) =>\n cardSetIds.map(cardSetCardIdAlias).join(\" | \") || \"never\";\n const sharedZoneCardIdEntries = sharedZoneIds\n .map((zoneId) => {\n const allowedCardSetIds = analysis.sharedZoneCardSetIds.get(zoneId) ?? [];\n return ` ${quote(zoneId)}: Array<${renderCardIdsForCardSets(allowedCardSetIds)}>;`;\n })\n .join(\"\\n\");\n const playerZoneCardIdEntries = playerZoneIds\n .map((zoneId) => {\n const allowedCardSetIds = analysis.playerZoneCardSetIds.get(zoneId) ?? [];\n return ` ${quote(zoneId)}: PerPlayer<Array<${renderCardIdsForCardSets(allowedCardSetIds)}>>;`;\n })\n .join(\"\\n\");\n const perBoardStateEntries = analysis.analyzedBoards\n .flatMap((board) =>\n board.runtimeBoardIds.map((runtimeBoardId) => {\n if (board.layout === \"hex\") {\n return ` ${quote(runtimeBoardId)}: HexBoardStateRecord<${quote(runtimeBoardId)}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(board.edges.map((edge) => edge.id))}, ${renderStringUnion(\n board.vertices.map((vertex) => vertex.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${hexEdgeFieldsTypeName(board.board.id)}, ${hexVertexFieldsTypeName(board.board.id)}>;`;\n }\n if (board.layout === \"square\") {\n return ` ${quote(runtimeBoardId)}: SquareBoardStateRecord<${quote(runtimeBoardId)}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(\n board.containers.map((container) => container.id),\n )}, ${renderStringUnion(board.edges.map((edge) => edge.id))}, ${renderStringUnion(\n board.vertices.map((vertex) => vertex.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${boardRelationFieldsTypeName(board.board.id)}, ${boardContainerFieldsTypeName(\n board.board.id,\n )}, ${hexEdgeFieldsTypeName(board.board.id)}, ${hexVertexFieldsTypeName(board.board.id)}>;`;\n }\n return ` ${quote(runtimeBoardId)}: GenericBoardStateRecord<${quote(runtimeBoardId)}, ${renderStringUnion(\n board.spaces.map((space) => space.id),\n )}, ${renderStringUnion(\n board.containers.map((container) => container.id),\n )}, ${boardFieldsTypeName(board.board.id)}, ${boardSpaceFieldsTypeName(\n board.board.id,\n )}, ${boardRelationFieldsTypeName(board.board.id)}, ${boardContainerFieldsTypeName(board.board.id)}>;`;\n }),\n )\n .join(\"\\n\");\n\n return `${generatedFileBanner}\n\nimport type {\n PerPlayer,\n RuntimeCardData,\n RuntimeCardVisibility,\n RuntimeComponentLocation,\n RuntimeDieData,\n RuntimeHandVisibilityMode,\n RuntimePieceData,\n RuntimeRecord,\n RuntimeTableRecord,\n} from \"@dreamboard/app-sdk/reducer\";\nimport { literals } from \"./manifest-literals\";\n\nexport type PlayerId = (typeof literals.playerIds)[number];\nexport type PhaseName = string;\nexport type BoardLayout = (typeof literals.boardLayouts)[number];\nexport type SetupOptionId = (typeof literals.setupOptionIds)[number];\nexport type SetupProfileId = (typeof literals.setupProfileIds)[number];\nexport type CardSetId = (typeof literals.cardSetIds)[number];\nexport type CardType = (typeof literals.cardTypes)[number];\nexport type CardId = (typeof literals.cardIds)[number];\nexport type DeckId = (typeof literals.deckIds)[number];\nexport type HandId = (typeof literals.handIds)[number];\nexport type SharedZoneId = (typeof literals.sharedZoneIds)[number];\nexport type PlayerZoneId = (typeof literals.playerZoneIds)[number];\nexport type ZoneId = (typeof literals.zoneIds)[number];\nexport type ResourceId = (typeof literals.resourceIds)[number];\nexport type PieceTypeId = (typeof literals.pieceTypeIds)[number];\nexport type PieceId = (typeof literals.pieceIds)[number];\nexport type DieTypeId = (typeof literals.dieTypeIds)[number];\nexport type DieId = (typeof literals.dieIds)[number];\nexport type BoardTypeId = (typeof literals.boardTypeIds)[number];\nexport type BoardBaseId = (typeof literals.boardBaseIds)[number];\nexport type BoardId = (typeof literals.boardIds)[number];\nexport type BoardContainerId = (typeof literals.boardContainerIds)[number];\nexport type RelationTypeId = (typeof literals.relationTypeIds)[number];\nexport type EdgeId = (typeof literals.edgeIds)[number];\nexport type EdgeTypeId = (typeof literals.edgeTypeIds)[number];\nexport type VertexId = (typeof literals.vertexIds)[number];\nexport type VertexTypeId = (typeof literals.vertexTypeIds)[number];\nexport type SpaceId = (typeof literals.spaceIds)[number];\nexport type SpaceTypeId = (typeof literals.spaceTypeIds)[number];\n\n${renderCardSetTypeSections(analysis)}\n\n${renderTopologyFieldTypeSections(analysis)}\n\n${renderBoardFieldMapTypes(analysis)}\n\nexport type CardProperties = ${\n analysis.cardSets.length > 0\n ? analysis.cardSets\n .map((cardSet) => `${toPascalCase(cardSet.id)}CardProperties`)\n .join(\" | \")\n : \"RuntimeRecord\"\n };\n\nexport type CardState = Omit<RuntimeCardData, \"id\" | \"cardSetId\" | \"cardType\" | \"properties\"> & {\n id: CardId;\n cardSetId: CardSetId;\n cardType: CardType;\n properties: CardProperties;\n};\nexport type CardStateById = Record<CardId, CardState>;\nexport type PieceStateById = Record<PieceId, RuntimePieceData>;\nexport type DieStateById = Record<DieId, RuntimeDieData>;\nexport type CardIdsBySharedZoneId = {\n${sharedZoneCardIdEntries}\n};\nexport type CardIdsByPlayerZoneId = {\n${playerZoneCardIdEntries}\n};\nexport type CardIdsByDeckId = CardIdsBySharedZoneId;\nexport type ComponentId = CardId | PieceId | DieId;\n\nexport interface BoardSpaceStateRecord<SpaceIdValue extends SpaceId = SpaceId, Fields = RuntimeRecord> {\n id: SpaceIdValue;\n name?: string | null;\n typeId?: SpaceTypeId | null;\n fields: Fields;\n zoneId?: string | null;\n}\nexport interface BoardRelationStateRecord<SpaceIdValue extends SpaceId = SpaceId, Fields = RuntimeRecord> {\n id?: string | null;\n typeId: RelationTypeId;\n fromSpaceId: SpaceIdValue;\n toSpaceId: SpaceIdValue;\n directed: boolean;\n fields: Fields;\n}\nexport interface BoardContainerStateRecord<SpaceIdValue extends SpaceId = SpaceId, ContainerIdValue extends BoardContainerId = BoardContainerId, Fields = RuntimeRecord> {\n id: ContainerIdValue;\n name: string;\n host: { type: \"board\" } | { type: \"space\"; spaceId: SpaceIdValue };\n allowedCardSetIds?: readonly CardSetId[];\n zoneId: string;\n fields: Fields;\n}\nexport interface BoardStateRecordBase<BoardIdValue extends BoardId = BoardId, BoardFields = RuntimeRecord> {\n id: BoardIdValue;\n baseId: BoardBaseId;\n typeId?: BoardTypeId | null;\n scope: \"shared\" | \"perPlayer\";\n playerId?: PlayerId | null;\n templateId?: string | null;\n fields: BoardFields;\n}\nexport interface GenericBoardStateRecord<BoardIdValue extends BoardId = BoardId, SpaceIdValue extends SpaceId = SpaceId, ContainerIdValue extends BoardContainerId = BoardContainerId, BoardFields = RuntimeRecord, SpaceFields = RuntimeRecord, RelationFields = RuntimeRecord, ContainerFields = RuntimeRecord> extends BoardStateRecordBase<BoardIdValue, BoardFields> {\n layout: \"generic\";\n spaces: Record<SpaceIdValue, BoardSpaceStateRecord<SpaceIdValue, SpaceFields>>;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RelationFields>>;\n containers: Record<ContainerIdValue, BoardContainerStateRecord<SpaceIdValue, ContainerIdValue, ContainerFields>>;\n}\nexport interface HexSpaceStateRecord<SpaceIdValue extends SpaceId = SpaceId, Fields = RuntimeRecord> extends BoardSpaceStateRecord<SpaceIdValue, Fields> {\n q: number;\n r: number;\n}\nexport interface SquareSpaceStateRecord<SpaceIdValue extends SpaceId = SpaceId, Fields = RuntimeRecord> extends BoardSpaceStateRecord<SpaceIdValue, Fields> {\n row: number;\n col: number;\n}\nexport interface TiledEdgeStateRecord<SpaceIdValue extends SpaceId = SpaceId, EdgeIdValue extends EdgeId = EdgeId, Fields = RuntimeRecord> {\n id: EdgeIdValue;\n spaceIds: readonly SpaceIdValue[];\n typeId?: EdgeTypeId | null;\n label?: string | null;\n ownerId?: PlayerId | null;\n fields: Fields;\n}\nexport interface TiledVertexStateRecord<SpaceIdValue extends SpaceId = SpaceId, VertexIdValue extends VertexId = VertexId, Fields = RuntimeRecord> {\n id: VertexIdValue;\n spaceIds: readonly SpaceIdValue[];\n typeId?: VertexTypeId | null;\n label?: string | null;\n ownerId?: PlayerId | null;\n fields: Fields;\n}\nexport type HexEdgeStateRecord<SpaceIdValue extends SpaceId = SpaceId, EdgeIdValue extends EdgeId = EdgeId, Fields = RuntimeRecord> = TiledEdgeStateRecord<SpaceIdValue, EdgeIdValue, Fields>;\nexport type HexVertexStateRecord<SpaceIdValue extends SpaceId = SpaceId, VertexIdValue extends VertexId = VertexId, Fields = RuntimeRecord> = TiledVertexStateRecord<SpaceIdValue, VertexIdValue, Fields>;\nexport interface HexBoardStateRecord<BoardIdValue extends BoardId = BoardId, SpaceIdValue extends SpaceId = SpaceId, EdgeIdValue extends EdgeId = EdgeId, VertexIdValue extends VertexId = VertexId, BoardFields = RuntimeRecord, SpaceFields = RuntimeRecord, EdgeFields = RuntimeRecord, VertexFields = RuntimeRecord> extends BoardStateRecordBase<BoardIdValue, BoardFields> {\n layout: \"hex\";\n spaces: Record<SpaceIdValue, HexSpaceStateRecord<SpaceIdValue, SpaceFields>>;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RuntimeRecord>>;\n containers: Record<never, never>;\n orientation: \"pointy-top\" | \"flat-top\";\n edges: Array<HexEdgeStateRecord<SpaceIdValue, EdgeIdValue, EdgeFields>>;\n vertices: Array<HexVertexStateRecord<SpaceIdValue, VertexIdValue, VertexFields>>;\n}\nexport interface SquareBoardStateRecord<BoardIdValue extends BoardId = BoardId, SpaceIdValue extends SpaceId = SpaceId, ContainerIdValue extends BoardContainerId = BoardContainerId, EdgeIdValue extends EdgeId = EdgeId, VertexIdValue extends VertexId = VertexId, BoardFields = RuntimeRecord, SpaceFields = RuntimeRecord, RelationFields = RuntimeRecord, ContainerFields = RuntimeRecord, EdgeFields = RuntimeRecord, VertexFields = RuntimeRecord> extends BoardStateRecordBase<BoardIdValue, BoardFields> {\n layout: \"square\";\n spaces: Record<SpaceIdValue, SquareSpaceStateRecord<SpaceIdValue, SpaceFields>>;\n relations: Array<BoardRelationStateRecord<SpaceIdValue, RelationFields>>;\n containers: Record<ContainerIdValue, BoardContainerStateRecord<SpaceIdValue, ContainerIdValue, ContainerFields>>;\n edges: Array<TiledEdgeStateRecord<SpaceIdValue, EdgeIdValue, EdgeFields>>;\n vertices: Array<TiledVertexStateRecord<SpaceIdValue, VertexIdValue, VertexFields>>;\n}\nexport type BoardStateById = {\n${perBoardStateEntries}\n};\nexport type BoardState<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof BoardStateById ? BoardStateById[BoardIdValue] : never;\nexport type BoardFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof BoardFieldsByBoardId ? BoardFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type BoardSpaceState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { spaces: Record<string, infer Space> } ? Space : never;\nexport type BoardSpaceFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof BoardSpaceFieldsByBoardId ? BoardSpaceFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type BoardRelationState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { relations: Array<infer Relation> } ? Relation : never;\nexport type BoardRelationFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof BoardRelationFieldsByBoardId ? BoardRelationFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type BoardContainerState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { containers: Record<string, infer Container> } ? Container : never;\nexport type BoardContainerFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof BoardContainerFieldsByBoardId ? BoardContainerFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type HexBoardStateById = {\n [BoardIdValue in keyof BoardStateById as BoardStateById[BoardIdValue] extends { layout: \"hex\" } ? BoardIdValue : never]: BoardStateById[BoardIdValue];\n};\nexport type SquareBoardStateById = {\n [BoardIdValue in keyof BoardStateById as BoardStateById[BoardIdValue] extends { layout: \"square\" } ? BoardIdValue : never]: BoardStateById[BoardIdValue];\n};\nexport type HexEdgeState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { layout: \"hex\"; edges: Array<infer Edge> } ? Edge : never;\nexport type HexEdgeFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof HexEdgeFieldsByBoardId ? HexEdgeFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type HexVertexState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { layout: \"hex\"; vertices: Array<infer Vertex> } ? Vertex : never;\nexport type HexVertexFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof HexVertexFieldsByBoardId ? HexVertexFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type SquareEdgeState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { layout: \"square\"; edges: Array<infer Edge> } ? Edge : never;\nexport type SquareEdgeFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof SquareEdgeFieldsByBoardId ? SquareEdgeFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type SquareVertexState<BoardIdValue extends BoardId = BoardId> = BoardState<BoardIdValue> extends { layout: \"square\"; vertices: Array<infer Vertex> } ? Vertex : never;\nexport type SquareVertexFields<BoardIdValue extends BoardId = BoardId> = BoardIdValue extends keyof SquareVertexFieldsByBoardId ? SquareVertexFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type TiledBoardId = keyof TiledEdgeFieldsByBoardId | keyof TiledVertexFieldsByBoardId;\nexport type TiledEdgeState<BoardIdValue extends TiledBoardId = TiledBoardId> = BoardIdValue extends BoardId ? HexEdgeState<BoardIdValue> | SquareEdgeState<BoardIdValue> : never;\nexport type TiledEdgeFields<BoardIdValue extends TiledBoardId = TiledBoardId> = BoardIdValue extends keyof TiledEdgeFieldsByBoardId ? TiledEdgeFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type TiledVertexState<BoardIdValue extends TiledBoardId = TiledBoardId> = BoardIdValue extends BoardId ? HexVertexState<BoardIdValue> | SquareVertexState<BoardIdValue> : never;\nexport type TiledVertexFields<BoardIdValue extends TiledBoardId = TiledBoardId> = BoardIdValue extends keyof TiledVertexFieldsByBoardId ? TiledVertexFieldsByBoardId[BoardIdValue] : RuntimeRecord;\nexport type BoardStateRecord = BoardStateById[BoardId];\n\nexport type TableState = Omit<RuntimeTableRecord, \"playerOrder\" | \"zones\" | \"decks\" | \"hands\" | \"handVisibility\" | \"cards\" | \"pieces\" | \"componentLocations\" | \"ownerOfCard\" | \"visibility\" | \"resources\" | \"boards\" | \"dice\"> & {\n playerOrder: PlayerId[];\n zones: RuntimeTableRecord[\"zones\"] & {\n visibility: Record<ZoneId, RuntimeHandVisibilityMode>;\n cardSetIdsByZoneId?: Record<ZoneId, readonly CardSetId[]>;\n };\n decks: CardIdsBySharedZoneId;\n hands: CardIdsByPlayerZoneId;\n handVisibility: Record<PlayerZoneId, RuntimeHandVisibilityMode>;\n cards: CardStateById;\n pieces: PieceStateById;\n componentLocations: Record<ComponentId, RuntimeComponentLocation>;\n ownerOfCard: Record<CardId, PlayerId | null>;\n visibility: Record<CardId, RuntimeCardVisibility>;\n resources: PerPlayer<Record<ResourceId, number>>;\n boards: {\n byId: BoardStateById;\n hex: HexBoardStateById;\n square: SquareBoardStateById;\n network: Record<string, RuntimeRecord>;\n track: Record<string, RuntimeRecord>;\n };\n dice: DieStateById;\n};\n`;\n}\n\nfunction extractGeneratedRuntimeValueExports(source: string): string[] {\n const exports = new Set<string>();\n for (const match of source.matchAll(\n /^export (?:const|function) ([A-Za-z_$][\\w$]*)/gm,\n )) {\n const name = match[1];\n if (name !== \"literals\") {\n exports.add(name);\n }\n }\n return [...exports].sort((left, right) => left.localeCompare(right));\n}\n\nfunction renderManifestContractBarrelSource(legacySource: string): string {\n const runtimeExports = extractGeneratedRuntimeValueExports(legacySource);\n return `${generatedFileBanner}\n\nexport { literals } from \"./manifest-literals\";\nexport type * from \"./manifest-types\";\nexport {\n${runtimeExports.map((name) => ` ${name},`).join(\"\\n\")}\n} from \"./manifest-runtime\";\nexport { default } from \"./manifest-runtime\";\n`;\n}\n\nexport function generateManifestContractSources(\n manifest: GameTopologyManifest,\n): GeneratedManifestContractSources {\n const legacySource = renderManifestContractSource(manifest);\n return {\n \"shared/manifest-literals.ts\": renderManifestLiteralsSource(legacySource),\n \"shared/manifest-types.ts\": renderManifestTypesSource(manifest),\n \"shared/manifest-runtime.ts\": renderManifestRuntimeSource(legacySource),\n \"shared/manifest-contract.ts\":\n renderManifestContractBarrelSource(legacySource),\n };\n}\n","import type {\n HexBoardSpec,\n HexBoardTemplateSpec,\n HexSpaceSpec,\n HexVertexSpec,\n BoardCard,\n BoardSpec,\n BoardTemplateSpec,\n DieSeedSpec,\n DieTypeSpec,\n GameTopologyManifest,\n PieceSeedSpec,\n PieceTypeSpec,\n SetupOptionSpec,\n ZoneSpec,\n} from \"@dreamboard/sdk-types\";\nimport { resolveHexVertexGeometryKey } from \"./hex-geometry.js\";\n\nexport type ManifestAuthoringValidationResult = {\n errors: string[];\n warnings: string[];\n};\n\nfunction isHexBoardTemplateSpec(\n boardTemplate: BoardTemplateSpec,\n): boardTemplate is Extract<BoardTemplateSpec, { layout: \"hex\" }> {\n return boardTemplate.layout === \"hex\";\n}\n\nfunction isHexBoardSpec(\n board: BoardSpec,\n): board is Extract<BoardSpec, { layout: \"hex\" }> {\n return board.layout === \"hex\";\n}\n\nfunction collectDuplicateIdIssues(options: {\n entries: ReadonlyArray<{ id?: string | null; path: string }>;\n label: string;\n}): string[] {\n const issues: string[] = [];\n const pathsById = new Map<string, string[]>();\n\n for (const entry of options.entries) {\n const id = entry.id?.trim();\n if (!id) {\n continue;\n }\n const paths = pathsById.get(id) ?? [];\n paths.push(entry.path);\n pathsById.set(id, paths);\n }\n\n for (const [id, paths] of pathsById.entries()) {\n if (paths.length > 1) {\n issues.push(`${paths.join(\", \")}: Duplicate ${options.label} '${id}'.`);\n }\n }\n\n return issues;\n}\n\nfunction renderCardInstanceIds(card: BoardCard): string[] {\n return card.count > 1\n ? Array.from(\n { length: card.count },\n (_, index) => `${card.type}-${index + 1}`,\n )\n : [card.type];\n}\n\nfunction expandSeedIds<\n Seed extends {\n id?: string | null;\n typeId: string;\n count?: number | null;\n },\n>(seeds: readonly Seed[]): string[] {\n return seeds.flatMap((seed) => {\n const count = seed.count ?? 1;\n const baseId = seed.id ?? seed.typeId;\n return count > 1\n ? Array.from({ length: count }, (_, index) => `${baseId}-${index + 1}`)\n : [baseId];\n });\n}\n\nfunction validateTypeSlotDuplicates(options: {\n pieceTypes: readonly PieceTypeSpec[];\n dieTypes: readonly DieTypeSpec[];\n}): string[] {\n const issues: string[] = [];\n\n for (const [index, pieceType] of options.pieceTypes.entries()) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (pieceType.slots ?? []).map((slot, slotIndex) => ({\n id: slot.id,\n path: `manifest.pieceTypes[${index}].slots[${slotIndex}].id`,\n })),\n label: \"piece slot id\",\n }),\n );\n }\n\n for (const [index, dieType] of options.dieTypes.entries()) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (dieType.slots ?? []).map((slot, slotIndex) => ({\n id: slot.id,\n path: `manifest.dieTypes[${index}].slots[${slotIndex}].id`,\n })),\n label: \"die slot id\",\n }),\n );\n }\n\n return issues;\n}\n\nfunction validateSlotHostsAndHomes(manifest: GameTopologyManifest): string[] {\n const issues: string[] = [];\n const pieceTypesById = new Map(\n (manifest.pieceTypes ?? []).map(\n (pieceType) => [pieceType.id, pieceType] as const,\n ),\n );\n const dieTypesById = new Map(\n (manifest.dieTypes ?? []).map((dieType) => [dieType.id, dieType] as const),\n );\n const slotIdsByHostKey = new Map<string, Set<string>>();\n\n for (const [index, seed] of (manifest.pieceSeeds ?? []).entries()) {\n const pieceType = pieceTypesById.get(seed.typeId);\n const slotIds = (pieceType?.slots ?? []).map((slot) => slot.id);\n if (slotIds.length === 0) {\n continue;\n }\n if (typeof seed.id !== \"string\" || seed.id.length === 0) {\n issues.push(\n `manifest.pieceSeeds[${index}].id: Piece seed for slot-bearing type '${seed.typeId}' must declare an explicit id.`,\n );\n continue;\n }\n if ((seed.count ?? 1) !== 1) {\n issues.push(\n `manifest.pieceSeeds[${index}].count: Piece seed '${seed.id}' for slot-bearing type '${seed.typeId}' must omit count or set it to 1.`,\n );\n continue;\n }\n slotIdsByHostKey.set(`piece:${seed.id}`, new Set(slotIds));\n }\n\n for (const [index, seed] of (manifest.dieSeeds ?? []).entries()) {\n const dieType = dieTypesById.get(seed.typeId);\n const slotIds = (dieType?.slots ?? []).map((slot) => slot.id);\n if (slotIds.length === 0) {\n continue;\n }\n if (typeof seed.id !== \"string\" || seed.id.length === 0) {\n issues.push(\n `manifest.dieSeeds[${index}].id: Die seed for slot-bearing type '${seed.typeId}' must declare an explicit id.`,\n );\n continue;\n }\n if ((seed.count ?? 1) !== 1) {\n issues.push(\n `manifest.dieSeeds[${index}].count: Die seed '${seed.id}' for slot-bearing type '${seed.typeId}' must omit count or set it to 1.`,\n );\n continue;\n }\n slotIdsByHostKey.set(`die:${seed.id}`, new Set(slotIds));\n }\n\n const validateHome = (\n home: BoardCard[\"home\"] | PieceSeedSpec[\"home\"] | DieSeedSpec[\"home\"],\n path: string,\n ) => {\n if (home?.type !== \"slot\") {\n return;\n }\n\n const hostKey = `${home.host.kind}:${home.host.id}`;\n const slotIds = slotIdsByHostKey.get(hostKey);\n if (!slotIds) {\n issues.push(\n `${path}.host: Unknown strict slot host '${home.host.kind}:${home.host.id}'. Hosts must be singleton piece/die seeds whose type declares slots.`,\n );\n return;\n }\n if (!slotIds.has(home.slotId)) {\n issues.push(\n `${path}.slotId: Unknown slot '${home.slotId}' for host '${home.host.kind}:${home.host.id}'.`,\n );\n }\n };\n\n for (const [cardSetIndex, cardSet] of manifest.cardSets.entries()) {\n if (cardSet.type !== \"manual\") {\n continue;\n }\n for (const [cardIndex, card] of cardSet.cards.entries()) {\n validateHome(\n card.home,\n `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].home`,\n );\n }\n }\n\n for (const [index, seed] of (manifest.pieceSeeds ?? []).entries()) {\n validateHome(seed.home, `manifest.pieceSeeds[${index}].home`);\n }\n\n for (const [index, seed] of (manifest.dieSeeds ?? []).entries()) {\n validateHome(seed.home, `manifest.dieSeeds[${index}].home`);\n }\n\n return issues;\n}\n\nfunction validateSetupProfileReferences(\n manifest: GameTopologyManifest,\n): string[] {\n const issues: string[] = [];\n const optionChoiceIdsByOptionId = new Map<string, Set<string>>(\n (manifest.setupOptions ?? []).map((option, optionIndex) => {\n const choiceIds = new Set<string>();\n for (const choice of option.choices ?? []) {\n choiceIds.add(choice.id);\n }\n if (!option.id) {\n issues.push(\n `manifest.setupOptions[${optionIndex}].id: Missing option id.`,\n );\n }\n return [option.id, choiceIds];\n }),\n );\n\n for (const [profileIndex, profile] of (\n manifest.setupProfiles ?? []\n ).entries()) {\n const optionValues = profile.optionValues ?? {};\n for (const [optionId, choiceId] of Object.entries(optionValues)) {\n const allowedChoices = optionChoiceIdsByOptionId.get(optionId);\n if (!allowedChoices) {\n issues.push(\n `manifest.setupProfiles[${profileIndex}].optionValues.${optionId}: Unknown setup option '${optionId}'.`,\n );\n continue;\n }\n if (!allowedChoices.has(choiceId)) {\n issues.push(\n `manifest.setupProfiles[${profileIndex}].optionValues.${optionId}: Unknown choice '${choiceId}' for setup option '${optionId}'.`,\n );\n }\n }\n }\n\n return issues;\n}\n\nfunction validatePlayerScopedSeedHomes(\n manifest: GameTopologyManifest,\n): string[] {\n const issues: string[] = [];\n const boardScopeById = new Map(\n (manifest.boards ?? []).map((board) => [board.id, board.scope] as const),\n );\n const zoneScopeById = new Map(\n (manifest.zones ?? []).map((zone) => [zone.id, zone.scope] as const),\n );\n\n const validateSeedHome = (\n seed: PieceSeedSpec | DieSeedSpec,\n path: string,\n label: \"Piece seed\" | \"Die seed\",\n ) => {\n const authoredId = seed.id ?? seed.typeId;\n if (seed.ownerId) {\n return;\n }\n\n if (\n homeTargetsBoard(seed.home) &&\n boardScopeById.get(seed.home.boardId) === \"perPlayer\"\n ) {\n issues.push(\n `${path}.boardId: ${label} '${authoredId}' requires ownerId because board '${seed.home.boardId}' has scope 'perPlayer'. Add ownerId to resolve the player-scoped destination.`,\n );\n return;\n }\n\n if (\n seed.home?.type === \"zone\" &&\n zoneScopeById.get(seed.home.zoneId) === \"perPlayer\"\n ) {\n issues.push(\n `${path}.zoneId: ${label} '${authoredId}' requires ownerId because zone '${seed.home.zoneId}' has scope 'perPlayer'. Add ownerId to resolve the player-scoped destination.`,\n );\n }\n };\n\n for (const [index, seed] of (manifest.pieceSeeds ?? []).entries()) {\n validateSeedHome(seed, `manifest.pieceSeeds[${index}].home`, \"Piece seed\");\n }\n\n for (const [index, seed] of (manifest.dieSeeds ?? []).entries()) {\n validateSeedHome(seed, `manifest.dieSeeds[${index}].home`, \"Die seed\");\n }\n\n return issues;\n}\n\nfunction homeTargetsBoard(\n home: PieceSeedSpec[\"home\"] | DieSeedSpec[\"home\"] | undefined,\n): home is Extract<\n NonNullable<PieceSeedSpec[\"home\"] | DieSeedSpec[\"home\"]>,\n { type: \"space\" | \"container\" | \"edge\" | \"vertex\" }\n> {\n return (\n home?.type === \"space\" ||\n home?.type === \"container\" ||\n home?.type === \"edge\" ||\n home?.type === \"vertex\"\n );\n}\n\nfunction validateBoardTemplateDuplicates(\n boardTemplates: readonly BoardTemplateSpec[],\n): string[] {\n const issues: string[] = [];\n\n for (const [index, boardTemplate] of boardTemplates.entries()) {\n if (isHexBoardTemplateSpec(boardTemplate)) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (boardTemplate.spaces ?? []).map((space, spaceIndex) => ({\n id: space.id,\n path: `manifest.boardTemplates[${index}].spaces[${spaceIndex}].id`,\n })),\n label: \"space id\",\n }),\n );\n continue;\n }\n\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (boardTemplate.spaces ?? []).map((space, spaceIndex) => ({\n id: space.id,\n path: `manifest.boardTemplates[${index}].spaces[${spaceIndex}].id`,\n })),\n label: \"space id\",\n }),\n );\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (boardTemplate.containers ?? []).map(\n (container, containerIndex) => ({\n id: container.id,\n path: `manifest.boardTemplates[${index}].containers[${containerIndex}].id`,\n }),\n ),\n label: \"container id\",\n }),\n );\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (boardTemplate.relations ?? []).map(\n (relation, relationIndex) => ({\n id: relation.id,\n path: `manifest.boardTemplates[${index}].relations[${relationIndex}].id`,\n }),\n ),\n label: \"relation id\",\n }),\n );\n }\n\n return issues;\n}\n\nfunction validateBoardDuplicates(boards: readonly BoardSpec[]): string[] {\n const issues: string[] = [];\n\n for (const [index, board] of boards.entries()) {\n if (isHexBoardSpec(board)) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (board.spaces ?? []).map((space, spaceIndex) => ({\n id: space.id,\n path: `manifest.boards[${index}].spaces[${spaceIndex}].id`,\n })),\n label: \"space id\",\n }),\n );\n continue;\n }\n\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (board.spaces ?? []).map((space, spaceIndex) => ({\n id: space.id,\n path: `manifest.boards[${index}].spaces[${spaceIndex}].id`,\n })),\n label: \"space id\",\n }),\n );\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (board.containers ?? []).map((container, containerIndex) => ({\n id: container.id,\n path: `manifest.boards[${index}].containers[${containerIndex}].id`,\n })),\n label: \"container id\",\n }),\n );\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (board.relations ?? []).map((relation, relationIndex) => ({\n id: relation.id,\n path: `manifest.boards[${index}].relations[${relationIndex}].id`,\n })),\n label: \"relation id\",\n }),\n );\n }\n\n return issues;\n}\n\nfunction validateSetupOptionChoiceDuplicates(\n options: readonly SetupOptionSpec[],\n): string[] {\n const issues: string[] = [];\n\n for (const [optionIndex, option] of options.entries()) {\n issues.push(\n ...collectDuplicateIdIssues({\n entries: (option.choices ?? []).map((choice, choiceIndex) => ({\n id: choice.id,\n path: `manifest.setupOptions[${optionIndex}].choices[${choiceIndex}].id`,\n })),\n label: \"setup option choice id\",\n }),\n );\n }\n\n return issues;\n}\n\nfunction resolveHexSpaces(\n board: HexBoardSpec,\n template: HexBoardTemplateSpec | undefined,\n): HexSpaceSpec[] {\n if (!template) {\n return [...(board.spaces ?? [])].sort((left, right) =>\n left.id.localeCompare(right.id),\n );\n }\n\n const templateSpacesById = new Map(\n (template.spaces ?? []).map((space) => [space.id, space] as const),\n );\n const overridesById = new Map(\n (board.spaces ?? []).map((space) => [space.id, space] as const),\n );\n for (const overrideId of overridesById.keys()) {\n if (!templateSpacesById.has(overrideId)) {\n continue;\n }\n }\n\n return (template.spaces ?? [])\n .map((templateSpace) => {\n const override = overridesById.get(templateSpace.id);\n if (!override) {\n return templateSpace;\n }\n return {\n ...templateSpace,\n ...override,\n id: templateSpace.id,\n q: templateSpace.q,\n r: templateSpace.r,\n };\n })\n .sort((left, right) => left.id.localeCompare(right.id));\n}\n\nfunction validateHexVertexRefs(options: {\n ownerPath: string;\n ownerLabel: string;\n spaces: readonly HexSpaceSpec[];\n vertices: readonly HexVertexSpec[];\n}): string[] {\n const issues: string[] = [];\n const spacesById = new Map(\n options.spaces.map((space) => [space.id, space] as const),\n );\n\n for (const [vertexIndex, vertex] of options.vertices.entries()) {\n try {\n resolveHexVertexGeometryKey(vertex.ref, spacesById);\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown hex vertex error.\";\n issues.push(\n `${options.ownerPath}.vertices[${vertexIndex}].ref: ${options.ownerLabel} with spaces '${vertex.ref.spaces.join(\", \")}' failed validation. ${message}`,\n );\n }\n }\n\n return issues;\n}\n\nfunction validateHexBoardVertexRefs(manifest: GameTopologyManifest): string[] {\n const issues: string[] = [];\n const hexTemplatesById = new Map(\n (manifest.boardTemplates ?? [])\n .filter(isHexBoardTemplateSpec)\n .map((boardTemplate) => [boardTemplate.id, boardTemplate] as const),\n );\n\n for (const [templateIndex, template] of (\n manifest.boardTemplates ?? []\n ).entries()) {\n if (!isHexBoardTemplateSpec(template)) {\n continue;\n }\n issues.push(\n ...validateHexVertexRefs({\n ownerPath: `manifest.boardTemplates[${templateIndex}]`,\n ownerLabel: `Hex board template '${template.id}'`,\n spaces: template.spaces ?? [],\n vertices: template.vertices ?? [],\n }),\n );\n }\n\n for (const [boardIndex, board] of (manifest.boards ?? []).entries()) {\n if (!isHexBoardSpec(board)) {\n continue;\n }\n issues.push(\n ...validateHexVertexRefs({\n ownerPath: `manifest.boards[${boardIndex}]`,\n ownerLabel: `Hex board '${board.id}'`,\n spaces: resolveHexSpaces(\n board,\n hexTemplatesById.get(board.templateId ?? \"\"),\n ),\n vertices: board.vertices ?? [],\n }),\n );\n }\n\n return issues;\n}\n\nfunction collectAmbiguousBoardTypeWarnings(\n manifest: GameTopologyManifest,\n): string[] {\n const warnings: string[] = [];\n const boardTemplatesById = new Map(\n (manifest.boardTemplates ?? []).map(\n (template) => [template.id, template] as const,\n ),\n );\n const boardsBySpaceType = new Map<string, Set<string>>();\n const boardsByEdgeType = new Map<string, Set<string>>();\n const boardsByVertexType = new Map<string, Set<string>>();\n\n const addBoardUsage = (\n target: Map<string, Set<string>>,\n typeId: string | null | undefined,\n boardId: string,\n ) => {\n if (!typeId) {\n return;\n }\n const boardIds = target.get(typeId) ?? new Set<string>();\n boardIds.add(boardId);\n target.set(typeId, boardIds);\n };\n\n for (const board of manifest.boards ?? []) {\n const template = board.templateId\n ? boardTemplatesById.get(board.templateId)\n : undefined;\n for (const space of [\n ...((template?.layout === board.layout ? template.spaces : undefined) ??\n []),\n ...(board.spaces ?? []),\n ]) {\n addBoardUsage(boardsBySpaceType, space.typeId, board.id);\n }\n\n if (board.layout === \"hex\" || board.layout === \"square\") {\n for (const edge of [\n ...((template?.layout === board.layout ? template.edges : undefined) ??\n []),\n ...(board.edges ?? []),\n ]) {\n addBoardUsage(boardsByEdgeType, edge.typeId, board.id);\n }\n for (const vertex of [\n ...((template?.layout === board.layout\n ? template.vertices\n : undefined) ?? []),\n ...(board.vertices ?? []),\n ]) {\n addBoardUsage(boardsByVertexType, vertex.typeId, board.id);\n }\n }\n }\n\n const pushWarnings = (\n kind: \"space\" | \"edge\" | \"vertex\",\n boardsByType: Map<string, Set<string>>,\n helperName: string,\n ) => {\n for (const [typeId, boardIds] of boardsByType.entries()) {\n if (boardIds.size < 2) {\n continue;\n }\n warnings.push(\n `Ambiguous ${kind}.typeId '${typeId}' is authored on multiple boards (${Array.from(boardIds).sort().join(\", \")}). Prefer ${helperName} for board-scoped lookups.`,\n );\n }\n };\n\n pushWarnings(\n \"space\",\n boardsBySpaceType,\n \"boardHelpers.spaceIdsByBoardId / boardHelpers.spaceTypeIdByBoardId\",\n );\n pushWarnings(\n \"edge\",\n boardsByEdgeType,\n \"boardHelpers.edgeIdsByBoardIdAndTypeId\",\n );\n pushWarnings(\n \"vertex\",\n boardsByVertexType,\n \"boardHelpers.vertexIdsByBoardIdAndTypeId\",\n );\n\n return warnings;\n}\n\nexport function validateManifestAuthoring(\n manifest: GameTopologyManifest,\n): ManifestAuthoringValidationResult {\n const errors: string[] = [];\n\n errors.push(\n ...collectDuplicateIdIssues({\n entries: manifest.cardSets.map((cardSet, index) => ({\n id: cardSet.id,\n path: `manifest.cardSets[${index}].id`,\n })),\n label: \"card set id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: manifest.cardSets.flatMap((cardSet, cardSetIndex) =>\n cardSet.type === \"manual\"\n ? cardSet.cards.flatMap((card, cardIndex) =>\n renderCardInstanceIds(card).map((cardId) => ({\n id: cardId,\n path: `manifest.cardSets[${cardSetIndex}].cards[${cardIndex}].type`,\n })),\n )\n : [],\n ),\n label: \"card runtime id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.zones ?? []).map((zone: ZoneSpec, index) => ({\n id: zone.id,\n path: `manifest.zones[${index}].id`,\n })),\n label: \"zone id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.boardTemplates ?? []).map((boardTemplate, index) => ({\n id: boardTemplate.id,\n path: `manifest.boardTemplates[${index}].id`,\n })),\n label: \"board template id\",\n }),\n );\n errors.push(\n ...validateBoardTemplateDuplicates(manifest.boardTemplates ?? []),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.boards ?? []).map((board, index) => ({\n id: board.id,\n path: `manifest.boards[${index}].id`,\n })),\n label: \"board id\",\n }),\n );\n errors.push(...validateBoardDuplicates(manifest.boards ?? []));\n errors.push(\n ...validateTypeSlotDuplicates({\n pieceTypes: manifest.pieceTypes ?? [],\n dieTypes: manifest.dieTypes ?? [],\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.pieceTypes ?? []).map((pieceType, index) => ({\n id: pieceType.id,\n path: `manifest.pieceTypes[${index}].id`,\n })),\n label: \"piece type id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: expandSeedIds(manifest.pieceSeeds ?? []).map(\n (pieceId, index) => ({\n id: pieceId,\n path: `manifest.pieceSeeds[*][${index}]`,\n }),\n ),\n label: \"piece runtime id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.dieTypes ?? []).map((dieType, index) => ({\n id: dieType.id,\n path: `manifest.dieTypes[${index}].id`,\n })),\n label: \"die type id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: expandSeedIds(manifest.dieSeeds ?? []).map((dieId, index) => ({\n id: dieId,\n path: `manifest.dieSeeds[*][${index}]`,\n })),\n label: \"die runtime id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.resources ?? []).map((resource, index) => ({\n id: resource.id,\n path: `manifest.resources[${index}].id`,\n })),\n label: \"resource id\",\n }),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.setupOptions ?? []).map((option, index) => ({\n id: option.id,\n path: `manifest.setupOptions[${index}].id`,\n })),\n label: \"setup option id\",\n }),\n );\n errors.push(\n ...validateSetupOptionChoiceDuplicates(manifest.setupOptions ?? []),\n );\n errors.push(\n ...collectDuplicateIdIssues({\n entries: (manifest.setupProfiles ?? []).map((profile, index) => ({\n id: profile.id,\n path: `manifest.setupProfiles[${index}].id`,\n })),\n label: \"setup profile id\",\n }),\n );\n errors.push(...validateSlotHostsAndHomes(manifest));\n errors.push(...validatePlayerScopedSeedHomes(manifest));\n errors.push(...validateSetupProfileReferences(manifest));\n errors.push(...validateHexBoardVertexRefs(manifest));\n\n return {\n errors,\n warnings: collectAmbiguousBoardTypeWarnings(manifest),\n };\n}\n","export type OwnershipPattern = {\n prefix: string;\n suffix: string;\n};\n\nexport type ScaffoldingOwnership = {\n version: number;\n allowedPaths: {\n rootFiles: string[];\n directoryPrefixes: string[];\n };\n dynamic: {\n generatedFiles: string[];\n seedFiles: string[];\n seedFilePatterns: OwnershipPattern[];\n };\n cliStatic: {\n exactFiles: string[];\n directoryPrefixes: string[];\n };\n preservedUserFiles: string[];\n};\n\nexport const WORKSPACE_CODEGEN_OWNERSHIP: ScaffoldingOwnership = {\n version: 26,\n allowedPaths: {\n rootFiles: [\n \".npmrc\",\n \"package.json\",\n \"pnpm-lock.yaml\",\n \"package-lock.json\",\n \"manifest.ts\",\n \"manifest.tsconfig.json\",\n \"rule.md\",\n ],\n directoryPrefixes: [\"app/\", \"ui/\", \"shared/\", \"test/\"],\n },\n dynamic: {\n generatedFiles: [\n \"shared/manifest-literals.ts\",\n \"shared/manifest-types.ts\",\n \"shared/manifest-runtime.ts\",\n \"shared/manifest-contract.ts\",\n \"shared/generated/ui-contract.ts\",\n \"app/index.ts\",\n \"app/tsconfig.framework.json\",\n \"ui/tsconfig.framework.json\",\n ],\n seedFiles: [\n \"app/README.md\",\n \"ui/App.tsx\",\n \"app/game-contract.ts\",\n \"app/game.ts\",\n \"app/setup-profiles.ts\",\n \"app/reducer-support.ts\",\n \"app/derived.ts\",\n ],\n seedFilePatterns: [{ prefix: \"app/phases/\", suffix: \".ts\" }],\n },\n cliStatic: {\n exactFiles: [\n \".npmrc\",\n \"package.json\",\n \"app/tsconfig.json\",\n \"ui/index.tsx\",\n \"ui/package.json\",\n \"ui/style.css\",\n \"ui/tsconfig.json\",\n ],\n directoryPrefixes: [],\n },\n preservedUserFiles: [],\n} as const;\n\nexport const AUTHORITATIVE_GENERATED_FILES =\n WORKSPACE_CODEGEN_OWNERSHIP.dynamic.generatedFiles;\nexport const SEED_FILES = WORKSPACE_CODEGEN_OWNERSHIP.dynamic.seedFiles;\nexport const SEED_FILE_PATTERNS =\n WORKSPACE_CODEGEN_OWNERSHIP.dynamic.seedFilePatterns;\nexport const PRESERVED_USER_FILES = new Set(\n WORKSPACE_CODEGEN_OWNERSHIP.preservedUserFiles,\n);\n\nfunction normalizeProjectPath(filePath: string): string {\n return filePath.replace(/^\\.\\//, \"\").replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n}\n\nexport function isAllowedGamePath(filePath: string): boolean {\n const path = normalizeProjectPath(filePath);\n if (WORKSPACE_CODEGEN_OWNERSHIP.allowedPaths.rootFiles.includes(path)) {\n return true;\n }\n return WORKSPACE_CODEGEN_OWNERSHIP.allowedPaths.directoryPrefixes.some(\n (prefix) => path.startsWith(prefix),\n );\n}\n\nexport function isAuthoritativeGeneratedPath(filePath: string): boolean {\n const path = normalizeProjectPath(filePath);\n return WORKSPACE_CODEGEN_OWNERSHIP.dynamic.generatedFiles.includes(path);\n}\n\nexport function isDynamicSeedPath(filePath: string): boolean {\n const path = normalizeProjectPath(filePath);\n if (WORKSPACE_CODEGEN_OWNERSHIP.dynamic.seedFiles.includes(path)) {\n return true;\n }\n return WORKSPACE_CODEGEN_OWNERSHIP.dynamic.seedFilePatterns.some(\n (pattern) =>\n path.startsWith(pattern.prefix) && path.endsWith(pattern.suffix),\n );\n}\n\nexport function isCliStaticPath(filePath: string): boolean {\n const path = normalizeProjectPath(filePath);\n if (WORKSPACE_CODEGEN_OWNERSHIP.cliStatic.exactFiles.includes(path)) {\n return true;\n }\n return WORKSPACE_CODEGEN_OWNERSHIP.cliStatic.directoryPrefixes.some(\n (prefix) => path.startsWith(prefix),\n );\n}\n\nexport function isLibraryPath(filePath: string): boolean {\n const path = normalizeProjectPath(filePath);\n return isAuthoritativeGeneratedPath(path);\n}\n","import type { GameTopologyManifest } from \"@dreamboard/sdk-types\";\n\nexport const SETUP_PROFILES_SEED_MARKER =\n \"Generated by dreamboard setup-profiles scaffold.\";\n\nfunction generateUiContractContent(): string {\n return `/**\n * Generated file.\n * Do not edit directly.\n */\n\nimport game from \"../../app/game\";\nimport {\n createClientParamSchemasByPhase,\n} from \"@dreamboard/app-sdk/reducer\";\nimport type {\n\t ClientParamsOfInteractionOfDefinition,\n\t DefaultedClientParamKeysOfInteractionOfDefinition,\n\t InteractionIdOfDefinition,\n InteractionIdOfDefinitionPhase,\n PhaseNamesOfDefinition,\n StageNamesOfDefinitionPhase,\n ViewNamesOfDefinition,\n ViewOfDefinition,\n} from \"@dreamboard/app-sdk/reducer\";\nimport {\n\t createDreamboardUI,\n\t createResourceCounter,\n\t InteractionField as InteractionFieldGeneric,\n\t type BoardHexGridProps as BoardHexGridPropsGeneric,\n\t type BoardHexViewProps as BoardHexViewPropsGeneric,\n\t type BoardSpaceIdOf,\n\t type ClientParamSchemaMap,\n\t type InteractionDescriptor,\n\t type InteractionFieldProps as InteractionFieldPropsGeneric,\n\t type InteractionFieldRenderMap,\n\t type InteractionHandle,\n\t type InteractionRouteMap as InteractionRouteMapGeneric,\n\t type InteractionSwitchProps as InteractionSwitchPropsGeneric,\n\t type InteractionSwitchRenderState,\n\t type DreamboardUI,\n\t type ResourceCounterComponents,\n\t type ResourceDisplayConfig,\n\t type TypedGame,\n\t type UIContract,\n\t type UIRootProps,\n\t type ZoneCardAtProps,\n\t type ZoneCardRenderItem,\n\t type ZoneListProps,\n\t type ZonePileCardsProps,\n\t} from \"@dreamboard/ui-sdk\";\n\timport { createElement, type ReactElement, type ReactNode } from \"react\";\n\timport {\n\t literals,\n\t staticBoards,\n\t type CardId,\n\t type CardProperties,\n\t type CardType,\n\t type EdgeId,\n type PlayerId,\n type ResourceId,\n type SpaceId,\n type VertexId,\n type ZoneId as ManifestZoneId,\n} from \"../manifest-contract\";\n\ntype GameDefinition = typeof game;\n\nexport type ViewName = ViewNamesOfDefinition<GameDefinition>;\nexport type InferView<Name extends ViewName> = ViewOfDefinition<\n GameDefinition,\n Name\n>;\nexport type GameView = Extract<\"player\", ViewName> extends never\n ? never\n : InferView<Extract<\"player\", ViewName>>;\n\nexport type PhaseName = PhaseNamesOfDefinition<GameDefinition>;\n\n// -------------------------------------------------------------------------\n// Interaction / Stage / Zone types (authored via defineInteraction/Stage/zones)\n// -------------------------------------------------------------------------\n\n/** Union of all interaction ids across phases. */\nexport type InteractionId = InteractionIdOfDefinition<GameDefinition>;\n\n/** Interactions declared in a specific phase. */\nexport type InteractionIdForPhase<Phase extends PhaseName> =\n InteractionIdOfDefinitionPhase<GameDefinition, Phase>;\n\n/**\n * Client-facing params type for an interaction, inferred from its input\n * collectors. Engine-sampled collectors (e.g. \\`rngInput.*\\`) are omitted\n * — the trusted reducer bundle fills those fields during submit, so the\n * client never supplies them.\n */\nexport type InteractionParams<\n Phase extends PhaseName,\n Id extends InteractionIdForPhase<Phase>,\n> = ClientParamsOfInteractionOfDefinition<GameDefinition, Phase, Id>;\n\n/** Client-facing params with authored input defaults. */\nexport type InteractionDefaultedKeys<\n Phase extends PhaseName,\n Id extends InteractionIdForPhase<Phase>,\n> = DefaultedClientParamKeysOfInteractionOfDefinition<GameDefinition, Phase, Id>;\n\n/** Phase-qualified interaction key for a specific phase. */\nexport type InteractionKeyForPhase<Phase extends PhaseName> =\n \\`\\${Phase}.\\${InteractionIdForPhase<Phase>}\\`;\n\n/** Phase-qualified union of every client/UI interaction key. */\nexport type InteractionKey = {\n [P in PhaseName]: InteractionKeyForPhase<P>;\n}[PhaseName];\n\ntype PhaseOfInteractionKey<Key extends InteractionKey> =\n Key extends \\`\\${infer P}.\\${string}\\` ? Extract<P, PhaseName> : never;\n\ntype IdOfInteractionKey<Key extends InteractionKey> =\n Key extends \\`\\${infer P}.\\${infer I}\\`\n ? P extends PhaseName\n ? Extract<I, InteractionIdForPhase<P>>\n : never\n : never;\n\nexport type BoardInteractions = InteractionKey;\n\n/** Stage names declared in a phase. */\nexport type StageName<Phase extends PhaseName> = StageNamesOfDefinitionPhase<\n GameDefinition,\n Phase\n>;\n\n/** Union of zone ids authored in the workspace manifest. */\nexport type ZoneId = ManifestZoneId;\n\ntype CamelCase<S extends string> = S extends \\`\\${infer Head}-\\${infer Tail}\\`\n ? \\`\\${Head}\\${Capitalize<CamelCase<Tail>>}\\`\n : S;\n\n/** JS-friendly keys for authored zones, e.g. \"dev-hand\" -> \"devHand\". */\nexport type WorkspaceZoneKey = CamelCase<ZoneId>;\n\ntype PlayerCardZoneId = {\n [Z in (typeof literals.playerZoneIds)[number]]: (typeof literals.cardSetIdsByPlayerZoneId)[Z] extends readonly []\n ? never\n : Z;\n}[(typeof literals.playerZoneIds)[number]];\n\n/** JS-friendly keys for per-player zones that can contain cards. */\nexport type WorkspacePlayerCardZoneKey = CamelCase<PlayerCardZoneId>;\n\n/** Interaction descriptor specialised to a concrete phase-qualified key. */\nexport type InteractionDescriptorFor<Key extends InteractionKey> =\n InteractionDescriptor<Key>;\n\n/**\n * Params shape for a phase-qualified interaction key. Drives strong typing\n * for component-first interaction state, forms, and submits.\n */\nexport type InteractionParamsOf<Key extends InteractionKey> =\n InteractionParams<PhaseOfInteractionKey<Key>, IdOfInteractionKey<Key>>;\n\nexport type InteractionDefaultedKeysOf<Key extends InteractionKey> =\n InteractionDefaultedKeys<PhaseOfInteractionKey<Key>, IdOfInteractionKey<Key>>;\n\ntype InteractionParamsShape<Key extends InteractionKey> =\n InteractionParamsOf<Key> extends Record<string, unknown>\n ? InteractionParamsOf<Key>\n : Record<string, unknown>;\n\ntype InteractionInputKeysOf<Key extends InteractionKey> =\n string extends keyof InteractionParamsOf<Key>\n ? never\n : keyof InteractionParamsOf<Key> & string;\n\ntype InteractionHandleDefaultedKeys<Key extends InteractionKey> = Extract<\n InteractionDefaultedKeysOf<Key>,\n keyof InteractionParamsShape<Key> & string\n>;\n\ntype RequiredInteractionInputKeysOf<Key extends InteractionKey> = Exclude<\n InteractionInputKeysOf<Key>,\n InteractionHandleDefaultedKeys<Key>\n>;\n\nexport type RequiredInteractionInputKey<Key extends InteractionKey> =\n RequiredInteractionInputKeysOf<Key>;\n\nexport type ZeroInputInteractionKey = {\n [K in InteractionKey]: InteractionInputKeysOf<K> extends never\n ? K\n : never;\n}[InteractionKey];\n\nexport type InputInteractionKey = Exclude<\n InteractionKey,\n ZeroInputInteractionKey\n>;\n\nexport type InteractionRouteRenderState<Key extends InteractionKey> =\n Omit<InteractionSwitchRenderState<Key>, \"descriptor\"> & {\n descriptor: InteractionDescriptorFor<Key>;\n };\n\nexport type InteractionRouteMap = {\n [K in InteractionKey]: (state: InteractionRouteRenderState<K>) => ReactNode;\n};\n\ntype ExactInteractionRoutes<Routes extends InteractionRouteMap> = Routes &\n Record<Exclude<keyof Routes, keyof InteractionRouteMap>, never>;\n\nexport function defineInteractionRoutes<const Routes extends InteractionRouteMap>(\n routes: ExactInteractionRoutes<Routes>,\n): InteractionRouteMap {\n return routes;\n}\n\ntype InteractionSwitchProps = Omit<\n InteractionSwitchPropsGeneric<InteractionKey>,\n \"routes\"\n> & {\n routes: InteractionRouteMap;\n};\n\ntype InteractionInputKeyOf<Key extends InteractionKey> =\n Key extends InteractionKey ? InteractionInputKeysOf<Key> : never;\n\nexport type InteractionInputKey = InteractionInputKeyOf<InteractionKey>;\n\nexport type PromptKey = InteractionKey;\n\nexport type PromptOptionValue = string;\n\nexport type BoardTargetId = SpaceId | EdgeId | VertexId;\n\ntype UIInteractionRegistry = {\n [K in InteractionKey]: {\n interaction: K;\n phase: PhaseOfInteractionKey<K>;\n id: IdOfInteractionKey<K>;\n };\n};\n\ntype UIInputRegistry = {\n [K in InteractionInputKey]: { input: K };\n};\n\ntype UIPromptRegistry = {\n [K in PromptKey]: { interaction: K };\n};\n\ntype UIPromptOptionRegistry = {\n [K in PromptOptionValue]: { value: K };\n};\n\ntype UIPlayerRegistry = {\n [K in PlayerId & string]: { player: K };\n};\n\ntype UIZoneRegistry = {\n [K in ZoneId & string]: { zone: K };\n};\n\ntype UICardRegistry = {\n [K in CardId & string]: { card: K };\n};\n\ntype UIPhaseRegistry = {\n [K in PhaseName & string]: { phase: K };\n};\n\ntype UIBoardTargetRegistry = {\n [K in BoardTargetId & string]: { target: K };\n};\n\nexport const uiContract = {\n interactions: {} as UIInteractionRegistry,\n inputs: {} as UIInputRegistry,\n prompts: {} as UIPromptRegistry,\n promptOptions: {} as UIPromptOptionRegistry,\n players: {} as UIPlayerRegistry,\n zones: {} as UIZoneRegistry,\n cards: {} as UICardRegistry,\n phases: {} as UIPhaseRegistry,\n boardTargets: {} as UIBoardTargetRegistry,\n} satisfies UIContract;\n\ndeclare module \"@dreamboard/ui-sdk\" {\n interface DreamboardUIRegister {\n contract: GameDefinition;\n ui: typeof uiContract;\n }\n}\n\n// -------------------------------------------------------------------------\n// Typed hex-board view adapter\n// -------------------------------------------------------------------------\n\n/** Generated hex-board topology source, keyed by hex-board id. */\nconst hexStaticBoards = staticBoards.hex;\n\n/** Union of authored hex-board ids in this workspace's manifest. */\nexport type HexBoardId = keyof typeof hexStaticBoards & string;\n\n/** Topology object for the named hex board, drawn from \\`staticBoards.hex\\`. */\nexport type HexBoardTopology<Id extends HexBoardId> = (typeof hexStaticBoards)[Id];\n\n/** Space id type for the named hex board. */\nexport type HexBoardSpaceId<Id extends HexBoardId> = BoardSpaceIdOf<\n HexBoardTopology<Id>\n>;\n\nexport type HexBoardViewProps<\n Id extends HexBoardId,\n TSpaceView extends { id: HexBoardSpaceId<Id> },\n> = Omit<BoardHexViewPropsGeneric<HexBoardTopology<Id>, TSpaceView>, \"board\"> & {\n board: Id;\n};\n\nexport type HexBoardGridProps<\n Id extends HexBoardId,\n TSpaceView extends { id: HexBoardSpaceId<Id> },\n> = Omit<\n BoardHexGridPropsGeneric<HexBoardTopology<Id>, TSpaceView>,\n \"board\" | \"interactions\"\n> & {\n board: Id;\n interactions?:\n | \"auto\"\n | false\n | {\n edge?: readonly InteractionKey[];\n vertex?: readonly InteractionKey[];\n space?: readonly InteractionKey[];\n };\n};\n\ntype WorkspaceBoard = Omit<DreamboardUI<typeof uiContract>[\"Board\"], \"HexView\" | \"HexGrid\"> & {\n HexView<\n const Id extends HexBoardId,\n const TSpaceView extends { id: HexBoardSpaceId<Id> },\n >(props: HexBoardViewProps<Id, TSpaceView>): ReactElement;\n HexGrid<\n const Id extends HexBoardId,\n const TSpaceView extends { id: HexBoardSpaceId<Id> },\n >(props: HexBoardGridProps<Id, TSpaceView>): ReactElement;\n};\n\ntype WorkspaceCardProperties = CardProperties extends Record<string, unknown>\n ? CardProperties\n : Record<string, unknown>;\ntype WorkspaceZoneId = [ZoneId] extends [never] ? string : ZoneId;\ntype WorkspaceCardId = [CardId] extends [never] ? string : CardId;\ntype WorkspaceCardType = [CardType] extends [never] ? string : CardType;\n\n// ZoneCardRenderItem is a discriminated union (hidden: true | false).\n// A bare Omit<..., \"zone\"> would collapse the union to its common keys and\n// strip cardType / properties from the hydrated branch, defeating the\n// discriminated-union narrowing the SDK contract promises. Distribute Omit\n// across the union so each branch keeps its own shape.\ntype WorkspaceZoneCard = ZoneCardRenderItem<\n WorkspaceCardId & string,\n WorkspaceCardType & string,\n WorkspaceCardProperties\n> extends infer Item\n ? Item extends { zone: string }\n ? Omit<Item, \"zone\"> & { zone: WorkspaceZoneId }\n : never\n : never;\n\ntype WorkspaceZone = Omit<\n DreamboardUI<typeof uiContract>[\"Zone\"],\n \"CardAt\" | \"TopCard\" | \"List\" | \"PileCards\"\n> & {\n CardAt(\n props: Omit<ZoneCardAtProps<WorkspaceZoneId>, \"zone\" | \"children\"> & {\n zone?: WorkspaceZoneId;\n children?: ReactNode | ((card: WorkspaceZoneCard) => ReactNode);\n },\n ): ReactElement | null;\n TopCard(\n props: Omit<\n ZoneCardAtProps<WorkspaceZoneId>,\n \"zone\" | \"index\" | \"children\"\n > & {\n zone?: WorkspaceZoneId;\n children?: ReactNode | ((card: WorkspaceZoneCard) => ReactNode);\n },\n ): ReactElement | null;\n List(\n props: Omit<ZoneListProps, \"children\"> & {\n children?: ReactNode | ((card: WorkspaceZoneCard) => ReactNode);\n },\n ): ReactElement;\n PileCards(\n props: Omit<ZonePileCardsProps, \"renderCard\"> & {\n renderCard: (card: WorkspaceZoneCard) => ReactNode;\n },\n ): ReactElement | null;\n};\n\ntype WorkspaceUI = Omit<\n DreamboardUI<typeof uiContract>,\n \"Root\" | \"Game\" | \"Interaction\" | \"Board\" | \"Zone\"\n> & {\n Root(props: UIRootProps): ReactElement;\n readonly Game: TypedGame<typeof uiContract, GameView, PlayerId, PhaseName>;\n readonly Interaction: Omit<\n DreamboardUI<typeof uiContract>[\"Interaction\"],\n \"Switch\"\n > & {\n Switch(props: InteractionSwitchProps): ReactElement;\n };\n readonly Board: WorkspaceBoard;\n readonly Zone: WorkspaceZone;\n readonly ResourceCounter: ResourceCounterComponents<ResourceId>;\n};\n\nconst baseUI = createDreamboardUI(uiContract);\n\nconst resourcePresentationById = literals.resourcePresentationById as Partial<\n Record<string, { label?: string; icon?: string }>\n>;\n\nconst resourceDisplayConfig = literals.resourceIds.map((resource) => {\n const resourceId = resource as ResourceId;\n const presentation = resourcePresentationById[resource as string];\n return {\n type: resourceId,\n label: presentation?.label ?? resource,\n icon: presentation?.icon ?? resource,\n };\n}) satisfies readonly ResourceDisplayConfig<ResourceId>[];\n\nconst resourceCounter = createResourceCounter<ResourceId>(resourceDisplayConfig);\n\nexport const Board: WorkspaceUI[\"Board\"] = {\n ...baseUI.Board,\n\t HexView<\n\t const Id extends HexBoardId,\n\t const TSpaceView extends { id: HexBoardSpaceId<Id> },\n\t >({ board: boardId, ...props }: HexBoardViewProps<Id, TSpaceView>) {\n\t return createElement(baseUI.Board.HexView<HexBoardTopology<Id>, TSpaceView>, {\n\t ...props,\n\t board: hexStaticBoards[boardId],\n\t });\n\t },\n\t HexGrid<\n\t const Id extends HexBoardId,\n\t const TSpaceView extends { id: HexBoardSpaceId<Id> },\n\t >({ board: boardId, ...props }: HexBoardGridProps<Id, TSpaceView>) {\n\t return createElement(baseUI.Board.HexGrid<HexBoardTopology<Id>, TSpaceView>, {\n\t ...props,\n\t board: hexStaticBoards[boardId],\n\t });\n\t },\n\t} as WorkspaceUI[\"Board\"];\n\nexport const UI: WorkspaceUI = {\n ...baseUI,\n Board,\n ResourceCounter: resourceCounter,\n};\nexport const Game: WorkspaceUI[\"Game\"] = UI.Game;\nexport const Interaction = UI.Interaction;\nexport const Prompt = UI.Prompt;\nexport const PromptInbox = UI.PromptInbox;\nexport const PlayerRoster: WorkspaceUI[\"PlayerRoster\"] = UI.PlayerRoster;\nexport const Dice: WorkspaceUI[\"Dice\"] = UI.Dice;\nexport const Phase = UI.Phase;\nexport const Zone = UI.Zone;\nexport const ResourceCounter: WorkspaceUI[\"ResourceCounter\"] = UI.ResourceCounter;\n\nexport type InteractionFieldRenderers<Key extends InteractionKey> =\n InteractionFieldRenderMap<InteractionParamsShape<Key>>;\n\nexport type InteractionFieldProps<\n Key extends InteractionKey,\n InputKey extends keyof InteractionParamsShape<Key> & string,\n> = Omit<\n InteractionFieldPropsGeneric<InteractionParamsShape<Key>, InputKey>,\n \"descriptor\" | \"handle\"\n> & {\n descriptor: InteractionDescriptorFor<Key>;\n handle: InteractionHandle<\n InteractionParamsShape<Key>,\n InteractionHandleDefaultedKeys<Key>\n >;\n};\n\nexport const clientParamSchemasByPhase = createClientParamSchemasByPhase(\n game,\n) as ClientParamSchemaMap;\n\nexport function InteractionField<\n Key extends InteractionKey,\n InputKey extends keyof InteractionParamsShape<Key> & string,\n>(props: InteractionFieldProps<Key, InputKey>): ReactElement | null {\n return createElement(\n InteractionFieldGeneric<InteractionParamsShape<Key>, InputKey>,\n props,\n );\n}\n`;\n}\n\nfunction generateReducerSupportSeed(): string {\n return `import {\n createReducerOps,\n createStateQueries,\n pipe,\n} from \"@dreamboard/app-sdk/reducer\";\nimport type { GameState } from \"./game-contract\";\n\n/**\n * Small, SDK-shaped reducer helpers belong here.\n *\n * Keep schema and contract declarations in app/game-contract.ts.\n * Keep initial state callbacks and defineGame wiring in app/game.ts.\n * Keep memoized aggregates (winner checks, VP totals, longest-road,\n * largest-army) in app/derived.ts via \\`defineDerived\\`.\n * Keep phase files focused on one game-flow state.\n *\n * When this file starts collecting real game rules, split them by domain\n * under app/rules/ instead, for example app/rules/board.ts,\n * app/rules/resources.ts, or app/rules/scoring.ts.\n *\n * Recommended authoring pattern inside a phase reducer:\n *\n * const next = pipe(\n * state,\n * ops.setActivePlayers([q.players.order()[0]]),\n * );\n * return accept(next);\n */\n\nexport const ops = createReducerOps<GameState>();\n\nexport { pipe };\n\nexport function stateQueries(state: GameState) {\n return createStateQueries(state);\n}\n`;\n}\n\nfunction generateAppReadmeSeed(): string {\n return `# App organization\n\nThis directory owns the reducer: game state schemas, phases, interactions,\nderived values, player views, and reducer helpers.\n\nUse this layout while the game is small:\n\n\\`\\`\\`txt\napp/\n game-contract.ts\n game.ts\n derived.ts\n reducer-support.ts\n phases/\n setup.ts\n\\`\\`\\`\n\nWhen a phase grows beyond a single idea, make the phase directory the table of\ncontents and split the implementation by game concept:\n\n\\`\\`\\`txt\napp/phases/player-turn/\n index.ts # definePhase assembly only\n state.ts # phase-local constants and types\n inputs.ts # shared input and presentation helpers\n build.ts # build interactions\n trade.ts # trade interactions\n end-turn.ts # end-turn interaction\n\\`\\`\\`\n\nSplit a phase when it has multiple action families, shared input helpers, card\nactions, or is roughly 250-300 lines. Keep \\`index.ts\\` as the assembly point\nthat imports interactions and registers them with \\`definePhase\\`.\n\nDo not turn \\`reducer-support.ts\\` into a catch-all rule module. Keep it small\nfor shared reducer plumbing; put real game rules under \\`app/rules/*\\` once\nthere is more than one domain.\n`;\n}\n\nfunction generateReducerDerivedSeed(): string {\n return `// Memoized, pure projections of reducer state. Read them from reducer\n// callbacks and view projections via the injected \\`derived\\` helper:\n//\n// reduce({ state, derived, accept }) {\n// const winner = derived(winnerOf);\n// return accept({ ...state, publicState: { ...state.publicState, winnerPlayerId: winner } });\n// }\n//\n// Do NOT mirror derived values back into \\`publicState\\`. Keep the raw\n// inputs (component locations, zone contents, counters) in state and\n// express aggregates here.\n//\n// Uncomment the example below once you have something to derive.\n\n// import { defineDerived } from \"@dreamboard/app-sdk/reducer\";\n// import type { GameContract } from \"./game-contract\";\n//\n// export const winnerOf = defineDerived<GameContract>()({\n// name: \"winnerOf\",\n// compute: ({ state }) => {\n// // Example: return the first player at or above the VP target.\n// return state.publicState.winnerPlayerId ?? null;\n// },\n// });\n\nexport {};\n`;\n}\n\nfunction generateReducerGameContractSeed(): string {\n return `import { z } from \"zod\";\nimport { ids, manifestContract } from \"../shared/manifest-contract\";\nimport { defineGameContract, type GameStateOf } from \"@dreamboard/app-sdk/reducer\";\n\n// Contract files should stay focused on schemas, phases, and exported\n// state types. Put reducers in app/phases/* and pure computations in\n// app/derived.ts or app/rules/*.\nconst publicStateSchema = z.object({\n currentPlayerId: ids.playerId.nullable(),\n notesByPlayerId: z.partialRecord(ids.playerId, z.string()).default({}),\n});\nconst privateStateSchema = z.object({});\nconst hiddenStateSchema = z.object({});\n\nexport const gameContract = defineGameContract({\n manifest: manifestContract,\n state: {\n public: publicStateSchema,\n private: privateStateSchema,\n hidden: hiddenStateSchema,\n },\n phases: {\n setup: z.object({}),\n },\n});\n\nexport type GameContract = typeof gameContract;\nexport type GameState = GameStateOf<GameContract>;\n`;\n}\n\nfunction generateReducerGameSeed(): string {\n return `import { defineGame } from \"@dreamboard/app-sdk/reducer\";\nimport { gameContract } from \"./game-contract\";\nimport { phases } from \"./phases\";\nimport setupProfiles from \"./setup-profiles\";\n\n// Keep this file as the defineGame assembly point. Put rules in phases,\n// projections in views/derived modules, and reusable domain helpers in\n// app/rules/* once reducer-support.ts is no longer small.\nexport default defineGame({\n contract: gameContract,\n initial: {\n public: ({ playerIds }) => ({\n currentPlayerId: playerIds[0] ?? null,\n notesByPlayerId: {},\n }),\n private: () => ({}),\n hidden: () => ({}),\n },\n initialPhase: \"setup\",\n setupProfiles,\n phases,\n views: {},\n});\n`;\n}\n\nfunction generateSetupProfilesSeed(manifest: GameTopologyManifest): string {\n const setupProfiles = manifest.setupProfiles ?? [];\n const setupProfileEntries =\n setupProfiles.length === 0\n ? \"\"\n : `{\\n${setupProfiles\n .map((profile) => ` ${JSON.stringify(profile.id)}: {},`)\n .join(\"\\n\")}\\n}`;\n\n return `// ${SETUP_PROFILES_SEED_MARKER}\nimport { setupProfiles } from \"../shared/manifest-contract\";\n\nexport default setupProfiles(${setupProfileEntries || \"{}\"});\n`;\n}\n\nexport function isFrameworkOwnedSetupProfilesSeed(\n content: string | null | undefined,\n): boolean {\n if (content === null || content === undefined) {\n return false;\n }\n const trimmed = content.trim();\n if (trimmed.length === 0) {\n return true;\n }\n if (trimmed.includes(SETUP_PROFILES_SEED_MARKER)) {\n return true;\n }\n return false;\n}\n\nfunction generateSetupPhaseSeed(): string {\n return `import { z } from \"zod\";\nimport type { GameContract } from \"../game-contract\";\nimport { definePhase } from \"@dreamboard/app-sdk/reducer\";\n\n// A single phase file is fine while the phase is small. When a phase grows\n// multiple action families, move it to app/phases/<phase>/index.ts and split\n// interactions into neighboring concept files.\nexport const setup = definePhase<GameContract>()({\n kind: \"auto\",\n state: z.object({}),\n initialState: () => ({}),\n enter({ state, accept }) {\n return accept(state);\n },\n});\n`;\n}\n\nfunction generatePhaseIndexSeed(): string {\n return `import { setup } from \"./setup\";\nimport type { GameContract } from \"../game-contract\";\nimport type { PhaseMapOf } from \"@dreamboard/app-sdk/reducer\";\n\nexport const phases = {\n setup,\n} satisfies PhaseMapOf<GameContract>;\n`;\n}\n\nfunction generateReducerAppIndex(): string {\n return `import game from \"./game\";\nimport { createReducerBundle } from \"@dreamboard/app-sdk/reducer\";\n\nexport default createReducerBundle(game);\n`;\n}\n\nfunction generateAppFrameworkTsConfig(): string {\n return `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2020\",\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: false,\n types: [],\n declaration: false,\n rootDir: \"..\",\n outDir: \"./dist\",\n paths: {\n \"@dreamboard/manifest-contract\": [\"../shared/manifest-contract.ts\"],\n \"@dreamboard/ui-contract\": [\"../shared/generated/ui-contract.ts\"],\n \"@shared/*\": [\"../shared/*\"],\n },\n },\n include: [\n \"./**/*.ts\",\n \"./**/*.d.ts\",\n \"../shared/manifest-*.ts\",\n \"../shared/manifest-*.d.ts\",\n ],\n exclude: [\"node_modules\", \"dist\", \"../shared/generated\"],\n },\n null,\n 2,\n )}\\n`;\n}\n\nfunction generateUiFrameworkTsConfig(): string {\n return `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2020\",\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n jsx: \"react-jsx\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: false,\n types: [],\n paths: {\n \"@dreamboard/manifest-contract\": [\"../shared/manifest-contract.ts\"],\n \"@dreamboard/ui-contract\": [\"../shared/generated/ui-contract.ts\"],\n \"@shared/*\": [\"../shared/*\"],\n },\n },\n include: [\"./**/*.ts\", \"./**/*.tsx\", \"../shared/**/*.ts\"],\n exclude: [\"node_modules\", \"dist\"],\n },\n null,\n 2,\n )}\\n`;\n}\n\nfunction generateReducerUiAppContent(): string {\n return `import { Game, Phase, Prompt, PromptInbox } from \"@dreamboard/ui-contract\";\n\nfunction SetupPhase() {\n return (\n <main>\n <PromptInbox.Root>\n <PromptInbox.Empty>No available prompts.</PromptInbox.Empty>\n <PromptInbox.Items>\n {(prompt) => (\n <Prompt.Root\n key={prompt.interactionKey}\n interaction={prompt.interactionKey}\n >\n <Prompt.Title />\n <Prompt.Message />\n <Prompt.Options>\n {(option) => (\n <Prompt.Option value={option.id}>\n {option.label ?? option.id}\n </Prompt.Option>\n )}\n </Prompt.Options>\n </Prompt.Root>\n )}\n </PromptInbox.Items>\n </PromptInbox.Root>\n </main>\n );\n}\n\nexport default function App() {\n return (\n <Game.Root>\n {() => (\n <Phase.Switch\n routes={{\n setup: () => <SetupPhase />,\n }}\n />\n )}\n </Game.Root>\n );\n}\n`;\n}\n\nexport function generateSeedFiles(\n manifest: GameTopologyManifest,\n): Record<string, string> {\n return {\n \"app/README.md\": generateAppReadmeSeed(),\n \"ui/App.tsx\": generateReducerUiAppContent(),\n \"app/game-contract.ts\": generateReducerGameContractSeed(),\n \"app/game.ts\": generateReducerGameSeed(),\n \"app/setup-profiles.ts\": generateSetupProfilesSeed(manifest),\n \"app/reducer-support.ts\": generateReducerSupportSeed(),\n \"app/derived.ts\": generateReducerDerivedSeed(),\n \"app/phases/setup.ts\": generateSetupPhaseSeed(),\n \"app/phases/index.ts\": generatePhaseIndexSeed(),\n };\n}\n\nexport function generateAuthoritativeIndexFile(\n _manifest: GameTopologyManifest,\n): string {\n return generateReducerAppIndex();\n}\n\nexport function generateFrameworkFiles(\n manifest: GameTopologyManifest,\n): Record<string, string> {\n return {\n \"app/tsconfig.framework.json\": generateAppFrameworkTsConfig(),\n \"ui/tsconfig.framework.json\": generateUiFrameworkTsConfig(),\n \"shared/generated/ui-contract.ts\": generateUiContractContent(),\n \"app/index.ts\": generateAuthoritativeIndexFile(manifest),\n };\n}\n","import type { GameTopologyManifest } from \"@dreamboard/sdk-types\";\nimport {\n generateManifestContractSources,\n materializeManifestTable,\n} from \"./manifest-contract.js\";\nimport { validateManifestAuthoring } from \"./manifest-validation.js\";\nimport {\n AUTHORITATIVE_GENERATED_FILES,\n isAllowedGamePath,\n isAuthoritativeGeneratedPath,\n isCliStaticPath,\n isDynamicSeedPath,\n isLibraryPath,\n PRESERVED_USER_FILES,\n SEED_FILES,\n SEED_FILE_PATTERNS,\n WORKSPACE_CODEGEN_OWNERSHIP,\n} from \"./ownership.js\";\nimport {\n generateFrameworkFiles,\n generateSeedFiles,\n isFrameworkOwnedSetupProfilesSeed,\n SETUP_PROFILES_SEED_MARKER,\n} from \"./seeds.js\";\nexport {\n materializeCardSet,\n materializePresetCardSet,\n} from \"./preset-card-sets.js\";\nexport { materializeManifestTable };\n\nexport {\n AUTHORITATIVE_GENERATED_FILES,\n isAllowedGamePath,\n isAuthoritativeGeneratedPath,\n isCliStaticPath,\n isDynamicSeedPath,\n isLibraryPath,\n PRESERVED_USER_FILES,\n SEED_FILES,\n SEED_FILE_PATTERNS,\n WORKSPACE_CODEGEN_OWNERSHIP,\n};\n\nexport function generateAuthoritativeFiles(\n manifest: GameTopologyManifest,\n): Record<string, string> {\n return {\n ...generateManifestContractSources(manifest),\n ...generateFrameworkFiles(manifest),\n };\n}\n\nexport { generateSeedFiles };\nexport { isFrameworkOwnedSetupProfilesSeed, SETUP_PROFILES_SEED_MARKER };\nexport { validateManifestAuthoring };\n\nexport function generateDynamicGeneratedFiles(\n manifest: GameTopologyManifest,\n): Record<string, string> {\n return {\n ...generateAuthoritativeFiles(manifest),\n ...generateSeedFiles(manifest),\n };\n}\n","import { existsSync, readdirSync, readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport type { Plugin } from \"esbuild\";\nimport { resolveCliRepoRoot } from \"./repo-root.js\";\n\ntype RepoLocalPackageInfo = {\n rootDir: string;\n exports: unknown;\n};\n\ntype RepoLocalPackageResolutionOptions = {\n repoRoot?: string;\n};\n\nconst PACKAGE_INFO_CACHE = new Map<string, Map<string, RepoLocalPackageInfo>>();\n\nfunction normalizeRepoRoot(\n options?: RepoLocalPackageResolutionOptions,\n): string {\n return options?.repoRoot ?? resolveCliRepoRoot(import.meta.url);\n}\n\nfunction readPackageInfos(repoRoot: string): Map<string, RepoLocalPackageInfo> {\n const cached = PACKAGE_INFO_CACHE.get(repoRoot);\n if (cached) {\n return cached;\n }\n\n const packageInfos = new Map<string, RepoLocalPackageInfo>();\n for (const workspaceDirName of [\"packages\", \"apps\"]) {\n const workspaceRoot = path.join(repoRoot, workspaceDirName);\n if (!existsSync(workspaceRoot)) {\n continue;\n }\n\n for (const entry of readdirSync(workspaceRoot, { withFileTypes: true })) {\n if (!entry.isDirectory()) {\n continue;\n }\n const packageRoot = path.join(workspaceRoot, entry.name);\n const packageJsonPath = path.join(packageRoot, \"package.json\");\n if (!existsSync(packageJsonPath)) {\n continue;\n }\n\n const parsed = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n name?: string;\n exports?: unknown;\n };\n if (\n !parsed.name ||\n !parsed.name.startsWith(\"@dreamboard/\") ||\n parsed.exports === undefined\n ) {\n continue;\n }\n\n packageInfos.set(parsed.name, {\n rootDir: packageRoot,\n exports: parsed.exports,\n });\n }\n }\n\n PACKAGE_INFO_CACHE.set(repoRoot, packageInfos);\n return packageInfos;\n}\n\nfunction parseDreamboardPackageSpecifier(specifier: string): {\n packageName: string;\n subpath: string;\n} | null {\n if (!specifier.startsWith(\"@dreamboard/\")) {\n return null;\n }\n\n const segments = specifier.split(\"/\");\n if (segments.length < 2) {\n return null;\n }\n\n const packageName = `${segments[0]}/${segments[1]}`;\n const subpath =\n segments.length === 2 ? \".\" : `./${segments.slice(2).join(\"/\")}`;\n return { packageName, subpath };\n}\n\nfunction resolveSourceTarget(exportEntry: unknown): string | null {\n if (typeof exportEntry === \"string\") {\n return exportEntry;\n }\n if (\n typeof exportEntry === \"object\" &&\n exportEntry !== null &&\n \"bun\" in exportEntry &&\n typeof (exportEntry as { bun?: unknown }).bun === \"string\"\n ) {\n return (exportEntry as { bun: string }).bun;\n }\n return null;\n}\n\nfunction resolveSourceTargetForSubpath(options: {\n exportsField: unknown;\n subpath: string;\n}): string | null {\n if (\n typeof options.exportsField !== \"object\" ||\n options.exportsField === null ||\n Array.isArray(options.exportsField)\n ) {\n return options.subpath === \".\"\n ? resolveSourceTarget(options.exportsField)\n : null;\n }\n\n const exportsMap = options.exportsField as Record<string, unknown>;\n if (options.subpath === \".\") {\n return (\n resolveSourceTarget(exportsMap[\".\"]) ?? resolveSourceTarget(exportsMap)\n );\n }\n const exactTarget = resolveSourceTarget(exportsMap[options.subpath]);\n if (exactTarget) {\n return exactTarget;\n }\n\n const wildcardEntries = Object.entries(exportsMap)\n .filter(([key]) => key.includes(\"*\"))\n .sort(([left], [right]) => right.length - left.length);\n for (const [pattern, exportEntry] of wildcardEntries) {\n const starIndex = pattern.indexOf(\"*\");\n const prefix = pattern.slice(0, starIndex);\n const suffix = pattern.slice(starIndex + 1);\n if (\n !options.subpath.startsWith(prefix) ||\n !options.subpath.endsWith(suffix)\n ) {\n continue;\n }\n\n const wildcardValue = options.subpath.slice(\n prefix.length,\n options.subpath.length - suffix.length,\n );\n const targetPattern = resolveSourceTarget(exportEntry);\n if (!targetPattern) {\n continue;\n }\n return targetPattern.replace(\"*\", wildcardValue);\n }\n\n return null;\n}\n\nexport function resolveRepoLocalPackageSource(\n specifier: string,\n options?: RepoLocalPackageResolutionOptions,\n): string | null {\n const parsedSpecifier = parseDreamboardPackageSpecifier(specifier);\n if (!parsedSpecifier) {\n return null;\n }\n\n let repoRoot: string;\n try {\n repoRoot = normalizeRepoRoot(options);\n } catch {\n return null;\n }\n\n const packageInfo = readPackageInfos(repoRoot).get(parsedSpecifier.packageName);\n if (!packageInfo) {\n return null;\n }\n\n const sourceTarget = resolveSourceTargetForSubpath({\n exportsField: packageInfo.exports,\n subpath: parsedSpecifier.subpath,\n });\n if (!sourceTarget) {\n return null;\n }\n\n return path.join(packageInfo.rootDir, sourceTarget);\n}\n\nexport function createRepoLocalPackageResolutionPlugin(\n options?: RepoLocalPackageResolutionOptions,\n): Plugin {\n return {\n name: \"dreamboard-repo-local-package-resolution\",\n setup(build) {\n build.onResolve({ filter: /^@dreamboard\\// }, (args) => {\n const resolvedPath = resolveRepoLocalPackageSource(args.path, options);\n if (!resolvedPath) {\n return null;\n }\n return { path: resolvedPath };\n });\n },\n };\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nfunction isRepoRoot(candidate: string): boolean {\n return (\n existsSync(path.join(candidate, \"pnpm-workspace.yaml\")) &&\n existsSync(path.join(candidate, \"apps\", \"dreamboard-cli\", \"package.json\"))\n );\n}\n\nexport function resolveCliRepoRoot(importMetaUrl: string = import.meta.url) {\n let current = path.dirname(fileURLToPath(importMetaUrl));\n\n while (true) {\n if (isRepoRoot(current)) {\n return current;\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n throw new Error(\n `Could not resolve Dreamboard CLI repo root from ${importMetaUrl}.`,\n );\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport { readdir, readFile, rm, rmdir, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { GameTopologyManifest } from \"@dreamboard/sdk-types\";\nimport { REDUCER_TESTING_TYPES_WRAPPER_CONTENT } from \"../../templates/testing-types-content.js\";\nimport {\n MANIFEST_TYPECHECK_CONFIG_FILE,\n PROJECT_CONFIG_FILE,\n PROJECT_DIR_NAME,\n} from \"../../constants.js\";\nimport type { LocalMaintainerRegistryConfig } from \"../../types.js\";\nimport {\n ensureDir,\n exists,\n readJsonFile,\n readTextFile,\n readTextFileIfExists,\n writeTextFile,\n} from \"../../utils/fs.js\";\nimport { resolveCliRepoRoot } from \"../../utils/repo-root.js\";\nimport { materializeManifest } from \"./manifest-authoring.js\";\nimport { isDynamicSeedPath } from \"./scaffold-ownership.js\";\nimport {\n FRAMEWORK_PNPM_OVERRIDES,\n FRAMEWORK_REACT_DEPENDENCIES,\n FRAMEWORK_ZOD_VERSION,\n} from \"./framework-dependencies.js\";\n\ntype StaticScaffoldMode = \"new\" | \"update\";\ntype StaticAssetEntry = {\n targetPath: string;\n content: string;\n};\ntype StaticScaffoldOptions = {\n localMaintainerRegistry?: LocalMaintainerRegistryConfig | null;\n};\ntype RootPackageJsonShape = {\n private?: boolean;\n packageManager?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n overrides?: Record<string, unknown>;\n pnpm?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nconst DREAMBOARD_SYNC_COMMAND = \"dreamboard sync\";\nconst TESTING_TYPES_STUB =\n \"export function defineScenario(scenario) { return scenario; }\\n\";\nconst GENERATED_TESTING_TYPES_PREFIX = \"// Generated by dreamboard\";\nconst GENERATED_SCENARIO_PREFIX = \"// Generated by dreamboard scaffold.\";\nconst LEGACY_DREAMBOARD_COMPONENT_INDEX_CONTENT = `export {\n ErrorBoundary,\n PluginRuntime,\n type ErrorBoundaryProps,\n type PluginRuntimeProps,\n} from \"@dreamboard/ui-sdk\";\n`;\nconst INITIAL_SCENARIO_CONTENT = `${GENERATED_SCENARIO_PREFIX}\nimport { defineScenario } from \"../testing-types\";\n\nexport default defineScenario({\n id: \"smoke-initial-turn\",\n description:\n \"Sanity check that the scaffolded workspace boots into its initial phase.\",\n from: \"initial-turn\",\n when: async () => undefined,\n then: ({ expect, interactions, players, state }) => {\n const playerIds = players();\n expect(playerIds).toHaveLength(playerIds.length);\n expect(playerIds.length).toBeGreaterThanOrEqual(1);\n expect(state()).toBe(\"setup\");\n for (const playerId of playerIds) {\n expect(interactions(playerId)).toEqual([]);\n }\n },\n});\n`;\nconst STATIC_ASSET_ROOT = resolveStaticAssetRoot();\nconst SDK_PACKAGE_PATHS = {\n \"@dreamboard/app-sdk\": [\"packages\", \"app-sdk\", \"package.json\"],\n \"@dreamboard/sdk-types\": [\"packages\", \"sdk-types\", \"package.json\"],\n \"@dreamboard/testing\": [\"packages\", \"testing\", \"package.json\"],\n \"@dreamboard/ui-sdk\": [\"packages\", \"ui-sdk\", \"package.json\"],\n} as const;\nconst DEFAULT_SDK_DEPENDENCY_RANGES = {\n \"@dreamboard/app-sdk\": \"^0.0.40\",\n \"@dreamboard/sdk-types\": \"^0.1.0\",\n \"@dreamboard/testing\": \"^0.1.0\",\n \"@dreamboard/ui-sdk\": \"^0.0.40\",\n} as const;\nconst SDK_DEPENDENCY_RANGES = {\n \"@dreamboard/app-sdk\": resolveSdkDependencyRange(\"@dreamboard/app-sdk\"),\n \"@dreamboard/sdk-types\": resolveSdkDependencyRange(\"@dreamboard/sdk-types\"),\n \"@dreamboard/testing\": resolveSdkDependencyRange(\"@dreamboard/testing\"),\n \"@dreamboard/ui-sdk\": resolveSdkDependencyRange(\"@dreamboard/ui-sdk\"),\n} as const;\n\nconst FRAMEWORK_SCRIPTS = {\n dev: \"dreamboard dev\",\n \"test:ui\":\n \"tsx --tsconfig test/tsconfig.tsx-runtime.json --test test/ui/**/*.test.tsx\",\n typecheck: `tsc --noEmit -p ${MANIFEST_TYPECHECK_CONFIG_FILE} && tsc --noEmit -p app/tsconfig.json && tsc --noEmit -p ui/tsconfig.json`,\n \"typecheck:manifest\": `tsc --noEmit -p ${MANIFEST_TYPECHECK_CONFIG_FILE}`,\n \"typecheck:app\": \"tsc --noEmit -p app/tsconfig.json\",\n \"typecheck:ui\": \"tsc --noEmit -p ui/tsconfig.json\",\n} as const;\nconst SHARED_DEPENDENCIES = {\n ...FRAMEWORK_REACT_DEPENDENCIES,\n} as const;\nconst ROOT_APP_DEPENDENCIES = {\n zod: FRAMEWORK_ZOD_VERSION,\n} as const;\nconst SHARED_DEV_DEPENDENCIES = {\n typescript: \"^5.9.2\",\n \"@types/node\": \"^24.5.2\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.0\",\n csstype: \"^3.1.3\",\n tsx: \"^4.20.5\",\n} as const;\n\nexport async function scaffoldStaticWorkspace(\n projectRoot: string,\n mode: StaticScaffoldMode,\n options: StaticScaffoldOptions = {},\n): Promise<void> {\n await writeFrameworkStaticFiles(projectRoot, mode, options);\n await writeManifestTypecheckTsconfig(\n path.join(projectRoot, MANIFEST_TYPECHECK_CONFIG_FILE),\n );\n await removeLegacyVendoredSdkPaths(projectRoot);\n await removeLegacyDreamboardComponentPath(projectRoot);\n\n const testDir = path.join(projectRoot, \"test\");\n const basesDir = path.join(testDir, \"bases\");\n const scenariosDir = path.join(testDir, \"scenarios\");\n const generatedDir = path.join(testDir, \"generated\");\n\n await ensureDir(basesDir);\n await ensureDir(scenariosDir);\n await ensureDir(generatedDir);\n\n await writeTestReadme(path.join(testDir, \"README.md\"));\n await writeGeneratedTestingStubs(generatedDir, mode);\n const initialTestPlayerCount = await inferInitialTestPlayerCount(projectRoot);\n await writeInitialBase(\n path.join(basesDir, \"initial-turn.base.ts\"),\n mode,\n initialTestPlayerCount,\n );\n await writeInitialScenario(\n path.join(scenariosDir, \"smoke-initial-turn.scenario.ts\"),\n mode,\n );\n await writeTestingTypes(path.join(testDir, \"testing-types.ts\"), mode);\n await writeTestTsconfig(path.join(testDir, \"tsconfig.json\"));\n\n const staleDtsPath = path.join(testDir, \"testing-types.d.ts\");\n if (await exists(staleDtsPath)) {\n await unlink(staleDtsPath);\n }\n const staleBaseScenariosPath = path.join(testDir, \"base-scenarios.json\");\n if (await exists(staleBaseScenariosPath)) {\n await unlink(staleBaseScenariosPath);\n }\n\n await migrateLegacyScenarioImports(projectRoot);\n}\n\nexport async function assertCliStaticScaffoldComplete(\n projectRoot: string,\n deletedPaths: readonly string[] = [],\n): Promise<void> {\n const expectedEntries = await getExpectedStaticEntries(projectRoot);\n const missingOrBlankPaths: string[] = [];\n\n for (const entry of expectedEntries) {\n const fullPath = path.join(projectRoot, entry.targetPath);\n const content = await readTextFileIfExists(fullPath);\n\n if (content === null || content.trim().length === 0) {\n missingOrBlankPaths.push(entry.targetPath);\n }\n }\n\n const staticPaths = new Set(expectedEntries.map((entry) => entry.targetPath));\n const deletedStaticPaths = deletedPaths\n .map(normalizeProjectPath)\n .filter((filePath) => staticPaths.has(filePath))\n .sort();\n\n if (missingOrBlankPaths.length === 0 && deletedStaticPaths.length === 0) {\n return;\n }\n\n const problems: string[] = [];\n if (missingOrBlankPaths.length > 0) {\n problems.push(\n `missing or blank: ${summarizePaths(missingOrBlankPaths.sort())}`,\n );\n }\n if (deletedStaticPaths.length > 0) {\n problems.push(`deleted: ${summarizePaths(deletedStaticPaths)}`);\n }\n\n throw new Error(\n `CLI static scaffold is incomplete (${problems.join(\"; \")}). Run \\`${DREAMBOARD_SYNC_COMMAND}\\` to refresh the scaffold before compiling.`,\n );\n}\n\nasync function writeFrameworkStaticFiles(\n projectRoot: string,\n mode: StaticScaffoldMode,\n options: StaticScaffoldOptions,\n): Promise<void> {\n const assetEntries = await getStaticAssetEntries();\n\n for (const entry of assetEntries) {\n const fullPath = path.join(projectRoot, entry.targetPath);\n // Dynamic seed files are user-customizable: only write them on first\n // scaffold; preserve existing content on subsequent updates.\n if (mode === \"update\" && isDynamicSeedPath(entry.targetPath)) {\n const existing = await readTextFileIfExists(fullPath);\n if (existing !== null && existing.trim().length > 0) {\n continue;\n }\n }\n await writeTextFile(fullPath, entry.content);\n }\n\n for (const entry of await getDynamicStaticEntries(\n projectRoot,\n mode,\n options,\n )) {\n await writeTextFile(\n path.join(projectRoot, entry.targetPath),\n entry.content,\n );\n }\n\n if (!options.localMaintainerRegistry) {\n await rm(path.join(projectRoot, \".npmrc\"), { force: true });\n }\n}\n\nasync function removeLegacyVendoredSdkPaths(\n projectRoot: string,\n): Promise<void> {\n await rm(path.join(projectRoot, \"app\", \"sdk\"), {\n recursive: true,\n force: true,\n });\n await rm(path.join(projectRoot, \"ui\", \"sdk\"), {\n recursive: true,\n force: true,\n });\n}\n\nasync function removeLegacyDreamboardComponentPath(\n projectRoot: string,\n): Promise<void> {\n const legacyDirPath = path.join(\n projectRoot,\n \"ui\",\n \"components\",\n \"dreamboard\",\n );\n const legacyIndexPath = path.join(legacyDirPath, \"index.ts\");\n const existing = await readTextFileIfExists(legacyIndexPath);\n\n if (\n existing === null ||\n existing.trim() !== LEGACY_DREAMBOARD_COMPONENT_INDEX_CONTENT.trim()\n ) {\n return;\n }\n\n await unlink(legacyIndexPath);\n const remainingEntries = await readdir(legacyDirPath).catch(() => []);\n if (remainingEntries.length === 0) {\n await rmdir(legacyDirPath);\n }\n}\n\nasync function writeTestReadme(filePath: string): Promise<void> {\n await writeTextFile(\n filePath,\n \"# Dreamboard Test Workspace\\n\\nTypeScript bases live in `test/bases/*.base.ts` and scenarios live in `test/scenarios/*.scenario.ts`.\\n\\n1. Define reusable seeded bases with `defineBase({ id, seed, players, setupProfileId?, setup })`.\\n2. Define scenarios with `defineScenario({ id, from, when, then })`.\\n3. Scenario assertions can read `players()`, `state()`, `view(playerId)`, and `interactions(playerId)`.\\n4. Generate deterministic base snapshots: `dreamboard test generate`.\\n5. Run tests: `dreamboard test run`.\\n\\nImport test helpers from `../testing-types`.\\n\\nGenerated artifacts are written to `test/generated/*` and should not be edited manually.\\n\",\n );\n}\n\nasync function writeInitialBase(\n filePath: string,\n mode: StaticScaffoldMode,\n players: number,\n): Promise<void> {\n if (mode === \"update\") {\n return;\n }\n\n await writeTextFile(\n filePath,\n `import { defineBase } from \"../testing-types\";\n\nexport default defineBase({\n id: \"initial-turn\",\n seed: 1337,\n players: ${players},\n setup: async () => undefined,\n});\n`,\n );\n}\n\nasync function writeInitialScenario(\n filePath: string,\n mode: StaticScaffoldMode,\n): Promise<void> {\n if (mode === \"new\") {\n await writeTextFile(filePath, INITIAL_SCENARIO_CONTENT);\n return;\n }\n\n const existing = await readTextFileIfExists(filePath);\n if (\n existing === null ||\n existing.trim().length === 0 ||\n existing === INITIAL_SCENARIO_CONTENT\n ) {\n await writeTextFile(filePath, INITIAL_SCENARIO_CONTENT);\n }\n}\n\nasync function writeTestingTypes(\n filePath: string,\n mode: StaticScaffoldMode,\n): Promise<void> {\n if (mode === \"new\") {\n await writeTextFile(filePath, REDUCER_TESTING_TYPES_WRAPPER_CONTENT);\n return;\n }\n\n const existing = await readTextFileIfExists(filePath);\n if (shouldRefreshGeneratedTestingTypes(existing)) {\n await writeTextFile(filePath, REDUCER_TESTING_TYPES_WRAPPER_CONTENT);\n }\n}\n\nasync function writeGeneratedTestingStubs(\n generatedDir: string,\n mode: StaticScaffoldMode,\n): Promise<void> {\n const header = \"// Generated by dreamboard scaffold. Do not edit by hand.\\n\";\n await writeGeneratedTestingStubFile(\n path.join(generatedDir, \"base-states.generated.ts\"),\n `${header}export const BASE_STATES = {} as const;\\n`,\n mode,\n );\n await writeGeneratedTestingStubFile(\n path.join(generatedDir, \"base-states.generated.d.ts\"),\n `${header}export declare const BASE_STATES: Record<string, unknown>;\\n`,\n mode,\n );\n await writeGeneratedTestingStubFile(\n path.join(generatedDir, \"testing-contract.ts\"),\n `${header}export type BaseId = string;\\nexport type GameView = unknown;\\nexport type InteractionId = string;\\nexport type InteractionParamsOf<_Id extends string> = Record<string, unknown>;\\nexport type PhaseName = string;\\nexport type PlayerId = string;\\nexport type RejectionCode = string;\\nexport type StateName = string;\\nexport type TestRunner = \"reducer\" | \"embedded\" | \"browser\";\\nexport type ViewByPhase = Record<string, GameView>;\\nexport type WorkspaceStageName<_Phase extends string = string> = string;\\nexport type Expectation = { [matcher: string]: (...args: unknown[]) => unknown; not: Expectation };\\nexport type ExpectFn = (actual: unknown) => Expectation;\\nexport interface InteractionDescriptorFor<Id extends string = string> { interactionId: Id; [key: string]: unknown; }\\nexport interface ScenarioGameApi { start(): Promise<void>; submit<Id extends InteractionId>(playerId: PlayerId, interactionId: Id, params?: InteractionParamsOf<Id>): Promise<void>; }\\nexport interface BaseContext { game: ScenarioGameApi; players(): readonly PlayerId[]; seat(index: number): PlayerId; }\\nexport interface SharedScenarioContext { game: ScenarioGameApi; players(): readonly PlayerId[]; seat(index: number): PlayerId; state(): StateName; view(playerId: PlayerId): GameView; interactions(playerId: PlayerId): readonly InteractionDescriptorFor[]; expect: ExpectFn; }\\nexport type ScenarioContext<Phase extends PhaseName | undefined = undefined> = Omit<SharedScenarioContext, \"state\" | \"view\"> & { state(): Phase extends PhaseName ? Phase : StateName; view(playerId: PlayerId): Phase extends PhaseName ? ViewByPhase[Phase] : GameView; };\\nexport type ScenarioThenContext<_Runners extends readonly TestRunner[] = readonly [\"reducer\"], Phase extends PhaseName | undefined = undefined> = ScenarioContext<Phase>;\\nexport interface BaseDefinition { id: string; seed?: number; players?: number; setupProfileId?: string; extends?: BaseId | string; setup: (ctx: BaseContext) => void | Promise<void>; }\\nexport interface ScenarioDefinition<Runners extends readonly TestRunner[] = readonly [\"reducer\"], Phase extends PhaseName | undefined = undefined> { id: string; description?: string; from: BaseId | string; runners?: Runners; phase?: Phase; stage?: Phase extends PhaseName ? WorkspaceStageName<Phase> : never; when: (ctx: ScenarioContext<Phase>) => void | Promise<void>; then: (ctx: ScenarioThenContext<Runners, Phase>) => void | Promise<void>; }\\n`,\n mode,\n );\n await writeGeneratedTestingStubFile(\n path.join(generatedDir, \"scenario-manifest.generated.ts\"),\n `${header}export const SCENARIO_MANIFEST = [] as const;\\n`,\n mode,\n );\n}\n\nasync function writeGeneratedTestingStubFile(\n filePath: string,\n content: string,\n mode: StaticScaffoldMode,\n): Promise<void> {\n if (mode === \"new\") {\n await writeTextFile(filePath, content);\n return;\n }\n\n const existing = await readTextFileIfExists(filePath);\n if (\n existing === null ||\n existing.trim().length === 0 ||\n existing.startsWith(GENERATED_SCENARIO_PREFIX)\n ) {\n await writeTextFile(filePath, content);\n }\n}\n\nasync function writeTestTsconfig(filePath: string): Promise<void> {\n await writeTextFile(\n filePath,\n `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n noEmit: true,\n },\n include: [\n \"./**/*.ts\",\n \"./**/*.d.ts\",\n \"../shared/**/*.ts\",\n \"../shared/**/*.d.ts\",\n ],\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\nasync function writeManifestTypecheckTsconfig(filePath: string): Promise<void> {\n await writeTextFile(\n filePath,\n `${JSON.stringify(\n {\n compilerOptions: {\n target: \"ES2022\",\n module: \"ESNext\",\n moduleResolution: \"bundler\",\n strict: true,\n esModuleInterop: true,\n skipLibCheck: true,\n noEmit: true,\n allowImportingTsExtensions: true,\n },\n include: [\"./manifest.ts\"],\n },\n null,\n 2,\n )}\\n`,\n );\n}\n\nexport async function migrateLegacyScenarioImports(\n projectRoot: string,\n): Promise<void> {\n const scenariosRoot = path.join(projectRoot, \"test\", \"scenarios\");\n if (!(await exists(scenariosRoot))) return;\n\n const scenarioFiles = await collectScenarioFiles(scenariosRoot);\n for (const filePath of scenarioFiles) {\n const content = await readTextFile(filePath);\n if (!content.includes(\"@dreamboard/cli/testing\")) continue;\n\n const relativeToTestingTypes = normalizeImportPath(\n path.relative(\n path.dirname(filePath),\n path.join(projectRoot, \"test\", \"testing-types\"),\n ),\n );\n\n const migrated = content\n .replaceAll('\"@dreamboard/cli/testing\"', `\"${relativeToTestingTypes}\"`)\n .replaceAll(\"'@dreamboard/cli/testing'\", `'${relativeToTestingTypes}'`);\n\n if (migrated !== content) {\n await writeTextFile(filePath, migrated);\n }\n }\n}\n\nfunction shouldRefreshGeneratedTestingTypes(\n existingContent: string | null,\n): boolean {\n if (existingContent === null || existingContent.trim().length === 0) {\n return true;\n }\n if (existingContent === TESTING_TYPES_STUB) {\n return true;\n }\n return existingContent.startsWith(GENERATED_TESTING_TYPES_PREFIX);\n}\n\nasync function inferInitialTestPlayerCount(\n projectRoot: string,\n): Promise<number> {\n const manifestPath = path.join(projectRoot, \"manifest.ts\");\n if (!(await exists(manifestPath))) {\n return 4;\n }\n\n try {\n const manifest = await materializeManifest(projectRoot);\n return manifest.players.optimalPlayers ?? manifest.players.minPlayers ?? 4;\n } catch {\n return 4;\n }\n}\n\nasync function collectScenarioFiles(rootDir: string): Promise<string[]> {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const dir = stack.pop();\n if (!dir) continue;\n\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n stack.push(fullPath);\n } else if (entry.isFile() && entry.name.endsWith(\".ts\")) {\n files.push(fullPath);\n }\n }\n }\n\n return files;\n}\n\nexport function resolveStaticAssetRoot(\n importUrl: string = import.meta.url,\n): string {\n const candidates = [\n fileURLToPath(new URL(\"../../scaffold/assets/static/\", importUrl)),\n fileURLToPath(new URL(\"./scaffold/assets/static/\", importUrl)),\n fileURLToPath(new URL(\"../scaffold/assets/static/\", importUrl)),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n throw new Error(\n `Unable to locate CLI static scaffold assets. Checked: ${candidates.join(\", \")}`,\n );\n}\n\nasync function getStaticAssetEntries(): Promise<StaticAssetEntry[]> {\n const files = await walkFiles(STATIC_ASSET_ROOT);\n const entries: StaticAssetEntry[] = [];\n\n for (const filePath of files) {\n const targetPath = normalizeProjectPath(\n path.relative(STATIC_ASSET_ROOT, filePath),\n );\n entries.push({\n targetPath,\n content: await readFile(filePath, \"utf8\"),\n });\n }\n\n entries.sort((left, right) =>\n left.targetPath.localeCompare(right.targetPath),\n );\n return entries;\n}\n\nasync function getDynamicStaticEntries(\n projectRoot: string,\n mode: StaticScaffoldMode,\n options: StaticScaffoldOptions = {},\n): Promise<StaticAssetEntry[]> {\n const entries: StaticAssetEntry[] = [\n {\n targetPath: \"package.json\",\n content: await buildRootPackageJson(projectRoot, mode, options),\n },\n {\n targetPath: \"ui/package.json\",\n content: buildUiPackageJson(),\n },\n ];\n\n if (options.localMaintainerRegistry) {\n entries.push({\n targetPath: \".npmrc\",\n content: buildWorkspaceNpmrc(options.localMaintainerRegistry.registryUrl),\n });\n }\n\n return entries;\n}\n\nasync function readProjectLocalMaintainerRegistry(\n projectRoot: string,\n): Promise<LocalMaintainerRegistryConfig | null> {\n const projectConfigPath = path.join(\n projectRoot,\n PROJECT_DIR_NAME,\n PROJECT_CONFIG_FILE,\n );\n if (!(await exists(projectConfigPath))) {\n return null;\n }\n\n const projectConfig = await readJsonFile<{\n localMaintainerRegistry?: LocalMaintainerRegistryConfig;\n }>(projectConfigPath);\n return projectConfig.localMaintainerRegistry ?? null;\n}\n\nasync function getExpectedStaticEntries(\n projectRoot: string,\n): Promise<StaticAssetEntry[]> {\n const entries = [\n ...(await getStaticAssetEntries()),\n ...(await getDynamicStaticEntries(projectRoot, \"update\", {\n localMaintainerRegistry:\n await readProjectLocalMaintainerRegistry(projectRoot),\n })),\n ];\n entries.sort((left, right) =>\n left.targetPath.localeCompare(right.targetPath),\n );\n return entries;\n}\n\nasync function walkFiles(rootDir: string): Promise<string[]> {\n const files: string[] = [];\n const stack = [rootDir];\n\n while (stack.length > 0) {\n const currentDir = stack.pop();\n if (!currentDir) continue;\n\n const entries = await readdir(currentDir, { withFileTypes: true });\n for (const entry of entries) {\n const fullPath = path.join(currentDir, entry.name);\n if (entry.isDirectory()) {\n stack.push(fullPath);\n } else if (entry.isFile()) {\n files.push(fullPath);\n }\n }\n }\n\n files.sort((left, right) => left.localeCompare(right));\n return files;\n}\n\nasync function buildRootPackageJson(\n projectRoot: string,\n mode: StaticScaffoldMode,\n options: StaticScaffoldOptions,\n): Promise<string> {\n const sdkDependencyRanges =\n options.localMaintainerRegistry?.packages ?? SDK_DEPENDENCY_RANGES;\n const packageJsonPath = path.join(projectRoot, \"package.json\");\n const existingPackageJson =\n mode === \"update\" && (await exists(packageJsonPath))\n ? await readJsonFile<RootPackageJsonShape>(packageJsonPath)\n : null;\n const {\n dreamboardFrameworkVersion: _legacyFrameworkVersion,\n ...existingPackageJsonWithoutLegacyVersion\n } = existingPackageJson ?? {};\n const frameworkDependencies = {\n \"@dreamboard/app-sdk\": sdkDependencyRanges[\"@dreamboard/app-sdk\"],\n \"@dreamboard/ui-sdk\": sdkDependencyRanges[\"@dreamboard/ui-sdk\"],\n ...SHARED_DEPENDENCIES,\n ...ROOT_APP_DEPENDENCIES,\n };\n const frameworkDevDependencies = {\n \"@dreamboard/sdk-types\": sdkDependencyRanges[\"@dreamboard/sdk-types\"],\n \"@dreamboard/testing\":\n sdkDependencyRanges[\"@dreamboard/testing\"] ??\n SDK_DEPENDENCY_RANGES[\"@dreamboard/testing\"],\n ...SHARED_DEV_DEPENDENCIES,\n };\n const nextPackageJson: RootPackageJsonShape = {\n ...existingPackageJsonWithoutLegacyVersion,\n private: true,\n scripts: {\n ...(existingPackageJson?.scripts ?? {}),\n ...FRAMEWORK_SCRIPTS,\n },\n dependencies: {\n ...(existingPackageJson?.dependencies ?? {}),\n ...frameworkDependencies,\n },\n devDependencies: {\n ...(existingPackageJson?.devDependencies ?? {}),\n ...frameworkDevDependencies,\n },\n pnpm: mergePnpmConfig(existingPackageJson?.pnpm),\n };\n return `${JSON.stringify(nextPackageJson, null, 2)}\\n`;\n}\n\nfunction mergePnpmConfig(\n existingPnpm: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n const existingOverrides =\n existingPnpm?.overrides &&\n typeof existingPnpm.overrides === \"object\" &&\n !Array.isArray(existingPnpm.overrides)\n ? (existingPnpm.overrides as Record<string, unknown>)\n : {};\n return {\n ...(existingPnpm ?? {}),\n overrides: {\n ...existingOverrides,\n ...FRAMEWORK_PNPM_OVERRIDES,\n },\n };\n}\n\nfunction buildWorkspaceNpmrc(registryUrl: string): string {\n return `@dreamboard:registry=${registryUrl}\\n`;\n}\n\nfunction buildUiPackageJson(): string {\n return `${JSON.stringify(\n {\n private: true,\n dependencies: SHARED_DEPENDENCIES,\n devDependencies: SHARED_DEV_DEPENDENCIES,\n },\n null,\n 2,\n )}\\n`;\n}\n\nfunction readPackageVersion(\n packageJsonPath: string,\n packageName: string,\n): string | null {\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n version?: unknown;\n };\n\n if (\n typeof packageJson.version !== \"string\" ||\n packageJson.version.trim().length === 0\n ) {\n return null;\n }\n\n return `^${packageJson.version.trim()}`;\n}\n\nfunction findNearestPackageJsonPath(\n importMetaUrl: string = import.meta.url,\n): string | null {\n let current = path.dirname(fileURLToPath(importMetaUrl));\n\n while (true) {\n const candidate = path.join(current, \"package.json\");\n if (existsSync(candidate)) {\n return candidate;\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n return null;\n }\n current = parent;\n }\n}\n\nfunction readPackagedSdkDependencyRange(\n packageName: keyof typeof SDK_PACKAGE_PATHS,\n importMetaUrl: string = import.meta.url,\n): string | null {\n const packageJsonPath = findNearestPackageJsonPath(importMetaUrl);\n if (!packageJsonPath) {\n return null;\n }\n\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf8\")) as {\n dependencies?: Record<string, unknown>;\n dreamboardSdkDependencyRanges?: Record<string, unknown>;\n };\n\n const packagedRange =\n packageJson.dreamboardSdkDependencyRanges?.[packageName] ??\n packageJson.dependencies?.[packageName];\n if (\n typeof packagedRange !== \"string\" ||\n packagedRange.trim().length === 0 ||\n packagedRange.startsWith(\"workspace:\")\n ) {\n return null;\n }\n\n return packagedRange.trim();\n}\n\nexport function resolveSdkDependencyRange(\n packageName: keyof typeof SDK_PACKAGE_PATHS,\n importMetaUrl: string = import.meta.url,\n): string {\n try {\n const repoRoot = resolveCliRepoRoot(importMetaUrl);\n const packageJsonPath = path.join(\n repoRoot,\n ...SDK_PACKAGE_PATHS[packageName],\n );\n const repoRange = readPackageVersion(packageJsonPath, packageName);\n if (repoRange) {\n return repoRange;\n }\n } catch {\n // Published installs do not include the monorepo layout.\n }\n\n const packagedRange = readPackagedSdkDependencyRange(\n packageName,\n importMetaUrl,\n );\n if (packagedRange) {\n return packagedRange;\n }\n\n return DEFAULT_SDK_DEPENDENCY_RANGES[packageName];\n}\n\nfunction normalizeImportPath(relativePath: string): string {\n const normalized = relativePath.replaceAll(\"\\\\\", \"/\");\n if (normalized.startsWith(\".\")) return normalized;\n return `./${normalized}`;\n}\n\nfunction normalizeProjectPath(filePath: string): string {\n return filePath.replace(/^\\.\\//, \"\").replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n}\n\nfunction summarizePaths(paths: readonly string[]): string {\n const maxShown = 5;\n const shown = paths.slice(0, maxShown).join(\", \");\n if (paths.length <= maxShown) return shown;\n return `${shown}, and ${paths.length - maxShown} more`;\n}\n","const DEFAULT_REJECTION_CODES = [\n \"NOT_YOUR_TURN\",\n \"action-unavailable\",\n \"invalid-action-params\",\n \"prompt-not-owned\",\n] as const;\n\nfunction renderLiteralUnion(values: readonly string[]): string {\n if (values.length === 0) {\n return \"never\";\n }\n return values.map((value) => JSON.stringify(value)).join(\" | \");\n}\n\nexport const REDUCER_TESTING_TYPES_WRAPPER_CONTENT = `\\\n// Generated by dreamboard — do not edit by hand.\nimport game from \"../app/game\";\nimport { createReducerBundle } from \"@dreamboard/app-sdk/reducer\";\nimport { createTestRuntime as createDreamboardTestRuntime } from \"@dreamboard/testing\";\nimport type { CreateTestRuntimeOptions } from \"@dreamboard/testing\";\nimport { literals } from \"../shared/manifest-contract\";\nimport type { PhaseName } from \"../shared/generated/ui-contract\";\nimport { BASE_STATES } from \"./generated/base-states.generated\";\nimport type {\n BaseDefinition,\n ScenarioDefinition,\n TestRunner,\n} from \"./generated/testing-contract\";\n\nexport * from \"./generated/testing-contract\";\n\n/**\n * Workspace-narrowed \\`defineBase\\` wrapper. Accepts the generated\n * \\`BaseDefinition\\` so \\`setup({ seat, game })\\` is typed against the\n * workspace's player ids and interaction contract.\n */\nexport function defineBase<const Definition extends BaseDefinition>(\n definition: Definition,\n): Definition {\n return definition;\n}\n\n/**\n * Workspace-narrowed \\`defineScenario\\` wrapper. The generated\n * \\`ScenarioDefinition\\` narrows \\`ctx.view(playerId)\\` in \\`then\\` based on\n * the declared \\`phase\\`, keeps \\`when\\` union-typed, and constrains\n * \\`phase\\` / \\`stage\\` to the manifest-derived literal types.\n */\nexport function defineScenario<\n const Runners extends readonly TestRunner[] = readonly [\"reducer\"],\n const Phase extends PhaseName | undefined = undefined,\n>(\n definition: ScenarioDefinition<Runners, Phase>,\n): ScenarioDefinition<Runners, Phase> {\n return definition;\n}\n\nexport function createTestRuntime(options: {\n baseId: keyof typeof BASE_STATES & string;\n phase?: PhaseName;\n controllingPlayerId?: (typeof literals.playerIds)[number];\n userId?: string | null;\n}) {\n const reducerBundle =\n createReducerBundle(game) satisfies CreateTestRuntimeOptions[\"bundle\"];\n const baseStates =\n BASE_STATES satisfies CreateTestRuntimeOptions[\"baseStates\"];\n const runtime = createDreamboardTestRuntime({\n baseId: options.baseId,\n baseStates,\n bundle: reducerBundle,\n phase: options.phase,\n userId: options.userId ?? \"test-user\",\n playerIds: literals.playerIds.slice(\n 0,\n BASE_STATES[options.baseId]?.fingerprint.players ?? literals.playerIds.length,\n ),\n });\n\n if (options.controllingPlayerId) {\n runtime.setControllingPlayer(options.controllingPlayerId);\n }\n\n return runtime;\n}\n`;\n\nexport function buildReducerTestingContractContent(\n options: {\n rejectionCodes?: readonly string[];\n } = {},\n): string {\n const rejectionCodes = Array.from(\n new Set([...(options.rejectionCodes ?? []), ...DEFAULT_REJECTION_CODES]),\n ).sort((left, right) => left.localeCompare(right));\n\n return `\\\n// Generated by dreamboard — do not edit by hand.\nimport type game from \"../../app/game\";\nimport { literals, type SetupProfileId } from \"../../shared/manifest-contract\";\nimport {\n type GameView,\n type InteractionId,\n type InteractionKey,\n type InteractionParamsOf,\n type PhaseName,\n type StageName as WorkspaceStageName,\n} from \"../../shared/generated/ui-contract\";\nimport type { ExpectFn as SharedExpectFn, TestRunner as SharedTestRunner } from \"@dreamboard/testing\";\nimport type { InteractionDescriptor } from \"@dreamboard/ui-sdk\";\nimport { BASE_STATES } from \"./base-states.generated\";\n\nexport type GameDefinition = typeof game;\nexport type PlayerId = (typeof literals.playerIds)[number];\nexport type StateName = PhaseName;\nexport type BaseId = keyof typeof BASE_STATES & string;\nexport type InteractionDescriptorFor<Id extends string = string> =\n InteractionDescriptor<Id>;\nexport type TestRunner = SharedTestRunner;\nexport type ExpectFn = SharedExpectFn;\nexport type KnownRejectionCode = ${renderLiteralUnion(rejectionCodes)};\nexport type RejectionCode = [KnownRejectionCode] extends [never]\n ? string\n : KnownRejectionCode;\n\ntype DefaultRunners = readonly [\"reducer\"];\ntype PhaseTaggedView<Phase extends PhaseName> = Extract<\n GameView,\n { phase: Phase } | { currentPhase: Phase } | { state: Phase }\n>;\ntype NarrowedView<Phase extends PhaseName> = [PhaseTaggedView<Phase>] extends [never]\n ? GameView\n : PhaseTaggedView<Phase>;\n\nexport type ViewByPhase = {\n [Phase in PhaseName]: NarrowedView<Phase>;\n};\n\ntype InteractionKeyForId<Id extends InteractionId> = Extract<\n InteractionKey,\n \\`\\${string}.\\${Id}\\`\n>;\ntype InteractionParamsOfId<Id extends InteractionId> =\n InteractionParamsOf<InteractionKeyForId<Id>>;\n\nexport interface BrowserRunnerSnapshot {\n sessionId: string | null;\n shortCode: string | null;\n version: number;\n currentPhase: string | null;\n controllingPlayerId: string;\n controllablePlayerIds: string[];\n view: unknown;\n availableInteractions?: string[];\n}\n\nexport interface BrowserRunnerBridge {\n snapshot(): Promise<BrowserRunnerSnapshot>;\n submitInteraction(\n playerId: PlayerId,\n interactionId: string,\n params: unknown,\n ): Promise<void>;\n}\n\nexport interface BrowserRunnerDriver {\n onReady?(bridge: BrowserRunnerBridge): Promise<void> | void;\n interaction?(\n bridge: BrowserRunnerBridge,\n input: { playerId: PlayerId; interactionId: string; params: unknown },\n ): Promise<boolean | void> | boolean | void;\n}\n\nexport interface ScenarioGameApi {\n start(): Promise<void>;\n /**\n * Patch the reducer snapshot for deterministic setup-heavy scenarios.\n * This is limited to reducer snapshot materialization and is rejected by\n * live replay/browser runners so authored gameplay verification still\n * submits real interactions.\n */\n patchState(mutator: (state: Record<string, unknown>) => void): Promise<void>;\n /**\n * Submit a player interaction (action-kind or prompt-kind) to the game.\n * The \\`interactionId\\` matches an \\`InteractionId\\` from the generated\n * \\`ui-contract\\`; \\`params\\` is typed per interaction id.\n */\n submit<Id extends InteractionId>(\n playerId: PlayerId,\n interactionId: Id,\n params?: InteractionParamsOfId<Id>,\n ): Promise<void>;\n}\n\nexport interface BaseContext {\n game: ScenarioGameApi;\n players(): readonly PlayerId[];\n /**\n * Resolve the seat at \\`index\\` in the base's players list.\n * Throws if the index is out of range. Prefer \\`seat(0)\\`/\\`seat(1)\\` over\n * literal player ids so bases stay portable across player counts and\n * we never hard-code wire-shape assumptions like \"player-1\".\n */\n seat(index: number): PlayerId;\n}\n\nexport interface SharedScenarioContext {\n game: ScenarioGameApi;\n players(): readonly PlayerId[];\n /**\n * Resolve the seat at \\`index\\` in the current scenario's players list.\n * Throws if the index is out of range. Prefer \\`seat(0)\\`/\\`seat(1)\\` over\n * literal player ids so scenarios stay portable across player counts and\n * we never hard-code wire-shape assumptions like \"player-1\".\n */\n seat(index: number): PlayerId;\n state(): StateName;\n view(playerId: PlayerId): GameView;\n interactions(playerId: PlayerId): readonly InteractionDescriptorFor[];\n expect: ExpectFn;\n}\n\nexport type ScenarioContext<\n Phase extends PhaseName | undefined = undefined,\n> = Omit<SharedScenarioContext, \"state\" | \"view\"> & {\n state(): Phase extends PhaseName ? Phase : StateName;\n view(playerId: PlayerId): Phase extends PhaseName ? ViewByPhase[Phase] : GameView;\n};\n\nexport type ScenarioThenContext<\n _Runners extends readonly TestRunner[] = DefaultRunners,\n Phase extends PhaseName | undefined = undefined,\n> = ScenarioContext<Phase>;\n\nexport interface BaseDefinition {\n id: string;\n seed?: number;\n players?: number;\n setupProfileId?: SetupProfileId;\n extends?: BaseId | string;\n setup: (ctx: BaseContext) => void | Promise<void>;\n}\n\nexport interface ScenarioDefinition<\n Runners extends readonly TestRunner[] = DefaultRunners,\n Phase extends PhaseName | undefined = undefined,\n> {\n id: string;\n description?: string;\n from: BaseId | string;\n runners?: Runners;\n phase?: Phase;\n stage?: Phase extends PhaseName ? WorkspaceStageName<Phase> : never;\n when: (ctx: ScenarioContext<Phase>) => void | Promise<void>;\n then: (ctx: ScenarioThenContext<Runners, Phase>) => void | Promise<void>;\n}\n\nexport type {\n GameView,\n InteractionId,\n InteractionParamsOf,\n PhaseName,\n WorkspaceStageName,\n};\n`;\n}\n","export const FRAMEWORK_REACT_VERSION = \"19.2.6\";\nexport const FRAMEWORK_ZOD_VERSION = \"4.4.3\";\n\nexport const FRAMEWORK_REACT_DEPENDENCIES = {\n react: FRAMEWORK_REACT_VERSION,\n \"react-dom\": FRAMEWORK_REACT_VERSION,\n} as const;\n\nexport const FRAMEWORK_PNPM_OVERRIDES = {\n ...FRAMEWORK_REACT_DEPENDENCIES,\n zod: FRAMEWORK_ZOD_VERSION,\n} as const;\n","import { unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n getGameSources,\n type GameTopologyManifest,\n} from \"@dreamboard/api-client\";\nimport { MANIFEST_FILE, RULE_FILE } from \"../../constants.js\";\nimport type { ProjectConfig, ResolvedConfig } from \"../../types.js\";\nimport { updateProjectState } from \"../../config/project-config.js\";\nimport { getAuthoringHeadSdk } from \"../api/authoring-state-api.js\";\nimport {\n clearProjectPendingAuthoringSync,\n updateProjectAuthoringState,\n} from \"./project-state.js\";\nimport { formatApiError } from \"../../utils/errors.js\";\nimport { exists, writeTextFile } from \"../../utils/fs.js\";\nimport {\n collectLocalFiles,\n removeExtraneousFiles,\n loadManifest,\n writeManifest,\n writeRule,\n writeSnapshot,\n writeSourceFiles,\n} from \"./local-files.js\";\nimport { isAllowedGamePath, isLibraryPath } from \"./scaffold-ownership.js\";\nimport { applyWorkspaceCodegen } from \"./workspace-codegen.js\";\n\nconst META_FILES = new Set([RULE_FILE]);\n\nexport type RemoteProjectSources = {\n authoringStateId: string;\n files: Record<string, string>;\n sourceRevisionId: string;\n treeHash: string;\n manifestId?: string;\n manifestContentHash?: string;\n manifest?: GameTopologyManifest;\n ruleId?: string;\n ruleText?: string;\n};\n\nexport type RemoteReconcileResult = {\n latest: RemoteProjectSources;\n remoteUserFiles: Record<string, string>;\n written: string[];\n deleted: string[];\n conflicts: string[];\n};\n\nfunction normalizeRemoteFiles(\n response:\n | {\n files?: Record<string, string>;\n sourceFiles?: Record<string, string>;\n }\n | undefined,\n): Record<string, string> {\n return response?.files ?? response?.sourceFiles ?? {};\n}\n\nfunction isMergeablePath(filePath: string): boolean {\n if (META_FILES.has(filePath)) return true;\n return isAllowedGamePath(filePath) && !isLibraryPath(filePath);\n}\n\nfunction isMergeableUserPath(filePath: string): boolean {\n return (\n !META_FILES.has(filePath) &&\n isAllowedGamePath(filePath) &&\n !isLibraryPath(filePath)\n );\n}\n\nfunction buildMergeableRemoteFiles(\n sources: RemoteProjectSources,\n): Record<string, string> {\n const files: Record<string, string> = {};\n\n for (const [filePath, content] of Object.entries(sources.files)) {\n if (isMergeablePath(filePath)) {\n files[filePath] = content;\n }\n }\n\n if (typeof sources.ruleText === \"string\") {\n files[RULE_FILE] = sources.ruleText;\n }\n\n return files;\n}\n\nfunction formatConflictSection(content: string | null): string {\n if (content === null) return \"\";\n return content.endsWith(\"\\n\") ? content : `${content}\\n`;\n}\n\nfunction buildConflictContent(\n localContent: string | null,\n remoteContent: string | null,\n): string {\n return [\n \"<<<<<<< LOCAL\",\n formatConflictSection(localContent),\n \"=======\",\n formatConflictSection(remoteContent),\n \">>>>>>> REMOTE\",\n \"\",\n ].join(\"\\n\");\n}\n\nfunction mergeFileContent(options: {\n baseContent: string | null;\n localContent: string | null;\n remoteContent: string | null;\n}): { content: string | null; conflicted: boolean } {\n const { baseContent, localContent, remoteContent } = options;\n\n if (localContent === remoteContent) {\n return { content: localContent, conflicted: false };\n }\n\n if (baseContent === localContent) {\n return { content: remoteContent, conflicted: false };\n }\n\n if (baseContent === remoteContent) {\n return { content: localContent, conflicted: false };\n }\n\n if (baseContent === null) {\n if (localContent === null) {\n return { content: remoteContent, conflicted: false };\n }\n if (remoteContent === null) {\n return { content: localContent, conflicted: false };\n }\n return {\n content: buildConflictContent(localContent, remoteContent),\n conflicted: true,\n };\n }\n\n if (localContent === null) {\n if (remoteContent === null) {\n return { content: null, conflicted: false };\n }\n return {\n content: buildConflictContent(null, remoteContent),\n conflicted: true,\n };\n }\n\n if (remoteContent === null) {\n return {\n content: buildConflictContent(localContent, null),\n conflicted: true,\n };\n }\n\n return {\n content: buildConflictContent(localContent, remoteContent),\n conflicted: true,\n };\n}\n\nasync function fetchRemoteSources(\n gameId: string,\n authoringStateId: string,\n): Promise<RemoteProjectSources> {\n const {\n data: sources,\n error: sourcesError,\n response: sourcesResponse,\n } = await getGameSources({\n path: { gameId },\n query: { authoringStateId },\n });\n\n if (sourcesError || !sources) {\n throw new Error(\n formatApiError(sourcesError, sourcesResponse, \"Failed to get sources\"),\n );\n }\n\n return {\n authoringStateId: sources.authoringStateId,\n files: normalizeRemoteFiles(sources),\n sourceRevisionId: sources.sourceRevisionId,\n treeHash: sources.treeHash,\n manifestId: sources.manifestId,\n manifestContentHash: sources.manifestContentHash ?? undefined,\n manifest: sources.manifest,\n ruleId: sources.ruleId,\n ruleText: sources.ruleText,\n };\n}\n\nexport async function fetchLatestRemoteSources(\n gameId: string,\n): Promise<RemoteProjectSources | null> {\n const latest = await getAuthoringHeadSdk(gameId);\n if (!latest?.authoringStateId) {\n return null;\n }\n return fetchRemoteSources(gameId, latest.authoringStateId);\n}\n\nexport async function pullIntoDirectory(\n config: ResolvedConfig,\n targetDir: string,\n projectConfig: ProjectConfig,\n): Promise<ProjectConfig> {\n const latest = await fetchLatestRemoteSources(projectConfig.gameId);\n if (!latest) {\n throw new Error(\"No authoring state found for this game.\");\n }\n\n await writeSourceFiles(targetDir, latest.files);\n await removeExtraneousFiles(targetDir, new Set(Object.keys(latest.files)));\n\n if (latest.manifest && !latest.files[MANIFEST_FILE]) {\n await writeManifest(targetDir, latest.manifest);\n }\n\n if (latest.ruleText) {\n await writeRule(targetDir, latest.ruleText);\n }\n\n const manifestForCodegen = await loadManifest(targetDir);\n await applyWorkspaceCodegen({\n projectRoot: targetDir,\n manifest: manifestForCodegen,\n });\n\n const pulledProjectConfig = buildPulledProjectConfig(\n config,\n projectConfig,\n latest,\n );\n await updateProjectState(targetDir, pulledProjectConfig);\n\n await writeSnapshot(targetDir);\n return pulledProjectConfig;\n}\n\nexport function buildPulledProjectConfig(\n config: Pick<ResolvedConfig, \"apiBaseUrl\" | \"webBaseUrl\">,\n projectConfig: ProjectConfig,\n latest: RemoteProjectSources,\n): ProjectConfig {\n return updateProjectAuthoringState(\n clearProjectPendingAuthoringSync({\n ...projectConfig,\n apiBaseUrl: projectConfig.apiBaseUrl ?? config.apiBaseUrl,\n webBaseUrl: projectConfig.webBaseUrl ?? config.webBaseUrl,\n }),\n {\n authoringStateId: latest.authoringStateId,\n sourceRevisionId: latest.sourceRevisionId,\n sourceTreeHash: latest.treeHash,\n manifestId: latest.manifestId ?? projectConfig.authoring?.manifestId,\n manifestContentHash:\n latest.manifestContentHash ??\n projectConfig.authoring?.manifestContentHash,\n ruleId: latest.ruleId ?? projectConfig.authoring?.ruleId,\n },\n );\n}\n\nexport async function reconcileRemoteChangesIntoWorkspace(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n baseAuthoringStateId: string;\n latestAuthoringStateId: string;\n}): Promise<RemoteReconcileResult> {\n const {\n projectRoot,\n projectConfig,\n baseAuthoringStateId,\n latestAuthoringStateId,\n } = options;\n const [base, latest, localFiles] = await Promise.all([\n fetchRemoteSources(projectConfig.gameId, baseAuthoringStateId),\n fetchRemoteSources(projectConfig.gameId, latestAuthoringStateId),\n collectLocalFiles(projectRoot),\n ]);\n\n const baseFiles = buildMergeableRemoteFiles(base);\n const latestFiles = buildMergeableRemoteFiles(latest);\n const localMergeableFiles = Object.fromEntries(\n Object.entries(localFiles).filter(([filePath]) =>\n isMergeablePath(filePath),\n ),\n );\n\n const candidatePaths = new Set<string>([\n ...Object.keys(baseFiles),\n ...Object.keys(latestFiles),\n ...Object.keys(localMergeableFiles),\n ]);\n\n const written: string[] = [];\n const deleted: string[] = [];\n const conflicts: string[] = [];\n\n for (const filePath of [...candidatePaths].sort()) {\n const mergeResult = mergeFileContent({\n baseContent: baseFiles[filePath] ?? null,\n localContent: localMergeableFiles[filePath] ?? null,\n remoteContent: latestFiles[filePath] ?? null,\n });\n\n const absolutePath = path.join(projectRoot, filePath);\n if (mergeResult.content === null) {\n if (await exists(absolutePath)) {\n await unlink(absolutePath);\n deleted.push(filePath);\n }\n continue;\n }\n\n await writeTextFile(absolutePath, mergeResult.content);\n written.push(filePath);\n\n if (mergeResult.conflicted) {\n conflicts.push(filePath);\n }\n }\n\n return {\n latest,\n remoteUserFiles: Object.fromEntries(\n Object.entries(latest.files).filter(([filePath]) =>\n isMergeableUserPath(filePath),\n ),\n ),\n written,\n deleted,\n conflicts,\n };\n}\n\nexport function buildRemoteAlignedSnapshotFiles(options: {\n localFiles: Record<string, string>;\n remoteUserFiles: Record<string, string>;\n}): Record<string, string> {\n return {\n ...options.localFiles,\n ...options.remoteUserFiles,\n };\n}\n","import type {\n LocalMaintainerRegistryConfig,\n ProjectAuthoringState,\n ProjectCompileAttempt,\n ProjectCompileState,\n ProjectConfig,\n ProjectPendingAuthoringSync,\n} from \"../../types.js\";\n\nexport function getProjectAuthoringState(\n projectConfig: ProjectConfig,\n): ProjectAuthoringState {\n return projectConfig.authoring ?? {};\n}\n\nexport function getProjectPendingAuthoringSync(\n projectConfig: ProjectConfig,\n): ProjectPendingAuthoringSync | undefined {\n return getProjectAuthoringState(projectConfig).pendingSync;\n}\n\nexport function getProjectCompileState(\n projectConfig: ProjectConfig,\n): ProjectCompileState {\n return projectConfig.compile ?? {};\n}\n\nexport function getProjectLocalMaintainerRegistry(\n projectConfig: ProjectConfig,\n): LocalMaintainerRegistryConfig | undefined {\n return projectConfig.localMaintainerRegistry;\n}\n\nexport function updateProjectAuthoringState(\n projectConfig: ProjectConfig,\n authoring: ProjectAuthoringState,\n): ProjectConfig {\n return {\n ...projectConfig,\n authoring: {\n ...getProjectAuthoringState(projectConfig),\n ...authoring,\n },\n };\n}\n\nexport function setProjectPendingAuthoringSync(\n projectConfig: ProjectConfig,\n pendingSync: ProjectPendingAuthoringSync,\n): ProjectConfig {\n return updateProjectAuthoringState(projectConfig, {\n pendingSync,\n });\n}\n\nexport function clearProjectPendingAuthoringSync(\n projectConfig: ProjectConfig,\n): ProjectConfig {\n const authoring = getProjectAuthoringState(projectConfig);\n if (!authoring.pendingSync) {\n return projectConfig;\n }\n\n const { pendingSync: _pendingSync, ...rest } = authoring;\n return {\n ...projectConfig,\n authoring: rest,\n };\n}\n\nexport function finalizeProjectPendingAuthoringSync(\n projectConfig: ProjectConfig,\n): ProjectConfig {\n const authoring = getProjectAuthoringState(projectConfig);\n const pendingSync = authoring.pendingSync;\n if (!pendingSync) {\n return projectConfig;\n }\n\n return updateProjectAuthoringState(\n clearProjectPendingAuthoringSync(projectConfig),\n {\n authoringStateId:\n pendingSync.phase === \"authoring_state_created\"\n ? pendingSync.authoringStateId\n : authoring.authoringStateId,\n sourceRevisionId: pendingSync.sourceRevisionId,\n sourceTreeHash: pendingSync.sourceTreeHash,\n manifestId: pendingSync.manifestId,\n manifestContentHash: pendingSync.manifestContentHash,\n localManifestContentHash: pendingSync.localManifestContentHash,\n ruleId: pendingSync.ruleId,\n },\n );\n}\n\nexport function updateProjectCompileState(\n projectConfig: ProjectConfig,\n compile: ProjectCompileState,\n): ProjectConfig {\n return {\n ...projectConfig,\n compile: {\n ...getProjectCompileState(projectConfig),\n ...compile,\n },\n };\n}\n\nexport function setLatestCompileAttempt(\n projectConfig: ProjectConfig,\n attempt: ProjectCompileAttempt,\n): ProjectConfig {\n return updateProjectCompileState(projectConfig, {\n ...getProjectCompileState(projectConfig),\n latestAttempt: attempt,\n latestSuccessful:\n attempt.status === \"successful\" && attempt.resultId\n ? {\n resultId: attempt.resultId,\n authoringStateId: attempt.authoringStateId,\n }\n : getProjectCompileState(projectConfig).latestSuccessful,\n });\n}\n\nexport function clearProjectCompileState(\n projectConfig: ProjectConfig,\n): ProjectConfig {\n return {\n ...projectConfig,\n compile: {},\n };\n}\n\nexport function updateProjectLocalMaintainerRegistry(\n projectConfig: ProjectConfig,\n localMaintainerRegistry: LocalMaintainerRegistryConfig | undefined,\n): ProjectConfig {\n return {\n ...projectConfig,\n localMaintainerRegistry,\n };\n}\n","import type { GameTopologyManifest } from \"@dreamboard/sdk-types\";\nimport {\n generateAuthoritativeFiles,\n generateSeedFiles,\n isFrameworkOwnedSetupProfilesSeed,\n} from \"@dreamboard/workspace-codegen\";\nimport { readTextFileIfExists, writeTextFile } from \"../../utils/fs.js\";\n\nexport interface WorkspaceCodegenWriteResult {\n written: string[];\n skipped: string[];\n merged: string[];\n}\n\nexport async function applyWorkspaceCodegen(options: {\n projectRoot: string;\n manifest: GameTopologyManifest;\n}): Promise<WorkspaceCodegenWriteResult> {\n const { projectRoot, manifest } = options;\n const authoritativeFiles = generateAuthoritativeFiles(manifest);\n const seedFiles = generateSeedFiles(manifest);\n\n const written: string[] = [];\n const skipped: string[] = [];\n const merged: string[] = [];\n\n for (const [relativePath, content] of Object.entries(authoritativeFiles)) {\n const filePath = `${projectRoot}/${relativePath}`;\n const existingContent = await readTextFileIfExists(filePath);\n await writeTextFile(filePath, content);\n if (existingContent !== content) {\n written.push(relativePath);\n }\n }\n\n for (const [relativePath, content] of Object.entries(seedFiles)) {\n const filePath = `${projectRoot}/${relativePath}`;\n const existingContent = await readTextFileIfExists(filePath);\n const shouldRefreshFrameworkSeed =\n relativePath === \"app/setup-profiles.ts\" &&\n isFrameworkOwnedSetupProfilesSeed(existingContent);\n\n if (shouldRefreshFrameworkSeed) {\n await writeTextFile(filePath, content);\n if (existingContent !== content) {\n written.push(relativePath);\n }\n continue;\n }\n\n const hasExistingContent =\n existingContent !== null && existingContent.trim().length > 0;\n if (hasExistingContent) {\n skipped.push(relativePath);\n continue;\n }\n\n await writeTextFile(filePath, content);\n written.push(relativePath);\n }\n\n written.sort();\n skipped.sort();\n merged.sort();\n return { written, skipped, merged };\n}\n","import { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport type { LocalMaintainerRegistryConfig } from \"../../types.js\";\nimport { resolveCliRepoRoot } from \"../../utils/repo-root.js\";\nimport {\n LOCAL_REGISTRY_URL,\n didLocalMaintainerSnapshotChange,\n getLocalMaintainerNpmrcContent,\n isLocalMaintainerRegistryEnabled,\n isLocalMaintainerRegistryUrl,\n} from \"./local-maintainer-registry-shared.js\";\n\nexport {\n didLocalMaintainerSnapshotChange,\n getLocalMaintainerNpmrcContent,\n isLocalMaintainerRegistryEnabled,\n isLocalMaintainerRegistryUrl,\n};\n\nconst MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));\n\nfunction getCliPackageRoot(): string {\n try {\n return path.join(\n resolveCliRepoRoot(import.meta.url),\n \"apps\",\n \"dreamboard-cli\",\n );\n } catch {\n return path.resolve(MODULE_DIR, \"../../..\");\n }\n}\n\nfunction getScriptInvocation(): {\n command: string;\n args: string[];\n attemptedCommand: string;\n cwd: string;\n} {\n const cliPackageRoot = getCliPackageRoot();\n const scriptPath = path.join(\n cliPackageRoot,\n \"scripts\",\n \"local-maintainer-registry.ts\",\n );\n if (!existsSync(scriptPath)) {\n throw new Error(\n [\n \"Dreamboard local maintainer registry support is only available from a source checkout.\",\n `Expected helper script at ${scriptPath}.`,\n ].join(\" \"),\n );\n }\n\n const command = process.platform === \"win32\" ? \"pnpm.cmd\" : \"pnpm\";\n const args = [\"exec\", \"tsx\", scriptPath];\n return {\n command,\n args,\n attemptedCommand: `${command} ${args.join(\" \")}`,\n cwd: cliPackageRoot,\n };\n}\n\nfunction buildScriptSetupError(options: {\n attemptedCommand: string;\n message: string;\n stderr?: string;\n}): Error {\n return new Error(\n [\n \"Dreamboard local maintainer registry support requires the source-checkout CLI tooling.\",\n options.message,\n `Attempted command: ${options.attemptedCommand}`,\n options.stderr?.trim() ? `stderr:\\n${options.stderr.trim()}` : null,\n ]\n .filter(Boolean)\n .join(\"\\n\"),\n );\n}\n\nasync function runLocalMaintainerScript<T>(args: string[]): Promise<T> {\n const invocation = getScriptInvocation();\n\n return new Promise<T>((resolve, reject) => {\n const child = spawn(invocation.command, [...invocation.args, ...args], {\n cwd: invocation.cwd,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: process.env,\n });\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (chunk) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n child.on(\"error\", (error) => {\n const errnoError = error as NodeJS.ErrnoException;\n if (errnoError.code === \"ENOENT\") {\n reject(\n buildScriptSetupError({\n attemptedCommand: invocation.attemptedCommand,\n message:\n \"`pnpm` was not found on PATH, so the source-checkout local maintainer helper could not run.\",\n }),\n );\n return;\n }\n reject(error);\n });\n child.on(\"close\", (code) => {\n if (code !== 0) {\n const missingTsx =\n stderr.includes('Command \"tsx\" not found') ||\n stderr.includes(\"tsx: command not found\") ||\n stderr.includes(\"tsx: not found\");\n reject(\n buildScriptSetupError({\n attemptedCommand: invocation.attemptedCommand,\n message: missingTsx\n ? \"`tsx` is not available for the source-checkout CLI package.\"\n : \"The source-checkout local maintainer helper failed.\",\n stderr,\n }),\n );\n return;\n }\n\n const trimmedStdout = stdout.trim();\n if (!trimmedStdout) {\n reject(\n buildScriptSetupError({\n attemptedCommand: invocation.attemptedCommand,\n message:\n \"The source-checkout local maintainer helper completed without returning JSON.\",\n stderr,\n }),\n );\n return;\n }\n\n try {\n resolve(JSON.parse(trimmedStdout) as T);\n } catch (error) {\n reject(\n buildScriptSetupError({\n attemptedCommand: invocation.attemptedCommand,\n message: `Failed to parse JSON from the source-checkout local maintainer helper: ${\n error instanceof Error ? error.message : String(error)\n }`,\n stderr: [stderr.trim(), trimmedStdout].filter(Boolean).join(\"\\n\"),\n }),\n );\n }\n });\n });\n}\n\nexport async function ensureLocalMaintainerSnapshot(\n apiBaseUrl: string,\n): Promise<LocalMaintainerRegistryConfig | null> {\n if (!isLocalMaintainerRegistryEnabled(apiBaseUrl)) {\n return null;\n }\n\n return runLocalMaintainerScript<LocalMaintainerRegistryConfig | null>([\n \"ensure-snapshot\",\n \"--api-base-url\",\n apiBaseUrl,\n ]);\n}\n\nexport async function readWorkspaceLocalMaintainerRegistry(\n projectRoot: string,\n fallbackRegistryUrl: string = LOCAL_REGISTRY_URL,\n): Promise<LocalMaintainerRegistryConfig | null> {\n return runLocalMaintainerScript<LocalMaintainerRegistryConfig | null>([\n \"read-workspace\",\n \"--project-root\",\n projectRoot,\n \"--fallback-registry-url\",\n fallbackRegistryUrl,\n ]);\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\nexport const LOCAL_REGISTRY_HOST = \"127.0.0.1\";\nexport const LOCAL_REGISTRY_PORT = 4873;\nexport const LOCAL_REGISTRY_URL = `http://${LOCAL_REGISTRY_HOST}:${LOCAL_REGISTRY_PORT}`;\nexport const LOCAL_SCOPE_NPMRC_CONTENT = `@dreamboard:registry=${LOCAL_REGISTRY_URL}\\n`;\nexport const LOCAL_SNAPSHOT_FORMAT_VERSION = 2;\nexport const SDK_PUBLISH_ORDER: readonly LocalMaintainerSdkPackageName[] = [\n \"@dreamboard/api-client\",\n \"@dreamboard/sdk-types\",\n \"@dreamboard/reducer-contract\",\n \"@dreamboard/app-sdk\",\n \"@dreamboard/ui-sdk\",\n \"@dreamboard/testing\",\n];\n\nexport type SnapshotManifest = {\n snapshotsByFingerprint: Record<string, LocalMaintainerRegistryConfig>;\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 dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n};\n\nexport function toLocalSnapshotTimestamp(date: Date = new Date()): string {\n return date\n .toISOString()\n .replace(/[-:]/g, \"\")\n .replace(/\\.\\d{3}Z$/, \"Z\");\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/\", \"\");\n}\n\nfunction packageFilesIncludeSource(files: string[] | undefined): boolean {\n if (!files) {\n return true;\n }\n\n return files.some((entry) => {\n const normalized = entry.replace(/^\\.\\/+/, \"\").replace(/\\/+$/, \"\");\n return (\n normalized === \".\" ||\n normalized === \"src\" ||\n normalized.startsWith(\"src/\")\n );\n });\n}\n\nfunction stripBunConditions(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(stripBunConditions);\n }\n if (!value || typeof value !== \"object\") {\n return value;\n }\n\n const entries = Object.entries(value).flatMap(([key, child]) =>\n key === \"bun\" ? [] : [[key, stripBunConditions(child)]],\n );\n return Object.fromEntries(entries);\n}\n\nexport function normalizeExportsForPublishedFiles(\n packageJson: Pick<PackageJsonShape, \"exports\" | \"files\">,\n): unknown {\n if (packageFilesIncludeSource(packageJson.files)) {\n return packageJson.exports;\n }\n return stripBunConditions(packageJson.exports);\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 appSdkVersion = packageJson.dependencies?.[\"@dreamboard/app-sdk\"];\n const uiSdkVersion = packageJson.dependencies?.[\"@dreamboard/ui-sdk\"];\n const sdkTypesVersion =\n packageJson.devDependencies?.[\"@dreamboard/sdk-types\"];\n const testingVersion = packageJson.devDependencies?.[\"@dreamboard/testing\"];\n if (\n !appSdkVersion?.includes(\"-local.\") ||\n !uiSdkVersion?.includes(\"-local.\") ||\n !sdkTypesVersion?.includes(\"-local.\")\n ) {\n return null;\n }\n\n return {\n registryUrl: fallbackRegistryUrl,\n snapshotId: shortHash(\n `${appSdkVersion}:${uiSdkVersion}:${sdkTypesVersion}:${testingVersion ?? \"\"}:${fallbackRegistryUrl}`,\n ),\n fingerprint: shortHash(\n `${appSdkVersion}:${uiSdkVersion}:${sdkTypesVersion}:${testingVersion ?? \"\"}:${fallbackRegistryUrl}`,\n ),\n publishedAt: \"\",\n packages: {\n \"@dreamboard/api-client\": \"\",\n \"@dreamboard/app-sdk\": appSdkVersion,\n \"@dreamboard/reducer-contract\": undefined,\n \"@dreamboard/sdk-types\": sdkTypesVersion,\n \"@dreamboard/testing\": testingVersion,\n \"@dreamboard/ui-sdk\": uiSdkVersion,\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:registry=http:\\/\\/127\\.0\\.0\\.1:\\d+/.test(fileContent);\n}\n","import crypto from \"node:crypto\";\nimport { spawn } from \"node:child_process\";\nimport { EventEmitter } from \"node:events\";\nimport { existsSync } from \"node:fs\";\nimport { mkdir, lstat, readFile, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Readable } from \"node:stream\";\nimport { fileURLToPath } from \"node:url\";\nimport {\n buildDependencyPreparationFailureMessage,\n buildMissingDependencyToolingMessage,\n buildMissingGeneratedLockfileMessage,\n buildPackageLockConflictMessage,\n} from \"./dependency-tooling-messages.js\";\nimport { FRAMEWORK_PNPM_OVERRIDES } from \"./framework-dependencies.js\";\n\ntype LockfileGenerationOptions = Record<string, never>;\n\ntype PackageJsonShape = {\n packageManager?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n pnpm?: Record<string, unknown>;\n};\n\ntype DependencyInstallMetadata = {\n dependencyFingerprint: string;\n installedAt: string;\n packageManager: string;\n};\n\ntype LockfileCommand = {\n binary: string;\n args: string[];\n};\n\nexport type WorkspaceDependencyReconciliationResult = {\n required: boolean;\n installed: boolean;\n lockfileGenerated: boolean;\n packageManagerNormalized: boolean;\n fingerprint: string | null;\n};\n\nconst MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));\nconst CLI_ROOT = path.resolve(MODULE_DIR, \"../../..\");\nconst REPO_ROOT = path.resolve(CLI_ROOT, \"../..\");\nconst REPO_PACKAGE_JSON_PATH = path.join(REPO_ROOT, \"package.json\");\nconst DEFAULT_PACKAGE_MANAGER = \"pnpm@10.4.1\";\nconst DEPENDENCY_INSTALL_METADATA_PATH_SEGMENTS = [\n \".dreamboard\",\n \"dependency-install.json\",\n] as const;\n\nclass LockfileGenerationError extends Error {\n constructor(\n readonly binary: string,\n readonly details: {\n code?: number | null;\n stdout: string;\n stderr: string;\n cause?: Error;\n },\n ) {\n super(buildLockfileGenerationErrorMessage(binary, details), {\n cause: details.cause,\n });\n this.name = \"LockfileGenerationError\";\n }\n}\n\nexport async function generatePnpmLockfile(\n projectRoot: string,\n _options: LockfileGenerationOptions = {},\n): Promise<boolean> {\n await ensurePackageManagerNormalized(projectRoot);\n await assertNoNpmLockfileConflict(projectRoot);\n await runPackageManagerCommand(projectRoot, {\n args: [\n \"install\",\n \"--ignore-workspace\",\n \"--lockfile-only\",\n \"--config.shared-workspace-lockfile=false\",\n ],\n });\n await assertPnpmLockfilePresent(projectRoot);\n return true;\n}\n\nexport async function installWorkspaceDependencies(\n projectRoot: string,\n _options: LockfileGenerationOptions = {},\n): Promise<boolean> {\n const result = await reconcileWorkspaceDependencies(projectRoot);\n return result.required;\n}\n\nexport async function reconcileWorkspaceDependencies(\n projectRoot: string,\n): Promise<WorkspaceDependencyReconciliationResult> {\n const packageJsonPath = path.join(projectRoot, \"package.json\");\n if (!(await pathExists(packageJsonPath))) {\n return {\n required: false,\n installed: false,\n lockfileGenerated: false,\n packageManagerNormalized: false,\n fingerprint: null,\n };\n }\n\n await assertNoNpmLockfileConflict(projectRoot);\n const packageManagerNormalized =\n await ensurePackageManagerNormalized(projectRoot);\n const pnpmLockfilePath = path.join(projectRoot, \"pnpm-lock.yaml\");\n const nodeModulesPath = path.join(projectRoot, \"node_modules\");\n const metadataPath = path.join(\n projectRoot,\n ...DEPENDENCY_INSTALL_METADATA_PATH_SEGMENTS,\n );\n\n let lockfileGenerated = false;\n let installed = false;\n const metadata = await readJsonFile<DependencyInstallMetadata>(metadataPath);\n const lockfileExists = await pathExists(pnpmLockfilePath);\n\n if (!lockfileExists) {\n await runPackageManagerCommand(projectRoot, {\n args: [\n \"install\",\n \"--ignore-workspace\",\n \"--config.shared-workspace-lockfile=false\",\n ],\n });\n lockfileGenerated = true;\n installed = true;\n }\n\n await assertPnpmLockfilePresent(projectRoot);\n let fingerprint = await fingerprintInstallManifest({\n packageJsonPath,\n lockfilePath: pnpmLockfilePath,\n });\n const hasValidInstalledDeps =\n (await pathExists(nodeModulesPath)) &&\n (await hasValidInstalledDependencies({\n packageJsonPath,\n nodeModulesPath,\n }));\n const shouldInstall =\n !installed &&\n (metadata?.dependencyFingerprint !== fingerprint || !hasValidInstalledDeps);\n\n if (shouldInstall) {\n await rm(nodeModulesPath, { recursive: true, force: true });\n await runPackageManagerCommand(projectRoot, {\n args: [\n \"install\",\n \"--ignore-workspace\",\n \"--config.shared-workspace-lockfile=false\",\n ],\n });\n installed = true;\n fingerprint = await fingerprintInstallManifest({\n packageJsonPath,\n lockfilePath: pnpmLockfilePath,\n });\n }\n\n if (installed || packageManagerNormalized || !metadata) {\n await mkdir(path.dirname(metadataPath), { recursive: true });\n await writeJsonFile(metadataPath, {\n dependencyFingerprint: fingerprint,\n installedAt: new Date().toISOString(),\n packageManager: await readRepoPackageManager(),\n } satisfies DependencyInstallMetadata);\n }\n\n return {\n required: true,\n installed,\n lockfileGenerated,\n packageManagerNormalized,\n fingerprint,\n };\n}\n\nasync function assertNoNpmLockfileConflict(projectRoot: string): Promise<void> {\n const packageLockPath = path.join(projectRoot, \"package-lock.json\");\n const pnpmLockPath = path.join(projectRoot, \"pnpm-lock.yaml\");\n if (\n (await pathExists(packageLockPath)) &&\n !(await pathExists(pnpmLockPath))\n ) {\n throw new Error(buildPackageLockConflictMessage());\n }\n}\n\nasync function assertPnpmLockfilePresent(projectRoot: string): Promise<void> {\n const pnpmLockfilePath = path.join(projectRoot, \"pnpm-lock.yaml\");\n if (!(await pathExists(pnpmLockfilePath))) {\n throw new Error(buildMissingGeneratedLockfileMessage());\n }\n}\n\nasync function ensurePackageManagerNormalized(\n projectRoot: string,\n): Promise<boolean> {\n const packageJsonPath = path.join(projectRoot, \"package.json\");\n const packageJsonContent = await readFile(packageJsonPath, \"utf8\");\n const packageJson = JSON.parse(packageJsonContent) as PackageJsonShape;\n const packageManager = await readRepoPackageManager();\n const nextPackageJson: PackageJsonShape = {\n ...packageJson,\n packageManager,\n pnpm: mergePnpmConfig(packageJson.pnpm),\n };\n const normalizedPackageJson = `${JSON.stringify(nextPackageJson, null, 2)}\\n`;\n if (normalizedPackageJson === packageJsonContent) {\n return false;\n }\n await writeFile(packageJsonPath, normalizedPackageJson, \"utf8\");\n return true;\n}\n\nfunction mergePnpmConfig(\n existingPnpm: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n const existingOverrides =\n existingPnpm?.overrides &&\n typeof existingPnpm.overrides === \"object\" &&\n !Array.isArray(existingPnpm.overrides)\n ? (existingPnpm.overrides as Record<string, unknown>)\n : {};\n return {\n ...(existingPnpm ?? {}),\n overrides: {\n ...existingOverrides,\n ...FRAMEWORK_PNPM_OVERRIDES,\n },\n };\n}\n\nasync function fingerprintInstallManifest(options: {\n packageJsonPath: string;\n lockfilePath: string;\n}): Promise<string> {\n const packageJson = await readFile(options.packageJsonPath, \"utf8\");\n const lockfile = await readFile(options.lockfilePath, \"utf8\");\n const packageManager = await readRepoPackageManager();\n return fingerprintContent([\n packageJson,\n lockfile,\n `packageManager:${packageManager}`,\n ]);\n}\n\nasync function hasValidInstalledDependencies(options: {\n packageJsonPath: string;\n nodeModulesPath: string;\n}): Promise<boolean> {\n const packageJson = await readJsonFile<PackageJsonShape>(\n options.packageJsonPath,\n );\n if (!packageJson) {\n return false;\n }\n\n const directDependencyNames = new Set<string>();\n for (const field of [\n \"dependencies\",\n \"devDependencies\",\n \"optionalDependencies\",\n ] as const) {\n for (const packageName of Object.keys(packageJson[field] ?? {})) {\n directDependencyNames.add(packageName);\n }\n }\n\n if (directDependencyNames.size === 0) {\n return true;\n }\n\n for (const packageName of directDependencyNames) {\n if (\n !(await pathExists(\n path.join(\n options.nodeModulesPath,\n ...packageName.split(\"/\"),\n \"package.json\",\n ),\n ))\n ) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction hasExactPnpmVersion(value?: string): boolean {\n return /^pnpm@\\d+\\.\\d+\\.\\d+(?:[-+][0-9A-Za-z.-]+)?$/.test(value ?? \"\");\n}\n\nasync function readRepoPackageManager(): Promise<string> {\n const packageJson = await readJsonFile<PackageJsonShape>(\n REPO_PACKAGE_JSON_PATH,\n );\n const packageManager = packageJson?.packageManager?.trim();\n return hasExactPnpmVersion(packageManager)\n ? packageManager!\n : DEFAULT_PACKAGE_MANAGER;\n}\n\nfunction fingerprintContent(parts: string[]): string {\n return crypto\n .createHash(\"sha256\")\n .update(parts.join(\"\\n---\\n\"))\n .digest(\"hex\");\n}\n\nfunction resolvePnpmInstallInvocation(installArgs: readonly string[]): {\n command: string;\n args: string[];\n} {\n const corepackPath = path.join(path.dirname(process.execPath), \"corepack\");\n if (existsSync(corepackPath)) {\n return { command: corepackPath, args: [\"pnpm\", ...installArgs] };\n }\n return { command: \"pnpm\", args: [...installArgs] };\n}\n\nasync function runPackageManagerCommand(\n projectRoot: string,\n command: { args: string[] },\n): Promise<void> {\n const invocation = resolvePnpmInstallInvocation(command.args);\n await runLockfileCommand(projectRoot, {\n binary: invocation.command,\n args: invocation.args,\n });\n}\n\nasync function runLockfileCommand(\n projectRoot: string,\n command: LockfileCommand,\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const child = spawn(command.binary, command.args, {\n cwd: projectRoot,\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n let stdout = \"\";\n let stderr = \"\";\n\n bindStream(child.stdout, (chunk) => {\n stdout += chunk.toString();\n });\n bindStream(child.stderr, (chunk) => {\n stderr += chunk.toString();\n });\n\n child.on(\"error\", (cause) => {\n reject(\n new LockfileGenerationError(command.binary, {\n stdout,\n stderr,\n cause,\n }),\n );\n });\n child.on(\"close\", (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n reject(\n new LockfileGenerationError(command.binary, {\n code,\n stdout,\n stderr,\n }),\n );\n });\n });\n}\n\nfunction buildLockfileGenerationErrorMessage(\n binary: string,\n details: {\n code?: number | null;\n stdout: string;\n stderr: string;\n cause?: Error;\n },\n): string {\n if (details.cause) {\n const errnoError = details.cause as NodeJS.ErrnoException;\n const binaryName = path.basename(binary).toLowerCase();\n if (\n errnoError.code === \"ENOENT\" &&\n (binaryName === \"pnpm\" ||\n binaryName === \"pnpm.cmd\" ||\n binaryName === \"corepack\" ||\n binaryName === \"corepack.exe\")\n ) {\n return buildMissingDependencyToolingMessage();\n }\n return `Failed to start ${binary} for Dreamboard dependency reconciliation. ${details.cause.message}`;\n }\n\n const output = [details.stdout.trim(), details.stderr.trim()]\n .filter((chunk) => chunk.length > 0)\n .join(\"\\n\");\n\n return buildDependencyPreparationFailureMessage({\n exitCode: details.code,\n output,\n });\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await lstat(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readJsonFile<T>(filePath: string): Promise<T | null> {\n try {\n return JSON.parse(await readFile(filePath, \"utf8\")) as T;\n } catch {\n return null;\n }\n}\n\nasync function writeJsonFile(filePath: string, value: unknown): Promise<void> {\n await writeFile(filePath, `${JSON.stringify(value, null, 2)}\\n`, \"utf8\");\n}\n\nfunction bindStream(\n stream: Readable | EventEmitter | null | undefined,\n onData: (chunk: Buffer | string) => void,\n): void {\n stream?.on(\"data\", onData);\n}\n","import { DEFAULT_WEB_BASE_URL } from \"../../constants.js\";\n\nexport const DEPENDENCY_SETUP_DOCS_PATH = \"/docs/reference/dependency-setup\";\nexport const DEPENDENCY_SETUP_DOCS_URL = `${DEFAULT_WEB_BASE_URL}${DEPENDENCY_SETUP_DOCS_PATH}`;\n\nexport function buildMissingDependencyToolingMessage(): string {\n return [\n \"Dreamboard needs dependency tooling to finish `dreamboard sync`.\",\n \"Use Node 20+ with Corepack enabled, then run `dreamboard sync` again.\",\n \"If Corepack is unavailable on this machine, install pnpm globally with `npm install -g pnpm`.\",\n `Help: ${DEPENDENCY_SETUP_DOCS_URL}`,\n ].join(\"\\n\");\n}\n\nexport function buildPackageLockConflictMessage(): string {\n return [\n \"Dreamboard manages workspace dependencies during `dreamboard sync`.\",\n \"This workspace has an npm lockfile that conflicts with Dreamboard-managed dependencies.\",\n \"Remove `package-lock.json` and run `dreamboard sync` again.\",\n `Help: ${DEPENDENCY_SETUP_DOCS_URL}`,\n ].join(\"\\n\");\n}\n\nexport function buildMissingGeneratedLockfileMessage(): string {\n return [\n \"Dreamboard could not finish preparing workspace dependencies during `dreamboard sync`.\",\n \"Diagnostic: `pnpm-lock.yaml` was not created.\",\n `Help: ${DEPENDENCY_SETUP_DOCS_URL}`,\n ].join(\"\\n\");\n}\n\nexport function buildDependencyPreparationFailureMessage(options: {\n output?: string;\n exitCode?: number | null;\n}): string {\n const details = options.output?.trim();\n return [\n `Dreamboard could not finish preparing workspace dependencies during \\`dreamboard sync\\`${options.exitCode != null ? ` (exit code ${options.exitCode})` : \"\"}.`,\n details ? `Diagnostic output:\\n${details}` : null,\n `Help: ${DEPENDENCY_SETUP_DOCS_URL}`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n","import path from \"node:path\";\nimport type { ProjectConfig } from \"../../types.js\";\nimport { readJsonFile, readTextFileIfExists } from \"../../utils/fs.js\";\n\ntype PackageJsonWithDeps = {\n packageManager?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n pnpm?: {\n overrides?: Record<string, unknown>;\n [key: string]: unknown;\n };\n};\n\nexport type SourceDependencyProfile = {\n kind: \"npm-registry\";\n packageManager?: string;\n dreamboardRegistryUrl?: string;\n localSnapshotId?: string;\n packages: Record<string, string>;\n};\n\ntype DependencyProblem = {\n location: string;\n packageName: string;\n specifier: string;\n};\n\nconst DEPENDENCY_FIELDS = [\n \"dependencies\",\n \"devDependencies\",\n \"optionalDependencies\",\n \"peerDependencies\",\n] as const;\n\nconst UNPORTABLE_SPECIFIER_PATTERN = /^(file|link|portal|workspace):/;\n\nexport async function buildSourceDependencyProfile(options: {\n projectRoot: string;\n projectConfig?: ProjectConfig;\n}): Promise<SourceDependencyProfile> {\n const packageJson = await readProjectPackageJson(options.projectRoot);\n const packages = collectDreamboardPackageSpecifiers(packageJson);\n return {\n kind: \"npm-registry\",\n packageManager: packageJson.packageManager,\n dreamboardRegistryUrl:\n (await readDreamboardRegistryFromNpmrc(options.projectRoot)) ??\n options.projectConfig?.localMaintainerRegistry?.registryUrl,\n localSnapshotId: options.projectConfig?.localMaintainerRegistry?.snapshotId,\n packages,\n };\n}\n\nexport async function assertCompilerPortableDependencies(options: {\n projectRoot: string;\n projectConfig?: ProjectConfig;\n}): Promise<SourceDependencyProfile> {\n const packageJson = await readProjectPackageJson(options.projectRoot);\n const problems = collectUnportableDreamboardSpecifiers(packageJson);\n if (problems.length > 0) {\n const details = problems\n .map(\n (problem) =>\n `${problem.location} ${problem.packageName} -> ${problem.specifier}`,\n )\n .join(\"; \");\n throw new Error(\n [\n \"Compiler-bound workspaces must install Dreamboard packages from a registry.\",\n `Found unportable Dreamboard dependency specifier(s): ${details}.`,\n \"Run `dreamboard sync` from a workspace that uses registry-pinned @dreamboard/* and dreamboard versions before compiling.\",\n ].join(\" \"),\n );\n }\n\n const profile = await buildSourceDependencyProfile(options);\n const hasLocalSnapshotPackage = Object.values(profile.packages).some(\n (value) => value.includes(\"-local.\"),\n );\n if (hasLocalSnapshotPackage && !profile.dreamboardRegistryUrl) {\n throw new Error(\n \"This workspace references local Dreamboard snapshot versions but has no @dreamboard registry configured. Run `dreamboard sync --env local` to refresh .npmrc before compiling.\",\n );\n }\n\n return profile;\n}\n\nasync function readProjectPackageJson(\n projectRoot: string,\n): Promise<PackageJsonWithDeps> {\n return readJsonFile<PackageJsonWithDeps>(\n path.join(projectRoot, \"package.json\"),\n );\n}\n\nfunction collectDreamboardPackageSpecifiers(\n packageJson: PackageJsonWithDeps,\n): Record<string, string> {\n const packages: Record<string, string> = {};\n for (const field of DEPENDENCY_FIELDS) {\n const dependencies = packageJson[field];\n if (!dependencies) continue;\n for (const [packageName, specifier] of Object.entries(dependencies)) {\n if (isDreamboardPackage(packageName)) {\n packages[packageName] = specifier;\n }\n }\n }\n\n const overrides = packageJson.pnpm?.overrides;\n if (overrides) {\n for (const [packageName, specifier] of Object.entries(overrides)) {\n if (\n isDreamboardPackage(packageName) &&\n typeof specifier === \"string\" &&\n packages[packageName] === undefined\n ) {\n packages[packageName] = specifier;\n }\n }\n }\n return packages;\n}\n\nfunction collectUnportableDreamboardSpecifiers(\n packageJson: PackageJsonWithDeps,\n): DependencyProblem[] {\n const problems: DependencyProblem[] = [];\n for (const field of DEPENDENCY_FIELDS) {\n const dependencies = packageJson[field];\n if (!dependencies) continue;\n for (const [packageName, specifier] of Object.entries(dependencies)) {\n if (\n isDreamboardPackage(packageName) &&\n UNPORTABLE_SPECIFIER_PATTERN.test(specifier)\n ) {\n problems.push({ location: field, packageName, specifier });\n }\n }\n }\n\n const overrides = packageJson.pnpm?.overrides;\n if (overrides) {\n for (const [packageName, specifier] of Object.entries(overrides)) {\n if (\n isDreamboardPackage(packageName) &&\n typeof specifier === \"string\" &&\n UNPORTABLE_SPECIFIER_PATTERN.test(specifier)\n ) {\n problems.push({\n location: \"pnpm.overrides\",\n packageName,\n specifier,\n });\n }\n }\n }\n return problems;\n}\n\nfunction isDreamboardPackage(packageName: string): boolean {\n return packageName === \"dreamboard\" || packageName.startsWith(\"@dreamboard/\");\n}\n\nasync function readDreamboardRegistryFromNpmrc(\n projectRoot: string,\n): Promise<string | undefined> {\n const npmrc = await readTextFileIfExists(path.join(projectRoot, \".npmrc\"));\n if (!npmrc) return undefined;\n for (const line of npmrc.split(/\\r?\\n/)) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"@dreamboard:registry=\")) continue;\n return trimmed.slice(\"@dreamboard:registry=\".length).trim() || undefined;\n }\n return undefined;\n}\n","import { MANIFEST_TYPECHECK_CONFIG_FILE } from \"../../constants.js\";\nimport { spawn } from \"node:child_process\";\nimport { lstat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport type LocalTypecheckResult = {\n success: boolean;\n output: string;\n skipped?: boolean;\n};\n\ntype TypecheckRunner = {\n command: string;\n argsPrefix: string[];\n};\n\nconst MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));\nconst REPO_ROOT = path.resolve(MODULE_DIR, \"../../../../..\");\nconst TYPESCRIPT_NODE_MODULES = path.join(REPO_ROOT, \"node_modules\");\nconst TYPESCRIPT_BIN_PATH_SEGMENTS = [\n \"node_modules\",\n \"typescript\",\n \"bin\",\n \"tsc\",\n];\nconst TYPESCRIPT_CLI = path.join(\n TYPESCRIPT_NODE_MODULES,\n \"typescript\",\n \"bin\",\n \"tsc\",\n);\n\nfunction getProjectNodeModules(projectRoot: string): string {\n return path.join(projectRoot, \"node_modules\");\n}\n\nfunction getProjectTypescriptCli(projectRoot: string): string {\n return path.join(projectRoot, ...TYPESCRIPT_BIN_PATH_SEGMENTS);\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await lstat(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function ensureTypecheckDependencies(\n projectRoot: string,\n): Promise<string | null> {\n if (await pathExists(getProjectNodeModules(projectRoot))) {\n return null;\n }\n\n return `Skipping local typecheck: workspace dependencies are not installed at ${getProjectNodeModules(projectRoot)}. Run \\`dreamboard sync\\` to reconcile workspace dependencies first.`;\n}\n\nasync function resolveTypecheckRunner(\n projectRoot: string,\n): Promise<TypecheckRunner | null> {\n const localTypescriptCli = getProjectTypescriptCli(projectRoot);\n if (await pathExists(localTypescriptCli)) {\n return {\n command: process.execPath,\n argsPrefix: [localTypescriptCli],\n };\n }\n\n if (await pathExists(TYPESCRIPT_CLI)) {\n return {\n command: process.execPath,\n argsPrefix: [TYPESCRIPT_CLI],\n };\n }\n\n const globalTscAvailable = await new Promise<boolean>((resolve) => {\n const child = spawn(\"tsc\", [\"--version\"], {\n env: process.env,\n stdio: \"ignore\",\n });\n\n child.on(\"error\", () => {\n resolve(false);\n });\n child.on(\"close\", (code) => {\n resolve(code === 0);\n });\n });\n\n if (!globalTscAvailable) {\n return null;\n }\n\n return {\n command: \"tsc\",\n argsPrefix: [],\n };\n}\n\nasync function runTypecheckProject(\n runner: TypecheckRunner,\n projectRoot: string,\n projectPath: string,\n): Promise<LocalTypecheckResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(\n runner.command,\n [...runner.argsPrefix, \"--noEmit\", \"-p\", projectPath],\n {\n cwd: projectRoot,\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n },\n );\n\n let stdout = \"\";\n let stderr = \"\";\n\n child.stdout.on(\"data\", (chunk) => {\n stdout += chunk.toString();\n });\n child.stderr.on(\"data\", (chunk) => {\n stderr += chunk.toString();\n });\n child.on(\"error\", (error) => {\n reject(new Error(`Failed to start local typecheck. ${error.message}`));\n });\n child.on(\"close\", (code) => {\n const output = [stdout, stderr].filter(Boolean).join(\"\\n\").trim();\n resolve({\n success: code === 0,\n output,\n });\n });\n });\n}\n\nexport async function runLocalTypecheck(\n projectRoot: string,\n): Promise<LocalTypecheckResult> {\n const dependencySkipReason = await ensureTypecheckDependencies(projectRoot);\n if (dependencySkipReason) {\n return {\n success: true,\n skipped: true,\n output: dependencySkipReason,\n };\n }\n\n const runner = await resolveTypecheckRunner(projectRoot);\n if (!runner) {\n return {\n success: true,\n skipped: true,\n output:\n \"Skipping local typecheck: TypeScript CLI was not found in workspace dependencies or on PATH.\",\n };\n }\n\n // The three projects are independent (no cross-project references), so\n // checking them in parallel roughly halves wall-clock time without changing\n // correctness. The slowest project (typically `ui/tsconfig.json`) bounds the\n // total cost.\n const results = await Promise.all(\n [\n MANIFEST_TYPECHECK_CONFIG_FILE,\n \"app/tsconfig.json\",\n \"ui/tsconfig.json\",\n ].map((projectPath) =>\n runTypecheckProject(runner, projectRoot, projectPath),\n ),\n );\n\n const firstFailure = results.find((result) => !result.success);\n if (firstFailure) {\n return firstFailure;\n }\n\n return {\n success: true,\n output: \"\",\n };\n}\n","import type { CompiledResult } from \"@dreamboard/api-client\";\nimport type { ProjectConfig } from \"../types.js\";\nimport { defineCommand } from \"citty\";\nimport consola from \"consola\";\nimport { CONFIG_FLAG_ARGS } from \"../command-args.js\";\nimport { resolveProjectContext } from \"../config/resolve.js\";\nimport { updateProjectState } from \"../config/project-config.js\";\nimport { parseCompileCommandArgs } from \"../flags.js\";\nimport { getLocalDiff } from \"../services/project/local-files.js\";\nimport { assertCliStaticScaffoldComplete } from \"../services/project/static-scaffold.js\";\nimport { assertCompilerPortableDependencies } from \"../services/project/dependency-portability.js\";\nimport { runLocalTypecheck } from \"../services/project/local-typecheck.js\";\nimport {\n findCompiledResultsForAuthoringState,\n getAuthoringHeadSdk,\n queueCompiledResultJobSdk,\n waitForCompiledResultJobSdk,\n} from \"../services/api/index.js\";\nimport {\n getProjectAuthoringState,\n getProjectPendingAuthoringSync,\n setLatestCompileAttempt,\n} from \"../services/project/project-state.js\";\nimport { formatCliError } from \"../utils/errors.js\";\n\nfunction formatDiagnosticsSummary(\n diagnostics: Array<{ message?: string }> | null | undefined,\n): string | undefined {\n const firstMessage = diagnostics?.find(\n (diagnostic) => diagnostic.message,\n )?.message;\n return firstMessage?.trim() || undefined;\n}\n\nfunction formatCompileJobProgressMessage(job: {\n status: string;\n phase?: string;\n queuePosition?: number;\n message?: string;\n}): string {\n const phase = job.phase ? ` [${job.phase}]` : \"\";\n const detail = job.message ? ` ${job.message}` : \"\";\n if (job.status === \"PENDING\") {\n const queue =\n typeof job.queuePosition === \"number\"\n ? ` (queue ${job.queuePosition + 1})`\n : \"\";\n return `Compile queued${queue}${phase}${detail}`.trim();\n }\n if (job.status === \"RUNNING\") {\n return `Compile running${phase}${detail}`.trim();\n }\n if (job.status === \"FAILED\") {\n return `Compile failed${phase}${detail}`.trim();\n }\n return `Compile ${job.status.toLowerCase()}${phase}${detail}`.trim();\n}\n\nfunction formatFailedCompileJobSummary(job: {\n phase?: string;\n message?: string | null;\n errorMessage?: string | null;\n}): string {\n return formatCompileJobProgressMessage({\n status: \"FAILED\",\n phase: job.phase,\n message: job.errorMessage ?? job.message ?? undefined,\n });\n}\n\nfunction formatFailedCompileJobWithCompiledResultMessage(options: {\n compiledResultId: string;\n job: {\n phase?: string;\n message?: string | null;\n errorMessage?: string | null;\n };\n}): string {\n return `${formatFailedCompileJobSummary(options.job)}. The backend created compiled result ${options.compiledResultId}, but the compile job did not complete cleanly. Run 'dreamboard compile' again after fixing the backend/compiler issue.`;\n}\n\nfunction formatRemoteCompileCommandError(options: {\n message: string;\n jobId?: string;\n}): string {\n const detail = options.message.trim();\n const hasActionableTerminalContext =\n /^Compile\\s+(failed|completed|cancelled|interrupted)\\b/i.test(detail);\n if (options.jobId) {\n if (hasActionableTerminalContext) {\n return `Remote compile job ${options.jobId} could not be completed. ${detail}`;\n }\n return `Remote compile job ${options.jobId} could not be completed. ${detail} Check backend health and try 'dreamboard compile' again.`;\n }\n return `Remote compile could not be started. ${detail} Check backend health and try 'dreamboard compile' again.`;\n}\n\nasync function persistFailedCompileAttempt(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n authoringStateId: string;\n diagnosticsSummary: string;\n jobId?: string;\n}): Promise<void> {\n const nextProjectConfig = setLatestCompileAttempt(options.projectConfig, {\n resultId: undefined,\n jobId: options.jobId,\n authoringStateId: options.authoringStateId,\n status: \"failed\",\n diagnosticsSummary: options.diagnosticsSummary,\n });\n await updateProjectState(options.projectRoot, nextProjectConfig);\n}\n\nexport default defineCommand({\n meta: {\n name: \"compile\",\n description: \"Compile the current remote authoring head\",\n },\n args: {\n debug: {\n type: \"boolean\",\n description: \"Print additional compile progress context\",\n default: false,\n },\n \"skip-local-check\": {\n type: \"boolean\",\n description: \"Skip the best-effort local typecheck before compiling\",\n default: false,\n },\n ...CONFIG_FLAG_ARGS,\n },\n async run({ args }) {\n const parsedArgs = parseCompileCommandArgs(args);\n const { projectRoot, projectConfig } =\n await resolveProjectContext(parsedArgs);\n await assertCompilerPortableDependencies({ projectRoot, projectConfig });\n\n const diff = await getLocalDiff(projectRoot);\n await assertCliStaticScaffoldComplete(projectRoot, diff.deleted);\n if (\n diff.modified.length > 0 ||\n diff.added.length > 0 ||\n diff.deleted.length > 0\n ) {\n throw new Error(\n \"Local authored changes are not synced yet. Run 'dreamboard sync' before compiling.\",\n );\n }\n\n const localAuthoring = getProjectAuthoringState(projectConfig);\n const pendingSync = getProjectPendingAuthoringSync(projectConfig);\n if (pendingSync) {\n if (pendingSync.phase === \"authoring_state_created\") {\n throw new Error(\n \"Previous sync reached the remote authored head, but local scaffold finalization did not complete. Run 'dreamboard sync' again before compiling.\",\n );\n }\n throw new Error(\n \"Previous sync uploaded source changes but did not finish creating the authored head. Run 'dreamboard sync' again before compiling.\",\n );\n }\n if (!localAuthoring.authoringStateId) {\n throw new Error(\n \"This workspace does not know its authored base yet. Run 'dreamboard sync' first.\",\n );\n }\n\n const remoteHead = await getAuthoringHeadSdk(projectConfig.gameId);\n if (!remoteHead?.authoringStateId) {\n throw new Error(\"Remote has no authored state to compile yet.\");\n }\n if (remoteHead.authoringStateId !== localAuthoring.authoringStateId) {\n throw new Error(\n `Remote authored state is ${remoteHead.authoringStateId} but this workspace is based on ${localAuthoring.authoringStateId}. Run 'dreamboard pull' before compiling.`,\n );\n }\n\n if (!parsedArgs[\"skip-local-check\"]) {\n consola.start(\"Running local typecheck...\");\n const typecheckResult = await runLocalTypecheck(projectRoot);\n if (typecheckResult.skipped) {\n if (typecheckResult.output) {\n consola.warn(typecheckResult.output);\n }\n } else if (!typecheckResult.success) {\n if (typecheckResult.output) {\n consola.error(typecheckResult.output);\n }\n throw new Error(\n \"Local typecheck failed. Fix the diagnostics or re-run with --skip-local-check.\",\n );\n } else {\n consola.success(\"Local typecheck passed.\");\n }\n }\n\n const existingCompiledResult = (\n await findCompiledResultsForAuthoringState({\n gameId: projectConfig.gameId,\n authoringStateId: localAuthoring.authoringStateId,\n })\n ).find((result) => result.success);\n if (existingCompiledResult) {\n const nextProjectConfig = setLatestCompileAttempt(projectConfig, {\n resultId: existingCompiledResult.id,\n jobId: undefined,\n authoringStateId: existingCompiledResult.authoringStateId,\n status: \"successful\",\n diagnosticsSummary: undefined,\n });\n await updateProjectState(projectRoot, nextProjectConfig);\n consola.success(\n `Reusing compiled ${existingCompiledResult.id} for authored state ${existingCompiledResult.authoringStateId}.`,\n );\n return;\n }\n\n let compileJobId: string | undefined;\n let compileJobStatus: string | undefined;\n let compileJobPhase: string | undefined;\n let compileJobMessage: string | null | undefined;\n let compileJobErrorMessage: string | null | undefined;\n let compiledResult: CompiledResult;\n try {\n const compileJob = await queueCompiledResultJobSdk({\n gameId: projectConfig.gameId,\n authoringStateId: localAuthoring.authoringStateId,\n });\n compileJobId = compileJob.jobId;\n if (!compileJobId) {\n throw new Error(\"Failed to create compile job: missing jobId.\");\n }\n\n ({\n job: {\n status: compileJobStatus,\n phase: compileJobPhase,\n message: compileJobMessage,\n errorMessage: compileJobErrorMessage,\n },\n compiledResult,\n } = await waitForCompiledResultJobSdk({\n gameId: projectConfig.gameId,\n jobId: compileJobId,\n onProgress: (job) => {\n const message = formatCompileJobProgressMessage(job);\n if (parsedArgs.debug) {\n consola.info(message);\n } else {\n consola.start(message);\n }\n },\n }));\n } catch (error) {\n const message = formatCliError(error);\n if (compileJobId) {\n await persistFailedCompileAttempt({\n projectRoot,\n projectConfig,\n authoringStateId: localAuthoring.authoringStateId,\n diagnosticsSummary: message,\n jobId: compileJobId,\n });\n }\n throw new Error(\n formatRemoteCompileCommandError({\n message,\n jobId: compileJobId,\n }),\n );\n }\n\n const failedJobProducedCompiledResult =\n compileJobStatus === \"FAILED\" && compiledResult.success;\n const failedJobWithCompiledResultSummary = failedJobProducedCompiledResult\n ? formatFailedCompileJobSummary({\n phase: compileJobPhase,\n message: compileJobMessage,\n errorMessage: compileJobErrorMessage,\n })\n : undefined;\n\n const nextProjectConfig = setLatestCompileAttempt(projectConfig, {\n resultId: compiledResult.id,\n jobId: compileJobId,\n authoringStateId: compiledResult.authoringStateId,\n status:\n compiledResult.success && !failedJobProducedCompiledResult\n ? \"successful\"\n : \"failed\",\n diagnosticsSummary:\n failedJobWithCompiledResultSummary ??\n formatDiagnosticsSummary(compiledResult.diagnostics),\n });\n await updateProjectState(projectRoot, nextProjectConfig);\n\n if (failedJobProducedCompiledResult) {\n throw new Error(\n formatFailedCompileJobWithCompiledResultMessage({\n compiledResultId: compiledResult.id,\n job: {\n phase: compileJobPhase,\n message: compileJobMessage,\n errorMessage: compileJobErrorMessage,\n },\n }),\n );\n }\n\n if (!compiledResult.success) {\n for (const diagnostic of compiledResult.diagnostics ?? []) {\n if (diagnostic.message) {\n consola.error(diagnostic.message);\n }\n }\n throw new Error(\n \"Remote compile failed, but your authored state is synced. Fix the diagnostics and run 'dreamboard compile' again.\",\n );\n }\n\n consola.success(\n `Compiled ${compiledResult.id} for authored state ${compiledResult.authoringStateId}.`,\n );\n },\n});\n","import { defineCommand } from \"citty\";\nimport consola from \"consola\";\nimport type { GlobalConfig, Environment } from \"../types.js\";\nimport { IS_PUBLISHED_BUILD } from \"../build-target.js\";\nimport { resolveConfig, valueOrUndefined } from \"../config/resolve.js\";\nimport { parseConfigCommandArgs } from \"../flags.js\";\nimport {\n getGlobalAuthPath,\n getGlobalConfigPath,\n loadGlobalConfig,\n saveGlobalConfig,\n} from \"../config/global-config.js\";\nimport {\n getStoredSession,\n setAccessOnlySession,\n} from \"../config/credential-store.js\";\n\nexport default defineCommand({\n meta: {\n name: \"config\",\n description: IS_PUBLISHED_BUILD\n ? \"View CLI configuration\"\n : \"View or update CLI configuration\",\n },\n args: {\n action: {\n type: \"positional\",\n description: IS_PUBLISHED_BUILD ? \"Action: show\" : \"Action: show | set\",\n default: \"show\",\n },\n ...(IS_PUBLISHED_BUILD\n ? {}\n : {\n env: {\n type: \"string\" as const,\n description: \"Environment: local | dev | prod\",\n },\n token: {\n type: \"string\" as const,\n description: \"Auth token (Supabase JWT)\",\n },\n }),\n },\n async run({ args }) {\n const parsedArgs = parseConfigCommandArgs(args);\n const action = parsedArgs.action;\n const globalConfig = await loadGlobalConfig();\n\n if (action === \"show\") {\n const storedSession = await getStoredSession();\n const config = resolveConfig(\n globalConfig,\n parsedArgs,\n undefined,\n storedSession,\n );\n console.log(\n JSON.stringify(\n IS_PUBLISHED_BUILD\n ? {\n configPath: getGlobalConfigPath(),\n authPath: getGlobalAuthPath(),\n authenticated: Boolean(config.authToken),\n refreshableSession: Boolean(config.refreshToken),\n }\n : {\n configPath: getGlobalConfigPath(),\n authPath: getGlobalAuthPath(),\n environment:\n parsedArgs.env || globalConfig.environment || \"dev\",\n apiBaseUrl: config.apiBaseUrl,\n webBaseUrl: config.webBaseUrl,\n authenticated: Boolean(config.authToken),\n refreshableSession: Boolean(config.refreshToken),\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (action === \"set\") {\n if (IS_PUBLISHED_BUILD) {\n throw new Error(\n \"The published Dreamboard CLI does not support config overrides. Use `dreamboard login` to authenticate.\",\n );\n }\n const updated: GlobalConfig = { ...globalConfig };\n if (parsedArgs.env) updated.environment = parsedArgs.env as Environment;\n await saveGlobalConfig(updated);\n\n const overrideToken = valueOrUndefined(parsedArgs.token);\n if (overrideToken) {\n // `config set --token` is an access-only override. Never write a\n // refresh token through this path - that belongs to\n // `dreamboard login`.\n await setAccessOnlySession(overrideToken);\n }\n consola.success(\"Config updated.\");\n return;\n }\n\n throw new Error(\n IS_PUBLISHED_BUILD\n ? \"Usage: dreamboard config show\"\n : \"Usage: dreamboard config show | dreamboard config set --env <local|dev|prod>\",\n );\n },\n});\n","import path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { defineCommand } from \"citty\";\nimport {\n createSession,\n ensureDevCompile,\n getApiVersion,\n getSessionSnapshot,\n type CompiledResult,\n type EnsureDevCompileRequest,\n type EnsureDevCompileResponse,\n} from \"@dreamboard/api-client\";\nimport {\n materializeSourceChangeOperations,\n mapUpsertBlobContentsByContentHash,\n} from \"@dreamboard/api-client/source-revisions\";\nimport { gameIdFromGameSource } from \"@dreamboard/ui-host-runtime/runtime\";\nimport consola from \"consola\";\nimport { CONFIG_FLAG_ARGS } from \"../command-args.js\";\nimport { PROJECT_DIR_NAME, RULE_FILE } from \"../constants.js\";\nimport { configureClient, resolveProjectContext } from \"../config/resolve.js\";\nimport { parseDevCommandArgs, parsePlayerCountFlags } from \"../flags.js\";\nimport type { ProjectConfig } from \"../types.js\";\nimport { ensureDir, readTextFile, writeJsonFile } from \"../utils/fs.js\";\nimport {\n createPersistedDevSession,\n parseDevSeed,\n} from \"../utils/dev-session.js\";\nimport { resolvePlayerCount } from \"../utils/player-count.js\";\nimport { toDreamboardApiError } from \"../utils/errors.js\";\nimport { openBrowser } from \"../auth/auth-server.js\";\nimport { startDreamboardDevServer } from \"../dev-host/start-dev-server.js\";\nimport {\n createSessionFromScenario,\n generateReducerNativeArtifacts,\n} from \"../services/testing/reducer-native-test-harness.js\";\nimport { resolveSetupProfileSelectionForSession } from \"../services/workflows/resolve-setup-profile.js\";\nimport {\n collectLocalFiles,\n loadManifest,\n loadRule,\n} from \"../services/project/local-files.js\";\nimport {\n uploadSourceBlobsSdk,\n waitForCompiledResultJobSdk,\n} from \"../services/api/index.js\";\nimport { runLocalTypecheck } from \"../services/project/local-typecheck.js\";\nimport {\n didLocalMaintainerSnapshotChange,\n ensureLocalMaintainerSnapshot,\n isLocalMaintainerRegistryEnabled,\n} from \"../services/project/local-maintainer-registry.js\";\nimport {\n getProjectLocalMaintainerRegistry,\n updateProjectLocalMaintainerRegistry,\n} from \"../services/project/project-state.js\";\nimport { updateProjectState } from \"../config/project-config.js\";\nimport { scaffoldStaticWorkspace } from \"../services/project/static-scaffold.js\";\nimport { applyWorkspaceCodegen } from \"../services/project/workspace-codegen.js\";\nimport { reconcileWorkspaceDependencies } from \"../services/project/workspace-dependencies.js\";\nimport { assertReducerContractPreflight } from \"../services/project/reducer-contract-preflight.js\";\nimport { assertReducerBundleSmoke } from \"../services/project/reducer-bundle-preflight.js\";\nimport {\n isAllowedGamePath,\n isDynamicGeneratedPath,\n} from \"../services/project/scaffold-ownership.js\";\n\nasync function runLoggedStep<T>(\n message: string,\n task: () => Promise<T>,\n): Promise<T> {\n consola.start(message);\n return task();\n}\n\nfunction clearPreflightOutput(): void {\n if (!process.stdout.isTTY || process.env.CI) return;\n console.clear();\n}\n\nfunction formatDevReadyOutput(options: {\n url: string;\n networkUrls: string[];\n allowedHosts: string[];\n apiBaseUrl: string;\n sessionStatus: \"created\" | \"reused\" | \"seeded\";\n shortCode: string;\n sessionId: string;\n seed: number | \"unknown\";\n debug: boolean;\n scenarioId?: string | null;\n materialization?: DevRunSession[\"materialization\"];\n setupProfile?: {\n id: string;\n name?: string | null;\n } | null;\n}): string {\n const lines = [\"Dreamboard dev\", \"\", `Local: ${options.url}`];\n\n for (const networkUrl of options.networkUrls) {\n lines.push(`Network: ${networkUrl}`);\n }\n\n if (options.networkUrls.length > 0) {\n lines.push(\"Access: LAN only; use trusted networks.\");\n }\n\n for (const allowedHost of options.allowedHosts) {\n lines.push(`Allowed: ${allowedHost}`);\n }\n\n lines.push(\n `Session: ${options.shortCode} (${options.sessionId}, ${options.sessionStatus})`,\n `Seed: ${options.seed}`,\n );\n\n if (options.setupProfile) {\n const label = options.setupProfile.name\n ? `${options.setupProfile.name} (${options.setupProfile.id})`\n : options.setupProfile.id;\n lines.push(`Setup: ${label}`);\n }\n\n if (options.scenarioId) {\n lines.push(`Scenario: ${options.scenarioId}`);\n }\n\n if (options.materialization) {\n lines.push(\n `Snapshot: ${options.materialization.totalMs}ms total (${options.materialization.reducerHarnessMs}ms reducer, ${options.materialization.backendHydrateMs}ms backend)`,\n );\n }\n\n lines.push(\n `Backend: ${options.apiBaseUrl}`,\n \"\",\n \"UI edits hot-reload. Rule, manifest, and app changes need restart.\",\n `Debug logs: ${options.debug ? \"on\" : \"off (--debug)\"}`,\n \"\",\n );\n\n return lines.join(\"\\n\");\n}\n\nfunction parseDevHost(\n value: string | boolean | undefined,\n): string | boolean | undefined {\n if (value === undefined || value === false) return undefined;\n if (value === true) return true;\n\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : true;\n}\n\nfunction parseAllowedHosts(value: string | undefined): string[] {\n if (!value) return [];\n return value\n .split(\",\")\n .map((host) => normalizeAllowedHost(host))\n .filter((host): host is string => Boolean(host));\n}\n\nfunction normalizeAllowedHost(value: string): string | null {\n const trimmed = value.trim();\n if (!trimmed) return null;\n\n if (trimmed.includes(\"://\")) {\n return new URL(trimmed).hostname;\n }\n\n return trimmed.split(\"/\")[0]?.replace(/:\\d+$/, \"\") || null;\n}\n\ntype DevResumeResult = {\n session: DevRunSession | null;\n reason: string | null;\n};\n\ntype DevRunSession = {\n sessionId: string;\n shortCode: string;\n gameId: string;\n seed?: number;\n setupProfileId?: string;\n materialization?: {\n mode: \"snapshot\";\n totalMs: number;\n reducerHarnessMs: number;\n backendHydrateMs: number;\n };\n};\n\nexport default defineCommand({\n meta: {\n name: \"dev\",\n description:\n \"Start a local iframe host for the current project while gameplay stays on the backend\",\n },\n args: {\n seed: {\n type: \"string\",\n description: \"Deterministic RNG seed for new sessions (defaults to 1337)\",\n },\n \"setup-profile\": {\n type: \"string\",\n description:\n \"Named setup profile to use when the manifest defines curated setup presets\",\n },\n players: {\n type: \"string\",\n description: \"Number of seats to create\",\n },\n \"player-count\": {\n type: \"string\",\n description: \"Number of seats to create (alias)\",\n },\n debug: {\n type: \"boolean\",\n description:\n \"Print browser/runtime logs and full SSE payloads in the terminal\",\n default: false,\n },\n resume: {\n type: \"string\",\n description: \"Resume a specific existing backend session by session id\",\n },\n \"from-scenario\": {\n type: \"string\",\n description:\n \"Create a backend session by materializing a typed test scenario snapshot\",\n },\n \"new-session\": {\n type: \"boolean\",\n description:\n \"Deprecated alias for the default behavior of creating a fresh session\",\n default: false,\n },\n open: {\n type: \"boolean\",\n description: \"Open the local dev host in the browser\",\n default: false,\n },\n port: {\n type: \"string\",\n description: \"Preferred local Vite port (defaults to 5352)\",\n },\n host: {\n type: \"string\",\n description:\n \"Expose the local dev host on the network. Pass without a value to bind all interfaces, or provide an address.\",\n valueHint: \"address\",\n },\n \"allowed-host\": {\n type: \"string\",\n description:\n \"Additional Host header to allow, for example a Cloudflare Tunnel hostname.\",\n valueHint: \"hostname\",\n },\n ...CONFIG_FLAG_ARGS,\n },\n async run({ args }) {\n const parsedArgs = parseDevCommandArgs(args);\n const { projectRoot, projectConfig, config } = await resolveProjectContext(\n parsedArgs,\n { requireAuth: false },\n );\n await configureClient(config);\n\n const devCompile = await ensureDevCompiledResult({\n projectRoot,\n projectConfig,\n config,\n env: parsedArgs.env ?? \"dev\",\n debug: parsedArgs.debug,\n });\n\n const devDir = path.join(projectRoot, PROJECT_DIR_NAME, \"dev\");\n await ensureDir(devDir);\n const sessionFilePath = path.join(devDir, \"session.json\");\n\n const requestedResumeSessionId = parsedArgs.resume?.trim() || null;\n const requestedScenarioId = parsedArgs[\"from-scenario\"]?.trim() || null;\n if (requestedResumeSessionId && parsedArgs[\"new-session\"]) {\n throw new Error(\"Cannot combine --resume with --new-session.\");\n }\n if (requestedResumeSessionId && requestedScenarioId) {\n throw new Error(\"Cannot combine --resume with --from-scenario.\");\n }\n if (\n requestedScenarioId &&\n (parsedArgs.seed ||\n parsedArgs[\"setup-profile\"] ||\n parsedArgs.players ||\n parsedArgs[\"player-count\"])\n ) {\n throw new Error(\n \"--from-scenario materializes the scenario's authored seed, setup profile, and player count. Remove --seed, --setup-profile, and player-count overrides.\",\n );\n }\n\n const requestedSeed = requestedScenarioId\n ? null\n : parseDevSeed(parsedArgs.seed);\n const selectedSetupProfile = requestedScenarioId\n ? null\n : await resolveSetupProfileSelectionForSession({\n projectRoot,\n requestedSetupProfileId: parsedArgs[\"setup-profile\"],\n });\n let selectedSetupProfileId = selectedSetupProfile?.id ?? null;\n let resolvedPlayerCount = requestedScenarioId\n ? 0\n : await resolvePlayerCount(\n projectRoot,\n parsePlayerCountFlags(parsedArgs),\n );\n const resumeResult = requestedResumeSessionId\n ? await tryResumeSession(\n { sessionId: requestedResumeSessionId },\n projectConfig.gameId,\n selectedSetupProfileId,\n )\n : { session: null, reason: null };\n\n if (requestedResumeSessionId && resumeResult.reason) {\n consola.warn(\n `Ignoring requested dev session ${requestedResumeSessionId}: ${resumeResult.reason}`,\n );\n }\n\n let runSession = resumeResult.session;\n let scenarioSeededSession = false;\n const resumedExistingSession = Boolean(\n requestedResumeSessionId &&\n runSession &&\n runSession.sessionId === requestedResumeSessionId,\n );\n\n if (requestedScenarioId) {\n await generateReducerNativeArtifacts({\n projectRoot,\n compiledResultId: devCompile.id,\n gameId: projectConfig.gameId,\n debug: parsedArgs.debug,\n });\n const seededScenario = await createSessionFromScenario({\n projectRoot,\n scenarioId: requestedScenarioId,\n compiledResultId: devCompile.id,\n gameId: projectConfig.gameId,\n debug: parsedArgs.debug,\n trustGeneratedFingerprint: true,\n });\n scenarioSeededSession = true;\n selectedSetupProfileId = seededScenario.setupProfileId;\n resolvedPlayerCount = seededScenario.playerCount;\n runSession = {\n sessionId: seededScenario.sessionId,\n shortCode: seededScenario.shortCode,\n gameId: seededScenario.gameId,\n seed: seededScenario.seed,\n setupProfileId: seededScenario.setupProfileId ?? undefined,\n materialization: seededScenario.materialization,\n };\n } else if (!runSession) {\n runSession = await createDevSession({\n projectRoot,\n projectConfig,\n playerCount: resolvedPlayerCount,\n seed: requestedSeed ?? 1337,\n compiledResult: devCompile,\n setupProfileId: selectedSetupProfileId,\n });\n }\n\n await writeJsonFile(\n sessionFilePath,\n createPersistedDevSession({ sessionId: runSession.sessionId }),\n );\n\n const preferredPort =\n typeof parsedArgs.port === \"string\" && parsedArgs.port.trim().length > 0\n ? Number.parseInt(parsedArgs.port, 10)\n : undefined;\n if (\n preferredPort !== undefined &&\n (!Number.isFinite(preferredPort) || preferredPort <= 0)\n ) {\n throw new Error(\"Invalid --port value. Expected a positive integer.\");\n }\n const allowedHosts = parseAllowedHosts(parsedArgs[\"allowed-host\"]);\n\n const devServer = await startDreamboardDevServer({\n projectRoot,\n sessionFilePath,\n port: preferredPort,\n host: parseDevHost(parsedArgs.host),\n allowedHosts,\n config,\n runtimeConfig: {\n apiBaseUrl: config.apiBaseUrl,\n userId: extractUserIdFromJwt(config.authToken ?? null),\n gameId: runSession.gameId,\n compiledResultId: devCompile.id,\n setupProfileId: runSession.setupProfileId ?? null,\n playerCount: resolvedPlayerCount,\n debug: parsedArgs.debug,\n slug: projectConfig.slug,\n autoStartGame: !resumedExistingSession && !scenarioSeededSession,\n initialSession: {\n sessionId: runSession.sessionId,\n shortCode: runSession.shortCode,\n gameId: runSession.gameId,\n seed: runSession.seed ?? null,\n },\n },\n });\n\n clearPreflightOutput();\n console.log(\n formatDevReadyOutput({\n url: devServer.url,\n networkUrls: devServer.networkUrls,\n allowedHosts,\n apiBaseUrl: config.apiBaseUrl,\n sessionStatus: scenarioSeededSession\n ? \"seeded\"\n : resumedExistingSession\n ? \"reused\"\n : \"created\",\n shortCode: runSession.shortCode,\n sessionId: runSession.sessionId,\n seed: runSession.seed ?? \"unknown\",\n debug: parsedArgs.debug,\n scenarioId: scenarioSeededSession ? requestedScenarioId : null,\n materialization: runSession.materialization,\n setupProfile: selectedSetupProfileId\n ? {\n id: selectedSetupProfileId,\n name: selectedSetupProfile?.name,\n }\n : null,\n }),\n );\n\n if (parsedArgs.open) {\n openBrowser(devServer.url);\n }\n\n await waitForTermination(async () => {\n await devServer.close();\n });\n },\n});\n\nasync function tryResumeSession(\n requested: {\n sessionId: string;\n },\n currentGameId: string,\n setupProfileId: string | null,\n): Promise<DevResumeResult> {\n const { data: snapshot, error } = await getSessionSnapshot({\n path: { sessionId: requested.sessionId },\n });\n if (error || !snapshot) {\n return {\n session: null,\n reason: \"backend could not confirm that the session is still active\",\n };\n }\n const context = snapshot.context;\n if (gameIdFromGameSource(context.gameSource) !== currentGameId) {\n return {\n session: null,\n reason: \"session belongs to a different game\",\n };\n }\n if ((context.setupProfileId ?? null) !== setupProfileId) {\n return {\n session: null,\n reason: `setup profile changed from ${context.setupProfileId ?? \"none\"} to ${setupProfileId ?? \"none\"}`,\n };\n }\n if (context.status === \"ended\" || context.phase === \"ended\") {\n return {\n session: null,\n reason: \"session has already ended\",\n };\n }\n\n return {\n session: {\n sessionId: context.sessionId,\n shortCode: context.shortCode,\n gameId: gameIdFromGameSource(context.gameSource),\n setupProfileId: context.setupProfileId ?? undefined,\n },\n reason: null,\n };\n}\n\nasync function ensureDevCompiledResult(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n config: { apiBaseUrl: string; authToken?: string };\n env: string;\n debug: boolean;\n}): Promise<CompiledResult> {\n const localMaintainerEnabled = isLocalMaintainerRegistryEnabled(\n options.config.apiBaseUrl,\n );\n const localMaintainerRegistry = localMaintainerEnabled\n ? await runLoggedStep(\"Checking local SDK snapshot...\", () =>\n ensureLocalMaintainerSnapshot(options.config.apiBaseUrl),\n )\n : await ensureLocalMaintainerSnapshot(options.config.apiBaseUrl);\n if (localMaintainerRegistry) {\n if (\n didLocalMaintainerSnapshotChange(\n getProjectLocalMaintainerRegistry(options.projectConfig),\n localMaintainerRegistry,\n )\n ) {\n await updateProjectState(\n options.projectRoot,\n updateProjectLocalMaintainerRegistry(\n options.projectConfig,\n localMaintainerRegistry,\n ),\n );\n consola.info(\"Local SDK snapshot refreshed.\");\n } else {\n consola.info(\"Using existing local SDK snapshot.\");\n }\n }\n\n await runLoggedStep(\"Refreshing static scaffold...\", () =>\n scaffoldStaticWorkspace(options.projectRoot, \"update\", {\n localMaintainerRegistry,\n }),\n );\n const manifest = await loadManifest(options.projectRoot);\n await runLoggedStep(\"Applying workspace codegen...\", () =>\n applyWorkspaceCodegen({\n projectRoot: options.projectRoot,\n manifest,\n }),\n );\n const dependencyState = await runLoggedStep(\n \"Reconciling workspace dependencies...\",\n () => reconcileWorkspaceDependencies(options.projectRoot),\n );\n if (\n dependencyState.packageManagerNormalized ||\n dependencyState.lockfileGenerated ||\n dependencyState.installed\n ) {\n consola.info(\"Workspace dependencies reconciled.\");\n } else {\n consola.info(\"Workspace dependencies already up to date.\");\n }\n await runLoggedStep(\"Validating reducer contract...\", () =>\n assertReducerContractPreflight(options.projectRoot),\n );\n const typecheckResult = await runLoggedStep(\n \"Running local typecheck...\",\n () => runLocalTypecheck(options.projectRoot),\n );\n if (!typecheckResult.skipped && !typecheckResult.success) {\n if (typecheckResult.output) consola.error(typecheckResult.output);\n throw new Error(\n \"Local typecheck failed. Fix the diagnostics before starting dev.\",\n );\n }\n if (typecheckResult.output && typecheckResult.skipped)\n consola.warn(typecheckResult.output);\n await runLoggedStep(\"Smoke-testing reducer bundle...\", () =>\n assertReducerBundleSmoke({\n projectRoot: options.projectRoot,\n manifest,\n }),\n );\n\n const [localFiles, ruleText, backendVersion, workspacePackageJson] =\n await Promise.all([\n collectLocalFiles(options.projectRoot),\n loadRule(options.projectRoot),\n resolveBackendVersionMetadata(),\n readWorkspacePackageJson(options.projectRoot),\n ]);\n const sourceRevisionFiles = Object.fromEntries(\n Object.entries(localFiles).filter(([filePath]) =>\n isDevSourceRevisionPath(filePath),\n ),\n );\n const sourceChanges = Object.entries(sourceRevisionFiles).map(\n ([filePath, content]) => ({\n kind: \"upsert\" as const,\n path: filePath,\n content,\n }),\n );\n const { changes } = await materializeSourceChangeOperations(sourceChanges);\n const uploadBlobs = mapUpsertBlobContentsByContentHash(\n sourceChanges,\n changes,\n );\n const devFingerprint = computeDevFingerprint({\n env: options.env,\n files: localFiles,\n manifest,\n ruleText,\n localMaintainerRegistry,\n backendVersion,\n workspacePackageJson,\n });\n\n const first = await postEnsureDevCompile({\n config: options.config,\n gameId: options.projectConfig.gameId,\n body: {\n devFingerprint,\n env: options.env,\n sourceRevision: { mode: \"replace\", changes: [] },\n ruleText,\n manifest,\n },\n });\n if (first.reused && first.compiledResult) {\n consola.success(`Reusing dev compile ${first.compiledResult.id}.`);\n return first.compiledResult;\n }\n\n await uploadSourceBlobsSdk(\n options.projectConfig.gameId,\n Array.from(uploadBlobs.values()),\n );\n const queued = await postEnsureDevCompile({\n config: options.config,\n gameId: options.projectConfig.gameId,\n body: {\n devFingerprint,\n env: options.env,\n sourceRevision: { mode: \"replace\", changes },\n ruleText,\n manifest,\n },\n });\n if (queued.reused && queued.compiledResult) return queued.compiledResult;\n if (!queued.jobId)\n throw new Error(\"Backend did not return a dev compile job id.\");\n\n const { compiledResult } = await waitForCompiledResultJobSdk({\n gameId: options.projectConfig.gameId,\n jobId: queued.jobId,\n onProgress: (job) => {\n if (options.debug)\n consola.info(\n `Dev compile ${job.status}${job.phase ? ` [${job.phase}]` : \"\"}${job.message ? ` ${job.message}` : \"\"}`,\n );\n },\n });\n return compiledResult;\n}\n\nfunction isDevSourceRevisionPath(filePath: string): boolean {\n if (filePath === RULE_FILE) return false;\n if (filePath === \".npmrc\") return true;\n return isAllowedGamePath(filePath) && !isDynamicGeneratedPath(filePath);\n}\n\nasync function resolveBackendVersionMetadata(): Promise<unknown> {\n const { data, error } = await getApiVersion();\n return error ? null : (data ?? null);\n}\n\nasync function readWorkspacePackageJson(projectRoot: string): Promise<unknown> {\n try {\n const raw = await readTextFile(path.join(projectRoot, \"package.json\"));\n const parsed = JSON.parse(raw) as {\n dependencies?: Record<string, unknown>;\n devDependencies?: Record<string, unknown>;\n };\n return {\n dependencies: Object.fromEntries(\n Object.entries(parsed.dependencies ?? {}).filter(([name]) =>\n name.startsWith(\"@dreamboard/\"),\n ),\n ),\n devDependencies: Object.fromEntries(\n Object.entries(parsed.devDependencies ?? {}).filter(([name]) =>\n name.startsWith(\"@dreamboard/\"),\n ),\n ),\n };\n } catch {\n return null;\n }\n}\n\nfunction stableJson(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map(stableJson).join(\",\")}]`;\n }\n return `{${Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`)\n .join(\",\")}}`;\n}\n\nfunction computeDevFingerprint(input: {\n env: string;\n files: Record<string, string>;\n manifest: unknown;\n ruleText: string;\n localMaintainerRegistry: unknown;\n backendVersion: unknown;\n workspacePackageJson: unknown;\n}): string {\n const hash = createHash(\"sha256\");\n hash.update(\n stableJson({\n env: input.env,\n manifest: input.manifest,\n ruleText: input.ruleText,\n localMaintainerRegistry: input.localMaintainerRegistry,\n backendVersion: input.backendVersion,\n workspacePackageJson: input.workspacePackageJson,\n }),\n );\n for (const [filePath, content] of Object.entries(input.files).sort(\n ([a], [b]) => a.localeCompare(b),\n )) {\n hash.update(filePath);\n hash.update(\"\\0\");\n hash.update(content);\n hash.update(\"\\0\");\n }\n return hash.digest(\"hex\");\n}\n\nasync function postEnsureDevCompile(options: {\n config: { apiBaseUrl: string; authToken?: string };\n gameId: string;\n body: EnsureDevCompileRequest;\n}): Promise<EnsureDevCompileResponse> {\n void options.config;\n const { data, error, response } = await ensureDevCompile({\n path: { gameId: options.gameId },\n body: options.body,\n });\n if (error || !data) {\n throw toDreamboardApiError(error, response, \"Failed to ensure dev compile\");\n }\n return data;\n}\n\nasync function createDevSession(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n playerCount: number;\n seed: number;\n compiledResult: CompiledResult;\n setupProfileId: string | null;\n}): Promise<DevRunSession> {\n const {\n data: session,\n error: sessionError,\n response: sessionResponse,\n } = await createSession({\n path: { gameId: options.projectConfig.gameId },\n body: {\n compiledResultId: options.compiledResult.id,\n seed: options.seed,\n playerCount: options.playerCount,\n autoAssignSeats: true,\n setupProfileId: options.setupProfileId ?? undefined,\n },\n });\n if (sessionError || !session) {\n throw toDreamboardApiError(\n sessionError,\n sessionResponse,\n \"Failed to create session\",\n );\n }\n\n return {\n sessionId: session.sessionId,\n shortCode: session.shortCode,\n gameId: gameIdFromGameSource(session.gameSource),\n seed: options.seed,\n setupProfileId: options.setupProfileId ?? undefined,\n };\n}\n\ntype TerminationOptions = {\n exitAfterShutdown?: boolean;\n exitProcess?: (code: number) => void;\n};\n\nexport async function waitForTermination(\n close: () => Promise<void>,\n options: TerminationOptions = {},\n): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n let shuttingDown = false;\n const exitAfterShutdown = options.exitAfterShutdown ?? true;\n const exitProcess = options.exitProcess ?? ((code) => process.exit(code));\n\n const cleanupListeners = () => {\n process.off(\"SIGINT\", handleSigint);\n process.off(\"SIGTERM\", handleSigterm);\n };\n\n const shutdown = (signal: string) => {\n if (shuttingDown) {\n return;\n }\n shuttingDown = true;\n cleanupListeners();\n void close()\n .then(() => {\n consola.info(`Stopped local dev host (${signal}).`);\n resolve();\n if (exitAfterShutdown) {\n exitProcess(0);\n }\n })\n .catch(reject);\n };\n\n const handleSigint = () => shutdown(\"SIGINT\");\n const handleSigterm = () => shutdown(\"SIGTERM\");\n\n process.on(\"SIGINT\", handleSigint);\n process.on(\"SIGTERM\", handleSigterm);\n });\n}\n\nfunction extractUserIdFromJwt(token: string | null): string | null {\n if (!token) {\n return null;\n }\n\n const parts = token.split(\".\");\n if (parts.length < 2) {\n return null;\n }\n\n try {\n const payload = JSON.parse(\n Buffer.from(parts[1]!, \"base64url\").toString(\"utf8\"),\n ) as Record<string, unknown>;\n return typeof payload.sub === \"string\" ? payload.sub : null;\n } catch {\n return null;\n }\n}\n","import type {\n SeatAssignment,\n SessionActor,\n SessionGameSource,\n} from \"@dreamboard/api-client\";\n\ntype HexColor = string & { readonly __brand: \"HexColor\" };\n\nconst HEX_COLOR_PATTERN = /^#[0-9A-Fa-f]{6}$/;\n\nfunction parseHexColor(value: unknown): HexColor | undefined {\n return typeof value === \"string\" && HEX_COLOR_PATTERN.test(value)\n ? (value as HexColor)\n : undefined;\n}\n\n/** Stable string principal for comparing actors to connection `userId` / demo actor id. */\nexport function principalKey(actor: SessionActor): string {\n if (actor.kind === \"AUTH_USER\") {\n return actor.id;\n }\n return actor.demoActorSessionId;\n}\n\nexport function principalMatchesActor(\n principalId: string | null | undefined,\n actor: SessionActor,\n): boolean {\n if (!principalId) {\n return false;\n }\n return principalKey(actor) === principalId;\n}\n\nexport function seatControlledByPrincipal(\n seat: SeatAssignment,\n principalId: string | null | undefined,\n): boolean {\n if (!principalId || !seat.controllerActor) {\n return false;\n }\n return principalMatchesActor(principalId, seat.controllerActor);\n}\n\nexport function gameIdFromGameSource(source: SessionGameSource): string {\n if (source.kind === \"USER_COMPILED\") {\n return source.gameId;\n }\n return `demo:${source.slug}:${source.revisionId}`;\n}\n\nexport function seatsForPluginSnapshot(seats: SeatAssignment[]): Array<{\n playerId: string;\n controllerUserId?: string;\n displayName: string;\n playerColor?: HexColor;\n isHost?: boolean;\n}> {\n return seats.map((seat) => ({\n playerId: seat.playerId,\n controllerUserId: seat.controllerActor\n ? principalKey(seat.controllerActor)\n : undefined,\n displayName: seat.displayName,\n playerColor: parseHexColor(seat.playerColor),\n isHost: seat.isHost,\n }));\n}\n","import { z } from \"zod\";\nimport type { PluginStateSnapshot } from \"@dreamboard/ui-sdk/reducer\";\n\nexport const InitMessageSchema = z.object({\n type: z.literal(\"init\"),\n sessionId: z.string(),\n controllablePlayerIds: z.array(z.string()),\n controllingPlayerId: z.string(),\n userId: z.string().nullable(),\n});\n\nexport const PingMessageSchema = z.object({\n type: z.literal(\"ping\"),\n});\n\nexport const StateSyncMessageSchema = z.object({\n type: z.literal(\"state-sync\"),\n syncId: z.number(),\n state: z.custom<PluginStateSnapshot>((data) => {\n return (\n typeof data === \"object\" &&\n data !== null &&\n \"session\" in data &&\n \"notifications\" in data\n );\n }),\n});\n\nexport const SubmitResultMessageSchema = z.object({\n type: z.literal(\"submit-result\"),\n messageId: z.string(),\n accepted: z.boolean(),\n errorCode: z.string().optional(),\n message: z.string().optional(),\n});\n\nexport const MainToPluginMessageSchema = z.discriminatedUnion(\"type\", [\n InitMessageSchema,\n PingMessageSchema,\n StateSyncMessageSchema,\n SubmitResultMessageSchema,\n]);\n\nexport type MainToPluginMessage = z.infer<typeof MainToPluginMessageSchema>;\n\nexport const ReadyMessageSchema = z.object({\n type: z.literal(\"ready\"),\n});\n\n// `params` is intentionally `z.unknown()` rather than `z.record(...)`. The\n// unified interaction wire carries every player input — actions and prompt\n// responses alike — and the ingress layer's `runtimePayloadSchema` already\n// accepts scalars (`z.boolean() | z.number() | z.string() | z.null() |\n// Array<...> | Record<...>`). Constraining this bridge field to an object\n// would make the host stricter than the ingress it forwards into, which\n// would mask legitimate scalar payloads (e.g. if a future authoring API\n// exposes runtime-opened prompts with a scalar `responseSchema`). Safety\n// still lives downstream: the reducer re-validates prompt responses via\n// `validatePromptResponseInput` and actions via collector schemas, so this\n// widening doesn't weaken end-to-end validation.\nexport const InteractionMessageSchema = z.object({\n type: z.literal(\"interaction\"),\n messageId: z.string(),\n playerId: z.string(),\n interactionId: z.string(),\n params: z.unknown(),\n // Optional client-minted correlation id (UUID) that lets the whole\n // click-to-render path be stitched across plugin iframe, web host,\n // backend spans/logs and SSE. Added for Tier-0 input-latency\n // observability; the backend rides it through as an HTTP header\n // (`X-Dreamboard-Client-Action-Id`) but no wire contract changed.\n clientActionId: z.string().optional(),\n // Plugin-iframe `Date.now()` captured right before the postMessage\n // is sent, used as the `t0_click` timestamp on the host-side perf\n // buffer. Date.now() is intentional: the iframe and the host share\n // a wall-clock base, but not a `performance.now()` origin.\n clientSubmittedAtMs: z.number().optional(),\n});\n\nexport const ValidateInteractionMessageSchema = z.object({\n type: z.literal(\"validate-interaction\"),\n playerId: z.string(),\n interactionId: z.string(),\n params: z.unknown(),\n messageId: z.string(),\n});\n\nexport const ValidateInteractionResultMessageSchema = z.object({\n type: z.literal(\"validate-interaction-result\"),\n messageId: z.string(),\n result: z.object({\n valid: z.boolean(),\n errorCode: z.string().optional(),\n message: z.string().optional(),\n }),\n});\n\nexport const PluginErrorMessageSchema = z.object({\n type: z.literal(\"error\"),\n message: z.string(),\n code: z.string().optional(),\n});\n\nexport const PongMessageSchema = z.object({\n type: z.literal(\"pong\"),\n});\n\nexport const SwitchPlayerMessageSchema = z.object({\n type: z.literal(\"switch-player\"),\n playerId: z.string(),\n});\n\nexport const StateAckMessageSchema = z.object({\n type: z.literal(\"state-ack\"),\n syncId: z.number(),\n // Plugin-iframe `Date.now()` captured when the state-sync message\n // was received. Threaded so the host-side perf HUD can compute the\n // `t7_state_sync_received` mark without needing perf to be enabled\n // inside the plugin iframe itself.\n clientReceivedAtMs: z.number().optional(),\n});\n\n/**\n * Plugin -> host message sent from a `queueMicrotask` scheduled inside\n * the state-sync handler so the timestamp reflects roughly when React\n * would have committed the DOM update for the new state. Dev-only /\n * perf-only: host records it as `t8_render_commit` on the perf HUD.\n */\nexport const StateRenderedMessageSchema = z.object({\n type: z.literal(\"state-rendered\"),\n syncId: z.number(),\n clientReceivedAtMs: z.number(),\n clientRenderedAtMs: z.number(),\n});\n\nexport const MarkNotificationReadMessageSchema = z.object({\n type: z.literal(\"mark-notification-read\"),\n notificationId: z.string(),\n});\n\nexport const RestoreHistoryMessageSchema = z.object({\n type: z.literal(\"restore-history\"),\n entryId: z.string(),\n});\n\nexport const PluginToMainMessageSchema = z.discriminatedUnion(\"type\", [\n ReadyMessageSchema,\n InteractionMessageSchema,\n ValidateInteractionMessageSchema,\n PluginErrorMessageSchema,\n PongMessageSchema,\n SwitchPlayerMessageSchema,\n StateAckMessageSchema,\n StateRenderedMessageSchema,\n MarkNotificationReadMessageSchema,\n RestoreHistoryMessageSchema,\n]);\n\nexport type PluginToMainMessage = z.infer<typeof PluginToMainMessageSchema>;\n","import { createStore } from \"zustand/vanilla\";\nimport { subscribeWithSelector } from \"zustand/middleware\";\nimport type { StoreApi } from \"zustand/vanilla\";\nimport type { PluginStateSnapshot as UiSdkPluginStateSnapshot } from \"@dreamboard/ui-sdk/reducer\";\nimport type { LoggerLike } from \"./logger.js\";\nimport { consoleLogger } from \"./logger.js\";\nimport type { HostSessionTransport } from \"./host-session-transport.js\";\nimport { defaultHostSessionTransport } from \"./host-session-transport.js\";\nimport type { GameplayViewport } from \"./session-model.js\";\nimport {\n getGameplayViewport,\n getSessionContext,\n resolveControllablePlayerIds,\n} from \"./session-model.js\";\nimport type { SSEManagerLike } from \"./session-live-runtime.js\";\nimport { createSessionIngressController } from \"./session-ingress-controller.js\";\nimport type { SessionIngressControllerActions } from \"./session-ingress-controller.js\";\nimport {\n createInitialUnifiedSessionState,\n type UnifiedSessionState,\n} from \"./session-state-reducer.js\";\nimport {\n selectBootstrapStatus,\n selectGameplayViewModel,\n selectGameplayViewport,\n selectHistory,\n selectLobbyViewModel,\n selectPluginSnapshot,\n selectSessionContext,\n selectSessionError,\n selectSessionType,\n} from \"./session-projection.js\";\n\nexport type {\n GameplayViewport,\n HistoryState,\n SessionContext,\n SessionIdentity,\n SessionPhase,\n UnifiedSessionModel,\n} from \"./session-model.js\";\nexport type {\n BootstrapStatus,\n GameplayViewModel,\n LobbyViewModel,\n} from \"./session-projection.js\";\nexport type { SSEManagerLike } from \"./session-live-runtime.js\";\nexport type {\n ActivityState,\n ConnectionState,\n DebugState,\n HostFeedback,\n HostFeedbackPayload,\n HostFeedbackType,\n Notification,\n NotificationPayload,\n NotificationType,\n SSEEventEntry,\n UnifiedSessionState,\n} from \"./session-state-reducer.js\";\n\nexport type PluginStateSnapshot = UiSdkPluginStateSnapshot;\nexport type GameplayState = GameplayViewport;\n\nexport interface UnifiedSessionActions extends SessionIngressControllerActions {\n getPluginSnapshot: () => PluginStateSnapshot;\n getRenderableGameplay: () => GameplayViewport | null;\n}\n\nexport type UnifiedSessionStore = UnifiedSessionState & UnifiedSessionActions;\n\nexport interface CreateUnifiedSessionStoreOptions {\n createSseManager: () => SSEManagerLike;\n transport?: HostSessionTransport;\n logger?: LoggerLike;\n fallbackToAllSeatsWhenUserIdMissing?: boolean;\n}\n\nlet sseEventIdCounter = 0;\nlet notificationIdCounter = 0;\nconst EMPTY_ARRAY: never[] = [];\n\nfunction generateNotificationId(): string {\n return `notif-${++notificationIdCounter}-${Date.now()}`;\n}\n\nexport function createUnifiedSessionStore(\n options: CreateUnifiedSessionStoreOptions,\n): StoreApi<UnifiedSessionStore> {\n const logger = options.logger ?? consoleLogger;\n const transport = options.transport ?? defaultHostSessionTransport;\n const fallbackToAllSeatsWhenUserIdMissing =\n options.fallbackToAllSeatsWhenUserIdMissing ?? false;\n\n return createStore<UnifiedSessionStore>()(\n subscribeWithSelector((_, get, store) => {\n const controller = createSessionIngressController({\n store,\n createSseManager: options.createSseManager,\n transport,\n logger,\n fallbackToAllSeatsWhenUserIdMissing,\n reducerEnvironment: {\n fallbackToAllSeatsWhenUserIdMissing,\n nextEventId: () => ++sseEventIdCounter,\n nextNotificationId: generateNotificationId,\n nowMs: () => Date.now(),\n nowIso: () => new Date().toISOString(),\n },\n });\n\n return {\n ...createInitialUnifiedSessionState(),\n ...controller,\n getPluginSnapshot: () =>\n selectPluginSnapshot(get(), fallbackToAllSeatsWhenUserIdMissing),\n getRenderableGameplay: () => getGameplayViewport(get().session),\n };\n }),\n );\n}\n\nexport const unifiedSessionSelectors = {\n sessionType: selectSessionType,\n bootstrapStatus: selectBootstrapStatus,\n sessionContext: selectSessionContext,\n lobby: selectLobbyViewModel,\n gameplay: selectGameplayViewModel,\n gameplayViewport: selectGameplayViewport,\n hasGameplayPayload: (s: UnifiedSessionStore) =>\n getGameplayViewport(s.session) !== null,\n history: selectHistory,\n isConnected: (s: UnifiedSessionStore) => s.connection.isConnected,\n connectionError: (s: UnifiedSessionStore) => s.connection.error,\n isLoading: (s: UnifiedSessionStore) =>\n s.session.type === \"loading\" || s.session.type === \"gameplayLoading\",\n error: selectSessionError,\n sessionId: (s: UnifiedSessionStore) =>\n getSessionContext(s.session)?.identity.sessionId ?? null,\n shortCode: (s: UnifiedSessionStore) =>\n getSessionContext(s.session)?.identity.shortCode ?? \"\",\n gameId: (s: UnifiedSessionStore) =>\n getSessionContext(s.session)?.identity.gameId ?? null,\n seats: (s: UnifiedSessionStore) =>\n getSessionContext(s.session)?.seats ?? EMPTY_ARRAY,\n canStart: (s: UnifiedSessionStore) =>\n getSessionContext(s.session)?.canStart ?? false,\n hostActor: (s: UnifiedSessionStore) =>\n getSessionContext(s.session)?.hostActor ?? null,\n isSessionHost: (s: UnifiedSessionStore) =>\n selectLobbyViewModel(s)?.isSessionHost ?? false,\n controllablePlayerIds: (s: UnifiedSessionStore) => {\n const context = getSessionContext(s.session);\n return context\n ? resolveControllablePlayerIds(\n context.switchablePlayerIds,\n context.seats,\n context.userId,\n )\n : EMPTY_ARRAY;\n },\n controllingPlayerId: (s: UnifiedSessionStore) =>\n s.session.type === \"gameplay\" ? s.session.perspective.playerId : null,\n currentPlayerId: (s: UnifiedSessionStore) =>\n s.session.type === \"gameplay\"\n ? s.session.perspective.playerId\n : s.session.type === \"gameplayLoading\"\n ? s.session.requestedPlayerId\n : s.session.type === \"lobby\"\n ? s.session.preferredPlayerId\n : null,\n userId: (s: UnifiedSessionStore) =>\n getSessionContext(s.session)?.userId ?? null,\n notifications: (s: UnifiedSessionStore) => s.activity.notifications,\n hostFeedback: (s: UnifiedSessionStore) => s.activity.hostFeedback,\n sseEvents: (s: UnifiedSessionStore) => s.debug.sseEvents,\n syncId: (s: UnifiedSessionStore) => s.activity.syncId,\n activity: (s: UnifiedSessionStore) => s.activity,\n debug: (s: UnifiedSessionStore) => s.debug,\n};\n","import { randomInt } from \"node:crypto\";\nimport { exists, readJsonFile } from \"./fs.js\";\n\nexport type PersistedDevSession = {\n sessionId: string;\n};\n\nconst DEFAULT_DEV_SEED = 1337;\nconst MAX_RANDOM_DEV_SEED_EXCLUSIVE = 2_147_483_648;\nconst MIN_KOTLIN_LONG = -9_223_372_036_854_775_808n;\nconst MAX_KOTLIN_LONG = 9_223_372_036_854_775_807n;\nconst MIN_SAFE_SEED = BigInt(Number.MIN_SAFE_INTEGER);\nconst MAX_SAFE_SEED = BigInt(Number.MAX_SAFE_INTEGER);\n\nexport function createPersistedDevSession(input: {\n sessionId: string;\n}): PersistedDevSession {\n return {\n sessionId: input.sessionId,\n };\n}\n\nexport async function loadPersistedDevSession(\n sessionFilePath: string,\n): Promise<PersistedDevSession | null> {\n if (!(await exists(sessionFilePath))) {\n return null;\n }\n const value = await readJsonFile<PersistedDevSession>(sessionFilePath);\n if (!value.sessionId) {\n return null;\n }\n return {\n sessionId: value.sessionId,\n };\n}\n\nexport function parseDevSeed(rawSeed: string | undefined): number {\n return parseOptionalDevSeed(rawSeed) ?? DEFAULT_DEV_SEED;\n}\n\nexport function parseOptionalDevSeed(\n rawSeed: string | undefined,\n): number | undefined {\n const value = rawSeed?.trim();\n if (!value) {\n return undefined;\n }\n if (!/^-?\\d+$/.test(value)) {\n throw new Error(\"seed must be an integer\");\n }\n\n const parsed = BigInt(value);\n if (parsed < MIN_KOTLIN_LONG || parsed > MAX_KOTLIN_LONG) {\n throw new Error(\"seed must be within signed 64-bit integer range\");\n }\n if (parsed < MIN_SAFE_SEED || parsed > MAX_SAFE_SEED) {\n throw new Error(\n `seed must be within JavaScript safe integer range (${Number.MIN_SAFE_INTEGER}..${Number.MAX_SAFE_INTEGER})`,\n );\n }\n\n return Number(parsed);\n}\n\nexport function generateRandomDevSeed(): number {\n return randomInt(MAX_RANDOM_DEV_SEED_EXCLUSIVE);\n}\n","import type { PlayerCountFlags } from \"../flags.js\";\nimport { loadManifest } from \"../services/project/local-files.js\";\nimport { parsePositiveInt } from \"./strings.js\";\n\nexport async function resolvePlayerCount(\n projectRoot: string,\n flags: PlayerCountFlags,\n): Promise<number> {\n const rawPlayers = flags.players ?? flags[\"player-count\"];\n if (rawPlayers !== undefined) {\n return parsePositiveInt(rawPlayers, \"players\");\n }\n\n const manifest = await loadManifest(projectRoot);\n const minPlayers = manifest.players?.minPlayers;\n if (typeof minPlayers !== \"number\" || !Number.isFinite(minPlayers)) {\n throw new Error(\n \"manifest.ts is missing players.minPlayers. Provide --players <count> instead.\",\n );\n }\n\n return Math.max(1, Math.floor(minPlayers));\n}\n","import {\n createServer,\n type IncomingMessage,\n type ServerResponse,\n} from \"node:http\";\nimport type { Session } from \"@supabase/supabase-js\";\nimport { spawn } from \"node:child_process\";\n\ntype CliAuthPayload = {\n token?: Session[\"access_token\"];\n refreshToken?: Session[\"refresh_token\"];\n state?: string;\n};\n\ntype CliAuthResult = {\n token: Session[\"access_token\"];\n refreshToken: Session[\"refresh_token\"] | null;\n};\n\nexport async function startCliAuthServer(\n state: string,\n timeoutMs: number,\n): Promise<{\n port: number;\n waitForToken: Promise<CliAuthResult>;\n close: () => void;\n}> {\n let resolveToken: (token: CliAuthResult) => void;\n let rejectToken: (error: Error) => void;\n\n const waitForToken = new Promise<CliAuthResult>((resolve, reject) => {\n resolveToken = resolve;\n rejectToken = reject;\n });\n\n let server: ReturnType<typeof createServer> | null = null;\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt < 10; attempt++) {\n const portCandidate = 49152 + Math.floor(Math.random() * 16383);\n try {\n server = createServer(\n async (request: IncomingMessage, response: ServerResponse) => {\n try {\n await handleAuthRequest(\n request,\n response,\n state,\n resolveToken!,\n () => server?.close(),\n );\n } catch (error) {\n const message =\n error instanceof Error\n ? error.message\n : \"Failed to handle auth callback.\";\n writeCorsResponse(request, response, 500, message);\n }\n },\n );\n await new Promise<void>((resolve, reject) => {\n server!.once(\"error\", reject);\n server!.listen(portCandidate, \"127.0.0.1\", () => {\n server!.off(\"error\", reject);\n resolve();\n });\n });\n break;\n } catch (error) {\n lastError =\n error instanceof Error\n ? error\n : new Error(\"Failed to start auth server\");\n }\n }\n\n if (!server) {\n const error =\n lastError ?? new Error(\"Failed to start auth callback server.\");\n rejectToken!(error);\n throw error;\n }\n\n const timer = setTimeout(() => {\n rejectToken!(new Error(\"Login timed out.\"));\n server?.close();\n }, timeoutMs);\n\n waitForToken.finally(() => clearTimeout(timer));\n\n return {\n port: portCandidateFromServer(server),\n waitForToken,\n close: () => server?.close(),\n };\n}\n\nfunction portCandidateFromServer(\n server: ReturnType<typeof createServer>,\n): number {\n const address = server.address();\n if (!address || typeof address === \"string\") {\n throw new Error(\"Auth callback server did not expose a bound port.\");\n }\n return address.port;\n}\n\nasync function handleAuthRequest(\n request: IncomingMessage,\n response: ServerResponse,\n state: string,\n resolveToken: (token: CliAuthResult) => void,\n closeServer: () => void,\n): Promise<void> {\n const requestUrl = new URL(request.url ?? \"/\", \"http://127.0.0.1\");\n\n if (request.method === \"OPTIONS\") {\n writeCorsResponse(request, response, 204, \"\");\n return;\n }\n\n if (requestUrl.pathname === \"/cli-auth\" && request.method === \"POST\") {\n const text = await readRequestBody(request);\n let payload: CliAuthPayload | null = null;\n try {\n payload = JSON.parse(text) as CliAuthPayload;\n } catch {\n payload = null;\n }\n\n const token = payload?.token;\n const refreshToken = payload?.refreshToken;\n const receivedState = payload?.state;\n if (!token || receivedState !== state) {\n writeCorsResponse(request, response, 400, \"Invalid auth payload\");\n return;\n }\n\n resolveToken({ token, refreshToken: refreshToken ?? null });\n response.once(\"finish\", () => {\n closeServer();\n });\n writeCorsResponse(request, response, 200, \"OK\");\n return;\n }\n\n writeCorsResponse(request, response, 200, \"Dreamboard CLI auth server\");\n}\n\nfunction writeCorsResponse(\n request: IncomingMessage,\n response: ServerResponse,\n statusCode: number,\n body: string,\n): void {\n const origin = request.headers.origin ?? \"*\";\n response.writeHead(statusCode, {\n \"Access-Control-Allow-Origin\": origin,\n \"Access-Control-Allow-Methods\": \"POST, OPTIONS\",\n \"Access-Control-Allow-Headers\": \"Content-Type\",\n \"Content-Type\": \"text/plain; charset=utf-8\",\n });\n response.end(body);\n}\n\nasync function readRequestBody(request: IncomingMessage): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of request) {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString(\"utf8\");\n}\n\nexport function openBrowser(url: string): void {\n const platform = process.platform;\n let command: [string, ...string[]];\n if (platform === \"darwin\") {\n command = [\"open\", url];\n } else if (platform === \"win32\") {\n command = [\"cmd\", \"/c\", \"start\", \"\", url];\n } else {\n command = [\"xdg-open\", url];\n }\n const [commandName, ...commandArgs] = command;\n const child = spawn(commandName, commandArgs, {\n stdio: \"ignore\",\n detached: true,\n });\n child.unref();\n}\n","import { rmSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport os from \"node:os\";\nimport react from \"@vitejs/plugin-react\";\nimport tailwindcssPostcss from \"@tailwindcss/postcss\";\nimport { createServer, type ViteDevServer } from \"vite\";\nimport type { ResolvedConfig } from \"../types.js\";\nimport { createDevApiProxyPlugin } from \"./dev-api-proxy-plugin.js\";\nimport { createDevRuntimePlatform } from \"./dev-runtime-platform.js\";\nimport { createVirtualDevModulesPlugin } from \"./dev-virtual-modules-plugin.js\";\nimport { createDevLogRelayPlugin } from \"./dev-log-relay-plugin.js\";\nimport { prepareFallbackStylesheet } from \"./dev-fallback-stylesheet.js\";\nimport type { DreamboardDevRuntimeConfig } from \"./dev-runtime-config.js\";\n\nconst require = createRequire(import.meta.url);\nconst tailwindCssEntry = require.resolve(\"tailwindcss/index.css\");\n\nexport type { DreamboardDevRuntimeConfig } from \"./dev-runtime-config.js\";\n\nexport async function startDreamboardDevServer(options: {\n projectRoot: string;\n sessionFilePath: string;\n port?: number;\n host?: string | boolean;\n allowedHosts?: string[];\n runtimeConfig: DreamboardDevRuntimeConfig;\n config: ResolvedConfig;\n}): Promise<{\n url: string;\n networkUrls: string[];\n close: () => Promise<void>;\n server: ViteDevServer;\n}> {\n const { projectRoot, port, host, allowedHosts, runtimeConfig, config } =\n options;\n const platform = createDevRuntimePlatform({\n importMetaUrl: import.meta.url,\n projectRoot,\n debug: runtimeConfig.debug,\n port,\n host,\n allowedHosts,\n tailwindCssEntry,\n });\n const generatedFallbackStylesheetPath = prepareFallbackStylesheet({\n projectRoot,\n repoRoot: platform.repoRoot,\n });\n\n const server = await createServer({\n root: platform.devHostRoot,\n appType: \"spa\",\n plugins: [\n react(),\n createVirtualDevModulesPlugin({\n projectRoot,\n runtimeConfig,\n generatedFallbackStylesheetPath,\n }),\n createDevApiProxyPlugin({ config }),\n createDevLogRelayPlugin({\n sessionFilePath: options.sessionFilePath,\n runtimeConfig,\n config,\n diagnosticsLevel: platform.diagnosticsLevel,\n }),\n ],\n css: {\n postcss: {\n plugins: [tailwindcssPostcss()],\n },\n },\n logLevel: platform.viteLogLevel,\n resolve: {\n dedupe: platform.resolveDedupe,\n alias: platform.resolveAlias,\n },\n optimizeDeps: {\n exclude: platform.optimizeDepsExclude,\n },\n server: platform.serverConfig,\n });\n\n await server.listen();\n const resolvedPort = getBoundPort(server);\n const url = `http://localhost:${resolvedPort}/index.html`;\n return {\n url,\n networkUrls: getNetworkUrls(host, resolvedPort),\n close: async () => {\n await server.close();\n if (generatedFallbackStylesheetPath) {\n rmSync(generatedFallbackStylesheetPath, { force: true });\n }\n },\n server,\n };\n}\n\nfunction getNetworkUrls(\n host: string | boolean | undefined,\n port: number,\n): string[] {\n if (!host) return [];\n if (typeof host === \"string\" && isLoopbackHost(host)) return [];\n\n const hosts =\n host === true || host === \"0.0.0.0\" || host === \"::\"\n ? getLanIpv4Addresses()\n : [host];\n\n return hosts.map(\n (value) => `http://${formatUrlHost(value)}:${port}/index.html`,\n );\n}\n\nfunction isLoopbackHost(host: string): boolean {\n return host === \"localhost\" || host === \"127.0.0.1\" || host === \"::1\";\n}\n\nfunction getLanIpv4Addresses(): string[] {\n return Object.values(os.networkInterfaces())\n .flatMap((interfaces) => interfaces ?? [])\n .filter((details) => details.family === \"IPv4\" && !details.internal)\n .map((details) => details.address);\n}\n\nfunction formatUrlHost(host: string): string {\n return host.includes(\":\") ? `[${host}]` : host;\n}\n\nfunction getBoundPort(server: ViteDevServer): number {\n const address = server.httpServer?.address();\n if (!address || typeof address === \"string\") {\n throw new Error(\"Failed to determine local dev server port.\");\n }\n return address.port;\n}\n","/**\n * Reverse-proxy plugin for the `dreamboard dev` Vite server.\n *\n * Every `/api/*` request the browser makes is intercepted here, run\n * through `ensureFreshAccessToken` so the CLI's stored Supabase session\n * is refreshed when needed, and forwarded to the configured upstream\n * backend with an `Authorization: Bearer <fresh-token>` header injected\n * on the wire. The access and refresh tokens never reach the browser.\n *\n * Failure contract:\n * - Permanent refresh failure (stored refresh token invalid) responds\n * with `401 { error: \"session_invalid\", message }` so the browser can\n * show a \"Run dreamboard login\" overlay instead of surfacing a\n * confusing upstream 401.\n * - Transient refresh failure (network blip) falls back to the snapshot\n * access token in `ResolvedConfig` when we still have one - this lets\n * a short outage degrade to \"existing token\" behavior instead of\n * blocking the iframe outright.\n * - Upstream connection failure responds with `502 { error:\n * \"upstream_unavailable\", message }`.\n *\n * The proxy is deliberately unaware of the session file / persist\n * endpoint / log relay; those live in `dev-log-relay-plugin.ts`.\n */\n\nimport http, { type IncomingMessage, type ServerResponse } from \"node:http\";\nimport https from \"node:https\";\nimport { EventEmitter } from \"node:events\";\nimport consola from \"consola\";\nimport type { Plugin } from \"vite\";\nimport {\n DEFAULT_REFRESH_WINDOW_MS,\n ensureFreshAccessToken,\n} from \"../auth/refresh-coordinator.js\";\nimport { PermanentRefreshError } from \"../auth/refresh-error.js\";\nimport type { ResolvedConfig } from \"../types.js\";\n\nexport type ResolvedBearerOk = {\n readonly kind: \"ok\";\n readonly token: string | null;\n};\nexport type ResolvedBearerPermanentFailure = {\n readonly kind: \"permanent_invalid\";\n readonly message: string;\n};\nexport type ResolvedBearer = ResolvedBearerOk | ResolvedBearerPermanentFailure;\n\nexport interface DevApiProxyPluginDeps {\n /**\n * Hook point for tests: resolve the bearer token (or a permanent\n * failure) synchronously once per request.\n */\n resolveBearer?: (config: ResolvedConfig) => Promise<ResolvedBearer>;\n /**\n * Hook point for tests: construct the underlying proxy. Allows\n * injecting an in-memory proxy that talks to a fake upstream.\n */\n createProxy?: (target: string) => DevApiProxy;\n}\n\ntype DevApiProxy = {\n on(event: \"error\", listener: ProxyErrorListener): DevApiProxy;\n web(\n req: IncomingMessage,\n res: ServerResponse,\n options?: Record<string, never>,\n callback?: (err?: Error) => void,\n ): void;\n close(): void;\n};\n\ntype ProxyErrorListener = (\n err: Error,\n req: IncomingMessage,\n res: ServerResponse,\n) => void;\n\nexport function createDevApiProxyPlugin(options: {\n config: ResolvedConfig;\n deps?: DevApiProxyPluginDeps;\n}): Plugin {\n const { config, deps } = options;\n const target = config.apiBaseUrl;\n\n return {\n name: \"dreamboard-dev-api-proxy\",\n configureServer(server) {\n const createProxy =\n deps?.createProxy ??\n ((proxyTarget: string) => createStreamingProxy(proxyTarget));\n\n const proxy = createProxy(target);\n\n proxy.on(\"error\", (err, _req, res) => {\n consola.debug(`[dev-proxy] upstream error: ${formatUnknown(err)}`);\n if (res instanceof Object && \"writeHead\" in res && !res.headersSent) {\n respondUpstreamUnavailable(res as ServerResponse, err);\n } else if (res && \"destroy\" in res) {\n (res as { destroy: () => void }).destroy();\n }\n });\n\n const resolveBearer = deps?.resolveBearer ?? resolveDevBearer;\n\n // NOTE: we intentionally do NOT mount this middleware on `/api`.\n // Connect-style `middlewares.use(path, handler)` strips the mount\n // prefix from `req.url` before invoking the handler, which would\n // cause the proxy to forward `/sessions/.../status` instead of\n // `/api/sessions/.../status` and the backend would respond 404.\n // Filtering inside the handler keeps the full path intact.\n server.middlewares.use((req, res, next) => {\n if (!req.url || !isApiRequest(req.url)) {\n next();\n return;\n }\n void handleApiRequest({ req, res, config, proxy, resolveBearer });\n });\n\n server.httpServer?.once(\"close\", () => {\n proxy.close();\n });\n },\n };\n}\n\nasync function handleApiRequest(options: {\n req: IncomingMessage;\n res: ServerResponse;\n config: ResolvedConfig;\n proxy: DevApiProxy;\n resolveBearer: (config: ResolvedConfig) => Promise<ResolvedBearer>;\n}): Promise<void> {\n const { req, res, config, proxy, resolveBearer } = options;\n try {\n const bearer = await resolveBearer(config);\n if (bearer.kind === \"permanent_invalid\") {\n respondSessionInvalid(res, bearer.message);\n return;\n }\n\n if (bearer.token) {\n req.headers.authorization = `Bearer ${bearer.token}`;\n } else {\n delete req.headers.authorization;\n }\n\n proxy.web(req, res, {}, (err) => {\n if (!err) return;\n consola.debug(`[dev-proxy] forward error: ${formatUnknown(err)}`);\n if (!res.headersSent) {\n respondUpstreamUnavailable(res, err);\n }\n });\n } catch (err) {\n consola.debug(`[dev-proxy] pre-forward error: ${formatUnknown(err)}`);\n respondRefreshFailed(res, err);\n }\n}\n\nfunction createStreamingProxy(target: string): DevApiProxy {\n const targetUrl = new URL(target);\n const events = new EventEmitter();\n const activeRequests = new Set<http.ClientRequest>();\n\n const proxy: DevApiProxy = {\n on(event, listener) {\n events.on(event, listener);\n return proxy;\n },\n web(req, res, _options, callback) {\n const upstreamUrl = new URL(req.url ?? \"/\", targetUrl);\n const headers = createForwardHeaders(req, targetUrl);\n\n const client = targetUrl.protocol === \"https:\" ? https : http;\n const upstreamReq = client.request(\n upstreamUrl,\n {\n method: req.method,\n headers,\n },\n (upstreamRes) => {\n res.writeHead(\n upstreamRes.statusCode ?? 502,\n upstreamRes.statusMessage,\n upstreamRes.headers,\n );\n upstreamRes.pipe(res);\n },\n );\n\n activeRequests.add(upstreamReq);\n\n const handleError = (err: Error) => {\n activeRequests.delete(upstreamReq);\n callback?.(err);\n events.emit(\"error\", err, req, res);\n };\n\n upstreamReq.on(\"error\", handleError);\n upstreamReq.on(\"close\", () => activeRequests.delete(upstreamReq));\n req.on(\"aborted\", () => upstreamReq.destroy());\n req.pipe(upstreamReq);\n },\n close() {\n for (const request of activeRequests) {\n request.destroy();\n }\n activeRequests.clear();\n events.removeAllListeners();\n },\n };\n\n return proxy;\n}\n\nfunction createForwardHeaders(\n req: IncomingMessage,\n targetUrl: URL,\n): http.OutgoingHttpHeaders {\n const headers: http.OutgoingHttpHeaders = { ...req.headers };\n\n // Browser requests are same-origin with the dev host. Once the CLI proxies\n // them to the backend, they are server-to-server requests; forwarding the\n // browser Origin from a Cloudflare/LAN host makes backend CORS reject valid\n // dev traffic.\n delete headers.origin;\n delete headers[\"access-control-request-headers\"];\n delete headers[\"access-control-request-method\"];\n\n headers.host = targetUrl.host;\n headers[\"x-forwarded-host\"] = req.headers.host;\n headers[\"x-forwarded-proto\"] = targetUrl.protocol.replace(\":\", \"\");\n\n return headers;\n}\n\nexport async function resolveDevBearer(\n config: ResolvedConfig,\n): Promise<ResolvedBearer> {\n // Env/flag-provided tokens are not owned by `CredentialStore` and must\n // not be rotated. Forward them as-is.\n if (!usesStoredSession(config)) {\n return { kind: \"ok\", token: config.authToken ?? null };\n }\n\n if (!config.supabaseUrl || !config.supabaseAnonKey) {\n return { kind: \"ok\", token: config.authToken ?? null };\n }\n\n try {\n const result = await ensureFreshAccessToken({\n supabaseUrl: config.supabaseUrl,\n supabaseAnonKey: config.supabaseAnonKey,\n refreshWindowMs: DEFAULT_REFRESH_WINDOW_MS,\n });\n switch (result.kind) {\n case \"missing\":\n return { kind: \"ok\", token: config.authToken ?? null };\n case \"unchanged\":\n case \"rotated\":\n return { kind: \"ok\", token: result.credentials.accessToken };\n case \"transient_failure\":\n return { kind: \"ok\", token: config.authToken ?? null };\n }\n } catch (err) {\n if (err instanceof PermanentRefreshError) {\n return { kind: \"permanent_invalid\", message: err.message };\n }\n throw err;\n }\n}\n\nfunction usesStoredSession(config: ResolvedConfig): boolean {\n return (\n config.authTokenSource === \"global\" &&\n config.refreshTokenSource === \"global\"\n );\n}\n\nfunction respondSessionInvalid(res: ServerResponse, message: string): void {\n if (res.headersSent) return;\n res.statusCode = 401;\n res.setHeader(\"content-type\", \"application/json\");\n res.end(\n JSON.stringify({\n error: \"session_invalid\",\n message,\n }),\n );\n}\n\nfunction respondUpstreamUnavailable(res: ServerResponse, error: unknown): void {\n if (res.headersSent) return;\n res.statusCode = 502;\n res.setHeader(\"content-type\", \"application/json\");\n res.end(\n JSON.stringify({\n error: \"upstream_unavailable\",\n message: formatUnknown(error),\n }),\n );\n}\n\nfunction respondRefreshFailed(res: ServerResponse, error: unknown): void {\n if (res.headersSent) return;\n res.statusCode = 502;\n res.setHeader(\"content-type\", \"application/json\");\n res.end(\n JSON.stringify({\n error: \"refresh_failed\",\n message: formatUnknown(error),\n }),\n );\n}\n\nfunction isApiRequest(url: string): boolean {\n return url === \"/api\" || url.startsWith(\"/api/\") || url.startsWith(\"/api?\");\n}\n\nfunction formatUnknown(value: unknown): string {\n if (value instanceof Error) {\n return value.message || value.name || \"Unknown error\";\n }\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n","import { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { existsSync } from \"node:fs\";\nimport type { Alias, ServerOptions } from \"vite\";\nimport { resolveDevDiagnosticsLevel } from \"./dev-diagnostics.js\";\n\nexport interface DevRuntimePlatformOptions {\n importMetaUrl: string;\n projectRoot: string;\n debug: boolean;\n port?: number;\n host?: string | boolean;\n allowedHosts?: string[];\n tailwindCssEntry: string;\n}\n\nexport interface DevRuntimePlatform {\n devHostRoot: string;\n repoRoot: string;\n cliRoot: string;\n diagnosticsLevel: ReturnType<typeof resolveDevDiagnosticsLevel>;\n viteLogLevel: \"info\" | \"warn\";\n serverConfig: ServerOptions;\n resolveDedupe: string[];\n resolveAlias: Alias[];\n optimizeDepsExclude: string[];\n}\n\nexport function createDevRuntimePlatform(\n options: DevRuntimePlatformOptions,\n): DevRuntimePlatform {\n const devHostRoot = resolveDevHostRoot(options.importMetaUrl);\n const cliRoot = resolveCliRoot(options.importMetaUrl);\n const repoRoot = resolveRepoRoot(cliRoot);\n const require = createRequire(options.importMetaUrl);\n const diagnosticsLevel = resolveDevDiagnosticsLevel(options.debug);\n const uiSdkRoot = resolvePackageRoot(\n require,\n cliRoot,\n \"@dreamboard/ui-sdk\",\n \"@dreamboard-games/ui-sdk\",\n \"packages/ui-sdk\",\n );\n const apiClientClientGen = resolvePackageSubpath(\n require,\n \"@dreamboard/api-client/client.gen\",\n \"@dreamboard-games/api-client/client.gen\",\n );\n const uiHostRuntimeRoot = resolveWorkspaceOrPackagedSource(\n repoRoot,\n cliRoot,\n \"packages/ui-host-runtime\",\n \"dist/runtime-packages/ui-host-runtime\",\n );\n const uiRoot = resolveWorkspaceOrPackagedSource(\n repoRoot,\n cliRoot,\n \"packages/ui\",\n \"dist/runtime-packages/ui\",\n );\n const tailwindConfigRoot = resolveWorkspaceOrPackagedSource(\n repoRoot,\n cliRoot,\n \"packages/tailwind-config\",\n \"dist/runtime-packages/tailwind-config\",\n );\n\n return {\n devHostRoot,\n repoRoot,\n cliRoot,\n diagnosticsLevel,\n viteLogLevel: diagnosticsLevel === \"verbose\" ? \"info\" : \"warn\",\n serverConfig: {\n host: options.host ?? \"localhost\",\n allowedHosts: options.allowedHosts,\n port: options.port ?? 5352,\n strictPort: false,\n watch: {\n ignored: createProjectOnlyWatchIgnored(options.projectRoot),\n },\n headers: {\n \"Access-Control-Allow-Origin\": \"*\",\n \"Access-Control-Allow-Methods\": \"GET, OPTIONS\",\n },\n fs: {\n allow: [options.projectRoot, repoRoot],\n },\n },\n resolveDedupe: [\n \"react\",\n \"react-dom\",\n \"@dreamboard/ui-sdk\",\n \"@dreamboard/sdk-types\",\n ],\n resolveAlias: [\n {\n find: /^react$/,\n replacement: resolveCliDependency(\n require,\n cliRoot,\n \"react\",\n \"node_modules/react/index.js\",\n ),\n },\n {\n find: /^react\\/jsx-runtime$/,\n replacement: resolveCliDependency(\n require,\n cliRoot,\n \"react/jsx-runtime\",\n \"node_modules/react/jsx-runtime.js\",\n ),\n },\n {\n find: /^react\\/jsx-dev-runtime$/,\n replacement: resolveCliDependency(\n require,\n cliRoot,\n \"react/jsx-dev-runtime\",\n \"node_modules/react/jsx-dev-runtime.js\",\n ),\n },\n {\n find: /^react-dom$/,\n replacement: resolveCliDependency(\n require,\n cliRoot,\n \"react-dom\",\n \"node_modules/react-dom/index.js\",\n ),\n },\n {\n find: /^react-dom\\/client$/,\n replacement: resolveCliDependency(\n require,\n cliRoot,\n \"react-dom/client\",\n \"node_modules/react-dom/client.js\",\n ),\n },\n {\n find: /^@dreamboard\\/ui-sdk$/,\n replacement: path.resolve(uiSdkRoot, \"src/index.ts\"),\n },\n {\n find: /^@dreamboard\\/ui-sdk\\/reducer$/,\n replacement: path.resolve(uiSdkRoot, \"src/reducer.ts\"),\n },\n {\n // Must resolve to the same source tree as the `@dreamboard/ui-sdk`\n // alias. If this subpath falls through to `node_modules/.../dist` it\n // creates a second RuntimeContext identity, and consumers calling\n // `useRuntimeContext` on the workspace-source copy will never find\n // the provider that's set up via the dist copy (and vice versa).\n find: /^@dreamboard\\/ui-sdk\\/components$/,\n replacement: path.resolve(uiSdkRoot, \"src/components/index.ts\"),\n },\n {\n // Keep generated workspace adapters and legacy internal imports on the\n // same source instance as PluginRuntime so React context identity stays\n // shared in dev.\n find: /^@dreamboard\\/ui-sdk\\/internal$/,\n replacement: path.resolve(uiSdkRoot, \"src/internal.ts\"),\n },\n {\n find: /^@dreamboard\\/ui-sdk\\/workspace-contract$/,\n replacement: path.resolve(uiSdkRoot, \"src/workspace-contract.ts\"),\n },\n {\n find: /^@dreamboard\\/ui-sdk\\/internal\\/runtime-context$/,\n replacement: path.resolve(\n uiSdkRoot,\n \"src/context/RuntimeContext.tsx\",\n ),\n },\n {\n find: /^@dreamboard\\/ui-sdk\\/internal\\/usePluginRuntime$/,\n replacement: path.resolve(\n uiSdkRoot,\n \"src/hooks/usePluginRuntime.ts\",\n ),\n },\n {\n find: /^@dreamboard\\/ui-sdk\\/internal\\/createPluginRuntimeAPI$/,\n replacement: path.resolve(\n uiSdkRoot,\n \"src/runtime/createPluginRuntimeAPI.ts\",\n ),\n },\n {\n find: /^@dreamboard\\/ui-sdk\\/internal\\/useHandLayout$/,\n replacement: path.resolve(uiSdkRoot, \"src/hooks/useHandLayout.ts\"),\n },\n {\n find: /^@dreamboard\\/ui-sdk\\/internal\\/usePanZoom$/,\n replacement: path.resolve(uiSdkRoot, \"src/hooks/usePanZoom.ts\"),\n },\n {\n find: /^@dreamboard\\/ui-sdk\\/internal\\/useIsMobile$/,\n replacement: path.resolve(uiSdkRoot, \"src/hooks/useIsMobile.ts\"),\n },\n {\n find: /^@dreamboard\\/ui-sdk\\/internal\\/player-state$/,\n replacement: path.resolve(\n uiSdkRoot,\n \"src/types/player-state.ts\",\n ),\n },\n {\n find: /^@dreamboard\\/ui-sdk\\/internal\\/tiled-board$/,\n replacement: path.resolve(\n uiSdkRoot,\n \"src/types/tiled-board.ts\",\n ),\n },\n {\n find: /^@dreamboard\\/ui-sdk\\/internal\\/plugin-state$/,\n replacement: path.resolve(\n uiSdkRoot,\n \"src/types/plugin-state.ts\",\n ),\n },\n {\n find: /^@dreamboard\\/ui-sdk\\/types\\/runtime-api$/,\n replacement: path.resolve(\n uiSdkRoot,\n \"src/types/runtime-api.ts\",\n ),\n },\n {\n find: /^@dreamboard\\/ui-host-runtime\\/components$/,\n replacement: path.resolve(uiHostRuntimeRoot, \"src/components/index.ts\"),\n },\n {\n find: /^@dreamboard\\/ui-host-runtime\\/runtime$/,\n replacement: path.resolve(uiHostRuntimeRoot, \"src/runtime/index.ts\"),\n },\n {\n find: /^@dreamboard\\/ui\\/components\\/(.*)$/,\n replacement: path.resolve(uiRoot, \"src/components/$1.tsx\"),\n },\n {\n find: /^@dreamboard\\/ui\\/lib\\/(.*)$/,\n replacement: path.resolve(uiRoot, \"src/lib/$1.ts\"),\n },\n {\n find: /^@dreamboard\\/tailwind-config$/,\n replacement: path.resolve(tailwindConfigRoot, \"shared-styles.css\"),\n },\n {\n find: /^@dreamboard\\/manifest-contract$/,\n replacement: path.resolve(\n options.projectRoot,\n \"shared/manifest-contract.ts\",\n ),\n },\n {\n find: /^@dreamboard\\/ui-contract$/,\n replacement: path.resolve(\n options.projectRoot,\n \"shared/generated/ui-contract.ts\",\n ),\n },\n {\n find: /^@dreamboard\\/ui-sdk\\/plugin-styles\\.css$/,\n replacement: resolveCliDependency(\n require,\n cliRoot,\n \"@dreamboard/ui-sdk/plugin-styles.css\",\n \"packages/ui-sdk/src/plugin-styles.css\",\n ),\n },\n {\n find: /^@dreamboard\\/api-client\\/client\\.gen$/,\n replacement: apiClientClientGen,\n },\n {\n find: /^@shared\\/(.*)$/,\n replacement: path.resolve(options.projectRoot, \"shared/$1\"),\n },\n {\n find: /^tailwindcss$/,\n replacement: options.tailwindCssEntry,\n },\n ],\n // Author SDKs are resolved from the project, not the CLI root. Let Vite\n // transform them fresh so its CLI-scoped dependency cache cannot pin an\n // older local snapshot after `dreamboard sync`.\n optimizeDepsExclude: [\n \"@dreamboard/ui-sdk\",\n \"@dreamboard/ui-sdk/workspace-contract\",\n \"@dreamboard/app-sdk\",\n \"@dreamboard/app-sdk/reducer\",\n \"@dreamboard/sdk-types\",\n ],\n };\n}\n\nfunction createProjectOnlyWatchIgnored(\n projectRoot: string,\n): (file: string) => boolean {\n const normalizedProjectRoot = path.resolve(projectRoot);\n\n return (file) => {\n const normalizedFile = path.resolve(file);\n const relativePath = path.relative(normalizedProjectRoot, normalizedFile);\n const isInsideProject =\n relativePath === \"\" ||\n (relativePath.length > 0 &&\n !relativePath.startsWith(\"..\") &&\n !path.isAbsolute(relativePath));\n\n if (!isInsideProject) {\n return true;\n }\n\n const pathSegments = relativePath.split(path.sep);\n return (\n pathSegments.includes(\".dreamboard\") ||\n pathSegments.includes(\"node_modules\")\n );\n };\n}\n\nfunction resolveWorkspaceOrPackagedSource(\n repoRoot: string,\n cliRoot: string,\n workspaceRelativePath: string,\n packagedRelativePath: string,\n): string {\n const workspacePath = path.resolve(repoRoot, workspaceRelativePath);\n if (existsSync(workspacePath)) return workspacePath;\n return path.resolve(cliRoot, packagedRelativePath);\n}\n\nfunction resolvePackageRoot(\n require: NodeJS.Require,\n cliRoot: string,\n specifier: string,\n publicSpecifier: string,\n fallbackRelativePath: string,\n): string {\n try {\n return path.dirname(require.resolve(`${specifier}/package.json`));\n } catch {\n try {\n return path.dirname(require.resolve(`${publicSpecifier}/package.json`));\n } catch {\n return path.resolve(cliRoot, \"..\", \"..\", fallbackRelativePath);\n }\n }\n}\n\nfunction resolvePackageSubpath(\n require: NodeJS.Require,\n specifier: string,\n publicSpecifier: string,\n): string {\n try {\n return require.resolve(specifier);\n } catch {\n return require.resolve(publicSpecifier);\n }\n}\n\nfunction resolveCliDependency(\n require: NodeJS.Require,\n cliRoot: string,\n specifier: string,\n fallbackRelativePath: string,\n): string {\n try {\n return require.resolve(specifier);\n } catch {\n return path.resolve(cliRoot, fallbackRelativePath);\n }\n}\n\nfunction resolveDevHostRoot(importMetaUrl: string): string {\n const currentDir = path.dirname(fileURLToPath(importMetaUrl));\n const packagedDirCandidate = path.resolve(currentDir, \"dev-host\");\n if (existsSync(packagedDirCandidate)) return packagedDirCandidate;\n const sourceDirCandidate = path.resolve(currentDir, \"../src/dev-host\");\n return existsSync(sourceDirCandidate) ? sourceDirCandidate : currentDir;\n}\n\nfunction resolveCliRoot(importMetaUrl: string): string {\n let currentDir = path.dirname(fileURLToPath(importMetaUrl));\n\n while (true) {\n if (existsSync(path.join(currentDir, \"package.json\"))) {\n return currentDir;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n return path.resolve(resolveDevHostRoot(importMetaUrl), \"../..\");\n }\n currentDir = parentDir;\n }\n}\n\nfunction resolveRepoRoot(cliRoot: string): string {\n let currentDir = cliRoot;\n\n while (true) {\n if (existsSync(path.join(currentDir, \"pnpm-workspace.yaml\"))) {\n return currentDir;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n return cliRoot;\n }\n currentDir = parentDir;\n }\n}\n","import type { LoggerLike } from \"@dreamboard/ui-host-runtime/runtime\";\n\nexport type DevLogEnvelope = {\n source: \"host\" | \"plugin\" | \"sse\";\n level: \"log\" | \"warn\" | \"error\" | \"info\";\n message: string;\n};\n\nexport type DevDiagnosticsLevel = \"errors\" | \"verbose\";\n\nexport function resolveDevDiagnosticsLevel(\n debug: boolean,\n): DevDiagnosticsLevel {\n return debug ? \"verbose\" : \"errors\";\n}\n\nexport function createDevDiagnosticsLogger(\n level: DevDiagnosticsLevel,\n): LoggerLike {\n if (level === \"verbose\") {\n return {\n log: (...args) => console.log(...args),\n warn: (...args) => console.warn(...args),\n error: (...args) => console.error(...args),\n };\n }\n\n return {\n log: () => {},\n warn: () => {},\n error: (...args) => console.error(...args),\n };\n}\n\nexport function shouldRelayDevLog(\n diagnosticsLevel: DevDiagnosticsLevel,\n payload: DevLogEnvelope,\n): boolean {\n return (\n diagnosticsLevel === \"verbose\" ||\n payload.level === \"warn\" ||\n payload.level === \"error\"\n );\n}\n\nexport function formatConsoleArgs(args: unknown[]): string {\n return args.map((value) => stringifyForRelay(value)).join(\" \");\n}\n\nexport function stringifyForRelay(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n if (value instanceof Error) {\n return value.stack ?? value.message;\n }\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n","import path from \"node:path\";\nimport { normalizePath, type Plugin } from \"vite\";\nimport type { DreamboardDevRuntimeConfig } from \"./dev-runtime-config.js\";\n\nexport function createVirtualDevModulesPlugin(options: {\n projectRoot: string;\n runtimeConfig: DreamboardDevRuntimeConfig;\n generatedFallbackStylesheetPath: string | null;\n}): Plugin {\n const configModuleId = \"virtual:dreamboard-dev-config\";\n const resolvedConfigModuleId = `\\0${configModuleId}`;\n const projectEntryModuleId = \"virtual:dreamboard-project-entry\";\n const resolvedProjectEntryModuleId = `\\0${projectEntryModuleId}`;\n const projectAppPath = path.resolve(options.projectRoot, \"ui/App.tsx\");\n const projectStylePath = path.resolve(options.projectRoot, \"ui/style.css\");\n\n return {\n name: \"dreamboard-dev-virtual-modules\",\n resolveId(id) {\n if (id === configModuleId) {\n return resolvedConfigModuleId;\n }\n if (id === projectEntryModuleId) {\n return resolvedProjectEntryModuleId;\n }\n return null;\n },\n load(id) {\n if (id === resolvedConfigModuleId) {\n return `export const devConfig = ${JSON.stringify(options.runtimeConfig)};\\nexport default devConfig;\\n`;\n }\n if (id === resolvedProjectEntryModuleId) {\n const fallbackImport = options.generatedFallbackStylesheetPath\n ? `import \"/@fs/${normalizePath(options.generatedFallbackStylesheetPath)}\";\\n`\n : \"\";\n return `${fallbackImport}import { createElement } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport { ErrorBoundary, PluginRuntime } from \"@dreamboard/ui-sdk\";\nimport \"/@fs/${normalizePath(projectStylePath)}\";\nimport App from \"/@fs/${normalizePath(projectAppPath)}\";\n\nconst rootElement = document.getElementById(\"root\");\nif (!rootElement) {\n throw new Error(\"Dreamboard dev plugin root element was not found.\");\n}\n\ncreateRoot(rootElement).render(\n createElement(\n ErrorBoundary,\n null,\n createElement(\n PluginRuntime,\n null,\n createElement(App),\n ),\n ),\n);\n`;\n }\n return null;\n },\n };\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport consola from \"consola\";\nimport type { Plugin } from \"vite\";\nimport type { ResolvedConfig } from \"../types.js\";\nimport { createPersistedDevSession } from \"../utils/dev-session.js\";\nimport { exists, readJsonFile, writeJsonFile } from \"../utils/fs.js\";\nimport { resolveDevBearer } from \"./dev-api-proxy-plugin.js\";\nimport {\n shouldRelayDevLog,\n type DevDiagnosticsLevel,\n type DevLogEnvelope,\n} from \"./dev-diagnostics.js\";\nimport type { DreamboardDevRuntimeConfig } from \"./dev-runtime-config.js\";\nimport type { ActiveSession } from \"./dev-host-storage.js\";\n\nexport function createDevLogRelayPlugin(options: {\n sessionFilePath: string;\n runtimeConfig: DreamboardDevRuntimeConfig;\n config: ResolvedConfig;\n diagnosticsLevel: DevDiagnosticsLevel;\n}): Plugin {\n return {\n name: \"dreamboard-dev-log-relay\",\n configureServer(server) {\n server.middlewares.use(\"/__dreamboard_dev/log\", (req, res) => {\n if (req.method !== \"POST\") {\n res.statusCode = 405;\n res.setHeader(\"content-type\", \"application/json\");\n res.end(JSON.stringify({ error: \"Method not allowed\" }));\n return;\n }\n\n const chunks: Buffer[] = [];\n req.on(\"data\", (chunk) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n req.on(\"end\", () => {\n try {\n const body = Buffer.concat(chunks).toString(\"utf8\");\n const payload = JSON.parse(body) as Partial<DevLogEnvelope>;\n const normalizedPayload = {\n source: coerceLogSource(payload.source),\n level: coerceLogLevel(payload.level),\n message:\n typeof payload.message === \"string\"\n ? payload.message\n : \"Missing dev log message\",\n } satisfies DevLogEnvelope;\n if (\n shouldRelayDevLog(options.diagnosticsLevel, normalizedPayload)\n ) {\n relayDevLog(normalizedPayload);\n }\n res.statusCode = 204;\n res.end();\n } catch (error) {\n consola.warn(\n `[dev-host] Failed to decode browser log payload: ${formatUnknown(error)}`,\n );\n res.statusCode = 400;\n res.setHeader(\"content-type\", \"application/json\");\n res.end(JSON.stringify({ error: \"Invalid dev log payload\" }));\n }\n });\n });\n\n server.middlewares.use(\n \"/__dreamboard_dev/session/snapshot\",\n createSnapshotSessionHandler({\n sessionFilePath: options.sessionFilePath,\n runtimeConfig: options.runtimeConfig,\n config: options.config,\n }),\n );\n server.middlewares.use(\n \"/__dreamboard_dev/session/new\",\n createNewSessionHandler({\n sessionFilePath: options.sessionFilePath,\n runtimeConfig: options.runtimeConfig,\n config: options.config,\n }),\n );\n server.middlewares.use(\n \"/__dreamboard_dev/session/start\",\n createStartSessionHandler({\n sessionFilePath: options.sessionFilePath,\n runtimeConfig: options.runtimeConfig,\n config: options.config,\n }),\n );\n },\n };\n}\n\nexport function createSnapshotSessionHandler(options: {\n sessionFilePath: string;\n runtimeConfig: DreamboardDevRuntimeConfig;\n config: ResolvedConfig;\n}): (req: IncomingMessage, res: ServerResponse) => void {\n return (req, res) => {\n void handleSnapshotSessionRequest(req, res, options);\n };\n}\n\nexport function createNewSessionHandler(options: {\n sessionFilePath: string;\n runtimeConfig: DreamboardDevRuntimeConfig;\n config: ResolvedConfig;\n}): (req: IncomingMessage, res: ServerResponse) => void {\n return (req, res) => {\n void handleNewSessionRequest(req, res, options);\n };\n}\n\nexport function createStartSessionHandler(options: {\n sessionFilePath: string;\n runtimeConfig: DreamboardDevRuntimeConfig;\n config: ResolvedConfig;\n}): (req: IncomingMessage, res: ServerResponse) => void {\n return (req, res) => {\n void handleStartSessionRequest(req, res, options);\n };\n}\n\nasync function handleSnapshotSessionRequest(\n req: IncomingMessage,\n res: ServerResponse,\n options: {\n sessionFilePath: string;\n runtimeConfig: DreamboardDevRuntimeConfig;\n config: ResolvedConfig;\n },\n): Promise<void> {\n if (req.method !== \"GET\") {\n respondJson(res, 405, { error: \"Method not allowed\" });\n return;\n }\n\n try {\n const session = await loadCurrentSession(options);\n const requestedPlayerId = extractQueryParam(req, \"playerId\");\n let snapshot = await fetchBackendJson(\n options.config,\n appendQuery(`/api/sessions/${session.sessionId}/snapshot`, {\n playerId: requestedPlayerId,\n }),\n );\n if (\n options.runtimeConfig.autoStartGame &&\n isStartableLobbySnapshot(snapshot)\n ) {\n snapshot = await fetchBackendJson(\n options.config,\n `/api/sessions/${session.sessionId}/start`,\n { method: \"POST\" },\n );\n if (requestedPlayerId) {\n snapshot = await fetchBackendJson(\n options.config,\n appendQuery(`/api/sessions/${session.sessionId}/snapshot`, {\n playerId: requestedPlayerId,\n }),\n );\n }\n await persistSessionId(options.sessionFilePath, session.sessionId);\n }\n respondJson(res, 200, attachLocalSeed(snapshot, session.seed ?? null));\n } catch (error) {\n respondJson(res, statusForError(error), { error: formatUnknown(error) });\n }\n}\n\nasync function handleNewSessionRequest(\n req: IncomingMessage,\n res: ServerResponse,\n options: {\n sessionFilePath: string;\n runtimeConfig: DreamboardDevRuntimeConfig;\n config: ResolvedConfig;\n },\n): Promise<void> {\n if (req.method !== \"POST\") {\n respondJson(res, 405, { error: \"Method not allowed\" });\n return;\n }\n\n try {\n const body = await readJsonBody(req);\n const seed = Number.parseInt(String(body.seed ?? \"\"), 10);\n if (!Number.isSafeInteger(seed)) {\n throw new Error(\"Seed must be a safe integer.\");\n }\n const created = await fetchBackendJson(\n options.config,\n `/api/games/${options.runtimeConfig.gameId}/sessions`,\n {\n method: \"POST\",\n body: {\n compiledResultId: options.runtimeConfig.compiledResultId,\n seed,\n playerCount: options.runtimeConfig.playerCount,\n autoAssignSeats: true,\n setupProfileId: options.runtimeConfig.setupProfileId ?? undefined,\n },\n },\n );\n const sessionId = requireString(\n (created as { sessionId?: unknown }).sessionId,\n \"sessionId\",\n );\n let snapshot = await fetchBackendJson(\n options.config,\n `/api/sessions/${sessionId}/snapshot`,\n );\n if (\n options.runtimeConfig.autoStartGame &&\n isStartableLobbySnapshot(snapshot)\n ) {\n snapshot = await fetchBackendJson(\n options.config,\n `/api/sessions/${sessionId}/start`,\n {\n method: \"POST\",\n },\n );\n }\n await persistSessionId(options.sessionFilePath, sessionId);\n respondJson(res, 200, attachLocalSeed(snapshot, seed));\n } catch (error) {\n respondJson(res, statusForError(error), { error: formatUnknown(error) });\n }\n}\n\nasync function handleStartSessionRequest(\n req: IncomingMessage,\n res: ServerResponse,\n options: {\n sessionFilePath: string;\n runtimeConfig: DreamboardDevRuntimeConfig;\n config: ResolvedConfig;\n },\n): Promise<void> {\n if (req.method !== \"POST\") {\n respondJson(res, 405, { error: \"Method not allowed\" });\n return;\n }\n\n try {\n const session = await loadCurrentSession(options);\n const snapshot = await fetchBackendJson(\n options.config,\n `/api/sessions/${session.sessionId}/start`,\n { method: \"POST\" },\n );\n await persistSessionId(options.sessionFilePath, session.sessionId);\n respondJson(res, 200, attachLocalSeed(snapshot, session.seed ?? null));\n } catch (error) {\n respondJson(res, statusForError(error), { error: formatUnknown(error) });\n }\n}\n\nasync function readJsonBody(\n req: IncomingMessage,\n): Promise<Record<string, unknown>> {\n const chunks: Buffer[] = [];\n await new Promise<void>((resolve, reject) => {\n req.on(\"data\", (chunk) => {\n chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));\n });\n req.on(\"end\", () => resolve());\n req.on(\"error\", reject);\n });\n const text = Buffer.concat(chunks).toString(\"utf8\");\n return text ? (JSON.parse(text) as Record<string, unknown>) : {};\n}\n\nfunction requireString(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`Missing required field: ${field}`);\n }\n return value;\n}\n\nfunction extractQueryParam(req: IncomingMessage, name: string): string | null {\n const rawUrl = req.url ?? \"\";\n const value = new URL(rawUrl, \"http://dreamboard.local\").searchParams.get(\n name,\n );\n return value?.trim() || null;\n}\n\nfunction appendQuery(\n path: string,\n query: Record<string, string | null | undefined>,\n): string {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value) {\n params.set(key, value);\n }\n }\n const serialized = params.toString();\n return serialized ? `${path}?${serialized}` : path;\n}\n\nasync function loadCurrentSession(options: {\n sessionFilePath: string;\n runtimeConfig: DreamboardDevRuntimeConfig;\n}): Promise<ActiveSession> {\n if (!(await exists(options.sessionFilePath))) {\n return options.runtimeConfig.initialSession;\n }\n\n const payload = await readJsonFile<unknown>(options.sessionFilePath);\n const session = parsePersistedSessionPointer(payload, options.runtimeConfig);\n if (!session) {\n throw new Error(\"Session file did not contain a valid session pointer.\");\n }\n return session;\n}\n\nasync function persistSessionId(\n sessionFilePath: string,\n sessionId: string,\n): Promise<void> {\n await writeJsonFile(\n sessionFilePath,\n createPersistedDevSession({ sessionId }),\n );\n}\n\nasync function fetchBackendJson(\n config: ResolvedConfig,\n path: string,\n options: {\n method?: \"GET\" | \"POST\";\n body?: Record<string, unknown>;\n } = {},\n): Promise<unknown> {\n const bearer = await resolveDevBearer(config);\n if (bearer.kind === \"permanent_invalid\") {\n throw new HttpError(401, bearer.message);\n }\n\n const response = await fetch(`${config.apiBaseUrl}${path}`, {\n method: options.method ?? \"GET\",\n headers: {\n ...(bearer.token ? { authorization: `Bearer ${bearer.token}` } : {}),\n ...(options.body ? { \"content-type\": \"application/json\" } : {}),\n },\n body: options.body ? JSON.stringify(options.body) : undefined,\n });\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new HttpError(\n response.status,\n text || `Backend request failed with ${response.status}`,\n );\n }\n return response.json();\n}\n\nfunction attachLocalSeed(snapshot: unknown, seed: number | null): unknown {\n if (!snapshot || typeof snapshot !== \"object\") {\n return snapshot;\n }\n const context = (snapshot as { context?: unknown }).context;\n if (!context || typeof context !== \"object\") {\n return snapshot;\n }\n return {\n ...(snapshot as Record<string, unknown>),\n context: {\n ...(context as Record<string, unknown>),\n seed,\n },\n };\n}\n\nfunction isStartableLobbySnapshot(snapshot: unknown): boolean {\n if (!snapshot || typeof snapshot !== \"object\") {\n return false;\n }\n const context = (snapshot as { context?: { phase?: unknown } }).context;\n const lobby = (snapshot as { lobby?: { canStart?: unknown } }).lobby;\n return context?.phase === \"lobby\" && lobby?.canStart === true;\n}\n\nfunction respondJson(\n res: ServerResponse,\n statusCode: number,\n payload: unknown,\n): void {\n res.statusCode = statusCode;\n res.setHeader(\"content-type\", \"application/json\");\n res.end(JSON.stringify(payload));\n}\n\nfunction statusForError(error: unknown): number {\n return error instanceof HttpError ? error.statusCode : 500;\n}\n\nclass HttpError extends Error {\n constructor(\n readonly statusCode: number,\n message: string,\n ) {\n super(message);\n }\n}\n\nfunction parsePersistedSessionPointer(\n value: unknown,\n runtimeConfig: DreamboardDevRuntimeConfig,\n): DreamboardDevRuntimeConfig[\"initialSession\"] | null {\n if (!value || typeof value !== \"object\") {\n return null;\n }\n const sessionId = (value as { sessionId?: unknown }).sessionId;\n if (typeof sessionId !== \"string\" || sessionId.length === 0) {\n return null;\n }\n return {\n sessionId,\n shortCode: \"Unknown\",\n gameId: runtimeConfig.gameId,\n seed: null,\n };\n}\n\nfunction relayDevLog(payload: DevLogEnvelope): void {\n const formatted = `[dev:${payload.source}] ${payload.message}`;\n switch (payload.level) {\n case \"error\":\n consola.error(formatted);\n break;\n case \"warn\":\n consola.warn(formatted);\n break;\n case \"info\":\n consola.info(formatted);\n break;\n default:\n consola.log(formatted);\n break;\n }\n}\n\nfunction coerceLogSource(value: unknown): DevLogEnvelope[\"source\"] {\n return value === \"host\" || value === \"plugin\" || value === \"sse\"\n ? value\n : \"host\";\n}\n\nfunction coerceLogLevel(value: unknown): DevLogEnvelope[\"level\"] {\n return value === \"warn\" ||\n value === \"error\" ||\n value === \"info\" ||\n value === \"log\"\n ? value\n : \"log\";\n}\n\nfunction formatUnknown(value: unknown): string {\n if (value instanceof Error) {\n return value.stack ?? value.message;\n }\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { normalizePath } from \"vite\";\n\nexport function prepareFallbackStylesheet(options: {\n projectRoot: string;\n repoRoot: string;\n}): string | null {\n const projectStylePath = path.resolve(options.projectRoot, \"ui/style.css\");\n if (existsSync(projectStylePath)) {\n return null;\n }\n\n const generatedDir = path.resolve(options.repoRoot, \".dreamboard-dev\");\n mkdirSync(generatedDir, { recursive: true });\n\n const fingerprint = createHash(\"sha256\")\n .update(options.projectRoot, \"utf8\")\n .digest(\"hex\")\n .slice(0, 8);\n const instanceId = randomUUID().replaceAll(\"-\", \"\").slice(0, 8);\n const generatedPath = path.join(\n generatedDir,\n `plugin-styles-${fingerprint}-${instanceId}.css`,\n );\n const sharedStylesPath = normalizePath(\n path.resolve(options.repoRoot, \"packages/ui-sdk/src/plugin-styles.css\"),\n );\n const uiSourcePath = normalizePath(\n path.resolve(options.projectRoot, \"ui/**/*.{ts,tsx}\"),\n );\n const sharedSourcePath = normalizePath(\n path.resolve(options.projectRoot, \"shared/**/*.{ts,tsx}\"),\n );\n\n writeFileSync(\n generatedPath,\n [\n `@import \"/@fs/${sharedStylesPath}\";`,\n \"\",\n `@source \"${uiSourcePath}\";`,\n `@source \"${sharedSourcePath}\";`,\n \"\",\n ].join(\"\\n\"),\n \"utf8\",\n );\n\n return generatedPath;\n}\n","import path from \"node:path\";\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 { Browser, Page } from \"playwright\";\nimport type { GameTopologyManifest } from \"@dreamboard/sdk-types\";\nimport {\n createSessionFromReducerSnapshot,\n createSession,\n listPlayerActions,\n startGame,\n submitPlayerAction,\n type HostPlayerGameplayView,\n type HostSessionEvent,\n} from \"@dreamboard/api-client\";\nimport { gameIdFromGameSource } from \"@dreamboard/ui-host-runtime/runtime\";\nimport * as ReducerContractZod from \"@dreamboard/reducer-contract/zod\";\nimport type * as Wire from \"@dreamboard/reducer-contract/wire\";\nimport { createReducerBundle } from \"@dreamboard/app-sdk/reducer\";\nimport { materializeManifestTable } from \"@dreamboard/workspace-codegen\";\nimport type { ProjectConfig, ResolvedConfig } from \"../../types.js\";\nimport {\n ensureDir,\n exists,\n readTextFileIfExists,\n writeJsonFile,\n writeTextFile,\n} from \"../../utils/fs.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 {\n startEmbeddedHarnessSession,\n type EmbeddedHarnessSession,\n} from \"./embedded-harness.js\";\nimport { subscribeToCliSessionEvents } from \"../../utils/session-event-stream.js\";\nimport {\n buildBrowserAuthInitScript,\n configurePlaywrightBrowsersPath,\n waitForGameReady,\n} from \"../../ui/playwright-runner.js\";\nimport { resolveSetupProfileSelection } from \"../workflows/resolve-setup-profile.js\";\nimport { toDreamboardApiError } from \"../../utils/errors.js\";\nimport { PROJECT_DIR_NAME } from \"../../constants.js\";\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\";\n\ntype TestRunnerName = \"reducer\" | \"embedded\" | \"browser\";\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 runners?: readonly TestRunnerName[];\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 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 gameId?: string;\n parentBaseId?: string | null;\n parentFingerprintHash?: string | null;\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 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\ntype BrowserDriverModule = {\n default?: BrowserRunnerDriver;\n} & Partial<BrowserRunnerDriver>;\n\ntype BrowserRunnerDriver = {\n onReady?: (bridge: BrowserBridgeClient) => Promise<void> | void;\n interaction?: (\n bridge: BrowserBridgeClient,\n input: {\n playerId: string;\n interactionId: string;\n params: unknown;\n },\n ) => Promise<boolean | void> | boolean | void;\n};\n\ntype BrowserSnapshot = {\n sessionId: string | null;\n shortCode: string | null;\n version: number;\n currentPhase: string | null;\n controllingPlayerId: string;\n controllablePlayerIds: string[];\n view: unknown;\n availableInteractions?: string[];\n};\n\nexport type ReducerNativeScenarioResult = {\n id: string;\n success: boolean;\n error?: string;\n};\n\nexport type ReducerNativeScenarioSummary = {\n passed: number;\n failed: number;\n results: ReducerNativeScenarioResult[];\n};\n\nexport type SeededScenarioSession = {\n sessionId: string;\n shortCode: string;\n gameId: 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 gameId: 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\ntype BrowserBridgeClient = {\n snapshot: () => Promise<BrowserSnapshot>;\n submitInteraction: (\n playerId: string,\n interactionId: string,\n params: unknown,\n ) => Promise<void>;\n waitForVersionChange: (\n previousVersion: number,\n timeoutMs?: number,\n ) => Promise<BrowserSnapshot>;\n};\n\ntype GameplaySnapshot = {\n version: number;\n actionSetVersion: string;\n currentPhase: string | null;\n playerId: string;\n view: unknown;\n availableInteractions: string[];\n};\n\nlet testingExpectApiFactoryPromise:\n | Promise<\n (options?: {\n matchSnapshot?: (name: string | undefined, actual: unknown) => void;\n }) => ExpectApi\n >\n | undefined;\n\nasync function loadTestingExpectApiFactory(): Promise<\n (options?: {\n matchSnapshot?: (name: string | undefined, actual: unknown) => void;\n }) => ExpectApi\n> {\n testingExpectApiFactoryPromise ??= import(\"@dreamboard/testing\").then(\n (module) =>\n module.createExpectApi as (options?: {\n matchSnapshot?: (name: string | undefined, actual: unknown) => void;\n }) => ExpectApi,\n );\n return testingExpectApiFactoryPromise;\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 normalizeScenarioRunners(\n runners: readonly TestRunnerName[] | undefined,\n): readonly TestRunnerName[] {\n return runners && runners.length > 0 ? runners : [\"reducer\"];\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 = path.join(projectRoot, \"test\", \"testing-types.ts\");\n const testingContractPath = path.join(\n projectRoot,\n \"test\",\n \"generated\",\n \"testing-contract.ts\",\n );\n const baseStatesPath = path.join(\n projectRoot,\n \"test\",\n \"generated\",\n \"base-states.generated.ts\",\n );\n const baseStatesDtsPath = path.join(\n projectRoot,\n \"test\",\n \"generated\",\n \"base-states.generated.d.ts\",\n );\n const scenarioManifestPath = path.join(\n projectRoot,\n \"test\",\n \"generated\",\n \"scenario-manifest.generated.ts\",\n );\n\n await ensureDir(path.dirname(testingTypesPath));\n await ensureDir(path.dirname(testingContractPath));\n\n const existingTestingTypes = await readTextFileIfExists(testingTypesPath);\n if (shouldRefreshReducerTestingTypes(existingTestingTypes)) {\n await writeTextFile(\n testingTypesPath,\n REDUCER_TESTING_TYPES_WRAPPER_CONTENT,\n );\n }\n\n const rejectionCodes = await collectKnownRejectionCodes(projectRoot);\n await writeTextFile(\n testingContractPath,\n buildReducerTestingContractContent({ rejectionCodes }),\n );\n\n const header =\n \"// Generated by dreamboard test generate. Do not edit by hand.\\n\";\n if (!(await exists(baseStatesPath))) {\n await writeTextFile(\n baseStatesPath,\n `${header}export const BASE_STATES = {} as const;\\n`,\n );\n }\n if (!(await exists(baseStatesDtsPath))) {\n await writeTextFile(\n baseStatesDtsPath,\n `${header}export declare const BASE_STATES: Record<string, unknown>;\\n`,\n );\n }\n if (!(await exists(scenarioManifestPath))) {\n await writeTextFile(\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 game 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 path.join(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 ? [path.resolve(projectRoot, options.scenarioPath)]\n : await discoverFiles(\n path.join(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`];\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) =>\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: ReturnType<typeof createReducerBundle>;\n private readonly runtime: ReturnType<\n ReturnType<typeof createReducerBundle>[\"createInProcessRuntime\"]\n >;\n private readonly playerIds: string[];\n private readonly historyRecords: HistoryRecord[] = [];\n private version = 0;\n private started = false;\n\n constructor(\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 game definition.\",\n );\n }\n this.bundle = createReducerBundle(gameModuleDefault as never);\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 const table =\n this.createInitialTable?.({\n playerIds: this.playerIds,\n shuffleItems,\n }) ??\n materializeManifestTable({\n manifest: this.manifest,\n playerIds: this.playerIds,\n shuffleItems,\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 const projection = this.runtime.projectSeatsDynamic({\n playerIds: this.playerIds as never,\n }) as {\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 return {\n currentStage: projection.currentStage ?? null,\n stageSeats: projection.stageSeats ?? [],\n seats: projection.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 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\nclass EmbeddedGameplayTracker {\n private readonly abortController = new AbortController();\n private readonly state: GameplaySnapshot = {\n version: -1,\n actionSetVersion: \"\",\n currentPhase: null,\n playerId: \"player-1\",\n view: null,\n availableInteractions: [],\n };\n private readonly events: HostSessionEvent[] = [];\n private connected = false;\n\n constructor(\n private readonly sessionId: string,\n private readonly playerId: string,\n ) {\n this.state.playerId = playerId;\n }\n\n async connect(): Promise<void> {\n if (this.connected) {\n return;\n }\n this.connected = true;\n const { stream } = await subscribeToCliSessionEvents({\n sessionId: this.sessionId,\n playerId: this.playerId,\n signal: this.abortController.signal,\n clientSource: \"dreamboard-cli-test\",\n });\n\n void (async () => {\n for await (const message of stream) {\n if (!message) {\n continue;\n }\n this.events.push(message);\n this.onMessage(message);\n }\n })();\n }\n\n close(): void {\n this.abortController.abort();\n }\n\n snapshot(): GameplaySnapshot {\n return {\n ...this.state,\n availableInteractions: [...this.state.availableInteractions],\n };\n }\n\n private onMessage(message: HostSessionEvent): void {\n if (message.type === \"session.snapshot\") {\n if (message.snapshot.type !== \"gameplay\") {\n return;\n }\n this.applyGameplay(message.snapshot.gameplay);\n return;\n }\n\n if (message.type === \"session.gameplayUpdated\") {\n this.applyGameplay(message.gameplay);\n }\n }\n\n private applyGameplay(gameplay: HostPlayerGameplayView): void {\n this.state.version = gameplay.version;\n this.state.actionSetVersion = gameplay.actionSetVersion;\n this.state.playerId = gameplay.playerId;\n this.state.currentPhase = gameplay.currentPhase;\n this.state.view = parseSeatView(gameplay.view);\n this.state.availableInteractions = (\n gameplay.availableInteractions ?? []\n ).map((interaction) => interaction.interactionId);\n }\n\n async waitForVersionChange(\n previousVersion: number,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n ): Promise<void> {\n const startedAt = Date.now();\n while (Date.now() - startedAt < timeoutMs) {\n if (this.state.version > previousVersion) {\n return;\n }\n await sleep(20);\n }\n throw new Error(\"Timed out waiting for gameplay version change.\");\n }\n\n async waitForBootstrap(timeoutMs = DEFAULT_TIMEOUT_MS): Promise<void> {\n await this.waitForVersionChange(-1, timeoutMs);\n }\n}\n\nfunction parseSeatView(raw: string | null | undefined): unknown {\n return raw ? parseJsonValue(raw) : null;\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction formatIssuePath(\n label: string,\n path: ReadonlyArray<PropertyKey>,\n): string {\n let formatted = label;\n for (const segment of path) {\n formatted +=\n typeof segment === \"number\" ? `[${segment}]` : `.${String(segment)}`;\n }\n return formatted;\n}\n\nfunction parseWirePayload<T>(\n methodName: string,\n value: unknown,\n label: string,\n schema: {\n safeParse: (input: unknown) =>\n | { success: true; data: T }\n | {\n success: false;\n error: {\n issues: Array<{\n path: Array<PropertyKey>;\n message: string;\n }>;\n };\n };\n },\n): T {\n const parsed = schema.safeParse(value);\n if (parsed.success) {\n return parsed.data;\n }\n const firstIssue = parsed.error.issues[0];\n const formattedPath = formatIssuePath(label, firstIssue?.path ?? []);\n throw new Error(\n `Reducer bundle returned invalid payload for '${methodName}': ${formattedPath} ${firstIssue?.message ?? \"failed schema validation\"}.`,\n );\n}\n\nexport function assertDispatchResultWireContract(\n result: unknown,\n): Wire.DispatchResult {\n return parseWirePayload(\n \"dispatch\",\n result,\n \"DispatchResult\",\n ReducerContractZod.DispatchResultSchema,\n );\n}\n\nasync function createBrowserBridgeClient(\n page: Page,\n): Promise<BrowserBridgeClient> {\n const bridgeExists = async (): Promise<boolean> =>\n page.evaluate(() =>\n Boolean(\n (\n window as typeof window & {\n __dreamboardTestBridge__?: unknown;\n }\n ).__dreamboardTestBridge__,\n ),\n );\n\n const startedAt = Date.now();\n while (!(await bridgeExists())) {\n if (Date.now() - startedAt > DEFAULT_TIMEOUT_MS) {\n const bodyText = await page\n .locator(\"body\")\n .innerText()\n .catch(() => \"\");\n const diagnostic = bodyText.trim().replace(/\\s+/g, \" \").slice(0, 400);\n throw new Error(\n diagnostic.length > 0\n ? `Timed out waiting for browser test bridge. Page text: ${diagnostic}`\n : \"Timed out waiting for browser test bridge.\",\n );\n }\n await sleep(50);\n }\n\n return {\n snapshot: () =>\n page.evaluate(() =>\n (\n window as typeof window & {\n __dreamboardTestBridge__: {\n snapshot: () => Promise<BrowserSnapshot>;\n };\n }\n ).__dreamboardTestBridge__.snapshot(),\n ),\n submitInteraction: (playerId, interactionId, params) =>\n page.evaluate(\n ([nextPlayerId, nextInteractionId, nextParams]) =>\n (\n window as typeof window & {\n __dreamboardTestBridge__: {\n submitInteraction: (\n playerId: string,\n interactionId: string,\n params: unknown,\n ) => Promise<void>;\n };\n }\n ).__dreamboardTestBridge__.submitInteraction(\n nextPlayerId,\n nextInteractionId,\n nextParams,\n ),\n [playerId, interactionId, params] as const,\n ),\n waitForVersionChange: async (\n previousVersion,\n timeoutMs = DEFAULT_TIMEOUT_MS,\n ) => {\n const started = Date.now();\n while (Date.now() - started < timeoutMs) {\n const snapshot = await page.evaluate(() =>\n (\n window as typeof window & {\n __dreamboardTestBridge__: {\n snapshot: () => Promise<BrowserSnapshot>;\n };\n }\n ).__dreamboardTestBridge__.snapshot(),\n );\n if (snapshot.version > previousVersion) {\n return snapshot;\n }\n await sleep(50);\n }\n throw new Error(\"Timed out waiting for browser gameplay version change.\");\n },\n };\n}\n\nasync function assertLiveMatchesShadow(\n runner: TestRunnerName,\n shadow: ShadowReducerRuntime,\n live: GameplaySnapshot | BrowserSnapshot,\n): Promise<void> {\n if (runner === \"reducer\") {\n return;\n }\n\n const currentPhase =\n \"currentPhase\" in live ? live.currentPhase : shadow.phase();\n if (currentPhase !== shadow.phase()) {\n throw new Error(\n `Live phase '${String(currentPhase)}' diverged from reducer phase '${shadow.phase()}'.`,\n );\n }\n\n const livePlayerId =\n \"playerId\" in live ? live.playerId : live.controllingPlayerId;\n const liveView = \"view\" in live ? live.view : null;\n if (livePlayerId && !deepEqual(liveView, await shadow.view(livePlayerId))) {\n throw new Error(\"Live projected views diverged from reducer shadow views.\");\n }\n\n const liveInteractions =\n \"availableInteractions\" in live ? live.availableInteractions : null;\n if (\n livePlayerId &&\n liveInteractions &&\n !deepEqual(\n liveInteractions,\n shadow.availableInteractionsForPlayer(livePlayerId),\n )\n ) {\n throw new Error(\n \"Live available-interactions metadata diverged from reducer shadow state.\",\n );\n }\n}\n\nasync function loadBrowserDriver(\n projectRoot: string,\n): Promise<BrowserRunnerDriver | null> {\n const filePath = path.join(projectRoot, \"test\", \"browser-driver.ts\");\n if (!(await exists(filePath))) {\n return null;\n }\n const module = await importTypeScriptModule<BrowserDriverModule>(filePath);\n return module.default ?? module;\n}\n\nasync function openBrowserPage(\n playUrl: string,\n config: ResolvedConfig,\n): Promise<{\n browser: Browser;\n page: Page;\n}> {\n configurePlaywrightBrowsersPath();\n const { chromium } = await import(\"playwright\");\n const browser = await chromium.launch({ headless: true });\n const context = await browser.newContext({\n viewport: { width: 1440, height: 900 },\n });\n const initScript = await buildBrowserAuthInitScript(config);\n if (initScript) {\n await context.addInitScript({ content: initScript });\n }\n const page = await context.newPage();\n await page.goto(playUrl, { waitUntil: \"domcontentloaded\" });\n return { browser, page };\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 = path.join(\n options.projectRoot,\n \"test\",\n \"generated\",\n \"snapshots\",\n `${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 runner: TestRunnerName;\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 embedded?:\n | {\n sessionId: string;\n tracker: EmbeddedGameplayTracker;\n }\n | undefined;\n browser?:\n | {\n bridge: BrowserBridgeClient;\n driver: BrowserRunnerDriver | null;\n }\n | undefined;\n}): Promise<SharedScenarioContext> {\n const api: ScenarioGameApi = {\n start: async () => {\n await options.shadow.start();\n if (options.runner === \"embedded\" && options.embedded) {\n const live = options.embedded.tracker.snapshot();\n await assertLiveMatchesShadow(\"embedded\", options.shadow, live);\n }\n if (options.runner === \"browser\" && options.browser) {\n const live = await options.browser.bridge.snapshot();\n await assertLiveMatchesShadow(\"browser\", options.shadow, live);\n }\n },\n patchState: async (mutator) => {\n await api.start();\n if (\n options.live ||\n options.embedded ||\n options.browser ||\n options.actionPlan\n ) {\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/browser runners.\",\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 : options.runner === \"embedded\"\n ? (options.embedded?.tracker.snapshot().version ?? 0)\n : options.runner === \"browser\"\n ? ((await options.browser?.bridge.snapshot())?.version ?? 0)\n : 0;\n\n if (options.live) {\n if (!options.live.actionSetVersion) {\n const { data } = await listPlayerActions({\n path: { sessionId: options.live.sessionId, playerId },\n });\n options.live.actionSetVersion = data?.actionSetVersion ?? \"\";\n }\n const submittedActionSetVersion = options.live.actionSetVersion;\n const submitStartedAt = performance.now();\n const { data, error, response } = await submitPlayerAction({\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 });\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,\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 } else if (options.runner === \"embedded\" && options.embedded) {\n const embeddedSnapshot = options.embedded.tracker.snapshot();\n const { data, error } = await submitPlayerAction({\n path: {\n sessionId: options.embedded.sessionId,\n playerId,\n interactionId,\n },\n body: {\n expectedVersion: previousVersion,\n actionSetVersion: embeddedSnapshot.actionSetVersion,\n inputs: normalizedInputs as never,\n },\n });\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 \"Embedded harness 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 } else if (options.runner === \"browser\" && options.browser) {\n const handled =\n (await options.browser.driver?.interaction?.(options.browser.bridge, {\n playerId,\n interactionId,\n params: interactionParams,\n })) === true;\n if (!handled) {\n await options.browser.bridge.submitInteraction(\n playerId,\n interactionId,\n interactionParams,\n );\n }\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 if (options.runner === \"embedded\" && options.embedded) {\n await options.embedded.tracker.waitForVersionChange(previousVersion);\n await assertLiveMatchesShadow(\n \"embedded\",\n options.shadow,\n options.embedded.tracker.snapshot(),\n );\n }\n if (options.runner === \"browser\" && options.browser) {\n const live =\n await options.browser.bridge.waitForVersionChange(previousVersion);\n await assertLiveMatchesShadow(\"browser\", options.shadow, live);\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 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 gameId: 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 createSessionFromReducerSnapshot({\n path: { gameId: options.gameId },\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 gameId: gameIdFromGameSource(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 path.join(\n options.projectRoot,\n PROJECT_DIR_NAME,\n \"dev\",\n \"scenario-cache\",\n `${sanitizeSnapshotSegment(options.baseId)}.${sanitizeSnapshotSegment(\n options.scenarioId,\n )}.${options.fingerprintHash}.json`,\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 cachePath = materializedScenarioCachePath(options);\n const text = await readTextFileIfExists(cachePath);\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 = materializedScenarioCachePath(options);\n await ensureDir(path.dirname(cachePath));\n await writeJsonFile(cachePath, {\n cacheVersion: MATERIALIZED_SCENARIO_CACHE_VERSION,\n fingerprintHash: options.fingerprintHash,\n materialized: options.materialized,\n } satisfies MaterializedScenarioCachePayload);\n}\n\nexport async function materializeScenarioReducerState(options: {\n projectRoot: string;\n scenarioId: string;\n compiledResultId?: string;\n gameId?: 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.gameId === options.gameId\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 generate' 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 generate' before using --from-scenario.`,\n );\n }\n\n const canTrustGeneratedFingerprint =\n options.trustGeneratedFingerprint === true &&\n generatedBase.fingerprint.compiledResultId === options.compiledResultId &&\n generatedBase.fingerprint.gameId === options.gameId;\n const current = canTrustGeneratedFingerprint\n ? generatedBase.fingerprint\n : await currentFingerprint({\n projectRoot: options.projectRoot,\n base,\n basesById,\n compiledResultId: options.compiledResultId,\n gameId: options.gameId,\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] = 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 ]);\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 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 runner: \"reducer\",\n shadow,\n expect: (await loadTestingExpectApiFactory())(),\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 gameId: 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 ] = 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 ]);\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 generate' 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 gameId: options.gameId,\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 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 generate' 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 createSession({\n path: { gameId: options.gameId },\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 runner: \"reducer\",\n shadow,\n expect: (await loadTestingExpectApiFactory())(),\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 gameId: gameIdFromGameSource(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 gameId: 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 ] = 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 ]);\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 generate' 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 gameId: options.gameId,\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 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 generate' first.`,\n );\n }\n shadow.hydrate(parentArtifact.snapshot, parentArtifact.version);\n }\n\n const diagnostics: LiveReplayActionDiagnostic[] = [];\n const context = await createScenarioContext({\n runner: \"reducer\",\n shadow,\n expect: (await loadTestingExpectApiFactory())(),\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 gameId: options.gameId,\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 gameId: 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 gameId: 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 createSession({\n path: { gameId: options.gameId },\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 gameId: gameIdFromGameSource(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 const { data } = await listPlayerActions({\n path: {\n sessionId: options.session.sessionId,\n playerId: action.playerId,\n },\n });\n actionSetVersion = data?.actionSetVersion ?? \"\";\n }\n\n const submittedActionSetVersion = actionSetVersion;\n const submitStartedAt = performance.now();\n const { data, error, response } = await submitPlayerAction({\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 });\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,\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 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 = path.join(\n options.projectRoot,\n \"test\",\n \"generated\",\n \"bases\",\n 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 = path.join(projectionDir, `${playerId}.projection.json`);\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 gameId?: 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 ),\n );\n\n const generatedDir = path.join(options.projectRoot, \"test\", \"generated\");\n await ensureDir(generatedDir);\n const baseStates: BaseStateFile = {};\n const [gameModule, manifestContractModule] = 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 ]);\n const createInitialTable =\n typeof manifestContractModule.createInitialTable === \"function\"\n ? (manifestContractModule.createInitialTable as GeneratedInitialTableFactory)\n : null;\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 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 runner: \"reducer\",\n shadow,\n expect: (await loadTestingExpectApiFactory())(),\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 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 gameId: options.gameId,\n parentBaseId: base.definition.extends ?? null,\n parentFingerprintHash,\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 generate. Do not edit by hand.\\n\";\n await writeTextFile(\n path.join(generatedDir, \"base-states.generated.ts\"),\n `${header}export const BASE_STATES = ${JSON.stringify(baseStates, null, 2)} as const;\\n`,\n );\n await writeTextFile(\n path.join(generatedDir, \"base-states.generated.d.ts\"),\n `${header}export declare const BASE_STATES: Record<string, unknown>;\\n`,\n );\n await writeTextFile(\n path.join(generatedDir, \"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 runners: normalizeScenarioRunners(scenario.definition.runners),\n })),\n null,\n 2,\n )} as const;\\n`,\n );\n await writeJsonFile(path.join(generatedDir, \".generation-meta.json\"), {\n generatedAt: new Date().toISOString(),\n scenarioCount: options.scenarios.length,\n baseStateCount: options.bases.length,\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 (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(\"game 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 generate' 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 gameId?: string;\n}): Promise<BaseStateArtifact[\"fingerprint\"]> {\n const manifest = await loadManifest(options.projectRoot);\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 gameId: options.gameId,\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 ),\n ),\n setupProfileId: effectiveSetup.setupProfileId,\n compiledResultId: options.compiledResultId,\n gameId: options.gameId,\n parentBaseId: options.base.definition.extends ?? null,\n parentFingerprintHash,\n };\n}\n\nexport async function generateReducerNativeArtifacts(options: {\n projectRoot: string;\n compiledResultId?: string;\n gameId?: 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 gameId: options.gameId,\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 runner: TestRunnerName;\n scenarioPath?: string;\n compiledResultId?: string;\n gameId?: 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 ] = 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 ]);\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 gameId: options.gameId,\n debug: options.debug,\n });\n generatedBaseStates = await loadGeneratedBaseStates(options.projectRoot);\n }\n\n const runnerScenarios = scenarios.filter((scenario) =>\n normalizeScenarioRunners(scenario.definition.runners).includes(\n options.runner,\n ),\n );\n\n let embeddedHarness: EmbeddedHarnessSession | null = null;\n let browser: Browser | null = null;\n let page: Page | null = null;\n let browserBridge: BrowserBridgeClient | null = null;\n let browserDriver: BrowserRunnerDriver | null = null;\n\n if (options.runner === \"embedded\") {\n embeddedHarness = await startEmbeddedHarnessSession({\n projectRoot: options.projectRoot,\n projectConfig: options.projectConfig,\n configureClient: true,\n });\n }\n\n if (options.runner === \"browser\") {\n const webBaseUrl = options.webBaseUrl ?? options.projectConfig.webBaseUrl;\n if (!webBaseUrl) {\n throw new Error(\n \"Browser runner requires a local webBaseUrl. Start the local web stack and configure the project for env local.\",\n );\n }\n browserDriver = await loadBrowserDriver(options.projectRoot);\n const opened = await openBrowserPage(\n `${webBaseUrl}/_dev`,\n options.resolvedConfig,\n );\n browser = opened.browser;\n page = opened.page;\n }\n\n try {\n let passed = 0;\n let failed = 0;\n const results: ReducerNativeScenarioResult[] = [];\n\n for (const scenario of runnerScenarios) {\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 gameId: options.gameId,\n }),\n });\n } else if (options.runner !== \"reducer\") {\n throw new Error(\n \"Missing reducer-native generated base artifacts. Run 'dreamboard test generate' first.\",\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 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 generate' first.`,\n );\n }\n shadow.hydrate(parentArtifact.snapshot, parentArtifact.version);\n }\n\n let embedded:\n | {\n sessionId: string;\n tracker: EmbeddedGameplayTracker;\n }\n | undefined;\n try {\n if (options.runner === \"embedded\" && embeddedHarness) {\n const { data: session, error: sessionError } = await createSession({\n path: { gameId: embeddedHarness.gameId },\n body: {\n compiledResultId: embeddedHarness.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 new Error(\"Failed to create embedded harness session.\");\n }\n const tracker = new EmbeddedGameplayTracker(\n session.sessionId,\n \"player-1\",\n );\n const { error: startError } = await startGame({\n path: { sessionId: session.sessionId },\n });\n if (startError) {\n throw new Error(\"Failed to start embedded harness session.\");\n }\n await tracker.connect();\n await tracker.waitForBootstrap();\n embedded = {\n sessionId: session.sessionId,\n tracker,\n };\n }\n\n if (options.runner === \"browser\" && page) {\n const gameId = options.gameId ?? options.projectConfig.gameId;\n const compiledResultId =\n options.compiledResultId ??\n options.projectConfig.compile?.latestSuccessful?.resultId;\n if (!compiledResultId) {\n throw new Error(\n \"Browser runner requires a compiled result. Compile the workspace first.\",\n );\n }\n const { data: session, error: sessionError } = await createSession({\n path: { gameId },\n body: {\n 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 new Error(\"Failed to create browser-runner session.\");\n }\n const { error: startError, data: started } = await startGame({\n path: { sessionId: session.sessionId },\n });\n if (startError || !started) {\n throw new Error(\"Failed to start browser-runner session.\");\n }\n await page.goto(\n `${options.webBaseUrl ?? options.projectConfig.webBaseUrl}/_dev/play/${started.context.shortCode}`,\n { waitUntil: \"domcontentloaded\" },\n );\n await waitForGameReady(page);\n browserBridge = await createBrowserBridgeClient(page);\n await browserDriver?.onReady?.(browserBridge);\n }\n\n const context = await createScenarioContext({\n runner: options.runner,\n shadow,\n expect: (await loadTestingExpectApiFactory())({\n matchSnapshot: createScenarioSnapshotMatcher({\n projectRoot: options.projectRoot,\n scenarioId: scenario.definition.id,\n updateSnapshots: options.updateSnapshots ?? false,\n }),\n }),\n embedded,\n browser:\n options.runner === \"browser\" && browserBridge\n ? {\n bridge: browserBridge,\n driver: browserDriver,\n }\n : undefined,\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 } finally {\n embedded?.tracker.close();\n }\n } catch (error) {\n failed += 1;\n results.push({\n id: scenario.definition.id,\n success: false,\n error:\n error instanceof Error\n ? error.message\n : `Scenario '${scenario.definition.id}' failed.`,\n });\n }\n }\n\n return { passed, failed, results };\n } finally {\n if (embeddedHarness) {\n await embeddedHarness.stop();\n }\n if (browser) {\n await browser.close();\n }\n }\n}\n","// @generated by packages/reducer-contract/scripts/generate-ts.mjs\n// DO NOT EDIT BY HAND. Edit schema/reducer-runtime.schema.json and rerun `pnpm generate`.\n\n/* eslint-disable */\nimport { z } from \"zod\";\n\nexport const ReducerContractVersionSchema = z.string().regex(new RegExp(\"^[0-9]+\\\\.[0-9]+\\\\.[0-9]+$\"));\n\nexport const EffectIdSchema = z.string().min(1);\n\nexport const JsonValueSchema = z.union([z.record(z.string(), z.unknown()), z.array(z.unknown()), z.string(), z.number(), z.boolean(), z.null()]);\n\nexport const ContinuationTokenSchema = z.object({ \"id\": z.string().min(1), \"data\": JsonValueSchema }).strict();\n\nexport const ContinuationMapSchema = z.record(z.string(), ContinuationTokenSchema);\n\nexport const ReducerSetupSelectionSchema = z.object({ \"profileId\": z.string().min(1), \"optionValues\": z.record(z.string(), z.union([z.string(), z.null()])) }).strict();\n\nexport const RngStateSchema = z.object({ \"seed\": z.union([z.number().int(), z.null()]), \"cursor\": z.number().int(), \"trace\": z.array(z.string()) }).strict();\n\nexport const ReducerFlowStateSchema = z.object({ \"currentPhase\": z.string().min(1), \"turn\": z.number().int(), \"round\": z.number().int(), \"activePlayers\": z.array(z.string().min(1)) }).strict();\n\nexport const RuntimeSimultaneousSubmissionSchema = z.object({ \"interactionId\": z.string().min(1), \"params\": JsonValueSchema }).strict();\n\nexport const RuntimeSimultaneousCurrentSchema = z.object({ \"phaseName\": z.string().min(1), \"actors\": z.array(z.string().min(1)), \"submissions\": z.record(z.string(), RuntimeSimultaneousSubmissionSchema) }).strict();\n\nexport const RuntimeSimultaneousStateSchema = z.object({ \"current\": z.union([RuntimeSimultaneousCurrentSchema, z.null()]) }).strict();\n\nexport const TransitionRecordSchema = z.object({ \"from\": z.string().min(1), \"to\": z.string().min(1) }).strict();\n\nexport const ReducerRuntimeStateSchema = z.object({ \"rng\": RngStateSchema, \"setup\": z.union([ReducerSetupSelectionSchema, z.null()]), \"simultaneous\": RuntimeSimultaneousStateSchema, \"lastTransition\": z.union([TransitionRecordSchema, z.null()]) }).strict();\n\nexport const ReducerDomainStateSchema = z.object({ \"table\": JsonValueSchema, \"publicState\": JsonValueSchema, \"privateState\": z.record(z.string(), JsonValueSchema), \"hiddenState\": JsonValueSchema, \"flow\": ReducerFlowStateSchema, \"phase\": JsonValueSchema }).strict();\n\nexport const ReducerSessionStateSchema = z.object({ \"domain\": ReducerDomainStateSchema, \"runtime\": ReducerRuntimeStateSchema }).strict();\n\nexport const GameInputInteractionSchema = z.object({ \"kind\": z.literal(\"interaction\"), \"playerId\": z.string().min(1), \"interactionId\": z.string().min(1), \"params\": JsonValueSchema }).strict();\n\nexport const GameInputSchema = z.discriminatedUnion(\"kind\", [GameInputInteractionSchema]);\n\nexport const EffectTransitionSchema = z.object({ \"effectId\": EffectIdSchema, \"type\": z.literal(\"transition\"), \"to\": z.string().min(1) }).strict();\n\nexport const EffectRollDieSchema = z.object({ \"effectId\": EffectIdSchema, \"type\": z.literal(\"rollDie\"), \"dieId\": z.string().min(1) }).strict();\n\nexport const EffectShuffleSharedZoneSchema = z.object({ \"effectId\": EffectIdSchema, \"type\": z.literal(\"shuffleSharedZone\"), \"zoneId\": z.string().min(1) }).strict();\n\nexport const EffectShufflePlayerZoneSchema = z.object({ \"effectId\": EffectIdSchema, \"type\": z.literal(\"shufflePlayerZone\"), \"zoneId\": z.string().min(1), \"playerId\": z.string().min(1) }).strict();\n\nexport const EffectSchema = z.discriminatedUnion(\"type\", [EffectTransitionSchema, EffectRollDieSchema, EffectShuffleSharedZoneSchema, EffectShufflePlayerZoneSchema]);\n\nexport const ReducerInputValidationResultSchema = z.object({ \"valid\": z.boolean(), \"errorCode\": z.string().optional(), \"message\": z.string().optional() }).strict();\n\nexport const InitializeRequestSchema = z.object({ \"table\": JsonValueSchema, \"playerIds\": z.array(z.string().min(1)), \"rngSeed\": z.union([z.number().int(), z.null()]).optional(), \"setup\": z.union([ReducerSetupSelectionSchema, z.null()]).optional() }).strict();\n\nexport const InitializePhaseRequestSchema = z.object({ \"state\": ReducerSessionStateSchema, \"to\": z.string().min(1) }).strict();\n\nexport const ValidateInputRequestSchema = z.object({ \"state\": ReducerSessionStateSchema, \"input\": GameInputSchema }).strict();\n\nexport const ReduceRequestSchema = z.object({ \"state\": ReducerSessionStateSchema, \"input\": GameInputSchema }).strict();\n\nexport const DispatchRequestSchema = z.object({ \"state\": ReducerSessionStateSchema, \"input\": GameInputSchema }).strict();\n\nexport const ReduceResultRejectSchema = z.object({ \"kind\": z.literal(\"reject\"), \"errorCode\": z.string().min(1), \"message\": z.string().optional() }).strict();\n\nexport const ReduceResultAcceptSchema = z.object({ \"kind\": z.literal(\"accept\"), \"state\": ReducerSessionStateSchema, \"effects\": z.array(EffectSchema), \"continuations\": ContinuationMapSchema }).strict();\n\nexport const ReduceResultSchema = z.discriminatedUnion(\"kind\", [ReduceResultRejectSchema, ReduceResultAcceptSchema]);\n\nexport const DispatchTraceAcceptedClientInputSchema = z.object({ \"kind\": z.literal(\"acceptedClientInput\"), \"input\": GameInputSchema }).strict();\n\nexport const DispatchTraceAppliedEffectSchema = z.object({ \"kind\": z.literal(\"appliedEffect\"), \"effect\": EffectSchema, \"continuation\": ContinuationTokenSchema.optional() }).strict();\n\nexport const DispatchTraceRngConsumptionSchema = z.object({ \"kind\": z.literal(\"rngConsumption\"), \"operation\": z.string().min(1), \"traceEntry\": z.string() }).strict();\n\nexport const DispatchTraceSchema = z.discriminatedUnion(\"kind\", [DispatchTraceAcceptedClientInputSchema, DispatchTraceAppliedEffectSchema, DispatchTraceRngConsumptionSchema]);\n\nexport const DispatchResultRejectSchema = z.object({ \"kind\": z.literal(\"reject\"), \"errorCode\": z.string().min(1), \"message\": z.string().optional() }).strict();\n\nexport const DispatchResultAcceptSchema = z.object({ \"kind\": z.literal(\"accept\"), \"state\": ReducerSessionStateSchema, \"trace\": z.array(DispatchTraceSchema) }).strict();\n\nexport const DispatchResultSchema = z.discriminatedUnion(\"kind\", [DispatchResultRejectSchema, DispatchResultAcceptSchema]);\n\nexport const ReducerRuntimeLogEntryAcceptedClientInputSchema = z.object({ \"kind\": z.literal(\"acceptedClientInput\"), \"version\": z.number().int(), \"input\": GameInputSchema }).strict();\n\nexport const ReducerRuntimeLogEntryAppliedEffectSchema = z.object({ \"kind\": z.literal(\"appliedEffect\"), \"version\": z.number().int(), \"effect\": EffectSchema, \"continuation\": z.union([ContinuationTokenSchema, z.null()]) }).strict();\n\nexport const ReducerRuntimeLogEntryRngConsumptionSchema = z.object({ \"kind\": z.literal(\"rngConsumption\"), \"version\": z.number().int(), \"operation\": z.string().min(1), \"traceEntry\": z.string() }).strict();\n\nexport const ReducerRuntimeLogEntryStateCommitSchema = z.object({ \"kind\": z.literal(\"stateCommit\"), \"version\": z.number().int(), \"state\": ReducerSessionStateSchema }).strict();\n\nexport const ReducerRuntimeLogEntrySchema = z.discriminatedUnion(\"kind\", [ReducerRuntimeLogEntryAcceptedClientInputSchema, ReducerRuntimeLogEntryAppliedEffectSchema, ReducerRuntimeLogEntryRngConsumptionSchema, ReducerRuntimeLogEntryStateCommitSchema]);\n\nexport const SeatProjectionSchema = z.object({ \"view\": JsonValueSchema.optional(), \"availableInteractions\": JsonValueSchema.optional(), \"zones\": JsonValueSchema.optional() }).strict();\n\nexport const SimultaneousPhaseProjectionSchema = z.object({ \"phaseName\": z.string().min(1), \"interactionId\": z.string().min(1), \"actorIds\": z.array(z.string().min(1)), \"sealedPlayerIds\": z.array(z.string().min(1)), \"pendingPlayerIds\": z.array(z.string().min(1)) }).strict();\n\nexport const SeatProjectionBundleSchema = z.object({ \"currentStage\": z.union([z.string().min(1), z.null()]).optional(), \"stageSeats\": z.array(z.string().min(1)).optional(), \"simultaneousPhase\": z.union([SimultaneousPhaseProjectionSchema, z.null()]).optional(), \"seats\": z.record(z.string(), SeatProjectionSchema) }).strict();\n\nexport const ProjectSeatsDynamicRequestSchema = z.object({ \"state\": ReducerSessionStateSchema, \"playerIds\": z.array(z.string().min(1)), \"viewId\": z.string().min(1).optional() }).strict();\n\nexport const BoardStaticProjectionSchema = z.object({ \"view\": JsonValueSchema, \"hash\": z.string().min(1), \"manifestVersion\": z.string() }).strict();\n","import { z } from \"zod\";\nimport type { Brand } from \"./model/table\";\n\n/**\n * Opaque brand applied to a runtime player identifier.\n *\n * Generators produce a workspace-specific `PlayerId` alias (e.g.\n * `Brand<string, \"PlayerId\">` in `shared/manifest-contract.ts`). Authors\n * obtain `PlayerId` values only through:\n * - `q.player.order()` / `q.player.current()` (reducer queries),\n * - engine-injected callback arguments (actions, phases, prompts),\n * - `perPlayerKeys(...)` / entries iteration,\n * - `asPlayerId(raw)` as an explicit escape hatch (e.g. ingress parsing).\n *\n * The brand is a phantom type: at runtime a `PlayerId` is just a string.\n * Do not JSON-serialize the brand marker; it exists purely at the type\n * level to block accidental literal comparisons such as\n * `playerId === \"player-1\"`.\n */\nexport type PlayerId = Brand<string, \"PlayerId\">;\n\n/**\n * Explicit conversion from a raw string to a branded `PlayerId`.\n *\n * Use at trust boundaries only (wire ingress, tests, fixtures). Inside\n * reducer logic, obtain `PlayerId` values from the engine instead of\n * constructing them yourself.\n */\nexport function asPlayerId(raw: string): PlayerId {\n return raw as PlayerId;\n}\n\n/**\n * Type guard that narrows `unknown` to `PlayerId` when the value is a\n * non-empty string. Does not validate against a specific player roster;\n * use `perPlayerSchema`/ingress parsing for that.\n */\nexport function isPlayerId(value: unknown): value is PlayerId {\n return typeof value === \"string\" && value.length > 0;\n}\n\n/**\n * A runtime-accurate per-player map.\n *\n * `PerPlayer<Value>` is an opaque, ordered container whose entries are\n * exactly the players that exist at runtime (the seats passed to\n * `initialize`).\n *\n * The `__perPlayer` discriminator keeps the structural type nominal-ish\n * without depending on a symbol (symbols do not round-trip through JSON,\n * which this shape must).\n *\n * Construct with `perPlayer(ids, init)` and read with the accessors in\n * this module; do not reach into `entries` directly unless you need\n * ordered iteration.\n */\nexport interface PerPlayer<Value, Id extends PlayerId = PlayerId> {\n readonly __perPlayer: true;\n readonly entries: ReadonlyArray<readonly [Id, Value]>;\n}\n\n/**\n * Construct a `PerPlayer<Value>` with one entry per `id` in `ids`.\n *\n * `ids` is treated as the authoritative runtime seat list: the returned\n * `PerPlayer` contains exactly `ids.length` entries, in the same order.\n * Duplicate ids throw.\n */\nexport function perPlayer<Value, Id extends PlayerId = PlayerId>(\n ids: readonly Id[],\n init: (id: Id, index: number) => Value,\n): PerPlayer<Value, Id> {\n const seen = new Set<string>();\n const entries: Array<readonly [Id, Value]> = [];\n for (const [index, id] of ids.entries()) {\n if (seen.has(id)) {\n throw new Error(`perPlayer: duplicate player id '${id}'`);\n }\n seen.add(id);\n entries.push([id, init(id, index)] as const);\n }\n return { __perPlayer: true, entries };\n}\n\n/** Ordered list of seat ids present in the `PerPlayer`. */\nexport function perPlayerKeys<Id extends PlayerId>(\n value: PerPlayer<unknown, Id>,\n): Id[] {\n return value.entries.map((entry) => entry[0]);\n}\n\n/** Ordered list of values present in the `PerPlayer`. */\nexport function perPlayerValues<Value>(\n value: PerPlayer<Value, PlayerId>,\n): Value[] {\n return value.entries.map((entry) => entry[1]);\n}\n\n/**\n * Ordered `[id, value]` pairs. Returns the backing array as-is; callers\n * must not mutate it.\n */\nexport function perPlayerEntries<Value, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n): ReadonlyArray<readonly [Id, Value]> {\n return value.entries;\n}\n\n/** Number of seats in the `PerPlayer`. */\nexport function perPlayerSize(value: PerPlayer<unknown, PlayerId>): number {\n return value.entries.length;\n}\n\n/** Whether `id` has a value. */\nexport function perPlayerHas<Id extends PlayerId>(\n value: PerPlayer<unknown, Id>,\n id: Id,\n): boolean {\n for (const [candidate] of value.entries) {\n if (candidate === id) {\n return true;\n }\n }\n return false;\n}\n\n/** Lookup with no fallback; returns `undefined` for missing seats. */\nexport function perPlayerGet<Value, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n id: Id,\n): Value | undefined {\n for (const [candidate, v] of value.entries) {\n if (candidate === id) {\n return v;\n }\n }\n return undefined;\n}\n\n/**\n * Lookup that throws if `id` is not present.\n *\n * Use when the caller has already established (via `q.player.order()`,\n * an action context, etc.) that `id` is an active runtime seat.\n */\nexport function perPlayerRequire<Value, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n id: Id,\n): Value {\n const found = perPlayerGet(value, id);\n if (found === undefined && !perPlayerHas(value, id)) {\n throw new Error(`perPlayerRequire: missing entry for player id '${id}'`);\n }\n return found as Value;\n}\n\n/**\n * Return a new `PerPlayer` with `id`'s value replaced (or added if the\n * id is not present). Preserves entry order; new entries are appended.\n */\nexport function perPlayerSet<Value, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n id: Id,\n next: Value,\n): PerPlayer<Value, Id> {\n const entries = value.entries.slice();\n const index = entries.findIndex((entry) => entry[0] === id);\n if (index >= 0) {\n entries[index] = [id, next] as const;\n } else {\n entries.push([id, next] as const);\n }\n return { __perPlayer: true, entries };\n}\n\n/**\n * Return a new `PerPlayer` where each value is replaced by `f(value, id)`.\n * Seat order is preserved.\n */\nexport function perPlayerMap<Value, Next, Id extends PlayerId>(\n value: PerPlayer<Value, Id>,\n f: (v: Value, id: Id, index: number) => Next,\n): PerPlayer<Next, Id> {\n return {\n __perPlayer: true,\n entries: value.entries.map(\n ([id, v], index) => [id, f(v, id, index)] as const,\n ),\n };\n}\n\n/**\n * Structural check for a `PerPlayer` without a Zod schema. Useful in\n * debug paths and as a fast pre-filter before schema validation.\n */\nexport function isPerPlayer(value: unknown): value is PerPlayer<unknown> {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n const candidate = value as { __perPlayer?: unknown; entries?: unknown };\n if (candidate.__perPlayer !== true) {\n return false;\n }\n if (!Array.isArray(candidate.entries)) {\n return false;\n }\n return candidate.entries.every(\n (entry) =>\n Array.isArray(entry) &&\n entry.length === 2 &&\n typeof entry[0] === \"string\",\n );\n}\n\n/**\n * Options accepted by `perPlayerSchema`.\n *\n * Setting `players` locks the schema to an exact seat list: parse fails\n * if the input is missing any seat or has an unknown id. Leaving\n * `players` unset yields a schema that accepts any non-empty string as\n * a key, which is the right default for generic SDK types.\n *\n * `playerIdSchema` lets callers feed a manifest-scoped Zod id schema in\n * so parse errors carry the same message as other branded ids.\n */\nexport type PerPlayerSchemaOptions<Id extends PlayerId> = {\n readonly playerIdSchema?: z.ZodType<Id>;\n readonly players?: readonly Id[];\n};\n\n/**\n * Build a Zod schema that validates a wire-shaped `PerPlayer<Value>`.\n *\n * When `options.players` is supplied the schema enforces that entries\n * match that exact set (same cardinality, same ids, any order). This is\n * the mechanism that catches the class of bug where a 3-player session\n * produced a view shape the old `Record<PlayerId, T>` type claimed had\n * a `player-4` key.\n */\nexport function perPlayerSchema<Value, Id extends PlayerId = PlayerId>(\n valueSchema: z.ZodType<Value>,\n options: PerPlayerSchemaOptions<Id> = {},\n): z.ZodType<PerPlayer<Value, Id>> {\n const keySchema =\n options.playerIdSchema ?? (z.string().min(1) as unknown as z.ZodType<Id>);\n\n const base = z\n .object({\n __perPlayer: z.literal(true),\n entries: z.array(z.tuple([keySchema, valueSchema])),\n })\n .transform(\n (value): PerPlayer<Value, Id> => ({\n __perPlayer: true as const,\n entries: value.entries as ReadonlyArray<readonly [Id, Value]>,\n }),\n );\n\n if (!options.players) {\n return base as unknown as z.ZodType<PerPlayer<Value, Id>>;\n }\n\n const expected = options.players;\n return base.superRefine((value, ctx) => {\n const seen = new Set<string>();\n for (const [id] of value.entries) {\n if (seen.has(id)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Duplicate player id '${id}'`,\n });\n }\n seen.add(id);\n }\n for (const expectedId of expected) {\n if (!seen.has(expectedId)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Missing entry for player id '${expectedId}'`,\n });\n }\n }\n for (const id of seen) {\n if (!expected.some((expectedId) => expectedId === id)) {\n ctx.addIssue({\n code: \"custom\",\n message: `Unexpected player id '${id}' (allowed: ${expected.join(\", \")})`,\n });\n }\n }\n }) as unknown as z.ZodType<PerPlayer<Value, Id>>;\n}\n\n// ---------------------------------------------------------------------------\n// BoardRef: replacement for flat `\"board:player-N\"` literal unions.\n// ---------------------------------------------------------------------------\n\n/**\n * Reference to a board by its authored `baseId`, plus an optional seat\n * for per-player boards.\n *\n * Replaces the old generated `\"ring:player-1\" | \"ring:player-2\" | ...`\n * flat unions whose keys pretended to be static but were actually\n * derived from `maxPlayers` and therefore misaligned with the runtime\n * seat list.\n *\n * The discriminant is the *presence* of `seat`, not a `scope` field, so\n * authors can destructure and pass the ref directly without needing a\n * discriminator check for shared boards.\n */\nexport type BoardRef<\n BaseId extends string = string,\n Id extends PlayerId = PlayerId,\n> = SharedBoardRef<BaseId> | PerPlayerBoardRef<BaseId, Id>;\n\nexport interface SharedBoardRef<BaseId extends string = string> {\n readonly baseId: BaseId;\n readonly seat?: undefined;\n}\n\nexport interface PerPlayerBoardRef<\n BaseId extends string = string,\n Id extends PlayerId = PlayerId,\n> {\n readonly baseId: BaseId;\n readonly seat: Id;\n}\n\n/** Construct a shared board ref. */\nexport function sharedBoardRef<BaseId extends string>(\n baseId: BaseId,\n): SharedBoardRef<BaseId> {\n return { baseId };\n}\n\n/** Construct a per-player board ref. */\nexport function perPlayerBoardRef<BaseId extends string, Id extends PlayerId>(\n baseId: BaseId,\n seat: Id,\n): PerPlayerBoardRef<BaseId, Id> {\n return { baseId, seat };\n}\n\n/**\n * Construct a `BoardRef` without knowing the scope ahead of time. Pass\n * `seat` for per-player boards; omit for shared boards.\n */\nexport function boardRef<BaseId extends string, Id extends PlayerId>(\n baseId: BaseId,\n seat?: Id,\n): BoardRef<BaseId, Id> {\n if (seat === undefined) {\n return { baseId };\n }\n return { baseId, seat };\n}\n\n/** Stable string key for Maps/Records keyed by a `BoardRef`. */\nexport function boardRefKey(ref: BoardRef): string {\n return ref.seat === undefined ? ref.baseId : `${ref.baseId}:${ref.seat}`;\n}\n\n/**\n * Inverse of `boardRefKey`. Parses `\"base\"` as a shared ref and\n * `\"base:player-N\"` as a per-player ref. Returns `null` for malformed\n * input.\n */\nexport function parseBoardRefKey(key: string): BoardRef | null {\n if (!key.length) {\n return null;\n }\n const colon = key.indexOf(\":\");\n if (colon < 0) {\n return { baseId: key };\n }\n const baseId = key.slice(0, colon);\n const seat = key.slice(colon + 1);\n if (!baseId.length || !seat.length) {\n return null;\n }\n return { baseId, seat: seat as PlayerId };\n}\n\n/**\n * Zod schema for a `BoardRef` with free-form base and seat ids.\n *\n * Feed a manifest-scoped `baseIdSchema` and `playerIdSchema` to bind\n * the ref to a specific workspace.\n */\nexport function boardRefSchema<\n BaseId extends string = string,\n Id extends PlayerId = PlayerId,\n>(\n options: {\n readonly baseIdSchema?: z.ZodType<BaseId>;\n readonly playerIdSchema?: z.ZodType<Id>;\n } = {},\n): z.ZodType<BoardRef<BaseId, Id>> {\n const baseSchema =\n options.baseIdSchema ?? (z.string().min(1) as unknown as z.ZodType<BaseId>);\n const playerSchema =\n options.playerIdSchema ?? (z.string().min(1) as unknown as z.ZodType<Id>);\n const shared = z.strictObject({ baseId: baseSchema });\n const perPlayer = z.strictObject({ baseId: baseSchema, seat: playerSchema });\n return z.union([perPlayer, shared]) as unknown as z.ZodType<\n BoardRef<BaseId, Id>\n >;\n}\n\n/** True when `ref` targets a shared board (no seat). */\nexport function isSharedBoardRef<BaseId extends string>(\n ref: BoardRef<BaseId, PlayerId>,\n): ref is SharedBoardRef<BaseId> {\n return ref.seat === undefined;\n}\n\n/** True when `ref` targets a per-player board (has a seat). */\nexport function isPerPlayerBoardRef<BaseId extends string, Id extends PlayerId>(\n ref: BoardRef<BaseId, Id>,\n): ref is PerPlayerBoardRef<BaseId, Id> {\n return ref.seat !== undefined;\n}\n","import { z } from \"zod\";\nimport type { SchemaLike } from \"../model/table\";\nimport type { ManifestIdSchema } from \"../model/manifest\";\nimport type {\n CollectorState,\n InputCollector,\n InputDomainDescriptor,\n} from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\nimport type { DerivedResolver } from \"../derived\";\nimport { isPerPlayer } from \"../per-player\";\nimport type { DependencyValues, InputFieldRef } from \"./defineInputs\";\n\ntype DomainContext<\n State extends CollectorState,\n Values extends Readonly<Record<string, unknown>> = Record<string, never>,\n> = {\n state: State;\n playerId: PlayerIdOfState<State>;\n q: TableQueriesOfState<State>;\n derived: DerivedResolver;\n values: Values;\n};\n\ntype ManifestFormInputSchema =\n | ManifestIdSchema<unknown>\n | z.ZodOptional<ManifestIdSchema<unknown>>\n | z.ZodNullable<ManifestIdSchema<unknown>>;\n\ntype DomainNumber<State extends CollectorState> =\n | number\n | ((context: DomainContext<State>) => number);\n\ntype DomainChoice<Value extends string, State extends CollectorState> = {\n value: Value;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n};\n\ntype DomainChoicePresentation = {\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n};\n\ntype ResourceMapChoiceDecorator<State extends CollectorState> = (\n context: DomainContext<State> & {\n resourceId: string;\n label: string;\n icon?: string;\n },\n) => DomainChoicePresentation | null | undefined;\n\ntype ResourceMapChoiceSource<State extends CollectorState> =\n | \"resourceMap\"\n | {\n source: \"resourceMap\";\n decorate?: ResourceMapChoiceDecorator<State>;\n };\n\ntype DomainChoices<Value extends string, State extends CollectorState> =\n | ReadonlyArray<DomainChoice<Value, State>>\n | ResourceMapChoiceSource<State>\n | ((\n context: DomainContext<State>,\n ) => ReadonlyArray<DomainChoice<Value, State>>);\n\ntype DependentDomainChoices<\n Value extends string,\n State extends CollectorState,\n Dependencies extends readonly InputFieldRef<string, unknown>[],\n> =\n | ReadonlyArray<DomainChoice<Value, State>>\n | ((\n context: DomainContext<State, DependencyValues<Dependencies>>,\n ) => ReadonlyArray<DomainChoice<Value, State>>);\n\ntype ChoiceListDefaultValue<\n Value extends string,\n State extends CollectorState,\n> =\n | Value[]\n | \"all\"\n | ((\n context: DomainContext<State> & {\n choices: ReadonlyArray<DomainChoice<Value, State>>;\n },\n ) => Value[]);\n\nfunction isResourceMapChoiceSource<State extends CollectorState>(\n choices: DomainChoices<string, State>,\n): choices is ResourceMapChoiceSource<State> {\n return (\n choices === \"resourceMap\" ||\n (typeof choices === \"object\" &&\n choices !== null &&\n !Array.isArray(choices) &&\n \"source\" in choices &&\n choices.source === \"resourceMap\")\n );\n}\n\nfunction resolveDomainNumber<State extends CollectorState>(\n value: DomainNumber<State> | undefined,\n context: DomainContext<State>,\n fallback: number,\n): number {\n if (typeof value === \"function\") return value(context);\n return value ?? fallback;\n}\n\nfunction resolveDomainChoices<\n Value extends string,\n State extends CollectorState,\n>(\n choices: DomainChoices<Value, State>,\n context: DomainContext<State>,\n): Array<{\n value: string;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n if (isResourceMapChoiceSource(choices)) {\n return resolveResourceMapChoices(choices, context);\n }\n const resolved = typeof choices === \"function\" ? choices(context) : choices;\n return resolved.map((choice) => ({\n value: choice.value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }));\n}\n\nfunction resolveDependentDomainChoices<\n Value extends string,\n State extends CollectorState,\n Dependencies extends readonly InputFieldRef<string, unknown>[],\n>(\n choices: DependentDomainChoices<Value, State, Dependencies>,\n context: DomainContext<State, DependencyValues<Dependencies>>,\n): Array<{\n value: string;\n label: string;\n icon?: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n const resolved = typeof choices === \"function\" ? choices(context) : choices;\n return resolved.map((choice) => ({\n value: choice.value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }));\n}\n\nfunction resolveResourceMapChoices<State extends CollectorState>(\n choices: ResourceMapChoiceSource<State>,\n context: DomainContext<State>,\n): Array<{\n value: string;\n label: string;\n badge?: string;\n description?: string;\n disabled?: boolean;\n disabledReason?: string;\n}> {\n const resources = context.state.table.resources as unknown;\n const firstResourceMap =\n isPerPlayer(resources) && resources.entries.length > 0\n ? resources.entries[0]?.[1]\n : resources;\n if (\n typeof firstResourceMap !== \"object\" ||\n firstResourceMap === null ||\n Array.isArray(firstResourceMap)\n ) {\n return [];\n }\n const decorate = choices === \"resourceMap\" ? undefined : choices.decorate;\n return Object.keys(firstResourceMap)\n .sort()\n .map((resourceId) => {\n const label = resourceId;\n const presentation = decorate?.({ ...context, resourceId, label });\n return {\n value: resourceId,\n label,\n badge: presentation?.badge,\n description: presentation?.description,\n disabled: presentation?.disabled,\n disabledReason: presentation?.disabledReason,\n };\n });\n}\n\nfunction createFormInput<\n Schema extends SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options?: { defaultValue?: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> {\n return {\n kind: \"form\",\n schema,\n ...(options && \"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n };\n}\n\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(schema: Schema): InputCollector<Schema, State, \"form\">;\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options: { defaultValue: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> & {\n readonly defaultValue: z.infer<Schema>;\n};\nfunction baseFormInput<\n Schema extends ManifestFormInputSchema & SchemaLike<unknown>,\n State extends CollectorState = CollectorState,\n>(\n schema: Schema,\n options?: { defaultValue?: z.infer<Schema> },\n): InputCollector<Schema, State, \"form\"> {\n return createFormInput(schema, options);\n}\n\nfunction resourceMapInput<\n State extends CollectorState = CollectorState,\n>(options: {\n resources: ReadonlyArray<{\n resourceId: string;\n label?: string;\n icon?: string;\n min?: DomainNumber<State>;\n max: DomainNumber<State>;\n }>;\n}): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\">;\nfunction resourceMapInput<\n State extends CollectorState = CollectorState,\n>(options: {\n resources: ReadonlyArray<{\n resourceId: string;\n label?: string;\n icon?: string;\n min?: DomainNumber<State>;\n max: DomainNumber<State>;\n }>;\n defaultValue: Record<string, number>;\n}): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\"> & {\n readonly defaultValue: Record<string, number>;\n};\nfunction resourceMapInput<\n State extends CollectorState = CollectorState,\n>(options: {\n resources: ReadonlyArray<{\n resourceId: string;\n label?: string;\n icon?: string;\n min?: DomainNumber<State>;\n max: DomainNumber<State>;\n }>;\n defaultValue?: Record<string, number>;\n}): InputCollector<z.ZodRecord<z.ZodString, z.ZodNumber>, State, \"form\"> {\n return {\n kind: \"form\",\n schema: z.record(z.string(), z.number().int().nonnegative()),\n ...(\"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n domain: (state, playerId, q, derived): InputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n };\n return {\n type: \"resourceMap\",\n resources: options.resources.map((resource) => ({\n resourceId: resource.resourceId,\n label: resource.label,\n icon: resource.icon,\n min: resolveDomainNumber(resource.min, context, 0),\n max: resolveDomainNumber(resource.max, context, 0),\n })),\n };\n },\n };\n}\n\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n}): InputCollector<z.ZodNumber, State, \"form\">;\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n defaultValue: number;\n}): InputCollector<z.ZodNumber, State, \"form\"> & {\n readonly defaultValue: number;\n};\nfunction numberInput<State extends CollectorState = CollectorState>(options: {\n min: DomainNumber<State>;\n max: DomainNumber<State>;\n step?: DomainNumber<State>;\n defaultValue?: number;\n}): InputCollector<z.ZodNumber, State, \"form\"> {\n return {\n kind: \"form\",\n schema: z.number(),\n ...(\"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n domain: (state, playerId, q, derived): InputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n };\n return {\n type: \"boundedNumber\",\n min: resolveDomainNumber(options.min, context, 0),\n max: resolveDomainNumber(options.max, context, 0),\n step:\n options.step === undefined\n ? undefined\n : resolveDomainNumber(options.step, context, 1),\n };\n },\n };\n}\n\nfunction choiceInput<\n const Dependencies extends readonly InputFieldRef<string, unknown>[],\n Value extends string = string,\n State extends CollectorState = CollectorState,\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n}): InputCollector<SchemaLike<Value>, State, \"form\">;\nfunction choiceInput<\n const Dependencies extends readonly InputFieldRef<string, unknown>[],\n Value extends string = string,\n State extends CollectorState = CollectorState,\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n};\nfunction choiceInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n}): InputCollector<SchemaLike<Value>, State, \"form\">;\nfunction choiceInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n const Dependencies extends readonly InputFieldRef<\n string,\n unknown\n >[] = readonly InputFieldRef<string, unknown>[],\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n}): InputCollector<SchemaLike<Value>, State, \"form\">;\nfunction choiceInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n};\nfunction choiceInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n const Dependencies extends readonly InputFieldRef<\n string,\n unknown\n >[] = readonly InputFieldRef<string, unknown>[],\n>(options: {\n dependsOn: Dependencies;\n choices: DependentDomainChoices<Value, State, Dependencies>;\n defaultValue: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n};\nfunction choiceInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices:\n | DomainChoices<Value, State>\n | DependentDomainChoices<\n Value,\n State,\n readonly InputFieldRef<string, unknown>[]\n >;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n defaultValue?: Value;\n}): InputCollector<SchemaLike<Value>, State, \"form\"> {\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n if (Array.isArray(options.choices) && options.choices.length === 0) {\n throw new Error(\"formInput.choice requires at least one choice.\");\n }\n const schema = Array.isArray(options.choices)\n ? (z.enum(\n options.choices.map((choice) => choice.value) as [Value, ...Value[]],\n ) as SchemaLike<Value>)\n : (z.string() as unknown as SchemaLike<Value>);\n return {\n kind: \"form\",\n schema,\n ...(\"defaultValue\" in options\n ? { defaultValue: options.defaultValue }\n : {}),\n ...(dependsOn ? { dependsOn } : {}),\n domain: (state, playerId, q, derived, values): InputDomainDescriptor => {\n return {\n type: \"choice\",\n choices: dependsOn\n ? resolveDependentDomainChoices(\n options.choices as DependentDomainChoices<\n Value,\n State,\n readonly InputFieldRef<string, unknown>[]\n >,\n {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: (values ?? {}) as DependencyValues<\n readonly InputFieldRef<string, unknown>[]\n >,\n },\n )\n : resolveDomainChoices(\n options.choices as DomainChoices<Value, State>,\n {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n },\n ),\n };\n },\n };\n}\n\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue: Value[];\n}): InputCollector<SchemaLike<Value[]>, State, \"form\"> & {\n readonly defaultValue: Value[];\n};\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n}): InputCollector<SchemaLike<Value[]>, State, \"form\">;\nfunction choiceListInput<\n Value extends string,\n State extends CollectorState = CollectorState,\n>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n}): InputCollector<SchemaLike<Value[]>, State, \"form\"> {\n if (Array.isArray(options.choices) && options.choices.length === 0) {\n throw new Error(\"formInput.choiceList requires at least one choice.\");\n }\n const staticDefaultValue = Array.isArray(options.defaultValue)\n ? options.defaultValue\n : undefined;\n const dynamicDefaultValue =\n options.defaultValue === \"all\" || typeof options.defaultValue === \"function\"\n ? options.defaultValue\n : undefined;\n return {\n kind: \"form\",\n schema: z.array(z.string()) as unknown as SchemaLike<Value[]>,\n ...(staticDefaultValue !== undefined\n ? { defaultValue: staticDefaultValue }\n : {}),\n domain: (state, playerId, q, derived): InputDomainDescriptor => {\n const context = {\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n };\n const choices = resolveDomainChoices(options.choices, context);\n return {\n type: \"choiceList\",\n choices,\n min: resolveDomainNumber(options.min, context, 0),\n max: resolveDomainNumber(options.max, context, choices.length),\n };\n },\n ...(dynamicDefaultValue\n ? {\n resolveDefaultValue: (state, playerId, q, derived, domain) => {\n const choices =\n domain.type === \"choiceList\"\n ? domain.choices.map((choice) => ({\n value: choice.value as Value,\n label: choice.label,\n icon: choice.icon,\n badge: choice.badge,\n description: choice.description,\n disabled: choice.disabled,\n disabledReason: choice.disabledReason,\n }))\n : [];\n if (dynamicDefaultValue === \"all\") {\n return choices.map((choice) => choice.value);\n }\n return dynamicDefaultValue({\n state: state as State,\n playerId: playerId as PlayerIdOfState<State>,\n q: q as TableQueriesOfState<State>,\n derived,\n values: {},\n choices,\n });\n },\n }\n : {}),\n };\n}\n\ntype FormInputForState<State extends CollectorState> = {\n <Schema extends ManifestFormInputSchema & SchemaLike<unknown>>(\n schema: Schema,\n ): InputCollector<Schema, State, \"form\">;\n <Schema extends ManifestFormInputSchema & SchemaLike<unknown>>(\n schema: Schema,\n options: { defaultValue: z.infer<Schema> },\n ): InputCollector<Schema, State, \"form\"> & {\n readonly defaultValue: z.infer<Schema>;\n };\n resourceMap(\n options: Parameters<typeof resourceMapInput<State>>[0],\n ): ReturnType<typeof resourceMapInput<State>>;\n resourceChoices(options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }): ResourceMapChoiceSource<State>;\n number(\n options: Parameters<typeof numberInput<State>>[0],\n ): ReturnType<typeof numberInput<State>>;\n choice<Value extends string>(options: {\n choices: DomainChoices<Value, State>;\n }): InputCollector<SchemaLike<Value>, State, \"form\">;\n choice<Value extends string>(options: {\n choices: DomainChoices<Value, State>;\n defaultValue: Value;\n }): InputCollector<SchemaLike<Value>, State, \"form\"> & {\n readonly defaultValue: Value;\n };\n choiceList<Value extends string>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue: Value[];\n }): InputCollector<SchemaLike<Value[]>, State, \"form\"> & {\n readonly defaultValue: Value[];\n };\n choiceList<Value extends string>(options: {\n choices: DomainChoices<Value, State>;\n min?: DomainNumber<State>;\n max?: DomainNumber<State>;\n defaultValue?: ChoiceListDefaultValue<Value, State>;\n }): InputCollector<SchemaLike<Value[]>, State, \"form\">;\n};\n\nfunction formInputForState<\n State extends CollectorState,\n>(): FormInputForState<State> {\n return Object.assign(\n ((schema: ManifestFormInputSchema & SchemaLike<unknown>, options?: {}) =>\n baseFormInput(schema, options as never)) as FormInputForState<State>,\n {\n resourceMap: (options: Parameters<typeof resourceMapInput<State>>[0]) =>\n resourceMapInput<State>(options),\n resourceChoices: (options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }) => formInput.resourceChoices<State>(options),\n number: (options: Parameters<typeof numberInput<State>>[0]) =>\n numberInput<State>(options),\n choice: (options: never) => choiceInput(options),\n choiceList: (options: never) => choiceListInput(options),\n },\n );\n}\n\n/**\n * Manifest-backed id input. Free-form Zod schemas are intentionally explicit:\n * if the runtime cannot disclose valid values or numeric bounds through a\n * manifest id or domain helper, use a custom interaction surface with an\n * explicit `paramsSchema` instead of the default form renderer.\n */\nexport const formInput = Object.assign(baseFormInput, {\n resourceMap: resourceMapInput,\n resourceChoices: <State extends CollectorState = CollectorState>(options?: {\n decorate?: ResourceMapChoiceDecorator<State>;\n }): ResourceMapChoiceSource<State> => ({\n source: \"resourceMap\",\n ...options,\n }),\n number: numberInput,\n choice: choiceInput,\n choiceList: choiceListInput,\n forState: formInputForState,\n});\n","import { z } from \"zod\";\nimport type { CollectorState, InputCollector } from \"../model/spec\";\nimport type { BoardTargetRule, PlayerBoardSpaceTarget } from \"./boardTarget\";\nimport type { InputFieldRef } from \"./defineInputs\";\n\n/**\n * `boardInput.*` helpers produce collectors that accept a board-element id\n * (vertex / edge / space / tile) scoped to one built `boardTarget` rule.\n *\n * Id typing:\n * The `Id` type parameter is the branded id for the board you target,\n * e.g. `HexVertexIdOfTable<Table, \"main\">` or\n * `SquareSpaceIdOfTable<Table, \"board\">`. Once tightened,\n * `ParamsOf<Collectors>` downstream typing reflects the branded id too.\n *\n * Eligibility:\n * Pass a built `boardTarget.*(...).where(...).build()` rule. The same rule\n * feeds server-authoritative eligible-target projection, submit validation,\n * and tests through its `bind({ state, playerId, q })` helper.\n *\n * Runtime vs. compile time:\n * At runtime the submitted value is a string. Branding is purely a\n * compile-time discipline.\n */\nfunction makeBoardCollector<\n Kind extends \"board-vertex\" | \"board-edge\" | \"board-tile\" | \"board-space\",\n>(kind: Kind) {\n return function collector<\n State extends CollectorState = CollectorState,\n Id extends string = string,\n >(options: {\n target: BoardTargetRule<State, Id>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n }): InputCollector<z.ZodType<Id>, State, Kind> {\n const target = options.target;\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n return {\n kind,\n schema: z.string() as unknown as z.ZodType<Id>,\n eligibleTargets: ((state, playerId, q, values) =>\n target.eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetId, values) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n },\n targetId as Id,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReturnType<BoardTargetRule<CollectorState, string>[\"validate\"]>)\n | undefined,\n ...(dependsOn ? { dependsOn } : {}),\n domain: dependsOn\n ? (state, playerId, q, _derived, values) => ({\n type: \"target\" as const,\n targetKind: target.targetKind,\n boardId: target.boardId,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map(String),\n })\n : undefined,\n meta: {\n targetKind: target.targetKind,\n boardId: target.boardId,\n valueKind: target.valueKind,\n },\n } as InputCollector<z.ZodType<Id>, State, Kind>;\n };\n}\n\nexport const vertexInput = makeBoardCollector(\"board-vertex\");\nexport const edgeInput = makeBoardCollector(\"board-edge\");\nexport const tileInput = makeBoardCollector(\"board-tile\");\nexport const spaceInput = makeBoardCollector(\"board-space\");\n\nexport function playerSpaceInput<\n State extends CollectorState = CollectorState,\n BoardId extends string = string,\n SpaceId extends string = string,\n PlayerId extends string = string,\n>(options: {\n target: BoardTargetRule<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>\n >;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n}): InputCollector<\n z.ZodType<PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>>,\n State,\n \"board-space\"\n> {\n const target = options.target;\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n return {\n kind: \"board-space\",\n schema: z.object({\n boardId: z.literal(target.boardId),\n playerId: z.string(),\n spaceId: z.string(),\n }) as unknown as z.ZodType<\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>\n >,\n eligibleTargets: ((state, playerId, q, values) =>\n target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map((candidate) => candidate.spaceId)) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetValue, values) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n },\n targetValue as PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerId>,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReturnType<\n BoardTargetRule<\n CollectorState,\n PlayerBoardSpaceTarget<string, string, string>\n >[\"validate\"]\n >)\n | undefined,\n ...(dependsOn ? { dependsOn } : {}),\n domain: dependsOn\n ? (state, playerId, q, _derived, values) => ({\n type: \"target\" as const,\n targetKind: target.targetKind,\n boardId: target.boardId,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map((candidate) => candidate.spaceId),\n })\n : undefined,\n meta: {\n targetKind: target.targetKind,\n boardId: target.boardId,\n valueKind: target.valueKind,\n },\n };\n}\n\nexport const boardInput = {\n vertex: vertexInput,\n edge: edgeInput,\n tile: tileInput,\n space: spaceInput,\n playerSpace: playerSpaceInput,\n};\n","import type { CollectorState, ValidationIssue } from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\n\nexport type TargetContext<State extends CollectorState> = {\n state: State;\n playerId: PlayerIdOfState<State>;\n q: TableQueriesOfState<State>;\n values?: Readonly<Record<string, unknown>>;\n};\n\nexport type TargetPredicateArgs<\n State extends CollectorState,\n Target,\n> = TargetContext<State> & {\n targetId: Target;\n target: Target;\n};\n\nexport type TargetPredicate<State extends CollectorState, Target> = {\n id: string;\n errorCode: string;\n message?: string;\n test: (args: TargetPredicateArgs<State, Target>) => boolean;\n};\n\nexport type BoundTargetRule<Target> = {\n readonly eligible: () => readonly Target[];\n readonly validate: (target: Target) => ValidationIssue | null;\n readonly isEligible: (target: Target) => boolean;\n};\n\nexport type TargetRule<State extends CollectorState, Target> = {\n readonly eligible: (ctx: TargetContext<State>) => readonly Target[];\n readonly validate: (\n ctx: TargetContext<State>,\n target: Target,\n ) => ValidationIssue | null;\n readonly isEligible: (ctx: TargetContext<State>, target: Target) => boolean;\n readonly bind: (ctx: TargetContext<State>) => BoundTargetRule<Target>;\n};\n\nexport type TargetRuleBuilder<\n State extends CollectorState,\n Target,\n Rule extends TargetRule<State, Target>,\n> = {\n readonly where: (\n predicate: TargetPredicate<State, Target>,\n ) => TargetRuleBuilder<State, Target, Rule>;\n readonly build: () => Rule;\n};\n\nexport type TargetCandidateResolver<State extends CollectorState, Target> = (\n ctx: TargetContext<State>,\n) => readonly Target[];\n\nexport type TargetRuleOptions = {\n missingCandidateIssue?: ValidationIssue;\n equals?: (left: unknown, right: unknown) => boolean;\n};\n\nconst DEFAULT_MISSING_CANDIDATE_ISSUE: ValidationIssue = {\n errorCode: \"TARGET_NOT_ELIGIBLE\",\n message: \"Target is not eligible.\",\n};\n\nexport function createTargetRule<State extends CollectorState, Target>(\n candidates: TargetCandidateResolver<State, Target>,\n predicates: readonly TargetPredicate<State, Target>[],\n options: TargetRuleOptions = {},\n): TargetRule<State, Target> {\n const missingCandidateIssue =\n options.missingCandidateIssue ?? DEFAULT_MISSING_CANDIDATE_ISSUE;\n const equals = options.equals ?? Object.is;\n\n const validate = (\n ctx: TargetContext<State>,\n target: Target,\n ): ValidationIssue | null => {\n if (!candidates(ctx).some((candidate) => equals(candidate, target))) {\n return missingCandidateIssue;\n }\n for (const predicate of predicates) {\n if (!predicate.test({ ...ctx, targetId: target, target })) {\n return {\n errorCode: predicate.errorCode,\n message: predicate.message,\n };\n }\n }\n return null;\n };\n\n const rule: TargetRule<State, Target> = {\n eligible: (ctx) =>\n candidates(ctx).filter((targetId) => validate(ctx, targetId) == null),\n validate,\n isEligible: (ctx, target) => validate(ctx, target) == null,\n bind: (ctx) => ({\n eligible: () => rule.eligible(ctx),\n validate: (id) => rule.validate(ctx, id),\n isEligible: (id) => rule.isEligible(ctx, id),\n }),\n };\n\n return rule;\n}\n\nexport function createTargetRuleBuilder<\n State extends CollectorState,\n Target,\n Rule extends TargetRule<State, Target>,\n>(\n buildRule: (predicates: readonly TargetPredicate<State, Target>[]) => Rule,\n predicates: readonly TargetPredicate<State, Target>[] = [],\n): TargetRuleBuilder<State, Target, Rule> {\n return {\n where: (predicate) =>\n createTargetRuleBuilder(buildRule, [...predicates, predicate]),\n build: () => buildRule(predicates),\n };\n}\n","import type { CollectorState, TargetKind } from \"../model/spec\";\nimport type { PlayerIdOfState } from \"../model/extract\";\nimport type { TableQueriesOfState } from \"../model/queries\";\nimport {\n createTargetRule,\n createTargetRuleBuilder,\n type TargetPredicate,\n type TargetRule,\n type TargetRuleBuilder,\n} from \"./targetRule\";\n\nexport type BoardTargetPredicate<\n State extends CollectorState,\n Target,\n> = TargetPredicate<State, Target>;\n\nexport type BoardTargetRule<State extends CollectorState, Target> = TargetRule<\n State,\n Target\n> & {\n readonly boardId: string;\n readonly targetKind: TargetKind;\n readonly valueKind: \"board-id\" | \"player-board-space\";\n};\n\nexport type BoardTargetBuilder<\n State extends CollectorState,\n Target,\n> = TargetRuleBuilder<State, Target, BoardTargetRule<State, Target>>;\n\nexport type PlayerBoardSpaceTarget<\n BoardId extends string,\n SpaceId extends string,\n PlayerId extends string,\n> = {\n readonly boardId: BoardId;\n readonly playerId: PlayerId;\n readonly spaceId: SpaceId;\n};\n\nfunction candidateIdsForKind<State extends CollectorState, Id extends string>(\n q: TableQueriesOfState<State>,\n boardId: string,\n targetKind: TargetKind,\n): readonly Id[] {\n if (targetKind === \"edge\") {\n return idsFromCollection<Id>(q.board.tiled(boardId as never).edges);\n }\n if (targetKind === \"vertex\") {\n return idsFromCollection<Id>(q.board.tiled(boardId as never).vertices);\n }\n return idsFromCollection<Id>(q.board.get(boardId as never)?.spaces);\n}\n\nfunction idsFromCollection<Id extends string>(\n collection: unknown,\n): readonly Id[] {\n if (!collection) return [];\n const values = Array.isArray(collection)\n ? collection\n : Object.values(collection as Record<string, unknown>);\n return values.flatMap((value) => {\n if (typeof value === \"string\") return [value as Id];\n if (\n typeof value === \"object\" &&\n value !== null &&\n \"id\" in value &&\n typeof (value as { id?: unknown }).id === \"string\"\n ) {\n return [(value as { id: string }).id as Id];\n }\n return [];\n });\n}\n\nfunction createBoardTargetBuilder<\n State extends CollectorState,\n Id extends string,\n>(targetKind: TargetKind, boardId: string): BoardTargetBuilder<State, Id> {\n return createTargetRuleBuilder<State, Id, BoardTargetRule<State, Id>>(\n (predicates) => ({\n ...createTargetRule(\n ({ q }) => candidateIdsForKind<State, Id>(q, boardId, targetKind),\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"BOARD_TARGET_NOT_ELIGIBLE\",\n message: \"Board target is not eligible.\",\n },\n },\n ),\n boardId,\n targetKind,\n valueKind: \"board-id\",\n }),\n );\n}\n\nfunction createPlayerSpaceTargetBuilder<\n State extends CollectorState,\n BoardId extends string,\n SpaceId extends string,\n>(\n boardId: BoardId,\n): BoardTargetBuilder<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerIdOfState<State>>\n> {\n type Target = PlayerBoardSpaceTarget<\n BoardId,\n SpaceId,\n PlayerIdOfState<State>\n >;\n return createTargetRuleBuilder<State, Target, BoardTargetRule<State, Target>>(\n (predicates) => ({\n ...createTargetRule(\n ({ state, q }) => {\n const spacesForPlayer = (playerId: string): readonly SpaceId[] =>\n candidateIdsForKind<State, SpaceId>(\n q,\n `${boardId}:${playerId}`,\n \"space\",\n );\n return state.table.playerOrder.flatMap((playerId) =>\n spacesForPlayer(playerId).map((spaceId) => ({\n boardId,\n playerId: playerId as PlayerIdOfState<State>,\n spaceId,\n })),\n );\n },\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"BOARD_TARGET_NOT_ELIGIBLE\",\n message: \"Board target is not eligible.\",\n },\n equals: (left, right) =>\n isPlayerBoardSpaceTarget(left) &&\n isPlayerBoardSpaceTarget(right) &&\n left.boardId === right.boardId &&\n left.playerId === right.playerId &&\n left.spaceId === right.spaceId,\n },\n ),\n boardId,\n targetKind: \"space\",\n valueKind: \"player-board-space\",\n }),\n );\n}\n\nfunction isPlayerBoardSpaceTarget(\n value: unknown,\n): value is PlayerBoardSpaceTarget<string, string, string> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"boardId\" in value &&\n \"playerId\" in value &&\n \"spaceId\" in value\n );\n}\n\nfunction makeBoardTargetFactory(targetKind: TargetKind) {\n return function target<State extends CollectorState, Id extends string>(\n boardId: string,\n ): BoardTargetBuilder<State, Id> {\n return createBoardTargetBuilder<State, Id>(targetKind, boardId);\n };\n}\n\nexport const boardTarget = {\n edge: makeBoardTargetFactory(\"edge\"),\n vertex: makeBoardTargetFactory(\"vertex\"),\n space: makeBoardTargetFactory(\"space\"),\n tile: makeBoardTargetFactory(\"tile\"),\n playerSpace<\n State extends CollectorState,\n BoardId extends string,\n SpaceId extends string,\n >(\n boardId: BoardId,\n ): BoardTargetBuilder<\n State,\n PlayerBoardSpaceTarget<BoardId, SpaceId, PlayerIdOfState<State>>\n > {\n return createPlayerSpaceTargetBuilder<State, BoardId, SpaceId>(boardId);\n },\n};\n","import type { CollectorState } from \"../model/spec\";\nimport type { CardIdOfState } from \"../model/extract\";\nimport {\n createTargetRule,\n createTargetRuleBuilder,\n type TargetPredicate,\n type TargetRule,\n type TargetRuleBuilder,\n} from \"./targetRule\";\n\nexport type CardTargetPredicate<\n State extends CollectorState,\n Id extends string,\n> = TargetPredicate<State, Id>;\n\nexport type CardTargetRule<\n State extends CollectorState,\n Id extends string,\n> = TargetRule<State, Id> & {\n readonly zoneIds: readonly string[];\n readonly zoneId: string;\n readonly targetKind: \"card\";\n};\n\nexport type CardTargetBuilder<\n State extends CollectorState,\n Id extends string,\n> = TargetRuleBuilder<State, Id, CardTargetRule<State, Id>>;\n\nfunction cardIdsForZone<State extends CollectorState, Id extends string>(\n state: State,\n playerId: string,\n q: {\n zone: {\n sharedCards: (zoneId: never) => readonly unknown[];\n playerCards: (playerId: never, zoneId: never) => readonly unknown[];\n };\n },\n zoneId: string,\n): readonly Id[] {\n const table = state.table as {\n decks?: Record<string, unknown>;\n hands?: Record<string, unknown>;\n zones?: {\n shared?: Record<string, unknown>;\n perPlayer?: Record<string, unknown>;\n };\n };\n if (\n zoneId in (table.hands ?? {}) ||\n zoneId in (table.zones?.perPlayer ?? {})\n ) {\n return q.zone.playerCards(\n playerId as never,\n zoneId as never,\n ) as readonly Id[];\n }\n if (zoneId in (table.decks ?? {}) || zoneId in (table.zones?.shared ?? {})) {\n return q.zone.sharedCards(zoneId as never) as readonly Id[];\n }\n return [];\n}\n\nfunction createCardTargetBuilder<\n State extends CollectorState,\n Id extends string,\n>(zoneIds: readonly string[]): CardTargetBuilder<State, Id> {\n return createTargetRuleBuilder<State, Id, CardTargetRule<State, Id>>(\n (predicates) => ({\n ...createTargetRule(\n ({ state, playerId, q }) =>\n zoneIds.flatMap((zoneId) =>\n cardIdsForZone<State, Id>(state, playerId, q, zoneId),\n ),\n predicates,\n {\n missingCandidateIssue: {\n errorCode: \"CARD_TARGET_NOT_ELIGIBLE\",\n message: \"Card target is not eligible.\",\n },\n },\n ),\n zoneIds: [...zoneIds],\n zoneId: zoneIds[0] ?? \"\",\n targetKind: \"card\",\n }),\n );\n}\n\nexport const cardTarget = {\n zones<State extends CollectorState, Id extends string = CardIdOfState<State>>(\n zoneIds: readonly string[],\n ): CardTargetBuilder<State, Id> {\n return createCardTargetBuilder<State, Id>(zoneIds);\n },\n};\n","import { z } from \"zod\";\nimport type { CollectorState, InputCollector } from \"../model/spec\";\nimport type { CardIdOfState } from \"../model/extract\";\nimport type { CardTargetRule } from \"./cardTarget\";\nimport type { InputFieldRef } from \"./defineInputs\";\n\n/**\n * `cardInput` produces a collector backed by one built `cardTarget` rule.\n * The submitted value is a manifest-branded card id.\n *\n * The target rule feeds server-authoritative eligible-card projection, submit\n * validation, and tests through its `bind({ state, playerId, q })` helper.\n */\nexport function cardInput<\n State extends CollectorState = CollectorState,\n Id extends string = CardIdOfState<State>,\n>(options: {\n target: CardTargetRule<State, Id>;\n dependsOn?: readonly InputFieldRef<string, unknown>[];\n}): InputCollector<z.ZodType<Id>, State, \"card\"> {\n const target = options.target;\n const dependsOn = options.dependsOn?.map((dependency) => dependency.key);\n return {\n kind: \"card\",\n schema: z.string() as unknown as z.ZodType<Id>,\n eligibleTargets: ((state, playerId, q, values) =>\n target.eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReadonlyArray<unknown>)\n | undefined,\n validateTarget: ((state, playerId, q, targetId, values) =>\n target.validate(\n {\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n },\n targetId as Id,\n )) as\n | ((\n state: CollectorState,\n playerId: string,\n q: unknown,\n targetId: unknown,\n values?: Readonly<Record<string, unknown>>,\n ) => ReturnType<CardTargetRule<CollectorState, string>[\"validate\"]>)\n | undefined,\n ...(dependsOn ? { dependsOn } : {}),\n domain: dependsOn\n ? (state, playerId, q, _derived, values) => ({\n type: \"target\" as const,\n targetKind: target.targetKind,\n zoneId: target.zoneId,\n zoneIds: target.zoneIds,\n eligibleTargets: target\n .eligible({\n state: state as State,\n playerId: playerId as never,\n q: q as never,\n values,\n })\n .map(String),\n })\n : undefined,\n meta: {\n zoneId: target.zoneId,\n zoneIds: target.zoneIds,\n targetKind: target.targetKind,\n },\n };\n}\n","import type {\n DispatchTraceEntry,\n TrustedReducerDispatchResult,\n TrustedRuntimeInput,\n} from \"../core/types\";\nimport type { RuntimeInstructionForState } from \"../core/runtime-instruction\";\n\nexport function createRuntimeInstructionEngine<\n State,\n PlayerId extends string,\n Input extends TrustedRuntimeInput<PlayerId>,\n>({\n reduce,\n resolveInstruction,\n afterInput,\n}: {\n reduce: (\n state: State,\n input: Input,\n ) =>\n | { type: \"reject\"; errorCode: string; message?: string }\n | {\n type: \"accept\";\n state: State;\n instructions?: RuntimeInstructionForState<State>[];\n };\n resolveInstruction: (\n state: State,\n instruction: RuntimeInstructionForState<State>,\n ) => {\n state: State;\n queuedInputs: Input[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, Input>[];\n };\n afterInput?: (\n state: State,\n input: Input,\n ) => {\n state: State;\n trace: DispatchTraceEntry<State, PlayerId, Input>[];\n };\n}) {\n function drainInstructions(\n state: State,\n instructionsToDrain: RuntimeInstructionForState<State>[],\n ): State {\n let workingState = state;\n const instructionQueue = [...instructionsToDrain];\n const systemQueue: Input[] = [];\n\n while (instructionQueue.length > 0 || systemQueue.length > 0) {\n while (instructionQueue.length > 0) {\n const instruction = instructionQueue.shift();\n if (instruction === undefined) break;\n const resolved = resolveInstruction(workingState, instruction);\n workingState = resolved.state;\n if (resolved.queuedInstructions.length > 0) {\n instructionQueue.unshift(...resolved.queuedInstructions);\n }\n systemQueue.push(...resolved.queuedInputs);\n }\n\n while (systemQueue.length > 0) {\n const input = systemQueue.shift();\n if (input === undefined) break;\n const result = reduce(workingState, input);\n if (result.type === \"reject\") {\n throw new Error(\n result.message ??\n `Reducer rejected internal input '${input.kind}'.`,\n );\n }\n workingState = result.state;\n instructionQueue.push(...(result.instructions ?? []));\n }\n }\n\n return workingState;\n }\n\n function dispatch(\n state: State,\n input: Input,\n ): TrustedReducerDispatchResult<State, PlayerId> {\n let workingState = state;\n const pendingInputs: Input[] = [input];\n const trace: DispatchTraceEntry<State, PlayerId, Input>[] = [\n {\n type: \"acceptedClientInput\",\n input,\n },\n ];\n\n while (pendingInputs.length > 0) {\n const pendingInput = pendingInputs.shift();\n if (pendingInput === undefined) break;\n const result = reduce(workingState, pendingInput);\n if (result.type === \"reject\") {\n if (pendingInput === input) {\n return result;\n }\n throw new Error(\n result.message ??\n `Reducer rejected internal input '${pendingInput.kind}'.`,\n );\n }\n\n workingState = result.state;\n\n if (afterInput) {\n const afterInputResult = afterInput(workingState, pendingInput);\n workingState = afterInputResult.state;\n trace.push(...afterInputResult.trace);\n }\n\n const instructionQueue = [...(result.instructions ?? [])];\n const continuationQueue: Input[] = [];\n while (instructionQueue.length > 0 || continuationQueue.length > 0) {\n while (instructionQueue.length > 0) {\n const instruction = instructionQueue.shift();\n if (instruction === undefined) break;\n trace.push({\n type: \"appliedInstruction\",\n instruction,\n });\n const resolved = resolveInstruction(workingState, instruction);\n workingState = resolved.state;\n trace.push(...resolved.trace);\n if (resolved.queuedInstructions.length > 0) {\n instructionQueue.unshift(...resolved.queuedInstructions);\n }\n continuationQueue.push(...resolved.queuedInputs);\n }\n\n while (continuationQueue.length > 0) {\n const queued = continuationQueue.shift();\n if (queued === undefined) break;\n pendingInputs.push(queued);\n }\n }\n }\n\n return {\n type: \"accept\",\n state: workingState,\n trace,\n };\n }\n\n return {\n dispatch,\n drainInstructions,\n };\n}\n","import type {\n CardCollection,\n ViewCard,\n ViewSlotOccupant,\n} from \"@dreamboard/sdk-types\";\nimport type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n BoardTypeIdOfTable,\n CardIdOfTable,\n CardIdOfState,\n ComponentLocationOfTable,\n ComponentIdOfTable,\n CompatibleCardIdForHandAndDeck,\n CompatibleCardIdForTwoPlayerZones,\n DeckCardsOfTable,\n DeckIdOfTable,\n HandCardsOfTable,\n HandIdOfTable,\n HexBoardIdOfTable,\n HexEdgeIdOfTable,\n HexSpaceIdOfTable,\n HexVertexIdOfTable,\n PlayerIdOfState,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n RelationTypeIdOfTable,\n ResolvedContainerLocation,\n ResolvedDeckLocation,\n ResolvedEdgeLocation,\n ResolvedHandLocation,\n ResolvedSlotLocation,\n ResolvedSpaceLocation,\n ResolvedVertexLocation,\n ResolvedZoneLocation,\n ResourceBalancesOfTable,\n RuntimeBoardState,\n RuntimeComponentLocation,\n RuntimeRecord,\n RuntimeTableRecord,\n SquareBoardIdOfTable,\n SquareSpaceIdOfTable,\n SharedZoneIdOfTable,\n SpaceIdOfTable,\n SpaceTypeIdOfTable,\n TableOfState,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledEdgeStateOfTable,\n TiledEdgeTypeIdOfTable,\n TiledVertexIdOfTable,\n TiledVertexStateOfTable,\n TiledVertexTypeIdOfTable,\n} from \"./model\";\nimport type { PerPlayer, PlayerId } from \"./per-player\";\nimport { perPlayerGet, perPlayerMap, perPlayerSet } from \"./per-player\";\n\n// Thin wrappers that preserve the existing \"look up by player id\" idiom used\n// throughout this file. `hands`, `zones.perPlayer`, and `resources` are\n// `PerPlayer<T>`-shaped at runtime (the ingress codec rejects anything else),\n// so these helpers assume the wrapper is always present.\nfunction ppRead<Value>(\n value: PerPlayer<Value> | undefined,\n playerId: string,\n): Value | undefined {\n if (value === undefined) return undefined;\n return perPlayerGet(value, playerId as PlayerId);\n}\n\nfunction ppWrite<Value>(\n value: PerPlayer<Value> | undefined,\n playerId: string,\n next: Value,\n): PerPlayer<Value> {\n const base: PerPlayer<Value> = value ?? { __perPlayer: true, entries: [] };\n return perPlayerSet(base, playerId as PlayerId, next);\n}\n\ntype ViewCardForTable<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<Table>,\n> =\n CardId extends CardIdOfTable<Table>\n ? ViewCard<\n CardId & string,\n Table[\"cards\"][CardId][\"cardType\"] & string,\n Extract<Table[\"cards\"][CardId][\"properties\"], Record<string, unknown>>\n >\n : never;\n\ntype ViewSlotOccupantForTable<Table extends RuntimeTableRecord> =\n ViewSlotOccupant<\n ComponentIdOfTable<Table> & string,\n PlayerIdOfTable<Table> & string,\n string,\n Record<string, unknown>\n >;\n\nexport function ensureArray<T>(value: readonly T[] | T[] | undefined): T[] {\n return Array.isArray(value) ? [...value] : [];\n}\n\nfunction locationPosition(location: RuntimeComponentLocation): number {\n return \"position\" in location && typeof location.position === \"number\"\n ? location.position\n : Number.MAX_SAFE_INTEGER;\n}\n\nfunction orderedComponentIdsForLocation(\n table: RuntimeTableRecord,\n predicate: (location: RuntimeComponentLocation) => boolean,\n): string[] {\n return Object.entries(table.componentLocations)\n .filter(([, location]) => predicate(location))\n .sort(\n (left, right) => locationPosition(left[1]) - locationPosition(right[1]),\n )\n .map(([componentId]) => componentId);\n}\n\nfunction allowedCardSetIdsForZone(\n table: RuntimeTableRecord,\n zoneId: string,\n): readonly string[] {\n return table.zones.cardSetIdsByZoneId?.[zoneId] ?? [];\n}\n\nfunction hasOwnKey(record: Record<string, unknown>, key: string): boolean {\n return Object.prototype.hasOwnProperty.call(record, key);\n}\n\nfunction isSharedZoneId(table: RuntimeTableRecord, zoneId: string): boolean {\n return (\n hasOwnKey(table.decks, zoneId) || hasOwnKey(table.zones.shared, zoneId)\n );\n}\n\nfunction isPlayerZoneId(table: RuntimeTableRecord, zoneId: string): boolean {\n return (\n hasOwnKey(table.hands, zoneId) ||\n hasOwnKey(table.zones.perPlayer, zoneId) ||\n hasOwnKey(table.handVisibility, zoneId)\n );\n}\n\nfunction zoneScopeForId(\n table: RuntimeTableRecord,\n zoneId: string,\n): \"shared\" | \"perPlayer\" | null {\n if (isPlayerZoneId(table, zoneId)) {\n return \"perPlayer\";\n }\n if (isSharedZoneId(table, zoneId)) {\n return \"shared\";\n }\n return null;\n}\n\nfunction assertZoneScope(\n table: RuntimeTableRecord,\n zoneId: string,\n expectedScope: \"shared\" | \"perPlayer\",\n operation: string,\n argumentName: string,\n): void {\n const actualScope = zoneScopeForId(table, zoneId);\n if (actualScope === expectedScope) {\n return;\n }\n\n if (actualScope === null) {\n throw new Error(\n `Unknown zone '${zoneId}' passed as ${argumentName} to ${operation}.`,\n );\n }\n\n throw new Error(\n `Zone '${zoneId}' has scope '${actualScope}', but ${operation} requires ${argumentName} to be a ${expectedScope === \"shared\" ? \"shared\" : \"perPlayer\"} zone.`,\n );\n}\n\nfunction matchesSlotHost(\n location: RuntimeComponentLocation,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n slotId?: string,\n): location is Extract<RuntimeComponentLocation, { type: \"InSlot\" }> {\n return (\n location.type === \"InSlot\" &&\n location.host.kind === host.kind &&\n location.host.id === host.id &&\n (slotId === undefined || location.slotId === slotId)\n );\n}\n\nfunction componentPlayerId<Table extends RuntimeTableRecord>(\n table: Table,\n componentId: ComponentIdOfTable<Table>,\n): (PlayerIdOfTable<Table> & string) | null {\n const piece = table.pieces[componentId];\n if (piece) {\n return (piece.ownerId ?? null) as (PlayerIdOfTable<Table> & string) | null;\n }\n\n const die = table.dice[componentId];\n if (die) {\n return (die.ownerId ?? null) as (PlayerIdOfTable<Table> & string) | null;\n }\n\n const owner = table.ownerOfCard[componentId];\n if (owner !== undefined) {\n return (owner ?? null) as (PlayerIdOfTable<Table> & string) | null;\n }\n\n return null;\n}\n\nfunction componentData<Table extends RuntimeTableRecord>(\n table: Table,\n componentId: ComponentIdOfTable<Table>,\n): Record<string, unknown> | undefined {\n const piece = table.pieces[componentId];\n if (piece) {\n return piece.properties as Record<string, unknown>;\n }\n\n const die = table.dice[componentId];\n if (die) {\n return die.properties as Record<string, unknown>;\n }\n\n const card = table.cards[componentId];\n if (card) {\n return card.properties as Record<string, unknown>;\n }\n\n return undefined;\n}\n\nexport function assertCardAllowedInZone<Table extends RuntimeTableRecord>(\n table: Table,\n zoneId: string,\n componentId: string,\n): void {\n const card = table.cards[componentId];\n if (!card) {\n return;\n }\n\n const allowedCardSetIds = allowedCardSetIdsForZone(table, zoneId);\n if (\n allowedCardSetIds.length > 0 &&\n !allowedCardSetIds.includes(card.cardSetId)\n ) {\n throw new Error(\n `Card '${componentId}' from card set '${card.cardSetId}' cannot enter zone '${zoneId}'.`,\n );\n }\n}\n\nfunction cloneRuntimeBoardState(board: RuntimeBoardState): RuntimeBoardState {\n if (board.layout !== \"generic\") {\n return {\n ...board,\n fields: { ...board.fields },\n spaces: Object.fromEntries(\n Object.entries(board.spaces).map(([spaceId, space]) => [\n spaceId,\n {\n ...space,\n fields: { ...space.fields },\n },\n ]),\n ),\n relations: board.relations.map((relation) => ({\n ...relation,\n fields: { ...relation.fields },\n })),\n containers: Object.fromEntries(\n Object.entries(board.containers).map(([containerId, container]) => [\n containerId,\n {\n ...container,\n fields: { ...container.fields },\n },\n ]),\n ),\n edges: board.edges.map((edge) => ({\n ...edge,\n spaceIds: [...edge.spaceIds],\n fields: { ...edge.fields },\n })),\n vertices: board.vertices.map((vertex) => ({\n ...vertex,\n spaceIds: [...vertex.spaceIds],\n fields: { ...vertex.fields },\n })),\n };\n }\n\n return {\n ...board,\n fields: { ...board.fields },\n spaces: Object.fromEntries(\n Object.entries(board.spaces).map(([spaceId, space]) => [\n spaceId,\n {\n ...space,\n fields: { ...space.fields },\n },\n ]),\n ),\n relations: board.relations.map((relation) => ({\n ...relation,\n fields: { ...relation.fields },\n })),\n containers: Object.fromEntries(\n Object.entries(board.containers).map(([containerId, container]) => [\n containerId,\n {\n ...container,\n fields: { ...container.fields },\n },\n ]),\n ),\n };\n}\n\nexport function cloneRuntimeTable<Table extends RuntimeTableRecord>(\n table: Table,\n): Table {\n return {\n ...table,\n zones: {\n shared: Object.fromEntries(\n Object.entries(table.zones.shared).map(([zoneId, componentIds]) => [\n zoneId,\n [...componentIds],\n ]),\n ) as Table[\"zones\"][\"shared\"],\n perPlayer: Object.fromEntries(\n Object.entries(table.zones.perPlayer).map(([zoneId, players]) => [\n zoneId,\n perPlayerMap(players as PerPlayer<string[]>, (componentIds) => [\n ...componentIds,\n ]),\n ]),\n ) as Table[\"zones\"][\"perPlayer\"],\n visibility: { ...table.zones.visibility },\n cardSetIdsByZoneId: table.zones.cardSetIdsByZoneId\n ? Object.fromEntries(\n Object.entries(table.zones.cardSetIdsByZoneId).map(\n ([zoneId, cardSetIds]) => [zoneId, [...cardSetIds]],\n ),\n )\n : table.zones.cardSetIdsByZoneId,\n } as Table[\"zones\"],\n decks: Object.fromEntries(\n Object.entries(table.decks).map(([deckId, cards]) => [\n deckId,\n [...cards],\n ]),\n ) as Table[\"decks\"],\n hands: Object.fromEntries(\n Object.entries(table.hands).map(([handId, players]) => [\n handId,\n perPlayerMap(players as PerPlayer<string[]>, (cards) => [...cards]),\n ]),\n ) as Table[\"hands\"],\n handVisibility: { ...table.handVisibility },\n pieces: Object.fromEntries(\n Object.entries(table.pieces).map(([pieceId, piece]) => [\n pieceId,\n { ...piece },\n ]),\n ) as Table[\"pieces\"],\n componentLocations: { ...table.componentLocations },\n ownerOfCard: { ...table.ownerOfCard },\n visibility: { ...table.visibility },\n resources: perPlayerMap(\n table.resources as PerPlayer<RuntimeRecord>,\n (resources) => ({ ...resources }),\n ) as Table[\"resources\"],\n boards: {\n ...table.boards,\n byId: Object.fromEntries(\n Object.entries(table.boards.byId).map(([boardId, board]) => [\n boardId,\n cloneRuntimeBoardState(board),\n ]),\n ),\n hex: Object.fromEntries(\n Object.entries(table.boards.hex ?? {}).map(([boardId, board]) => [\n boardId,\n cloneRuntimeBoardState(board),\n ]),\n ),\n square: Object.fromEntries(\n Object.entries(table.boards.square ?? {}).map(([boardId, board]) => [\n boardId,\n cloneRuntimeBoardState(board),\n ]),\n ),\n } as Table[\"boards\"],\n dice: Object.fromEntries(\n Object.entries(table.dice).map(([dieId, die]) => [dieId, { ...die }]),\n ) as Table[\"dice\"],\n };\n}\n\nfunction syncSharedZoneWithDeck<\n Table extends RuntimeTableRecord,\n ZoneId extends SharedZoneIdOfTable<Table>,\n>(table: Table, zoneId: ZoneId, nextCards: readonly string[]): void {\n table.decks[zoneId] = [...nextCards] as Table[\"decks\"][ZoneId];\n table.zones.shared[zoneId] = [\n ...nextCards,\n ] as Table[\"zones\"][\"shared\"][ZoneId];\n}\n\n/**\n * Read or write a per-player zone's card list by mutating `table` in place.\n * Called with no `nextCards` to read; called with `nextCards` to write the\n * new ordering. Returns the list at the read site as a plain array.\n *\n * Used by engine-side per-player shuffle resolution; authors should reach for\n * the named ops in this file.\n */\nexport function shufflePlayerZoneCards(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n nextCards?: readonly string[],\n): string[] {\n if (nextCards === undefined) {\n const fromZone = ppRead(\n table.zones.perPlayer[zoneId] ?? table.hands[zoneId],\n playerId,\n ) as readonly string[] | undefined;\n return [...ensureArray(fromZone)];\n }\n table.hands[zoneId] = ppWrite(table.hands[zoneId], playerId, [\n ...nextCards,\n ]) as (typeof table.hands)[string];\n table.zones.perPlayer[zoneId] = ppWrite(\n table.zones.perPlayer[zoneId],\n playerId,\n [...nextCards],\n ) as (typeof table.zones.perPlayer)[string];\n return [...nextCards];\n}\n\nfunction syncPlayerZoneWithHand<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(\n table: Table,\n zoneId: ZoneId,\n playerId: PlayerId,\n nextCards: readonly string[],\n): void {\n table.hands[zoneId] = ppWrite(table.hands[zoneId], playerId as string, [\n ...nextCards,\n ]) as Table[\"hands\"][ZoneId];\n table.zones.perPlayer[zoneId] = ppWrite(\n table.zones.perPlayer[zoneId],\n playerId as string,\n [...nextCards],\n ) as Table[\"zones\"][\"perPlayer\"][ZoneId];\n}\n\nfunction reindexSpaceOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, spaceId: SpaceId): void {\n getComponentsOnSpace(table, boardId, spaceId).forEach(\n (componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"OnSpace\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n },\n );\n}\n\nfunction reindexContainerOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<Table>,\n ContainerId extends BoardContainerIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, containerId: ContainerId): void {\n getComponentsInContainer(table, boardId, containerId).forEach(\n (componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"InContainer\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n },\n );\n}\n\nfunction reindexEdgeOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<Table>,\n EdgeId extends HexEdgeIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, edgeId: EdgeId): void {\n orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnEdge\" &&\n location.boardId === boardId &&\n location.edgeId === edgeId,\n ).forEach((componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"OnEdge\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n });\n}\n\nfunction reindexVertexOccupants<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<Table>,\n VertexId extends HexVertexIdOfTable<Table, BoardId>,\n>(table: Table, boardId: BoardId, vertexId: VertexId): void {\n orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnVertex\" &&\n location.boardId === boardId &&\n location.vertexId === vertexId,\n ).forEach((componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"OnVertex\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n });\n}\n\nfunction reindexSlotOccupants<Table extends RuntimeTableRecord>(\n table: Table,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n slotId: string,\n): void {\n orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"InSlot\" &&\n location.host.kind === host.kind &&\n location.host.id === host.id &&\n location.slotId === slotId,\n ).forEach((componentId, index) => {\n const location = table.componentLocations[componentId];\n if (location?.type === \"InSlot\") {\n table.componentLocations[componentId] = {\n ...location,\n position: index,\n };\n }\n });\n}\n\nfunction removeComponentFromCurrentLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n>(table: Table, componentId: ComponentId): void {\n const currentLocation = table.componentLocations[componentId];\n if (!currentLocation) {\n return;\n }\n\n if (currentLocation.type === \"InDeck\") {\n const nextCards = ensureArray(table.decks[currentLocation.deckId]).filter(\n (candidate) => candidate !== componentId,\n );\n syncSharedZoneWithDeck(\n table,\n currentLocation.deckId as SharedZoneIdOfTable<Table>,\n nextCards,\n );\n nextCards.forEach((cardId, index) => {\n const location = table.componentLocations[cardId];\n if (location?.type === \"InDeck\") {\n table.componentLocations[cardId] = {\n ...location,\n position: index,\n };\n }\n });\n return;\n }\n\n if (currentLocation.type === \"InHand\") {\n const nextCards = ensureArray(\n ppRead(table.hands[currentLocation.handId], currentLocation.playerId),\n ).filter((candidate) => candidate !== componentId);\n syncPlayerZoneWithHand(\n table,\n currentLocation.handId as PlayerZoneIdOfTable<Table>,\n currentLocation.playerId as PlayerIdOfTable<Table>,\n nextCards,\n );\n nextCards.forEach((cardId, index) => {\n const location = table.componentLocations[cardId];\n if (location?.type === \"InHand\") {\n table.componentLocations[cardId] = {\n ...location,\n position: index,\n };\n }\n });\n return;\n }\n\n if (currentLocation.type === \"OnSpace\") {\n delete table.componentLocations[componentId];\n reindexSpaceOccupants(\n table,\n currentLocation.boardId as BoardIdOfTable<Table>,\n currentLocation.spaceId as SpaceIdOfTable<Table, BoardIdOfTable<Table>>,\n );\n return;\n }\n\n if (currentLocation.type === \"InZone\") {\n if (currentLocation.zoneId in table.zones.shared) {\n const nextComponents = ensureArray(\n table.zones.shared[currentLocation.zoneId],\n ).filter((candidate) => candidate !== componentId);\n syncSharedZoneWithDeck(\n table,\n currentLocation.zoneId as SharedZoneIdOfTable<Table>,\n nextComponents,\n );\n nextComponents.forEach((currentComponentId, index) => {\n const location = table.componentLocations[currentComponentId];\n if (location?.type === \"InZone\") {\n table.componentLocations[currentComponentId] = {\n ...location,\n position: index,\n };\n }\n });\n }\n delete table.componentLocations[componentId];\n return;\n }\n\n if (currentLocation.type === \"InContainer\") {\n delete table.componentLocations[componentId];\n reindexContainerOccupants(\n table,\n currentLocation.boardId as BoardIdOfTable<Table>,\n currentLocation.containerId as BoardContainerIdOfTable<\n Table,\n BoardIdOfTable<Table>\n >,\n );\n return;\n }\n\n if (currentLocation.type === \"OnEdge\") {\n delete table.componentLocations[componentId];\n reindexEdgeOccupants(\n table,\n currentLocation.boardId as HexBoardIdOfTable<Table>,\n currentLocation.edgeId as HexEdgeIdOfTable<\n Table,\n HexBoardIdOfTable<Table>\n >,\n );\n return;\n }\n\n if (currentLocation.type === \"OnVertex\") {\n delete table.componentLocations[componentId];\n reindexVertexOccupants(\n table,\n currentLocation.boardId as HexBoardIdOfTable<Table>,\n currentLocation.vertexId as HexVertexIdOfTable<\n Table,\n HexBoardIdOfTable<Table>\n >,\n );\n return;\n }\n\n if (currentLocation.type === \"InSlot\") {\n delete table.componentLocations[componentId];\n reindexSlotOccupants(table, currentLocation.host, currentLocation.slotId);\n return;\n }\n\n delete table.componentLocations[componentId];\n}\n\nfunction appendToDeck<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n playedBy: PlayerIdOfTable<Table> | null = null,\n position: \"top\" | \"bottom\" = \"bottom\",\n): Table {\n const nextTable = cloneRuntimeTable(table);\n assertZoneScope(\n nextTable,\n deckId as string,\n \"shared\",\n \"addCardToSharedZone\",\n \"zoneId\",\n );\n const deckCards = [\n ...ensureArray(nextTable.decks[deckId]),\n ] as DeckCardsOfTable<Table, DeckId>;\n assertCardAllowedInZone(nextTable, deckId, cardId);\n if (position === \"top\") {\n deckCards.unshift(cardId);\n } else {\n deckCards.push(cardId);\n }\n syncSharedZoneWithDeck(nextTable, deckId, deckCards);\n for (const [index, currentCardId] of deckCards.entries()) {\n if (currentCardId === cardId) {\n nextTable.componentLocations[currentCardId] = {\n type: \"InDeck\",\n deckId,\n playedBy,\n position: index,\n };\n continue;\n }\n const existing = nextTable.componentLocations[currentCardId];\n nextTable.componentLocations[currentCardId] = {\n type: \"InDeck\",\n deckId,\n playedBy: existing?.type === \"InDeck\" ? existing.playedBy : null,\n position: index,\n };\n }\n nextTable.ownerOfCard[cardId] = playedBy;\n nextTable.visibility[cardId] = {\n faceUp: true,\n };\n return nextTable;\n}\n\nfunction removeFromDeck<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n): Table {\n const nextTable = cloneRuntimeTable(table);\n assertZoneScope(\n nextTable,\n deckId as string,\n \"shared\",\n \"removeCardFromSharedZone\",\n \"zoneId\",\n );\n const remaining = ensureArray(nextTable.decks[deckId]).filter(\n (candidate) => candidate !== cardId,\n );\n syncSharedZoneWithDeck(nextTable, deckId, remaining);\n for (const [index, currentCardId] of remaining.entries()) {\n const currentLocation = nextTable.componentLocations[currentCardId];\n if (currentLocation?.type === \"InDeck\") {\n nextTable.componentLocations[currentCardId] = {\n ...currentLocation,\n position: index,\n };\n }\n }\n return nextTable;\n}\n\nfunction computeVisibilityForPlayerZone(\n table: RuntimeTableRecord,\n zoneId: string,\n playerId: string,\n): { faceUp: boolean; visibleTo?: string[] } {\n const mode = table.handVisibility[zoneId];\n if (mode === \"all\" || mode === \"public\") {\n return { faceUp: true };\n }\n return { faceUp: false, visibleTo: [playerId] };\n}\n\nfunction moveFromHandToDeck<\n Table extends RuntimeTableRecord,\n HandId extends HandIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n DeckId extends DeckIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n handId: HandId;\n cardId: CompatibleCardIdForHandAndDeck<Table, HandId, DeckId>;\n deckId: DeckId;\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): Table {\n const nextTable = cloneRuntimeTable(options.table);\n assertZoneScope(\n nextTable,\n options.handId as string,\n \"perPlayer\",\n \"moveCardFromPlayerZoneToSharedZone\",\n \"fromZoneId\",\n );\n assertZoneScope(\n nextTable,\n options.deckId as string,\n \"shared\",\n \"moveCardFromPlayerZoneToSharedZone\",\n \"toZoneId\",\n );\n const currentHand = ensureArray(\n ppRead(nextTable.hands[options.handId], options.playerId as string) as\n | readonly string[]\n | undefined,\n ).filter((candidate) => candidate !== options.cardId);\n syncPlayerZoneWithHand(\n nextTable,\n options.handId,\n options.playerId,\n currentHand,\n );\n for (const [index, currentCardId] of currentHand.entries()) {\n nextTable.componentLocations[currentCardId as string] = {\n type: \"InHand\",\n handId: options.handId,\n playerId: options.playerId,\n position: index,\n };\n }\n nextTable.ownerOfCard[options.cardId] = options.playedBy ?? options.playerId;\n nextTable.visibility[options.cardId] = {\n faceUp: true,\n };\n return appendToDeck(\n nextTable,\n options.deckId,\n options.cardId,\n options.playedBy ?? options.playerId,\n options.position ?? \"bottom\",\n );\n}\n\nexport function setActivePlayers<\n State extends { flow: { activePlayers: PlayerIdOfState<State>[] } },\n>(state: State, activePlayers: PlayerIdOfState<State>[]): State {\n return {\n ...state,\n flow: {\n ...state.flow,\n activePlayers,\n },\n };\n}\n\nexport function setPhaseState<State extends { phase: object }, PhaseState>(\n state: State,\n phaseState: PhaseState,\n): State {\n return {\n ...state,\n phase: phaseState,\n };\n}\n\ntype DeckCardsForZone<\n Table extends RuntimeTableRecord,\n ZoneId extends DeckIdOfTable<Table>,\n> = ZoneId extends infer Each extends DeckIdOfTable<Table>\n ? DeckCardsOfTable<Table, Each>\n : never;\n\ntype HandCardsForZone<\n Table extends RuntimeTableRecord,\n ZoneId extends HandIdOfTable<Table>,\n> = ZoneId extends infer Each extends HandIdOfTable<Table>\n ? HandCardsOfTable<Table, Each>\n : never;\n\nexport function getSharedZoneCards<\n Table extends RuntimeTableRecord,\n ZoneId extends SharedZoneIdOfTable<Table>,\n>(table: Table, zoneId: ZoneId): DeckCardsForZone<Table, ZoneId> {\n assertZoneScope(\n table,\n zoneId as string,\n \"shared\",\n \"getSharedZoneCards\",\n \"zoneId\",\n );\n return [\n ...ensureArray(table.zones.shared[zoneId] ?? table.decks[zoneId]),\n ] as DeckCardsForZone<Table, ZoneId>;\n}\n\nexport function getPlayerZoneCards<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(\n table: Table,\n playerId: PlayerId,\n zoneId: ZoneId,\n): HandCardsForZone<Table, ZoneId> {\n assertZoneScope(\n table,\n zoneId as string,\n \"perPlayer\",\n \"getPlayerZoneCards\",\n \"zoneId\",\n );\n const cards =\n ppRead(table.zones.perPlayer[zoneId], playerId as string) ??\n ppRead(table.hands[zoneId], playerId as string);\n return [\n ...ensureArray(cards as readonly string[] | undefined),\n ] as unknown as HandCardsForZone<Table, ZoneId>;\n}\n\nfunction collectZoneIds(\n ...sources: ReadonlyArray<Record<string, unknown> | undefined>\n): string[] {\n const seen = new Set<string>();\n for (const source of sources) {\n if (!source) continue;\n for (const key of Object.keys(source)) {\n seen.add(key);\n }\n }\n return [...seen];\n}\n\nexport function getAllSharedZoneCards<Table extends RuntimeTableRecord>(\n table: Table,\n): {\n readonly [Z in SharedZoneIdOfTable<Table>]: DeckCardsOfTable<Table, Z>;\n} {\n const zoneIds = collectZoneIds(\n table.zones.shared as Record<string, unknown> | undefined,\n table.decks as Record<string, unknown> | undefined,\n );\n const result: Record<string, readonly unknown[]> = {};\n for (const zoneId of zoneIds) {\n result[zoneId] = getSharedZoneCards(\n table,\n zoneId as SharedZoneIdOfTable<Table>,\n );\n }\n return result as {\n readonly [Z in SharedZoneIdOfTable<Table>]: DeckCardsOfTable<Table, Z>;\n };\n}\n\nexport function getAllPlayerZoneCards<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n>(\n table: Table,\n zoneId: ZoneId,\n): {\n readonly [P in PlayerIdOfTable<Table>]: HandCardsOfTable<Table, ZoneId>;\n} {\n const result: Record<string, readonly unknown[]> = {};\n for (const playerId of table.playerOrder) {\n result[playerId] = getPlayerZoneCards(\n table,\n playerId as PlayerIdOfTable<Table>,\n zoneId,\n );\n }\n return result as {\n readonly [P in PlayerIdOfTable<Table>]: HandCardsOfTable<Table, ZoneId>;\n };\n}\n\nexport function getCard<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<NoInfer<Table>>,\n>(table: Table, cardId: CardId): ViewCardForTable<Table, CardId> {\n const card = table.cards[cardId] as Table[\"cards\"][CardId];\n\n return {\n id: card.id,\n cardType: card.cardType,\n name: card.name,\n text: card.text,\n properties: card.properties,\n } as ViewCardForTable<Table, CardId>;\n}\n\nexport function getCardsById<\n Table extends RuntimeTableRecord,\n const CardIds extends readonly CardIdOfTable<NoInfer<Table>>[],\n>(\n table: Table,\n cardIds: CardIds,\n): Readonly<{\n [Id in CardIds[number]]: ViewCardForTable<Table, Id> | undefined;\n}> {\n return Object.fromEntries(\n cardIds.map((cardId) => [\n cardId,\n table.cards[cardId] ? getCard(table, cardId) : undefined,\n ]),\n ) as Readonly<{\n [Id in CardIds[number]]: ViewCardForTable<Table, Id> | undefined;\n }>;\n}\n\nexport function getSharedZoneCardCollection<\n Table extends RuntimeTableRecord,\n ZoneId extends SharedZoneIdOfTable<Table>,\n>(\n table: Table,\n zoneId: ZoneId,\n): CardCollection<\n CardIdOfTable<Table> & string,\n ViewCardForTable<Table, CardIdOfTable<Table>>\n> {\n const cardIds = getSharedZoneCards(table, zoneId);\n\n return {\n cardIds: cardIds as readonly (CardIdOfTable<Table> & string)[],\n cardsById: getCardsById(table, cardIds as readonly CardIdOfTable<Table>[]),\n };\n}\n\nexport function getPlayerZoneCardCollection<\n Table extends RuntimeTableRecord,\n ZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(\n table: Table,\n playerId: PlayerId,\n zoneId: ZoneId,\n): CardCollection<\n CardIdOfTable<Table> & string,\n ViewCardForTable<Table, CardIdOfTable<Table>>\n> {\n const cardIds = getPlayerZoneCards(table, playerId, zoneId);\n\n return {\n cardIds: cardIds as readonly (CardIdOfTable<Table> & string)[],\n cardsById: getCardsById(table, cardIds as readonly CardIdOfTable<Table>[]),\n };\n}\n\nexport function getSlotOccupants<Table extends RuntimeTableRecord>(\n table: Table,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n slotId: string,\n): ViewSlotOccupantForTable<Table>[] {\n return orderedComponentIdsForLocation(table, (location) =>\n matchesSlotHost(location, host, slotId),\n ).map((componentId) => ({\n pieceId: componentId as ComponentIdOfTable<Table> & string,\n playerId: componentPlayerId(\n table,\n componentId as ComponentIdOfTable<Table>,\n ),\n slotId,\n data: componentData(table, componentId as ComponentIdOfTable<Table>),\n }));\n}\n\nexport function getSlotOccupantsByHost<Table extends RuntimeTableRecord>(\n table: Table,\n host: Extract<RuntimeComponentLocation, { type: \"InSlot\" }>[\"host\"],\n): Readonly<Record<string, ViewSlotOccupantForTable<Table>[]>> {\n const occupantsBySlot: Record<string, ViewSlotOccupantForTable<Table>[]> = {};\n\n orderedComponentIdsForLocation(table, (location) =>\n matchesSlotHost(location, host),\n ).forEach((componentId) => {\n const location = table.componentLocations[componentId];\n if (!location || !matchesSlotHost(location, host)) {\n return;\n }\n\n const slotOccupant: ViewSlotOccupantForTable<Table> = {\n pieceId: componentId as ComponentIdOfTable<Table> & string,\n playerId: componentPlayerId(\n table,\n componentId as ComponentIdOfTable<Table>,\n ),\n slotId: location.slotId,\n data: componentData(table, componentId as ComponentIdOfTable<Table>),\n };\n\n (occupantsBySlot[location.slotId] ??= []).push(slotOccupant);\n });\n\n return occupantsBySlot;\n}\n\nexport function getCardOwner<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<NoInfer<Table>>,\n>(table: Table, cardId: CardId): Table[\"ownerOfCard\"][CardId] {\n return table.ownerOfCard[cardId] as Table[\"ownerOfCard\"][CardId];\n}\n\nexport function getCardVisibility<\n Table extends RuntimeTableRecord,\n CardId extends CardIdOfTable<NoInfer<Table>>,\n>(table: Table, cardId: CardId): Table[\"visibility\"][CardId] {\n return table.visibility[cardId] as Table[\"visibility\"][CardId];\n}\n\nexport function getPlayerOrder<Table extends RuntimeTableRecord>(\n table: Table,\n): Table[\"playerOrder\"] {\n return table.playerOrder;\n}\n\nexport function getPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: PlayerIdOfTable<NoInfer<Table>>,\n): ResourceBalancesOfTable<Table> {\n return perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as unknown as PlayerId,\n ) as ResourceBalancesOfTable<Table>;\n}\n\n/**\n * Read the amount a player holds of a single resource. Returns `0` when the\n * player has never accumulated that resource.\n */\nexport function getPlayerResourceAmount<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n resourceId: string,\n): number {\n const playerResources = perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n );\n if (!playerResources) return 0;\n const value = (playerResources as Record<string, unknown>)[resourceId];\n return typeof value === \"number\" ? value : 0;\n}\n\n/**\n * Sum of every resource amount for a player (e.g. \"total cards in hand\"\n * games). Skips `undefined` and non-number values.\n */\nexport function getPlayerResourceTotal<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n): number {\n const playerResources = perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n );\n if (!playerResources) return 0;\n let total = 0;\n for (const key of Object.keys(playerResources)) {\n const value = (playerResources as Record<string, unknown>)[key];\n if (typeof value === \"number\") total += value;\n }\n return total;\n}\n\n/**\n * Next player in seating order after `playerId`, wrapping around to the\n * first seat. Returns `null` when `playerId` is not in the player order or\n * the order is empty.\n */\nexport function getNextPlayerInOrder<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n): PlayerIdOfTable<Table> | null {\n const order = table.playerOrder as unknown as ReadonlyArray<\n PlayerIdOfTable<Table>\n >;\n if (order.length === 0) return null;\n const idx = order.indexOf(playerId as PlayerIdOfTable<Table>);\n if (idx < 0) return null;\n return order[(idx + 1) % order.length] ?? null;\n}\n\n/**\n * Iterate a resource-amounts record, skipping undefined / non-positive entries.\n * Shared by the resource mutation helpers below.\n */\nfunction forEachResourceEntry(\n amounts: Readonly<Record<string, number | undefined>>,\n visit: (resourceId: string, amount: number) => void,\n): void {\n for (const resourceId of Object.keys(amounts)) {\n const amount = amounts[resourceId];\n if (typeof amount !== \"number\" || amount === 0) continue;\n visit(resourceId, amount);\n }\n}\n\n/**\n * Return `true` when `playerId` has at least the requested `amounts` of each\n * resource. Unknown resource ids are treated as zero-balance (i.e. requesting\n * one of them returns `false` unless the requested amount is also zero).\n */\nexport function canAffordResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): boolean {\n for (const resourceId of Object.keys(amounts)) {\n const required = amounts[resourceId];\n if (typeof required !== \"number\" || required <= 0) continue;\n if (getPlayerResourceAmount(table, playerId, resourceId) < required) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Return the subset of `amounts` that the player cannot afford. The returned\n * record maps resource id → shortfall. Empty when the player can afford the\n * full cost.\n */\nexport function getMissingResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Record<string, number> {\n const missing: Record<string, number> = {};\n for (const resourceId of Object.keys(amounts)) {\n const required = amounts[resourceId];\n if (typeof required !== \"number\" || required <= 0) continue;\n const have = getPlayerResourceAmount(table, playerId, resourceId);\n if (have < required) missing[resourceId] = required - have;\n }\n return missing;\n}\n\nfunction withPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n nextForPlayer: Record<string, number>,\n): Table {\n return {\n ...table,\n resources: perPlayerSet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n nextForPlayer as RuntimeRecord,\n ),\n } as Table;\n}\n\n/**\n * Increment each resource in `amounts` for `playerId`. Negative entries are\n * rejected — prefer {@link spendPlayerResources} for deductions so that\n * affordability is checked explicitly.\n */\nexport function addPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Table {\n const prev = (perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n ) ?? {}) as Record<string, number>;\n const next: Record<string, number> = { ...prev };\n forEachResourceEntry(amounts, (resourceId, amount) => {\n if (amount < 0) {\n throw new Error(\n `addPlayerResources: negative amount for resource '${resourceId}'. ` +\n `Use spendPlayerResources or transferPlayerResources instead.`,\n );\n }\n next[resourceId] = (next[resourceId] ?? 0) + amount;\n });\n return withPlayerResources(table, playerId, next);\n}\n\n/**\n * Deduct each resource in `amounts` from `playerId`. Throws when the player\n * cannot afford the full cost — callers must check `canAfford` in their\n * `validate` phase before invoking this op.\n */\nexport function spendPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Table {\n if (!canAffordResources(table, playerId, amounts)) {\n const missing = getMissingResources(table, playerId, amounts);\n throw new Error(\n `spendPlayerResources: player '${playerId}' cannot afford ${JSON.stringify(\n missing,\n )}. Check canAfford in your validate step first.`,\n );\n }\n const prev = (perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n ) ?? {}) as Record<string, number>;\n const next: Record<string, number> = { ...prev };\n forEachResourceEntry(amounts, (resourceId, amount) => {\n if (amount < 0) {\n throw new Error(\n `spendPlayerResources: negative amount for resource '${resourceId}'. ` +\n `Pass positive amounts — the op deducts them from the player.`,\n );\n }\n next[resourceId] = Math.max(0, (next[resourceId] ?? 0) - amount);\n });\n return withPlayerResources(table, playerId, next);\n}\n\n/**\n * Transfer the specified `amounts` from one player to another. Fails when the\n * source player cannot afford the full cost; on success the destination\n * gains exactly what the source loses.\n */\nexport function transferPlayerResources<Table extends RuntimeTableRecord>(\n table: Table,\n fromPlayerId: string,\n toPlayerId: string,\n amounts: Readonly<Record<string, number | undefined>>,\n): Table {\n const afterSpend = spendPlayerResources(table, fromPlayerId, amounts);\n return addPlayerResources(afterSpend, toPlayerId, amounts);\n}\n\n/**\n * Overwrite a single resource balance for a player. Prefer the additive or\n * subtractive helpers — use this only when the new balance is an absolute\n * (e.g. \"set coins to 10\" for a scripted setup).\n */\nexport function setPlayerResource<Table extends RuntimeTableRecord>(\n table: Table,\n playerId: string,\n resourceId: string,\n amount: number,\n): Table {\n if (!Number.isFinite(amount) || amount < 0) {\n throw new Error(\n `setPlayerResource: amount must be a non-negative finite number, got ${amount}.`,\n );\n }\n const prev = (perPlayerGet(\n table.resources as PerPlayer<RuntimeRecord>,\n playerId as PlayerId,\n ) ?? {}) as Record<string, number>;\n return withPlayerResources(table, playerId, {\n ...prev,\n [resourceId]: amount,\n });\n}\n\nexport function getComponentLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ComponentLocationOfTable<Table, ComponentId> | undefined {\n return table.componentLocations[componentId] as\n | ComponentLocationOfTable<Table, ComponentId>\n | undefined;\n}\n\nexport function getComponentDeckLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedDeckLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InDeck\") {\n return null;\n }\n\n return {\n componentId,\n deckId: location.deckId as DeckIdOfTable<Table>,\n cards: table.decks[location.deckId as DeckIdOfTable<Table>],\n location,\n } as ResolvedDeckLocation<Table, ComponentId>;\n}\n\nexport function getComponentHandLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedHandLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InHand\") {\n return null;\n }\n\n return {\n componentId,\n handId: location.handId as HandIdOfTable<Table>,\n playerId: location.playerId as PlayerIdOfTable<Table>,\n cards: ppRead(\n table.hands[location.handId as HandIdOfTable<Table>],\n location.playerId as string,\n ),\n location,\n } as unknown as ResolvedHandLocation<Table, ComponentId>;\n}\n\nexport function getComponentZoneLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedZoneLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InZone\") {\n return null;\n }\n\n return {\n componentId,\n zoneId: location.zoneId,\n location,\n } as ResolvedZoneLocation<Table, ComponentId>;\n}\n\nexport function getComponentSpaceLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedSpaceLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"OnSpace\") {\n return null;\n }\n\n const boardId = location.boardId as BoardIdOfTable<Table>;\n const spaceId = location.spaceId as SpaceIdOfTable<Table, typeof boardId>;\n return {\n componentId,\n boardId,\n board: getBoard(table, boardId),\n spaceId,\n space: getSpace(table, boardId, spaceId),\n location,\n } as ResolvedSpaceLocation<Table, ComponentId>;\n}\n\nexport function getComponentContainerLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedContainerLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InContainer\") {\n return null;\n }\n\n const boardId = location.boardId as BoardIdOfTable<Table>;\n const containerId = location.containerId as BoardContainerIdOfTable<\n Table,\n typeof boardId\n >;\n return {\n componentId,\n boardId,\n board: getBoard(table, boardId),\n containerId,\n container: getContainer(table, boardId, containerId),\n location,\n } as ResolvedContainerLocation<Table, ComponentId>;\n}\n\nexport function getComponentEdgeLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedEdgeLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"OnEdge\") {\n return null;\n }\n\n const boardId = location.boardId as TiledBoardIdOfTable<Table>;\n const edgeId = location.edgeId as TiledEdgeIdOfTable<Table, typeof boardId>;\n return {\n componentId,\n boardId,\n board: getTiledBoard(table, boardId),\n edgeId,\n edge: getEdge(table, boardId, edgeId),\n location,\n } as ResolvedEdgeLocation<Table, ComponentId>;\n}\n\nexport function getComponentVertexLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedVertexLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"OnVertex\") {\n return null;\n }\n\n const boardId = location.boardId as TiledBoardIdOfTable<Table>;\n const vertexId = location.vertexId as TiledVertexIdOfTable<\n Table,\n typeof boardId\n >;\n return {\n componentId,\n boardId,\n board: getTiledBoard(table, boardId),\n vertexId,\n vertex: getVertex(table, boardId, vertexId),\n location,\n } as ResolvedVertexLocation<Table, ComponentId>;\n}\n\nexport function getComponentSlotLocation<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n componentId: ComponentId,\n): ResolvedSlotLocation<Table, ComponentId> | null {\n const location = getComponentLocation(table, componentId);\n if (location?.type !== \"InSlot\") {\n return null;\n }\n\n return {\n componentId,\n host: location.host,\n slotId: location.slotId,\n location,\n } as ResolvedSlotLocation<Table, ComponentId>;\n}\n\nexport function getBoard<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n>(table: Table, boardId: BoardId): Table[\"boards\"][\"byId\"][BoardId] {\n return table.boards.byId[boardId] as Table[\"boards\"][\"byId\"][BoardId];\n}\n\nexport function getHexBoard<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n): Extract<Table[\"boards\"][\"byId\"][BoardId], { layout: \"hex\" }> {\n return getBoard(table, boardId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >;\n}\n\nexport function getTiledBoard<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n): Extract<Table[\"boards\"][\"byId\"][BoardId], { layout: \"hex\" | \"square\" }> {\n return getBoard(table, boardId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" | \"square\" }\n >;\n}\n\nexport function getSquareBoard<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n): Extract<Table[\"boards\"][\"byId\"][BoardId], { layout: \"square\" }> {\n return getBoard(table, boardId) as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >;\n}\n\nexport function getSpace<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): Table[\"boards\"][\"byId\"][BoardId][\"spaces\"][SpaceId] {\n return getBoard(table, boardId).spaces[\n spaceId\n ] as Table[\"boards\"][\"byId\"][BoardId][\"spaces\"][SpaceId];\n}\n\nexport function getHexSpace<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends HexSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n>[\"spaces\"][SpaceId] {\n return getHexBoard(table, boardId).spaces[spaceId] as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >[\"spaces\"][SpaceId];\n}\n\nexport function getSquareSpace<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SquareSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n>[\"spaces\"][SpaceId] {\n return getSquareBoard(table, boardId).spaces[spaceId] as Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >[\"spaces\"][SpaceId];\n}\n\nexport function getContainer<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n containerId: ContainerId,\n): Table[\"boards\"][\"byId\"][BoardId][\"containers\"][ContainerId] {\n return getBoard(table, boardId).containers[\n containerId\n ] as Table[\"boards\"][\"byId\"][BoardId][\"containers\"][ContainerId];\n}\n\nexport function assertCardAllowedInContainer<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n containerId: ContainerId,\n componentId: string,\n): void {\n const card = table.cards[componentId];\n if (!card) {\n return;\n }\n\n const allowedCardSetIds =\n getContainer(table, boardId, containerId).allowedCardSetIds ?? [];\n if (\n allowedCardSetIds.length > 0 &&\n !allowedCardSetIds.includes(card.cardSetId)\n ) {\n throw new Error(\n `Card '${componentId}' from card set '${card.cardSetId}' cannot enter container '${containerId}' on board '${boardId}'.`,\n );\n }\n}\n\nexport function getEdge<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n edgeId: EdgeId,\n): TiledEdgeStateOfTable<Table, BoardId, EdgeId> {\n const edge = getTiledBoard(table, boardId).edges.find(\n (candidate) => candidate.id === edgeId,\n );\n if (!edge) {\n throw new Error(`Unknown edge '${edgeId}' on board '${boardId}'.`);\n }\n return edge as TiledEdgeStateOfTable<Table, BoardId, EdgeId>;\n}\n\nexport function getVertex<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n vertexId: VertexId,\n): TiledVertexStateOfTable<Table, BoardId, VertexId> {\n const vertex = getTiledBoard(table, boardId).vertices.find(\n (candidate) => candidate.id === vertexId,\n );\n if (!vertex) {\n throw new Error(`Unknown vertex '${vertexId}' on board '${boardId}'.`);\n }\n return vertex as TiledVertexStateOfTable<Table, BoardId, VertexId>;\n}\n\nexport function getHexSpaceAt<\n Table extends RuntimeTableRecord,\n BoardId extends HexBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n q: number,\n r: number,\n):\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >[\"spaces\"][HexSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined {\n return Object.values(getHexBoard(table, boardId).spaces).find(\n (space) => space.q === q && space.r === r,\n ) as\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"hex\" }\n >[\"spaces\"][HexSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined;\n}\n\nexport function getSquareSpaceAt<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n row: number,\n col: number,\n):\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >[\"spaces\"][SquareSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined {\n return Object.values(getSquareBoard(table, boardId).spaces).find(\n (space) => space.row === row && space.col === col,\n ) as\n | Extract<\n Table[\"boards\"][\"byId\"][BoardId],\n { layout: \"square\" }\n >[\"spaces\"][SquareSpaceIdOfTable<NoInfer<Table>, BoardId>]\n | undefined;\n}\n\nexport function getSpaceEdges<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceIdOfTable<NoInfer<Table>, BoardId>,\n): TiledEdgeIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .edges.filter((edge) => edge.spaceIds.includes(spaceId))\n .map((edge) => edge.id as TiledEdgeIdOfTable<Table, BoardId>);\n}\n\nexport function getSpaceVertices<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceIdOfTable<NoInfer<Table>, BoardId>,\n): TiledVertexIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .vertices.filter((vertex) => vertex.spaceIds.includes(spaceId))\n .map((vertex) => vertex.id as TiledVertexIdOfTable<Table, BoardId>);\n}\n\nexport function getIncidentEdges<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n vertexId: VertexId,\n): TiledEdgeIdOfTable<Table, BoardId>[] {\n const tiledBoard = getTiledBoard(table, boardId);\n const vertex = tiledBoard.vertices.find(\n (candidate) => candidate.id === vertexId,\n );\n if (!vertex) {\n throw new Error(`Unknown vertex '${vertexId}' on board '${boardId}'.`);\n }\n const vertexSpaceIds = new Set(vertex.spaceIds);\n return tiledBoard.edges\n .filter((edge) =>\n edge.spaceIds.every((spaceId) => vertexSpaceIds.has(spaceId)),\n )\n .map((edge) => edge.id as TiledEdgeIdOfTable<Table, BoardId>);\n}\n\nexport function getIncidentVertices<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n edgeId: EdgeId,\n): TiledVertexIdOfTable<Table, BoardId>[] {\n const tiledBoard = getTiledBoard(table, boardId);\n const edge = tiledBoard.edges.find((candidate) => candidate.id === edgeId);\n if (!edge) {\n throw new Error(`Unknown edge '${edgeId}' on board '${boardId}'.`);\n }\n const edgeSpaceIds = new Set(edge.spaceIds);\n return tiledBoard.vertices\n .filter((vertex) =>\n Array.from(edgeSpaceIds).every((spaceId) =>\n vertex.spaceIds.includes(spaceId),\n ),\n )\n .map((vertex) => vertex.id as TiledVertexIdOfTable<Table, BoardId>);\n}\n\nexport function getRelatedSpaces<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n TypeId extends RelationTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n relationTypeId: TypeId,\n): SpaceId[] {\n const board = getBoard(table, boardId);\n const related = new Set<SpaceId>();\n\n for (const relation of board.relations) {\n if (relation.typeId !== relationTypeId) {\n continue;\n }\n if (relation.fromSpaceId === spaceId) {\n related.add(relation.toSpaceId as SpaceId);\n continue;\n }\n if (!relation.directed && relation.toSpaceId === spaceId) {\n related.add(relation.fromSpaceId as SpaceId);\n }\n }\n\n return [...related];\n}\n\nexport function getAdjacentSpaces<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(table: Table, boardId: BoardId, spaceId: SpaceId): SpaceId[] {\n return getRelatedSpaces(\n table,\n boardId,\n spaceId,\n \"adjacent\" as RelationTypeIdOfTable<NoInfer<Table>, BoardId>,\n );\n}\n\nexport function getSpaceDistance<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n): number {\n if (fromSpaceId === toSpaceId) {\n return 0;\n }\n\n const visited = new Set<string>([fromSpaceId]);\n let frontier: string[] = [fromSpaceId];\n let distance = 0;\n\n while (frontier.length > 0) {\n distance += 1;\n const nextFrontier: string[] = [];\n\n for (const currentSpaceId of frontier) {\n for (const neighborId of getAdjacentSpaces(\n table,\n boardId,\n currentSpaceId as SpaceId,\n )) {\n if (neighborId === toSpaceId) {\n return distance;\n }\n if (!visited.has(neighborId)) {\n visited.add(neighborId);\n nextFrontier.push(neighborId);\n }\n }\n }\n\n frontier = nextFrontier;\n }\n\n return Number.POSITIVE_INFINITY;\n}\n\nexport function getSquareNeighbors<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SquareSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n options: { mode?: \"orthogonal\" | \"diagonal\" | \"all\" } = {},\n): SquareSpaceIdOfTable<Table, BoardId>[] {\n const board = getSquareBoard(table, boardId);\n const space = getSquareSpace(table, boardId, spaceId);\n const offsets: ReadonlyArray<readonly [number, number]> =\n options.mode === \"diagonal\"\n ? [\n [-1, -1],\n [-1, 1],\n [1, -1],\n [1, 1],\n ]\n : options.mode === \"all\"\n ? [\n [-1, 0],\n [0, 1],\n [1, 0],\n [0, -1],\n [-1, -1],\n [-1, 1],\n [1, -1],\n [1, 1],\n ]\n : [\n [-1, 0],\n [0, 1],\n [1, 0],\n [0, -1],\n ];\n\n return offsets\n .map(([rowOffset, colOffset]) =>\n Object.values(board.spaces).find(\n (candidate) =>\n candidate.row === space.row + rowOffset &&\n candidate.col === space.col + colOffset,\n ),\n )\n .filter((candidate): candidate is typeof space => candidate !== undefined)\n .map((candidate) => candidate.id as SquareSpaceIdOfTable<Table, BoardId>);\n}\n\nexport function getSquareDistance<\n Table extends RuntimeTableRecord,\n BoardId extends SquareBoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SquareSpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n options: { metric?: \"manhattan\" | \"chebyshev\" } = {},\n): number {\n const from = getSquareSpace(table, boardId, fromSpaceId);\n const to = getSquareSpace(table, boardId, toSpaceId);\n const rowDistance = Math.abs(from.row - to.row);\n const colDistance = Math.abs(from.col - to.col);\n\n return options.metric === \"chebyshev\"\n ? Math.max(rowDistance, colDistance)\n : rowDistance + colDistance;\n}\n\nexport function getBoardsByTypeId<\n Table extends RuntimeTableRecord,\n TypeId extends BoardTypeIdOfTable<NoInfer<Table>>,\n>(table: Table, typeId: TypeId): BoardIdOfTable<Table>[] {\n return Object.entries(table.boards.byId)\n .filter(([, board]) => board.typeId === typeId)\n .map(([boardId]) => boardId as BoardIdOfTable<Table>);\n}\n\nexport function getSpacesByTypeId<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n TypeId extends SpaceTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n typeId: TypeId,\n): SpaceIdOfTable<Table, BoardId>[] {\n return Object.entries(getBoard(table, boardId).spaces)\n .filter(([, space]) => space.typeId === typeId)\n .map(([spaceId]) => spaceId as SpaceIdOfTable<Table, BoardId>);\n}\n\nexport function getEdgesByTypeId<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n TypeId extends TiledEdgeTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n typeId: TypeId,\n): TiledEdgeIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .edges.filter((edge) => edge.typeId === typeId)\n .map((edge) => edge.id as TiledEdgeIdOfTable<Table, BoardId>);\n}\n\nexport function getVerticesByTypeId<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n TypeId extends TiledVertexTypeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n typeId: TypeId,\n): TiledVertexIdOfTable<Table, BoardId>[] {\n return getTiledBoard(table, boardId)\n .vertices.filter((vertex) => vertex.typeId === typeId)\n .map((vertex) => vertex.id as TiledVertexIdOfTable<Table, BoardId>);\n}\n\nexport function getComponentsOnSpace<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n spaceId: SpaceId,\n): ComponentIdOfTable<Table>[] {\n const zoneId = getSpace(table, boardId, spaceId).zoneId;\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n (location.type === \"OnSpace\" &&\n location.boardId === boardId &&\n location.spaceId === spaceId) ||\n (location.type === \"InZone\" &&\n typeof zoneId === \"string\" &&\n zoneId.length > 0 &&\n location.zoneId === zoneId),\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function getComponentsInContainer<\n Table extends RuntimeTableRecord,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n containerId: ContainerId,\n): ComponentIdOfTable<Table>[] {\n const zoneId = getContainer(table, boardId, containerId).zoneId;\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n (location.type === \"InContainer\" &&\n location.boardId === boardId &&\n location.containerId === containerId) ||\n (location.type === \"InZone\" &&\n typeof zoneId === \"string\" &&\n zoneId.length > 0 &&\n location.zoneId === zoneId),\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function getComponentsOnEdge<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(table: Table, boardId: BoardId, edgeId: EdgeId): ComponentIdOfTable<Table>[] {\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnEdge\" &&\n location.boardId === boardId &&\n location.edgeId === edgeId,\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function getComponentsOnVertex<\n Table extends RuntimeTableRecord,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n boardId: BoardId,\n vertexId: VertexId,\n): ComponentIdOfTable<Table>[] {\n return orderedComponentIdsForLocation(\n table,\n (location) =>\n location.type === \"OnVertex\" &&\n location.boardId === boardId &&\n location.vertexId === vertexId,\n ) as ComponentIdOfTable<Table>[];\n}\n\nexport function moveComponentToSpace<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n SpaceId extends SpaceIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n spaceId: SpaceId,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n const position = getComponentsOnSpace(nextTable, boardId, spaceId).length;\n removeComponentFromCurrentLocation(nextTable, componentId);\n nextTable.componentLocations[componentId] = {\n type: \"OnSpace\",\n boardId,\n spaceId,\n position,\n };\n return nextTable;\n}\n\nexport function moveComponentToContainer<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends BoardIdOfTable<NoInfer<Table>>,\n ContainerId extends BoardContainerIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n containerId: ContainerId,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n assertCardAllowedInContainer(nextTable, boardId, containerId, componentId);\n const position = getComponentsInContainer(\n nextTable,\n boardId,\n containerId,\n ).length;\n removeComponentFromCurrentLocation(nextTable, componentId);\n nextTable.componentLocations[componentId] = {\n type: \"InContainer\",\n boardId,\n containerId,\n position,\n };\n return nextTable;\n}\n\nexport function moveComponentToDetached<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n>(table: Table, componentId: ComponentId): Table {\n const nextTable = cloneRuntimeTable(table);\n removeComponentFromCurrentLocation(nextTable, componentId);\n nextTable.componentLocations[componentId] = { type: \"Detached\" };\n return nextTable;\n}\n\nexport function moveComponentToEdge<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n EdgeId extends TiledEdgeIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n edgeId: EdgeId,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n getEdge(nextTable, boardId, edgeId);\n const position = getComponentsOnEdge(nextTable, boardId, edgeId).length;\n removeComponentFromCurrentLocation(nextTable, componentId);\n nextTable.componentLocations[componentId] = {\n type: \"OnEdge\",\n boardId,\n edgeId,\n position,\n };\n return nextTable;\n}\n\nexport function moveComponentToVertex<\n Table extends RuntimeTableRecord,\n ComponentId extends ComponentIdOfTable<Table>,\n BoardId extends TiledBoardIdOfTable<NoInfer<Table>>,\n VertexId extends TiledVertexIdOfTable<NoInfer<Table>, BoardId>,\n>(\n table: Table,\n componentId: ComponentId,\n boardId: BoardId,\n vertexId: VertexId,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n getVertex(nextTable, boardId, vertexId);\n const position = getComponentsOnVertex(nextTable, boardId, vertexId).length;\n removeComponentFromCurrentLocation(nextTable, componentId);\n nextTable.componentLocations[componentId] = {\n type: \"OnVertex\",\n boardId,\n vertexId,\n position,\n };\n return nextTable;\n}\n\nexport function moveCardFromPlayerZoneToSharedZone<\n Table extends RuntimeTableRecord,\n HandId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n DeckId extends SharedZoneIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: HandId;\n toZoneId: DeckId;\n cardId: CompatibleCardIdForHandAndDeck<Table, HandId, DeckId>;\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): Table {\n return moveFromHandToDeck({\n table: options.table,\n playerId: options.playerId,\n handId: options.fromZoneId,\n cardId: options.cardId,\n deckId: options.toZoneId,\n playedBy: options.playedBy,\n position: options.position,\n });\n}\n\n/**\n * Move a named card from a shared zone (supply pile, deck) to a perPlayer zone\n * (e.g. discard, hand, in-play). Use this for the \"gain\" verb — distinct from\n * `dealCardsToPlayerZone`, which draws an unspecified count of top cards from\n * a deck. Owner flips to the receiving player; visibility is recomputed from\n * the destination zone's `handVisibility` mode.\n */\n/**\n * Move the top `count` cards from one perPlayer zone to another for the same\n * player. Companion to {@link dealCardsFromDeckToHand} for the perPlayer →\n * perPlayer case (most importantly, \"draw N from your deck to your hand\"\n * in deck-builders). Visibility is recomputed for the destination; owner is\n * preserved.\n */\nexport function dealCardsBetweenPlayerZones<\n Table extends RuntimeTableRecord,\n FromZoneId extends PlayerZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n count: number;\n}): Table {\n let nextTable = options.table;\n for (let i = 0; i < options.count; i += 1) {\n const sourceCards = ensureArray(\n ppRead(\n nextTable.zones.perPlayer[options.fromZoneId] ??\n nextTable.hands[options.fromZoneId],\n options.playerId as string,\n ) as readonly string[] | undefined,\n );\n const topCardId = sourceCards[0];\n if (topCardId === undefined) {\n break;\n }\n nextTable = moveCardBetweenPlayerZones({\n table: nextTable,\n playerId: options.playerId,\n fromZoneId: options.fromZoneId,\n toZoneId: options.toZoneId,\n cardId: topCardId as CompatibleCardIdForTwoPlayerZones<\n Table,\n FromZoneId,\n ToZoneId\n >,\n });\n }\n return nextTable;\n}\n\nexport function moveCardFromSharedZoneToPlayerZone<\n Table extends RuntimeTableRecord,\n FromZoneId extends SharedZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<Table, ToZoneId, FromZoneId>;\n position?: \"top\" | \"bottom\";\n}): Table {\n const nextTable = cloneRuntimeTable(options.table);\n assertZoneScope(\n nextTable,\n options.fromZoneId as string,\n \"shared\",\n \"moveCardFromSharedZoneToPlayerZone\",\n \"fromZoneId\",\n );\n assertZoneScope(\n nextTable,\n options.toZoneId as string,\n \"perPlayer\",\n \"moveCardFromSharedZoneToPlayerZone\",\n \"toZoneId\",\n );\n\n const sourceCards = ensureArray(\n nextTable.zones.shared[options.fromZoneId] ??\n nextTable.decks[options.fromZoneId],\n );\n if (!sourceCards.includes(options.cardId as string)) {\n throw new Error(\n `Card '${String(options.cardId)}' is not in shared zone '${String(\n options.fromZoneId,\n )}'.`,\n );\n }\n assertCardAllowedInZone(\n nextTable,\n options.toZoneId as string,\n options.cardId as string,\n );\n\n const remainingSource = sourceCards.filter(\n (candidate) => candidate !== options.cardId,\n );\n syncSharedZoneWithDeck(nextTable, options.fromZoneId, remainingSource);\n for (const [index, currentCardId] of remainingSource.entries()) {\n const existing = nextTable.componentLocations[currentCardId];\n if (existing?.type === \"InDeck\") {\n nextTable.componentLocations[currentCardId] = {\n ...existing,\n position: index,\n };\n }\n }\n\n const destinationCards = ensureArray(\n ppRead(\n nextTable.zones.perPlayer[options.toZoneId] ??\n nextTable.hands[options.toZoneId],\n options.playerId as string,\n ) as readonly string[] | undefined,\n );\n const nextDestination =\n options.position === \"top\"\n ? [options.cardId as string, ...destinationCards]\n : [...destinationCards, options.cardId as string];\n syncPlayerZoneWithHand(\n nextTable,\n options.toZoneId,\n options.playerId,\n nextDestination,\n );\n for (const [index, currentCardId] of nextDestination.entries()) {\n nextTable.componentLocations[currentCardId] = {\n type: \"InHand\",\n handId: options.toZoneId as string,\n playerId: options.playerId as string,\n position: index,\n };\n }\n nextTable.ownerOfCard[options.cardId as string] = options.playerId as string;\n nextTable.visibility[options.cardId as string] =\n computeVisibilityForPlayerZone(\n nextTable,\n options.toZoneId as string,\n options.playerId as string,\n );\n\n return nextTable;\n}\n\n/**\n * Move a card between two perPlayer zones owned by the same player. Use this\n * for hand → in-play, in-play → discard, and similar same-player transitions\n * that do not change ownership. Owner is preserved; visibility is recomputed\n * from the destination zone's `handVisibility` mode.\n */\nexport function moveCardBetweenPlayerZones<\n Table extends RuntimeTableRecord,\n FromZoneId extends PlayerZoneIdOfTable<Table>,\n ToZoneId extends PlayerZoneIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n>(options: {\n table: Table;\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForTwoPlayerZones<Table, FromZoneId, ToZoneId>;\n position?: \"top\" | \"bottom\";\n}): Table {\n const nextTable = cloneRuntimeTable(options.table);\n assertZoneScope(\n nextTable,\n options.fromZoneId as string,\n \"perPlayer\",\n \"moveCardBetweenPlayerZones\",\n \"fromZoneId\",\n );\n assertZoneScope(\n nextTable,\n options.toZoneId as string,\n \"perPlayer\",\n \"moveCardBetweenPlayerZones\",\n \"toZoneId\",\n );\n\n const sourceCards = ensureArray(\n ppRead(\n nextTable.zones.perPlayer[options.fromZoneId] ??\n nextTable.hands[options.fromZoneId],\n options.playerId as string,\n ) as readonly string[] | undefined,\n );\n if (!sourceCards.includes(options.cardId as string)) {\n throw new Error(\n `Card '${String(options.cardId)}' is not in zone '${String(\n options.fromZoneId,\n )}' for player '${String(options.playerId)}'.`,\n );\n }\n assertCardAllowedInZone(\n nextTable,\n options.toZoneId as string,\n options.cardId as string,\n );\n\n const remainingSource = sourceCards.filter(\n (candidate) => candidate !== options.cardId,\n );\n syncPlayerZoneWithHand(\n nextTable,\n options.fromZoneId,\n options.playerId,\n remainingSource,\n );\n for (const [index, currentCardId] of remainingSource.entries()) {\n const existing = nextTable.componentLocations[currentCardId];\n if (existing?.type === \"InHand\") {\n nextTable.componentLocations[currentCardId] = {\n ...existing,\n position: index,\n };\n }\n }\n\n const destinationCards = ensureArray(\n ppRead(\n nextTable.zones.perPlayer[options.toZoneId] ??\n nextTable.hands[options.toZoneId],\n options.playerId as string,\n ) as readonly string[] | undefined,\n );\n const nextDestination =\n options.position === \"top\"\n ? [options.cardId as string, ...destinationCards]\n : [...destinationCards, options.cardId as string];\n syncPlayerZoneWithHand(\n nextTable,\n options.toZoneId,\n options.playerId,\n nextDestination,\n );\n for (const [index, currentCardId] of nextDestination.entries()) {\n nextTable.componentLocations[currentCardId] = {\n type: \"InHand\",\n handId: options.toZoneId as string,\n playerId: options.playerId as string,\n position: index,\n };\n }\n nextTable.visibility[options.cardId as string] =\n computeVisibilityForPlayerZone(\n nextTable,\n options.toZoneId as string,\n options.playerId as string,\n );\n\n return nextTable;\n}\n\nexport function moveCardBetweenSharedZones<\n Table extends RuntimeTableRecord,\n FromZoneId extends SharedZoneIdOfTable<Table>,\n ToZoneId extends SharedZoneIdOfTable<Table>,\n>(options: {\n table: Table;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: DeckCardsOfTable<Table, FromZoneId>[number];\n playedBy?: PlayerIdOfTable<Table> | null;\n position?: \"top\" | \"bottom\";\n}): Table {\n const removed = removeFromDeck(\n options.table,\n options.fromZoneId,\n options.cardId,\n );\n return appendToDeck(\n removed,\n options.toZoneId,\n options.cardId as DeckCardsOfTable<Table, ToZoneId>[number],\n options.playedBy ?? null,\n options.position ?? \"bottom\",\n );\n}\n\nexport function removeCardFromSharedZone<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n): Table {\n return removeFromDeck(table, deckId, cardId);\n}\n\nexport function addCardToSharedZone<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n>(\n table: Table,\n deckId: DeckId,\n cardId: DeckCardsOfTable<Table, DeckId>[number],\n playedBy: PlayerIdOfTable<Table> | null = null,\n position: \"top\" | \"bottom\" = \"bottom\",\n): Table {\n return appendToDeck(table, deckId, cardId, playedBy, position);\n}\n\n/**\n * Deterministically draw the top `count` cards from a shared deck and deal\n * them into a player's hand zone. No RNG is consumed — call\n * {@link shuffleSharedZone} (via `fx.shuffleSharedZone`) first if the deck\n * needs randomising.\n */\nexport function dealCardsFromDeckToHand<\n Table extends RuntimeTableRecord,\n DeckId extends DeckIdOfTable<Table>,\n PlayerId extends PlayerIdOfTable<Table>,\n HandId extends HandIdOfTable<Table>,\n>(\n table: Table,\n fromZoneId: DeckId,\n playerId: PlayerId,\n toZoneId: HandId,\n count: number,\n): Table {\n const nextTable = cloneRuntimeTable(table);\n const publicHands = new Set(\n Object.entries(nextTable.handVisibility)\n .filter(([, mode]) => mode === \"all\" || mode === \"public\")\n .map(([handId]) => handId),\n );\n\n for (let index = 0; index < count; index += 1) {\n const nextCard = ensureArray(nextTable.decks[fromZoneId])[0];\n if (!nextCard) {\n break;\n }\n nextTable.decks[fromZoneId] = ensureArray(\n nextTable.decks[fromZoneId],\n ).slice(1) as (typeof nextTable.decks)[DeckId];\n nextTable.zones.shared[fromZoneId] = [\n ...ensureArray(nextTable.decks[fromZoneId]),\n ] as (typeof nextTable.zones.shared)[DeckId];\n const prevHand = ppRead(nextTable.hands[toZoneId], playerId as string) as\n | readonly string[]\n | undefined;\n const nextHand = [...ensureArray(prevHand), nextCard];\n assertCardAllowedInZone(nextTable, toZoneId, nextCard);\n nextTable.hands[toZoneId] = ppWrite(\n nextTable.hands[toZoneId],\n playerId as string,\n nextHand,\n ) as (typeof nextTable.hands)[HandId];\n nextTable.zones.perPlayer[toZoneId] = ppWrite(\n nextTable.zones.perPlayer[toZoneId],\n playerId as string,\n [...nextHand],\n ) as (typeof nextTable.zones.perPlayer)[HandId];\n nextTable.componentLocations[nextCard] = {\n type: \"InHand\",\n handId: toZoneId,\n playerId,\n position: nextHand.length - 1,\n };\n nextTable.ownerOfCard[nextCard] = playerId;\n nextTable.visibility[nextCard] = publicHands.has(toZoneId as string)\n ? {\n faceUp: true,\n }\n : {\n faceUp: false,\n visibleTo: [playerId],\n };\n }\n return nextTable;\n}\n\nexport type { RuntimeTableRecord, TableOfState, CardIdOfState };\n","import type { RuntimeRngState } from \"./model\";\n\n/**\n * Deterministic pseudo-random integer generator for reducer-native games.\n *\n * The public contract is `(rng.seed, rng.cursor) -> value`, with the cursor\n * advanced by one per call. Same `(seed, cursor)` tuple always produces the\n * same output, which is what makes session replay deterministic without\n * having to persist anything beyond the seed and cursor.\n *\n * Internally we hash `(seed, cursor)` through a Murmur3-style 32-bit\n * finalizer rather than computing a linear combination of the cursor. The\n * older `(seed * A + C + cursor) & 0x7fffffff` form was linear in `cursor`,\n * so consecutive samples differed by a fixed step — for a d6 that meant\n * every roll produced a simple `+1` counter through the faces. Mixing\n * `(seed, cursor)` with an avalanche finalizer is still pure and still\n * cheap, but now nearby cursors yield well-distributed outputs.\n *\n * Distribution note: the `% bound` step is biased when `bound` is not a\n * power of two. For gameplay-level bounds (≤ 64) the bias is negligible\n * and we leave it in to keep replay fixtures stable against future bound\n * changes. If a caller ever needs strict uniformity we can add an\n * explicit `nextUniformInt` without touching the existing consumers.\n */\nexport function nextRandomInt(\n bound: number,\n rng: RuntimeRngState,\n): [number, RuntimeRngState] {\n if (bound <= 0) {\n throw new Error(\"Random bound must be positive.\");\n }\n const seed = rng.seed ?? 1;\n const raw = hashSeedCursor(seed, rng.cursor);\n const value = raw % bound;\n return [\n value,\n {\n ...rng,\n cursor: rng.cursor + 1,\n trace: [\n ...rng.trace,\n `cursor=${rng.cursor};bound=${bound};value=${value}`,\n ],\n },\n ];\n}\n\n/**\n * Mix `(seed, cursor)` into a uniformly-distributed uint32 using a\n * Murmur3-style finalizer. The seed is split into its low and high 32-bit\n * halves so large 53-bit JS-integer seeds (including the negative seeds\n * the backend derives from its own 64-bit generator) don't collapse onto\n * the same bucket after a `| 0` truncation.\n */\nfunction hashSeedCursor(seed: number, cursor: number): number {\n const seedLo = seed | 0;\n // `Math.floor(seed / 2^32) | 0` keeps the upper bits of large seeds.\n // For small seeds this is 0 (or -1 for negatives), so the stir below is\n // still dominated by `seedLo` + `cursor` as you'd expect.\n const seedHi = Math.floor(seed / 0x1_0000_0000) | 0;\n let x = Math.imul(seedLo, 0x9e3779b1);\n x = (x + Math.imul(seedHi, 0x85ebca77)) | 0;\n x = (x + Math.imul(cursor | 0, 0xc2b2ae3d)) | 0;\n // Murmur3 32-bit finalizer.\n x = Math.imul(x ^ (x >>> 16), 0x85ebca6b);\n x = Math.imul(x ^ (x >>> 13), 0xc2b2ae35);\n x = x ^ (x >>> 16);\n return x >>> 0;\n}\n","import type {\n CollectorState,\n InputCollector,\n RandomHelpers,\n RuntimeRngState,\n SchemaLike,\n} from \"../../model\";\nimport { nextRandomInt } from \"../../rng\";\n\nexport type RngConsumption = {\n operation: string;\n traceEntry: string;\n};\n\nexport type MutableRandomHelpers = {\n random: RandomHelpers;\n currentRng: () => RuntimeRngState;\n};\n\nexport function sampleDieValue(\n sides: number,\n rng: RuntimeRngState,\n): {\n value: number;\n nextRng: RuntimeRngState;\n consumption: RngConsumption;\n} {\n const [offset, nextRng] = nextRandomInt(sides, rng);\n return {\n value: offset + 1,\n nextRng,\n consumption: {\n operation: \"rollDie\",\n traceEntry: nextRng.trace[nextRng.trace.length - 1] ?? \"\",\n },\n };\n}\n\nexport function shuffleWithRng<T>(\n values: readonly T[],\n rng: RuntimeRngState,\n operation:\n | \"shuffleSharedZone\"\n | \"shufflePlayerZone\"\n | \"randomSubset\" = \"shuffleSharedZone\",\n): {\n orderedValues: T[];\n nextRng: RuntimeRngState;\n consumptions: RngConsumption[];\n} {\n const orderedValues = [...values];\n let nextRng = rng;\n const consumptions: RngConsumption[] = [];\n for (\n let lastIndex = orderedValues.length - 1;\n lastIndex > 0;\n lastIndex -= 1\n ) {\n const [swapIndex, updatedRng] = nextRandomInt(lastIndex + 1, nextRng);\n consumptions.push({\n operation,\n traceEntry: updatedRng.trace[updatedRng.trace.length - 1] ?? \"\",\n });\n nextRng = updatedRng;\n const current = orderedValues[lastIndex];\n const swap = orderedValues[swapIndex];\n if (current === undefined || swap === undefined) {\n throw new Error(\n `shuffleWithRng: invalid index (lastIndex=${lastIndex}, swapIndex=${swapIndex}, length=${orderedValues.length})`,\n );\n }\n orderedValues[lastIndex] = swap;\n orderedValues[swapIndex] = current;\n }\n return { orderedValues, nextRng, consumptions };\n}\n\nexport function subsetWithRng<T>(\n values: readonly T[],\n count: number,\n rng: RuntimeRngState,\n): {\n values: readonly T[];\n nextRng: RuntimeRngState;\n consumptions: RngConsumption[];\n} {\n if (!Number.isInteger(count) || count < 0) {\n throw new Error(\"random.subset count must be a non-negative integer.\");\n }\n if (count > values.length) {\n throw new Error(\n `random.subset count ${count} exceeds source length ${values.length}.`,\n );\n }\n const shuffled = shuffleWithRng(values, rng, \"randomSubset\");\n return {\n values: shuffled.orderedValues.slice(0, count),\n nextRng: shuffled.nextRng,\n consumptions: shuffled.consumptions,\n };\n}\n\nexport function createMutableRandomHelpers(\n rng: RuntimeRngState,\n): MutableRandomHelpers {\n let current = rng;\n return {\n random: {\n subset(options) {\n const sampled = subsetWithRng(options.from, options.count, current);\n current = sampled.nextRng;\n return sampled.values;\n },\n },\n currentRng: () => current,\n };\n}\n\nexport function sampleRngCollectorValue(\n collector: InputCollector<SchemaLike<unknown>, CollectorState, \"rng\">,\n rng: RuntimeRngState,\n): { value: unknown; nextRng: RuntimeRngState } {\n const meta = collector.meta;\n switch (meta.rng) {\n case \"d6\": {\n const count = meta.count > 0 ? meta.count : 1;\n const values: number[] = [];\n let nextRng = rng;\n for (let i = 0; i < count; i += 1) {\n const sampled = sampleDieValue(6, nextRng);\n values.push(sampled.value);\n nextRng = sampled.nextRng;\n }\n return { value: { values }, nextRng };\n }\n case \"coin\": {\n const [offset, nextRng] = nextRandomInt(2, rng);\n return {\n value: { value: offset === 0 ? \"heads\" : \"tails\" },\n nextRng,\n };\n }\n default: {\n const _exhaustive: never = meta;\n throw new Error(\n `Unknown rngInput kind '${String(_exhaustive)}'. Register a sampler in trusted rng-sampler.`,\n );\n }\n }\n}\n","import type { DispatchTraceEntry, TrustedRuntimeInput } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport {\n cloneRuntimeTable,\n ensureArray,\n shufflePlayerZoneCards,\n} from \"../../table-ops\";\nimport {\n sampleDieValue,\n shuffleWithRng,\n type RngConsumption,\n} from \"./rng-sampler\";\nimport type {\n TrustedInput,\n TrustedPlayerId,\n TrustedState,\n} from \"./runtime-scope\";\n\nfunction toRngTrace<\n State,\n PlayerId extends string,\n ReducerInput extends TrustedRuntimeInput<PlayerId>,\n>(\n consumptions: readonly RngConsumption[],\n): DispatchTraceEntry<State, PlayerId, ReducerInput>[] {\n return consumptions.map((consumption) => ({\n type: \"rngConsumption\" as const,\n operation: consumption.operation,\n traceEntry: consumption.traceEntry,\n }));\n}\n\nexport function createEngineInstructionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>() {\n type State = TrustedState<Contract>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n function resolveRollDie(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.rollDie\" }\n >,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n const die = state.table.dice[instruction.dieId];\n if (!die) {\n throw new Error(`Cannot roll unknown die '${instruction.dieId}'.`);\n }\n if (!Number.isInteger(die.sides) || die.sides <= 0) {\n throw new Error(\n `Cannot roll die '${instruction.dieId}' with invalid sides '${die.sides}'.`,\n );\n }\n const nextTable = cloneRuntimeTable(state.table);\n const sampled = sampleDieValue(die.sides, state.runtime.rng);\n nextTable.dice[instruction.dieId] = {\n ...die,\n value: sampled.value,\n };\n const queuedInputs: ReducerInput[] = instruction.continuation\n ? [\n {\n kind: \"continuation\",\n continuationId: instruction.continuation.id,\n resumeData: instruction.continuation.data,\n source: \"effect\",\n effectKind: \"rollDie\",\n response: {\n dieId: instruction.dieId,\n value: sampled.value,\n },\n } as unknown as ReducerInput,\n ]\n : [];\n return {\n state: {\n ...state,\n table: nextTable,\n runtime: {\n ...state.runtime,\n rng: sampled.nextRng,\n },\n },\n queuedInputs,\n queuedInstructions: [],\n trace: toRngTrace<State, PlayerId, ReducerInput>([sampled.consumption]),\n };\n }\n\n function resolveShuffleSharedZone(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.shuffleSharedZone\" }\n >,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n const nextTable = cloneRuntimeTable(state.table);\n const deckCards = [...ensureArray(nextTable.decks[instruction.zoneId])];\n const shuffled = shuffleWithRng(deckCards, state.runtime.rng);\n const orderedCardIds = [...shuffled.orderedValues];\n nextTable.decks[instruction.zoneId] = shuffled.orderedValues;\n nextTable.zones.shared[instruction.zoneId] = [...shuffled.orderedValues];\n for (const [index, cardId] of shuffled.orderedValues.entries()) {\n const currentLocation = nextTable.componentLocations[cardId];\n nextTable.componentLocations[cardId] =\n currentLocation?.type === \"InDeck\" || currentLocation?.type === \"InZone\"\n ? {\n ...currentLocation,\n type: \"InDeck\",\n deckId: instruction.zoneId,\n playedBy: currentLocation.playedBy ?? null,\n position: index,\n }\n : {\n type: \"InDeck\",\n deckId: instruction.zoneId,\n playedBy: null,\n position: index,\n };\n }\n const queuedInputs: ReducerInput[] = instruction.continuation\n ? [\n {\n kind: \"continuation\",\n continuationId: instruction.continuation.id,\n resumeData: instruction.continuation.data,\n source: \"effect\",\n effectKind: \"shuffleSharedZone\",\n response: {\n zoneId: instruction.zoneId,\n orderedCardIds,\n },\n } as unknown as ReducerInput,\n ]\n : [];\n return {\n state: {\n ...state,\n table: nextTable,\n runtime: {\n ...state.runtime,\n rng: shuffled.nextRng,\n },\n },\n queuedInputs,\n queuedInstructions: [],\n trace: toRngTrace<State, PlayerId, ReducerInput>(shuffled.consumptions),\n };\n }\n\n function resolveShufflePlayerZone(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"engine.shufflePlayerZone\" }\n >,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n const nextTable = cloneRuntimeTable(state.table);\n const zoneCards = shufflePlayerZoneCards(\n nextTable,\n instruction.zoneId,\n instruction.playerId,\n );\n const shuffled = shuffleWithRng(\n zoneCards,\n state.runtime.rng,\n \"shufflePlayerZone\",\n );\n const orderedCardIds = [...shuffled.orderedValues];\n shufflePlayerZoneCards(\n nextTable,\n instruction.zoneId,\n instruction.playerId,\n orderedCardIds,\n );\n for (const [index, cardId] of orderedCardIds.entries()) {\n const currentLocation = nextTable.componentLocations[cardId];\n nextTable.componentLocations[cardId] =\n currentLocation?.type === \"InHand\"\n ? {\n ...currentLocation,\n type: \"InHand\",\n handId: instruction.zoneId,\n playerId: instruction.playerId,\n position: index,\n }\n : {\n type: \"InHand\",\n handId: instruction.zoneId,\n playerId: instruction.playerId,\n position: index,\n };\n }\n const queuedInputs: ReducerInput[] = instruction.continuation\n ? [\n {\n kind: \"continuation\",\n continuationId: instruction.continuation.id,\n resumeData: instruction.continuation.data,\n source: \"effect\",\n effectKind: \"shufflePlayerZone\",\n response: {\n zoneId: instruction.zoneId,\n playerId: instruction.playerId,\n orderedCardIds,\n },\n } as unknown as ReducerInput,\n ]\n : [];\n return {\n state: {\n ...state,\n table: nextTable,\n runtime: {\n ...state.runtime,\n rng: shuffled.nextRng,\n },\n },\n queuedInputs,\n queuedInstructions: [],\n trace: toRngTrace<State, PlayerId, ReducerInput>(shuffled.consumptions),\n };\n }\n\n return {\n resolveRollDie,\n resolveShuffleSharedZone,\n resolveShufflePlayerZone,\n };\n}\n","import type { DispatchTraceEntry } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type { createLifecycleRunner } from \"./lifecycle-runner\";\nimport type {\n TrustedInput,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype LifecycleRunnerFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createLifecycleRunner<Contract, Definitions, Views>>;\n\nexport function createFlowInstructionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(lifecycle: LifecycleRunnerFor<Contract, Definitions, Views>) {\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n function resolveTransition(\n state: State,\n instruction: Extract<\n RuntimeInstructionForState<State>,\n { kind: \"flow.transition\" }\n >,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n const initialized = lifecycle.initializePhaseResult(\n {\n ...state,\n flow: {\n ...state.flow,\n currentPhase:\n instruction.to as unknown as State[\"flow\"][\"currentPhase\"],\n },\n runtime: {\n ...state.runtime,\n lastTransition: {\n from: state.flow.currentPhase,\n to: instruction.to,\n },\n } as State[\"runtime\"],\n },\n instruction.to as PhaseName,\n );\n return {\n state: initialized.state,\n queuedInputs: [],\n queuedInstructions: initialized.instructions,\n trace: [],\n };\n }\n\n return {\n resolveTransition,\n };\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\n\nexport const SIMULTANEOUS_SUBMIT_INTERACTION_ID = \"submit\";\n\ntype ErasedPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<\n TrustedRuntimeScope<Contract, Definitions, Views>[\"phaseByName\"]\n>;\n\nexport function isSimultaneousPhase<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(phase: ErasedPhase<Contract, Definitions, Views>): boolean {\n return phase.kind === \"simultaneousPlayer\";\n}\n\nexport function simultaneousSubmitInteraction<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n phase: ErasedPhase<Contract, Definitions, Views>,\n):\n | AnyInteractionSpec<TrustedDomainState<Contract>, TrustedManifest<Contract>>\n | undefined {\n return (phase as { submit?: unknown }).submit as\n | AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >\n | undefined;\n}\n\nfunction resolvePromptToArray<PlayerId extends string>(\n value: unknown,\n): PlayerId[] {\n if (value === undefined || value === null) return [];\n if (Array.isArray(value)) return value as PlayerId[];\n if (typeof value === \"string\") return [value as PlayerId];\n return [];\n}\n\nexport function resolveSimultaneousActors<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n state: TrustedState<Contract>,\n phase: ErasedPhase<Contract, Definitions, Views>,\n projection?: ProjectionContext<\n TrustedDomainState<Contract>,\n TrustedState<Contract>\n >,\n): TrustedPlayerId<Contract>[] {\n type PlayerId = TrustedPlayerId<Contract>;\n const selector =\n (phase as { actors?: unknown; actor?: unknown }).actors ??\n (phase as { actor?: unknown }).actor;\n if (typeof selector === \"function\") {\n const selected = selector(\n scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n );\n const resolved = resolvePromptToArray<PlayerId>(selected);\n if (resolved.length > 0) {\n return resolved;\n }\n }\n const active = state.flow.activePlayers as PlayerId[];\n if (active.length > 0) {\n return [...active];\n }\n return [...(state.table.playerOrder as PlayerId[])];\n}\n","import type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n BoardTypeIdOfTable,\n CardIdOfTable,\n ComponentDataOfTable,\n ComponentIdOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n HexBoardIdOfTable,\n HexSpaceIdOfTable,\n PlayerIdOfTable,\n RelationTypeIdOfTable,\n RuntimeTableRecord,\n SpaceIdOfTable,\n SpaceTypeIdOfTable,\n SquareBoardIdOfTable,\n SquareSpaceIdOfTable,\n TableQueries,\n TableQueriesOfState,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledEdgeTypeIdOfTable,\n TiledVertexIdOfTable,\n TiledVertexTypeIdOfTable,\n} from \"./model\";\nimport {\n getAdjacentSpaces,\n getAllPlayerZoneCards,\n getAllSharedZoneCards,\n getBoard,\n getBoardsByTypeId,\n getCard,\n getCardsById,\n getCardOwner,\n getCardVisibility,\n getSlotOccupants,\n getSlotOccupantsByHost,\n getComponentContainerLocation,\n getComponentDeckLocation,\n getComponentEdgeLocation,\n getComponentHandLocation,\n getComponentLocation,\n getComponentSlotLocation,\n getComponentSpaceLocation,\n getComponentVertexLocation,\n getComponentZoneLocation,\n getComponentsInContainer,\n getComponentsOnEdge,\n getComponentsOnSpace,\n getComponentsOnVertex,\n getContainer,\n getEdge,\n getEdgesByTypeId,\n getHexBoard,\n getHexSpace,\n getHexSpaceAt,\n getIncidentEdges,\n getIncidentVertices,\n canAffordResources,\n getMissingResources,\n getNextPlayerInOrder,\n getPlayerOrder,\n getPlayerResourceAmount,\n getPlayerResourceTotal,\n getPlayerResources,\n getPlayerZoneCardCollection,\n getPlayerZoneCards,\n getRelatedSpaces,\n getSharedZoneCardCollection,\n getSharedZoneCards,\n getSpace,\n getSpaceDistance,\n getSpaceEdges,\n getSpacesByTypeId,\n getSpaceVertices,\n getSquareBoard,\n getSquareDistance,\n getSquareNeighbors,\n getSquareSpace,\n getSquareSpaceAt,\n getTiledBoard,\n getVertex,\n getVerticesByTypeId,\n} from \"./table-ops\";\n\nexport function createTableQueries<Table extends RuntimeTableRecord>(\n table: Table,\n): TableQueries<Table> {\n return {\n board: {\n get: <BoardId extends BoardIdOfTable<Table>>(boardId: BoardId) =>\n getBoard(table, boardId),\n hex: <BoardId extends HexBoardIdOfTable<Table>>(boardId: BoardId) =>\n getHexBoard(table, boardId),\n square: <BoardId extends SquareBoardIdOfTable<Table>>(boardId: BoardId) =>\n getSquareBoard(table, boardId),\n tiled: <BoardId extends TiledBoardIdOfTable<Table>>(boardId: BoardId) =>\n getTiledBoard(table, boardId),\n space: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getSpace(table, boardId, spaceId),\n hexSpace: <\n BoardId extends HexBoardIdOfTable<Table>,\n SpaceId extends HexSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getHexSpace(table, boardId, spaceId),\n squareSpace: <\n BoardId extends SquareBoardIdOfTable<Table>,\n SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getSquareSpace(table, boardId, spaceId),\n container: <\n BoardId extends BoardIdOfTable<Table>,\n ContainerId extends BoardContainerIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n containerId: ContainerId,\n ) => getContainer(table, boardId, containerId),\n edge: <\n BoardId extends TiledBoardIdOfTable<Table>,\n EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n edgeId: EdgeId,\n ) => getEdge(table, boardId, edgeId),\n vertex: <\n BoardId extends TiledBoardIdOfTable<Table>,\n VertexId extends TiledVertexIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n vertexId: VertexId,\n ) => getVertex(table, boardId, vertexId),\n byType: <TypeId extends BoardTypeIdOfTable<Table>>(typeId: TypeId) =>\n getBoardsByTypeId(table, typeId),\n spacesByType: <\n BoardId extends BoardIdOfTable<Table>,\n TypeId extends SpaceTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n typeId: TypeId,\n ) => getSpacesByTypeId(table, boardId, typeId),\n edgesByType: <\n BoardId extends TiledBoardIdOfTable<Table>,\n TypeId extends TiledEdgeTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n typeId: TypeId,\n ) => getEdgesByTypeId(table, boardId, typeId),\n verticesByType: <\n BoardId extends TiledBoardIdOfTable<Table>,\n TypeId extends TiledVertexTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n typeId: TypeId,\n ) => getVerticesByTypeId(table, boardId, typeId),\n adjacentSpaces: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getAdjacentSpaces(table, boardId, spaceId),\n relatedSpaces: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n TypeId extends RelationTypeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n relationTypeId: TypeId,\n ) => getRelatedSpaces(table, boardId, spaceId, relationTypeId),\n incidentEdges: <\n BoardId extends TiledBoardIdOfTable<Table>,\n VertexId extends TiledVertexIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n vertexId: VertexId,\n ) => getIncidentEdges(table, boardId, vertexId),\n incidentVertices: <\n BoardId extends TiledBoardIdOfTable<Table>,\n EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n edgeId: EdgeId,\n ) => getIncidentVertices(table, boardId, edgeId),\n spaceEdges: <BoardId extends TiledBoardIdOfTable<Table>>(\n boardId: BoardId,\n spaceId: SpaceIdOfTable<Table, BoardId>,\n ) => getSpaceEdges(table, boardId, spaceId),\n spaceVertices: <BoardId extends TiledBoardIdOfTable<Table>>(\n boardId: BoardId,\n spaceId: SpaceIdOfTable<Table, BoardId>,\n ) => getSpaceVertices(table, boardId, spaceId),\n spaceDistance: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n ) => getSpaceDistance(table, boardId, fromSpaceId, toSpaceId),\n hexSpaceAt: <BoardId extends HexBoardIdOfTable<Table>>(\n boardId: BoardId,\n q: number,\n r: number,\n ) => getHexSpaceAt(table, boardId, q, r),\n squareSpaceAt: <BoardId extends SquareBoardIdOfTable<Table>>(\n boardId: BoardId,\n row: number,\n col: number,\n ) => getSquareSpaceAt(table, boardId, row, col),\n squareNeighbors: <\n BoardId extends SquareBoardIdOfTable<Table>,\n SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n options?: { mode?: \"orthogonal\" | \"diagonal\" | \"all\" },\n ) => getSquareNeighbors(table, boardId, spaceId, options),\n squareDistance: <\n BoardId extends SquareBoardIdOfTable<Table>,\n SpaceId extends SquareSpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n fromSpaceId: SpaceId,\n toSpaceId: SpaceId,\n options?: { metric?: \"manhattan\" | \"chebyshev\" },\n ) => getSquareDistance(table, boardId, fromSpaceId, toSpaceId, options),\n spaceOccupants: <\n BoardId extends BoardIdOfTable<Table>,\n SpaceId extends SpaceIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n spaceId: SpaceId,\n ) => getComponentsOnSpace(table, boardId, spaceId),\n containerOccupants: <\n BoardId extends BoardIdOfTable<Table>,\n ContainerId extends BoardContainerIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n containerId: ContainerId,\n ) => getComponentsInContainer(table, boardId, containerId),\n edgeOccupants: <\n BoardId extends TiledBoardIdOfTable<Table>,\n EdgeId extends TiledEdgeIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n edgeId: EdgeId,\n ) => getComponentsOnEdge(table, boardId, edgeId),\n vertexOccupants: <\n BoardId extends TiledBoardIdOfTable<Table>,\n VertexId extends TiledVertexIdOfTable<Table, BoardId>,\n >(\n boardId: BoardId,\n vertexId: VertexId,\n ) => getComponentsOnVertex(table, boardId, vertexId),\n },\n zone: {\n sharedCards: <ZoneId extends DeckIdOfTable<Table>>(zoneId: ZoneId) =>\n getSharedZoneCards(table, zoneId),\n sharedCardCollection: <ZoneId extends DeckIdOfTable<Table>>(\n zoneId: ZoneId,\n ) => getSharedZoneCardCollection(table, zoneId),\n allSharedCards: () => getAllSharedZoneCards(table),\n playerCards: <\n PlayerId extends PlayerIdOfTable<Table>,\n ZoneId extends HandIdOfTable<Table>,\n >(\n playerId: PlayerId,\n zoneId: ZoneId,\n ) => getPlayerZoneCards(table, playerId, zoneId),\n playerCardCollection: <\n PlayerId extends PlayerIdOfTable<Table>,\n ZoneId extends HandIdOfTable<Table>,\n >(\n playerId: PlayerId,\n zoneId: ZoneId,\n ) => getPlayerZoneCardCollection(table, playerId, zoneId),\n allPlayerCards: <ZoneId extends HandIdOfTable<Table>>(zoneId: ZoneId) =>\n getAllPlayerZoneCards(table, zoneId),\n },\n card: {\n get: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCard(table, cardId),\n byIds: <CardIds extends readonly CardIdOfTable<Table>[]>(\n cardIds: CardIds,\n ) => getCardsById(table, cardIds),\n owner: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCardOwner(table, cardId),\n visibility: <CardId extends CardIdOfTable<Table>>(cardId: CardId) =>\n getCardVisibility(table, cardId),\n },\n slot: {\n occupants: (host, slotId) => getSlotOccupants(table, host, slotId),\n occupantsByHost: (host) => getSlotOccupantsByHost(table, host),\n pieceOccupants: (hostId, slotId) =>\n getSlotOccupants(table, { kind: \"piece\", id: hostId }, slotId),\n pieceOccupantsByHost: (hostId) =>\n getSlotOccupantsByHost(table, { kind: \"piece\", id: hostId }),\n dieOccupants: (hostId, slotId) =>\n getSlotOccupants(table, { kind: \"die\", id: hostId }, slotId),\n dieOccupantsByHost: (hostId) =>\n getSlotOccupantsByHost(table, { kind: \"die\", id: hostId }),\n },\n player: {\n order: () => getPlayerOrder(table),\n nextInOrder: (playerId) => getNextPlayerInOrder(table, playerId),\n resources: (playerId) => getPlayerResources(table, playerId),\n resource: (playerId, resourceId) =>\n getPlayerResourceAmount(table, playerId, resourceId),\n resourceTotal: (playerId) => getPlayerResourceTotal(table, playerId),\n canAfford: (playerId, amounts) =>\n canAffordResources(table, playerId, amounts),\n missingResources: (playerId, amounts) =>\n getMissingResources(table, playerId, amounts),\n },\n component: {\n data: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) =>\n (table.cards[componentId] ??\n table.pieces[componentId] ??\n table.dice[componentId]) as\n | ComponentDataOfTable<Table, ComponentId>\n | undefined,\n location: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentLocation(table, componentId),\n deck: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentDeckLocation(table, componentId),\n hand: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentHandLocation(table, componentId),\n zone: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentZoneLocation(table, componentId),\n space: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentSpaceLocation(table, componentId),\n container: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentContainerLocation(table, componentId),\n edge: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentEdgeLocation(table, componentId),\n vertex: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentVertexLocation(table, componentId),\n slot: <ComponentId extends ComponentIdOfTable<Table>>(\n componentId: ComponentId,\n ) => getComponentSlotLocation(table, componentId),\n },\n };\n}\n\nexport function createStateQueries<State extends { table: RuntimeTableRecord }>(\n state: State,\n): TableQueriesOfState<State> {\n return createTableQueries(\n state.table,\n ) as unknown as TableQueriesOfState<State>;\n}\n","import type { RuntimeTableRecord } from \"./model/table\";\nimport type { TableQueriesOfState } from \"./model/queries\";\nimport type { BaseGameStateOfContract } from \"./model/definition\";\nimport { createStateQueries } from \"./table-queries\";\n\n/**\n * A freestanding, memoized projection of immutable game state.\n *\n * Use `defineDerived` for values that are pure functions of component\n * locations, zone contents, resources, or other state fields - and are\n * consumed from multiple reducer or view call sites, or whose compute cost\n * is non-trivial (graph walks, aggregate reductions).\n *\n * Do NOT cache derived values in `publicState`. State fields should be\n * inputs to derivations, not mirrors of them.\n */\nexport type DerivedDefinition<Contract, Value> = {\n /** Optional label for debugging. Does not affect caching. */\n readonly name?: string;\n readonly compute: (ctx: {\n readonly state: BaseGameStateOfContract<Contract>;\n readonly q: TableQueriesOfState<BaseGameStateOfContract<Contract>>;\n readonly derived: DerivedResolver;\n }) => Value;\n};\n\n/**\n * Resolves a `DerivedDefinition` to its value. Callers do not need to know\n * about memoization - the resolver handles caching internally.\n */\nexport type DerivedResolver = <Value>(\n def: DerivedDefinition<never, Value>,\n) => Value;\n\ntype AnyDerivedDefinition = DerivedDefinition<unknown, unknown>;\n\n/**\n * Author-facing factory for creating a derived value tied to a game\n * contract. Usage:\n *\n * ```ts\n * export const longestRoad = defineDerived<GameContract>()({\n * name: \"longestRoad\",\n * compute: ({ q, derived }) => computeLongestRoad(q),\n * });\n * ```\n */\nexport function defineDerived<Contract>() {\n return <Value>(def: {\n name?: string;\n compute: (ctx: {\n state: BaseGameStateOfContract<Contract>;\n q: TableQueriesOfState<BaseGameStateOfContract<Contract>>;\n derived: DerivedResolver;\n }) => Value;\n }): DerivedDefinition<Contract, Value> => def;\n}\n\n/**\n * Creates a resolver scoped to a single state snapshot. Each engine tick\n * and each view projection call creates its own resolver; cache lifetime\n * ends with the call. Cache key is the `DerivedDefinition` identity (the\n * object reference).\n *\n * Re-entry on an in-flight definition throws a readable error.\n */\nexport function createDerivedResolver<\n State extends { table: RuntimeTableRecord },\n>(\n state: State,\n options: { q?: TableQueriesOfState<State> } = {},\n): DerivedResolver {\n const cache = new Map<AnyDerivedDefinition, unknown>();\n const inflight = new Set<AnyDerivedDefinition>();\n const q = options.q ?? createStateQueries(state);\n\n const resolver: DerivedResolver = <Value>(\n def: DerivedDefinition<never, Value>,\n ): Value => {\n const typedDef = def as unknown as AnyDerivedDefinition;\n if (cache.has(typedDef)) {\n return cache.get(typedDef) as Value;\n }\n if (inflight.has(typedDef)) {\n throw new Error(\n `Cyclic derived: '${def.name ?? \"<anonymous>\"}' depends on itself.`,\n );\n }\n inflight.add(typedDef);\n try {\n const value = (\n def.compute as unknown as (ctx: {\n state: unknown;\n q: unknown;\n derived: DerivedResolver;\n }) => Value\n )({ state, q, derived: resolver });\n cache.set(typedDef, value);\n return value;\n } finally {\n inflight.delete(typedDef);\n }\n };\n\n return resolver;\n}\n","import type {\n AnyContinuationToken,\n EffectSpecLike,\n ReducerFx,\n RuntimeTableRecord,\n} from \"./model\";\n\ntype FxState = {\n table: RuntimeTableRecord;\n flow: { currentPhase: string };\n};\n\ntype InternalEffectDefinition = EffectSpecLike;\n\nfunction buildResume(\n effect: InternalEffectDefinition,\n context: unknown,\n): AnyContinuationToken | undefined {\n if (!effect.__continuation) {\n return undefined;\n }\n return (effect.__continuation as unknown as (data: unknown) => unknown)(\n context ?? {},\n ) as AnyContinuationToken;\n}\n\nfunction invokeEffect(\n effect: InternalEffectDefinition,\n options: Record<string, unknown>,\n) {\n const continuation = buildResume(effect, options.context);\n if (effect.type === \"rollDie\") {\n return continuation === undefined\n ? {\n kind: \"engine.rollDie\" as const,\n dieId: options.dieId as string,\n }\n : {\n kind: \"engine.rollDie\" as const,\n dieId: options.dieId as string,\n continuation,\n };\n }\n if (effect.type === \"shuffleSharedZone\") {\n return continuation === undefined\n ? {\n kind: \"engine.shuffleSharedZone\" as const,\n zoneId: options.zoneId as string,\n }\n : {\n kind: \"engine.shuffleSharedZone\" as const,\n zoneId: options.zoneId as string,\n continuation,\n };\n }\n if (effect.type === \"shufflePlayerZone\") {\n return continuation === undefined\n ? {\n kind: \"engine.shufflePlayerZone\" as const,\n zoneId: options.zoneId as string,\n playerId: options.playerId as string,\n }\n : {\n kind: \"engine.shufflePlayerZone\" as const,\n zoneId: options.zoneId as string,\n playerId: options.playerId as string,\n continuation,\n };\n }\n throw new Error(\n `fx.effect: unsupported effect type '${(effect as InternalEffectDefinition).type}'.`,\n );\n}\n\nexport function createReducerFx<State extends FxState>(\n _state: State,\n): ReducerFx<State> {\n const fx: ReducerFx<State> = {\n transition(to) {\n return { kind: \"flow.transition\", to } as ReturnType<\n ReducerFx<State>[\"transition\"]\n >;\n },\n effect(effect, options) {\n return invokeEffect(\n effect as unknown as InternalEffectDefinition,\n options as Record<string, unknown>,\n ) as ReturnType<ReducerFx<State>[\"effect\"]>;\n },\n } as ReducerFx<State>;\n return fx;\n}\n","/**\n * Curried state writers for use with `pipe`.\n *\n * Each entry in the returned `ops` namespace is a curried transformation\n * `(args) => (state) => state` that can be composed with `pipe`:\n *\n * const ops = createReducerOps<GameState>();\n *\n * return accept(\n * pipe(state,\n * ops.setActivePlayers([playerId]),\n * ops.moveCardFromPlayerZoneToSharedZone({\n * playerId,\n * fromZoneId: \"things-hand\",\n * toZoneId: \"ring-1\",\n * cardId: \"a-dog\",\n * }),\n * ),\n * );\n *\n * The factory binds all ops to a specific `State` type so that ID arguments\n * (deck ids, card ids, etc.) are checked against the manifest-derived table\n * shape of the game.\n */\nimport type { Op } from \"./compose\";\nimport type {\n BoardContainerIdOfTable,\n BoardIdOfTable,\n CompatibleHandIdForDeck,\n ComponentIdOfTable,\n CompatibleCardIdForHandAndDeck,\n CompatibleCardIdForTwoPlayerZones,\n DeckCardsOfTable,\n DeckIdOfTable,\n HandIdOfTable,\n HiddenStateOfState,\n PhaseStateOfState,\n PlayerIdOfState,\n PlayerIdOfTable,\n PlayerZoneIdOfTable,\n PrivateStateOfState,\n PublicStateOfState,\n ResourceAmountsOfTable,\n ResourceIdOfTable,\n RuntimeTableRecord,\n SharedZoneIdOfTable,\n SpaceIdOfTable,\n TableOfState,\n TiledBoardIdOfTable,\n TiledEdgeIdOfTable,\n TiledVertexIdOfTable,\n} from \"./model\";\nimport {\n addCardToSharedZone as tableAddCardToSharedZone,\n addPlayerResources as tableAddPlayerResources,\n dealCardsFromDeckToHand as tableDealCardsFromDeckToHand,\n dealCardsBetweenPlayerZones as tableDealCardsBetweenPlayerZones,\n moveCardBetweenPlayerZones as tableMoveCardBetweenPlayerZones,\n moveCardBetweenSharedZones as tableMoveCardBetweenSharedZones,\n moveCardFromPlayerZoneToSharedZone as tableMoveCardFromPlayerZoneToSharedZone,\n moveCardFromSharedZoneToPlayerZone as tableMoveCardFromSharedZoneToPlayerZone,\n moveComponentToContainer as tableMoveComponentToContainer,\n moveComponentToDetached as tableMoveComponentToDetached,\n moveComponentToEdge as tableMoveComponentToEdge,\n moveComponentToSpace as tableMoveComponentToSpace,\n moveComponentToVertex as tableMoveComponentToVertex,\n removeCardFromSharedZone as tableRemoveCardFromSharedZone,\n setActivePlayers as stateSetActivePlayers,\n setPhaseState as stateSetPhaseState,\n setPlayerResource as tableSetPlayerResource,\n spendPlayerResources as tableSpendPlayerResources,\n transferPlayerResources as tableTransferPlayerResources,\n} from \"./table-ops\";\n\n/**\n * Minimum shape required for any state targeted by reducer ops.\n *\n * All curried writers operate on a game state with a `table` field.\n */\nexport type ReducerStateBase = {\n table: RuntimeTableRecord;\n};\n\ntype PipeTable<State extends ReducerStateBase> = TableOfState<State>;\n\n/**\n * A shallow patch for a slice of state. Either a partial object to merge\n * over the previous value, or a functional updater `(prev) => next`.\n */\nexport type StatePatch<T> = Partial<T> | ((prev: T) => T);\n\n/**\n * Curried writer namespace for a specific game state type.\n *\n * Created via {@link createReducerOps}.\n */\nexport interface ReducerOps<State extends ReducerStateBase> {\n // --- Flow ------------------------------------------------------------\n\n /** Set the list of players whose turn is currently active. */\n setActivePlayers(\n activePlayers: ReadonlyArray<PlayerIdOfState<State>>,\n ): Op<State>;\n\n /**\n * Advance `flow.activePlayers` to the single next seat in `playerOrder`.\n *\n * Uses `state.flow.activePlayers[0]` as the current seat (or the first\n * seat in `playerOrder` when `activePlayers` is empty) and sets\n * `activePlayers` to `[q.player.nextInOrder(current)]`. No-op when the\n * player order is empty.\n */\n advanceActivePlayer(): Op<State>;\n\n // --- Author-owned state slices --------------------------------------\n\n /**\n * Update the current phase's local state.\n *\n * Accepts either a `Partial<PhaseState>` which is shallow-merged into the\n * previous value, or a functional updater `(prev) => next` which must\n * return a complete `PhaseState`.\n */\n patchPhaseState(patch: StatePatch<PhaseStateOfState<State>>): Op<State>;\n\n /**\n * Update `state.publicState`.\n *\n * Accepts either a `Partial<PublicState>` which is shallow-merged into the\n * previous value, or a functional updater `(prev) => next` which must\n * return a complete `PublicState`.\n */\n patchPublicState(patch: StatePatch<PublicStateOfState<State>>): Op<State>;\n\n /**\n * Update `state.hiddenState`.\n *\n * Accepts either a `Partial<HiddenState>` or a functional updater.\n */\n patchHiddenState(patch: StatePatch<HiddenStateOfState<State>>): Op<State>;\n\n /**\n * Update a single player's entry in `state.privateState`.\n *\n * Accepts either a `Partial<PrivateState>` or a functional updater.\n */\n patchPlayerPrivateState(args: {\n playerId: PlayerIdOfState<State>;\n patch: StatePatch<PrivateStateOfState<State>>;\n }): Op<State>;\n\n // --- Shared zones / decks -------------------------------------------\n\n /**\n * Append a card to a shared zone (deck). Defaults to placing the card at the\n * bottom; pass `position: \"top\"` for top-of-deck placement (e.g. Bureaucrat-style).\n */\n addCardToSharedZone<\n DeckId extends SharedZoneIdOfTable<PipeTable<State>>,\n >(args: {\n deckId: DeckId;\n cardId: DeckCardsOfTable<PipeTable<State>, DeckId>[number];\n playedBy?: PlayerIdOfTable<PipeTable<State>> | null;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /** Remove a card from a shared zone (deck). */\n removeCardFromSharedZone<\n DeckId extends DeckIdOfTable<PipeTable<State>>,\n >(args: {\n deckId: DeckId;\n cardId: DeckCardsOfTable<PipeTable<State>, DeckId>[number];\n }): Op<State>;\n\n /**\n * Move a card between two shared zones (decks). Defaults to placing the card\n * at the bottom of the destination; pass `position: \"top\"` for top placement.\n */\n moveCardBetweenSharedZones<\n FromZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n >(args: {\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: DeckCardsOfTable<PipeTable<State>, FromZoneId>[number];\n playedBy?: PlayerIdOfTable<PipeTable<State>> | null;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Draw the top `count` cards from one perPlayer zone into another for the\n * same player (e.g. deck → hand at the start of a turn). Companion to\n * {@link dealCardsToPlayerZone} for the perPlayer → perPlayer case. Stops\n * silently if the source runs out before `count` is reached.\n */\n dealCardsBetweenPlayerZones<\n FromZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n count: number;\n }): Op<State>;\n\n /**\n * Move a card between two perPlayer zones owned by the same player (e.g.\n * hand → in-play → discard). Owner is preserved; visibility is recomputed\n * from the destination zone.\n */\n moveCardBetweenPlayerZones<\n FromZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForTwoPlayerZones<\n PipeTable<State>,\n FromZoneId,\n ToZoneId\n >;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Move a card from a player zone (hand) to a shared zone (deck). Defaults to\n * placing the card at the bottom; pass `position: \"top\"` to topdeck.\n */\n moveCardFromPlayerZoneToSharedZone<\n FromZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<\n PipeTable<State>,\n FromZoneId,\n ToZoneId\n >;\n playedBy?: PlayerIdOfTable<PipeTable<State>> | null;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Move a named card from a shared zone (supply pile, deck) to a perPlayer\n * zone (e.g. discard). The \"gain\" verb in deck-builders. Distinct from\n * {@link dealCardsToPlayerZone}, which draws unspecified top-N cards from a\n * deck. Owner flips to the receiving player; visibility is recomputed.\n */\n moveCardFromSharedZoneToPlayerZone<\n FromZoneId extends SharedZoneIdOfTable<PipeTable<State>>,\n ToZoneId extends PlayerZoneIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n >(args: {\n playerId: PlayerId;\n fromZoneId: FromZoneId;\n toZoneId: ToZoneId;\n cardId: CompatibleCardIdForHandAndDeck<\n PipeTable<State>,\n ToZoneId,\n FromZoneId\n >;\n position?: \"top\" | \"bottom\";\n }): Op<State>;\n\n /**\n * Deal the top `count` cards from a shared deck into a player's hand zone.\n *\n * This op does not consume RNG. If the deck needs to be random, shuffle it\n * first with `fx.shuffleSharedZone(...)`, then deal from the shuffled deck\n * inside the same reducer via this op.\n */\n dealCardsToPlayerZone<\n FromZoneId extends DeckIdOfTable<PipeTable<State>>,\n PlayerId extends PlayerIdOfTable<PipeTable<State>>,\n ToZoneId extends CompatibleHandIdForDeck<PipeTable<State>, FromZoneId> &\n HandIdOfTable<PipeTable<State>>,\n >(args: {\n fromZoneId: FromZoneId;\n playerId: PlayerId;\n toZoneId: ToZoneId;\n count: number;\n }): Op<State>;\n\n // --- Board / component movement -------------------------------------\n\n /** Move a component onto a board space. */\n moveComponentToSpace<\n BoardId extends BoardIdOfTable<PipeTable<State>>,\n SpaceId extends SpaceIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n spaceId: SpaceId;\n }): Op<State>;\n\n /** Move a component into a board container. */\n moveComponentToContainer<\n BoardId extends BoardIdOfTable<PipeTable<State>>,\n ContainerId extends BoardContainerIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n containerId: ContainerId;\n }): Op<State>;\n\n /** Move a component onto a tiled board edge. */\n moveComponentToEdge<\n BoardId extends TiledBoardIdOfTable<PipeTable<State>>,\n EdgeId extends TiledEdgeIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n edgeId: EdgeId;\n }): Op<State>;\n\n /** Move a component onto a tiled board vertex. */\n moveComponentToVertex<\n BoardId extends TiledBoardIdOfTable<PipeTable<State>>,\n VertexId extends TiledVertexIdOfTable<PipeTable<State>, BoardId>,\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n boardId: BoardId;\n vertexId: VertexId;\n }): Op<State>;\n\n /** Move a component back to the detached pool. */\n moveComponentToDetached<\n ComponentId extends ComponentIdOfTable<PipeTable<State>>,\n >(args: {\n componentId: ComponentId;\n }): Op<State>;\n\n // --- Resources ------------------------------------------------------\n\n /**\n * Credit the specified resources to a player.\n *\n * Amounts must be non-negative; use {@link spendResources} for deductions\n * so that affordability is checked explicitly.\n *\n * pipe(\n * state,\n * ops.addResources({ playerId, amounts: { wood: 1, brick: 1 } }),\n * )\n */\n addResources(args: {\n playerId: PlayerIdOfTable<PipeTable<State>>;\n amounts: ResourceAmountsOfTable<PipeTable<State>>;\n }): Op<State>;\n\n /**\n * Debit the specified resources from a player.\n *\n * Throws when the player cannot afford the full cost — gate with\n * `q.player.canAfford(...)` in your `validate` step before invoking.\n *\n * pipe(\n * state,\n * ops.spendResources({ playerId, amounts: COST_DEV_CARD }),\n * ops.dealCardsToPlayerZone({ ... }),\n * )\n */\n spendResources(args: {\n playerId: PlayerIdOfTable<PipeTable<State>>;\n amounts: ResourceAmountsOfTable<PipeTable<State>>;\n }): Op<State>;\n\n /**\n * Transfer the specified resources from one player to another.\n *\n * Throws when the source cannot afford the full amount. On success the\n * destination gains exactly what the source loses.\n */\n transferResources(args: {\n fromPlayerId: PlayerIdOfTable<PipeTable<State>>;\n toPlayerId: PlayerIdOfTable<PipeTable<State>>;\n amounts: ResourceAmountsOfTable<PipeTable<State>>;\n }): Op<State>;\n\n /**\n * Overwrite a single resource balance for a player. Prefer\n * {@link addResources} / {@link spendResources} — use this only when the\n * new balance is an absolute (e.g. scripted setup).\n */\n setResource(args: {\n playerId: PlayerIdOfTable<PipeTable<State>>;\n resourceId: ResourceIdOfTable<PipeTable<State>>;\n amount: number;\n }): Op<State>;\n}\n\n// --- Internal helpers -----------------------------------------------\n\ntype AnyTable = RuntimeTableRecord;\ntype AnyState = { table: AnyTable };\n\nfunction updateTable<S extends AnyState>(state: S, nextTable: AnyTable): S {\n return { ...state, table: nextTable };\n}\n\n/**\n * Internal, id-type-erased signatures for the board writer family.\n *\n * The public `tableMove*` helpers constrain their id args to manifest-derived\n * unions such as `TiledBoardIdOfTable<Table>`, which collapse to `never` for\n * the unconstrained `RuntimeTableRecord`. Inside `createReducerOps<State>`\n * the `State` generic is not yet bound, so at this call site we only know\n * that all ids are plain strings. These aliases narrow that distinction to\n * one place instead of leaking `as never` casts across every op body.\n */\ntype TableMoveComponentToEdgeInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n edgeId: string,\n) => RuntimeTableRecord;\n\ntype TableMoveComponentToVertexInternal = (\n table: RuntimeTableRecord,\n componentId: string,\n boardId: string,\n vertexId: string,\n) => RuntimeTableRecord;\n\ntype TableDealCardsFromDeckToHandInternal = (\n table: RuntimeTableRecord,\n fromZoneId: string,\n playerId: string,\n toZoneId: string,\n count: number,\n) => RuntimeTableRecord;\n\nconst moveComponentToEdgeInternal =\n tableMoveComponentToEdge as unknown as TableMoveComponentToEdgeInternal;\nconst moveComponentToVertexInternal =\n tableMoveComponentToVertex as unknown as TableMoveComponentToVertexInternal;\nconst dealCardsFromDeckToHandInternal =\n tableDealCardsFromDeckToHand as unknown as TableDealCardsFromDeckToHandInternal;\n\n/**\n * Create the `ops.*` namespace specialised to a game state.\n *\n * Call this once (typically in a shared reducer-support module) and reuse the\n * resulting object across phases:\n *\n * export const ops = createReducerOps<GameState>();\n */\nexport function createReducerOps<\n State extends ReducerStateBase,\n>(): ReducerOps<State> {\n // The implementation operates on the structural `AnyState` shape; the\n // public `ReducerOps<State>` interface adds manifest-aware argument\n // validation and polymorphic state preservation on top. The final\n // `as unknown as ReducerOps<State>` bridges the two: all runtime\n // correctness is still covered by the underlying table-ops writers.\n const applyPatch = <T extends object>(\n prev: T,\n patch: Partial<T> | ((prev: T) => T),\n ): T => {\n if (typeof patch === \"function\") {\n return (patch as (prev: T) => T)(prev);\n }\n return { ...prev, ...patch };\n };\n\n const impl = {\n setActivePlayers(activePlayers: ReadonlyArray<string>) {\n return <S extends AnyState>(state: S): S =>\n stateSetActivePlayers(\n state as unknown as never,\n [...activePlayers] as never,\n ) as unknown as S;\n },\n advanceActivePlayer() {\n return <S extends AnyState>(state: S): S => {\n const table = (state as unknown as { table: RuntimeTableRecord }).table;\n const order = table.playerOrder as ReadonlyArray<string>;\n if (order.length === 0) return state;\n const flow = (\n state as unknown as { flow?: { activePlayers?: readonly string[] } }\n ).flow;\n const current = flow?.activePlayers?.[0];\n const idx = current ? order.indexOf(current) : -1;\n const nextIdx = idx < 0 ? 0 : (idx + 1) % order.length;\n const nextId = order[nextIdx];\n if (nextId === undefined) return state;\n return stateSetActivePlayers(\n state as unknown as never,\n [nextId] as never,\n ) as unknown as S;\n };\n },\n patchPhaseState(patch: unknown) {\n return <S extends AnyState>(state: S): S => {\n const prev = (state as unknown as { phase?: object }).phase ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return stateSetPhaseState(\n state as unknown as { phase: object },\n next as object,\n ) as unknown as S;\n };\n },\n patchPublicState(patch: unknown) {\n return <S extends AnyState>(state: S): S => {\n const prev =\n (state as unknown as { publicState?: object }).publicState ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return { ...state, publicState: next } as S;\n };\n },\n patchHiddenState(patch: unknown) {\n return <S extends AnyState>(state: S): S => {\n const prev =\n (state as unknown as { hiddenState?: object }).hiddenState ?? {};\n const next = applyPatch(\n prev as object,\n patch as Partial<object> | ((prev: object) => object),\n );\n return { ...state, hiddenState: next } as S;\n };\n },\n patchPlayerPrivateState(args: { playerId: string; patch: unknown }) {\n return <S extends AnyState>(state: S): S => {\n const privateByPlayer =\n (state as unknown as { privateState?: Record<string, object> })\n .privateState ?? {};\n const prev = (privateByPlayer[args.playerId] ?? {}) as object;\n const next = applyPatch(\n prev,\n args.patch as Partial<object> | ((prev: object) => object),\n );\n return {\n ...state,\n privateState: {\n ...privateByPlayer,\n [args.playerId]: next,\n },\n } as S;\n };\n },\n addCardToSharedZone(args: {\n deckId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableAddCardToSharedZone(\n state.table,\n args.deckId,\n args.cardId,\n args.playedBy ?? null,\n args.position ?? \"bottom\",\n );\n return updateTable(state, nextTable);\n };\n },\n removeCardFromSharedZone(args: { deckId: string; cardId: string }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableRemoveCardFromSharedZone(\n state.table,\n args.deckId,\n args.cardId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveCardBetweenSharedZones(args: {\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardBetweenSharedZones({\n table: state.table,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n playedBy: args.playedBy ?? null,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n dealCardsBetweenPlayerZones(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n count: number;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableDealCardsBetweenPlayerZones({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n count: args.count,\n });\n return updateTable(state, nextTable);\n };\n },\n moveCardBetweenPlayerZones(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardBetweenPlayerZones({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n moveCardFromPlayerZoneToSharedZone(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n playedBy?: string | null;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardFromPlayerZoneToSharedZone({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n playedBy: args.playedBy ?? null,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n moveCardFromSharedZoneToPlayerZone(args: {\n playerId: string;\n fromZoneId: string;\n toZoneId: string;\n cardId: string;\n position?: \"top\" | \"bottom\";\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveCardFromSharedZoneToPlayerZone({\n table: state.table,\n playerId: args.playerId,\n fromZoneId: args.fromZoneId,\n toZoneId: args.toZoneId,\n cardId: args.cardId,\n position: args.position ?? \"bottom\",\n });\n return updateTable(state, nextTable);\n };\n },\n dealCardsToPlayerZone(args: {\n fromZoneId: string;\n playerId: string;\n toZoneId: string;\n count: number;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = dealCardsFromDeckToHandInternal(\n state.table,\n args.fromZoneId,\n args.playerId,\n args.toZoneId,\n args.count,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToSpace(args: {\n componentId: string;\n boardId: string;\n spaceId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveComponentToSpace(\n state.table,\n args.componentId,\n args.boardId,\n args.spaceId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToContainer(args: {\n componentId: string;\n boardId: string;\n containerId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveComponentToContainer(\n state.table,\n args.componentId,\n args.boardId,\n args.containerId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToEdge(args: {\n componentId: string;\n boardId: string;\n edgeId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = moveComponentToEdgeInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.edgeId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToVertex(args: {\n componentId: string;\n boardId: string;\n vertexId: string;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = moveComponentToVertexInternal(\n state.table,\n args.componentId,\n args.boardId,\n args.vertexId,\n );\n return updateTable(state, nextTable);\n };\n },\n moveComponentToDetached(args: { componentId: string }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableMoveComponentToDetached(\n state.table,\n args.componentId,\n );\n return updateTable(state, nextTable);\n };\n },\n addResources(args: {\n playerId: string;\n amounts: Record<string, number | undefined>;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableAddPlayerResources(\n state.table,\n args.playerId,\n args.amounts,\n );\n return updateTable(state, nextTable);\n };\n },\n spendResources(args: {\n playerId: string;\n amounts: Record<string, number | undefined>;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableSpendPlayerResources(\n state.table,\n args.playerId,\n args.amounts,\n );\n return updateTable(state, nextTable);\n };\n },\n transferResources(args: {\n fromPlayerId: string;\n toPlayerId: string;\n amounts: Record<string, number | undefined>;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableTransferPlayerResources(\n state.table,\n args.fromPlayerId,\n args.toPlayerId,\n args.amounts,\n );\n return updateTable(state, nextTable);\n };\n },\n setResource(args: {\n playerId: string;\n resourceId: string;\n amount: number;\n }) {\n return <S extends AnyState>(state: S): S => {\n const nextTable = tableSetPlayerResource(\n state.table,\n args.playerId,\n args.resourceId,\n args.amount,\n );\n return updateTable(state, nextTable);\n };\n },\n };\n\n return impl as unknown as ReducerOps<State>;\n}\n","import { cardInput } from \"./inputs/cardInput\";\nimport { cardTarget } from \"./inputs/cardTarget\";\nimport type {\n AnyCardActionSpec,\n AnyContinuationCallable,\n AnyInteractionSpec,\n BaseGameStateOfContract,\n EffectMap,\n InputCollector,\n InteractionMap,\n ManifestContractOf,\n PhaseDefinition,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n ReducerGameContractLike,\n ReducerGameDefinition,\n SchemaLike,\n StageMap,\n StageSpec,\n ViewMapOf,\n PhaseZoneList,\n PlayerZoneIdOfManifest,\n} from \"./model\";\n\nexport type ReducerIndexedPhase<Contract extends ReducerGameContractLike> =\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>,\n Record<string, InputCollector>,\n EffectMap<BaseGameStateOfContract<Contract>, ManifestContractOf<Contract>>,\n InteractionMap<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n StageMap<BaseGameStateOfContract<Contract>, ManifestContractOf<Contract>>,\n PhaseZoneList<ManifestContractOf<Contract>>\n >;\n\nexport type ReducerIndexedInteractionEntry<\n Contract extends ReducerGameContractLike,\n> = readonly [\n string,\n AnyInteractionSpec<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n];\n\nexport type ReducerIndexedStageEntry<Contract extends ReducerGameContractLike> =\n readonly [\n string,\n StageSpec<BaseGameStateOfContract<Contract>, ManifestContractOf<Contract>>,\n ];\n\nexport type ReducerIndexedZoneEntry<Contract extends ReducerGameContractLike> =\n PlayerZoneIdOfManifest<ManifestContractOf<Contract>>;\n\nexport type ReducerIndexedCardActionEntry<\n Contract extends ReducerGameContractLike,\n> = readonly [\n string,\n AnyCardActionSpec<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n];\n\nexport type ReducerIndexedEffectEntry<\n Contract extends ReducerGameContractLike,\n> = readonly [\n string,\n {\n readonly id: string;\n readonly type: string;\n readonly continuation?: AnyContinuationCallable<\n BaseGameStateOfContract<Contract>\n > & {\n readonly id?: string;\n };\n },\n];\n\nexport interface ReducerDefinitionPhaseIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n readonly phaseName: PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n readonly phase: ReducerIndexedPhase<Contract>;\n readonly interactions: ReadonlyArray<\n ReducerIndexedInteractionEntry<Contract>\n >;\n readonly stages: ReadonlyArray<ReducerIndexedStageEntry<Contract>>;\n readonly zones: ReadonlyArray<ReducerIndexedZoneEntry<Contract>>;\n readonly cardActions: ReadonlyArray<ReducerIndexedCardActionEntry<Contract>>;\n readonly effects: ReadonlyArray<ReducerIndexedEffectEntry<Contract>>;\n}\n\nexport interface ReducerDefinitionIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n readonly phaseEntries: ReadonlyArray<\n readonly [\n PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >,\n ReducerIndexedPhase<Contract>,\n ]\n >;\n readonly phasesByName: ReadonlyMap<\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, Views>>,\n ReducerDefinitionPhaseIndex<Contract, Definitions, Views>\n >;\n}\n\ntype RawEffectEntry<Contract extends ReducerGameContractLike> = readonly [\n string,\n {\n id?: string;\n type?: string;\n __continuation?: AnyContinuationCallable<\n BaseGameStateOfContract<Contract>\n > & {\n id?: string;\n };\n },\n];\n\nfunction phaseEntriesOf<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): Array<\n readonly [\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, Views>>,\n ReducerIndexedPhase<Contract>,\n ]\n> {\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n return Object.entries(definition.phases) as unknown as Array<\n readonly [PhaseName, ReducerIndexedPhase<Contract>]\n >;\n}\n\nfunction interactionEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedInteractionEntry<Contract>> {\n return Object.entries(\n (phase as { interactions?: Record<string, unknown> }).interactions ?? {},\n ) as Array<ReducerIndexedInteractionEntry<Contract>>;\n}\n\nfunction simultaneousSubmitEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedInteractionEntry<Contract>> {\n const submit = (phase as { submit?: unknown }).submit;\n if (!submit) return [];\n return [\n [\"submit\", submit] as unknown as ReducerIndexedInteractionEntry<Contract>,\n ];\n}\n\nfunction cardActionEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedCardActionEntry<Contract>> {\n return Object.entries(\n (phase as { cardActions?: Record<string, unknown> }).cardActions ?? {},\n ) as Array<ReducerIndexedCardActionEntry<Contract>>;\n}\n\nfunction stageEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedStageEntry<Contract>> {\n return Object.entries(\n (phase as { stages?: Record<string, unknown> }).stages ?? {},\n ) as Array<ReducerIndexedStageEntry<Contract>>;\n}\n\nfunction zoneEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<ReducerIndexedZoneEntry<Contract>> {\n return Array.from(\n (phase as { zones?: readonly unknown[] }).zones ?? [],\n ) as Array<ReducerIndexedZoneEntry<Contract>>;\n}\n\nfunction effectEntriesOf<Contract extends ReducerGameContractLike>(\n phase: ReducerIndexedPhase<Contract>,\n): Array<RawEffectEntry<Contract>> {\n return Object.entries(\n (phase as { effects?: Record<string, unknown> }).effects ?? {},\n ) as Array<RawEffectEntry<Contract>>;\n}\n\nexport function collectReducerDefinitionIndex<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): ReducerDefinitionIndex<Contract, Definitions, Views> {\n type State = BaseGameStateOfContract<Contract>;\n type Manifest = ManifestContractOf<Contract>;\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n\n const phaseEntries = phaseEntriesOf(definition);\n const phasesByName = new Map<\n PhaseName,\n ReducerDefinitionPhaseIndex<Contract, Definitions, Views>\n >();\n\n for (const [phaseName, phase] of phaseEntries) {\n const interactionEntries = [\n ...interactionEntriesOf(phase),\n ...simultaneousSubmitEntriesOf(phase),\n ];\n const cardActionEntries: Array<ReducerIndexedInteractionEntry<Contract>> =\n cardActionEntriesOf(phase).map(([cardActionId, cardAction]) => [\n cardActionId,\n {\n ...cardAction,\n __steps: cardAction.__steps,\n inputs: {\n cardId: cardInput<State>({\n target: cardTarget\n .zones<State>([cardAction.playFrom])\n .where({\n id: \"card-type\",\n errorCode: \"WRONG_CARD_TYPE\",\n message: `Card must be ${cardAction.cardType}.`,\n test: ({ q, targetId }) =>\n q.card.get(targetId).cardType === cardAction.cardType,\n })\n .build(),\n }),\n ...(cardAction.inputs ?? {}),\n },\n } satisfies AnyInteractionSpec<State, Manifest>,\n ]);\n const effects: Array<ReducerIndexedEffectEntry<Contract>> = effectEntriesOf(\n phase,\n ).map(([effectKey, effectValue]) => [\n effectKey,\n {\n id: effectValue.id ?? effectKey,\n type: effectValue.type ?? \"rollDie\",\n continuation: effectValue.__continuation,\n },\n ]);\n\n phasesByName.set(phaseName, {\n phaseName,\n phase,\n interactions: [...interactionEntries, ...cardActionEntries],\n stages: stageEntriesOf(phase),\n zones: zoneEntriesOf(phase),\n cardActions: cardActionEntriesOf(phase),\n effects,\n });\n }\n\n return {\n phaseEntries,\n phasesByName,\n };\n}\n","import type {\n AnyContinuationCallable,\n BaseGameStateOfContract,\n ManifestContractOf,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"../../model\";\nimport {\n collectReducerDefinitionIndex,\n type ReducerDefinitionPhaseIndex,\n type ReducerIndexedCardActionEntry,\n type ReducerIndexedInteractionEntry,\n type ReducerIndexedPhase,\n type ReducerIndexedStageEntry,\n type ReducerIndexedZoneEntry,\n} from \"../../definition-index\";\n\nexport type TrustedErasedPhase<Contract extends ReducerGameContractLike> =\n ReducerIndexedPhase<Contract>;\n\nexport type TrustedInteractionEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedInteractionEntry<Contract>;\n\nexport type TrustedCardActionEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedCardActionEntry<Contract>;\n\nexport type TrustedStageEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedStageEntry<Contract>;\n\nexport type TrustedZoneEntry<Contract extends ReducerGameContractLike> =\n ReducerIndexedZoneEntry<Contract>;\n\nexport type TrustedContinuationRegistry<\n Contract extends ReducerGameContractLike,\n> = ReadonlyMap<\n string,\n AnyContinuationCallable<BaseGameStateOfContract<Contract>>\n>;\n\nexport interface TrustedPhaseRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> extends Omit<\n ReducerDefinitionPhaseIndex<Contract, Definitions, Views>,\n \"effects\"\n > {}\n\nexport interface TrustedRuntimeRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n readonly phaseEntries: ReadonlyArray<\n readonly [\n PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >,\n TrustedErasedPhase<Contract>,\n ]\n >;\n readonly phasesByName: ReadonlyMap<\n PhaseNamesOfDefinition<ReducerGameDefinition<Contract, Definitions, Views>>,\n TrustedPhaseRegistry<Contract, Definitions, Views>\n >;\n readonly continuationsById: TrustedContinuationRegistry<Contract>;\n readonly effectsById: ReadonlyMap<\n string,\n { readonly id: string; readonly type: string }\n >;\n}\n\nexport function collectTrustedRuntimeRegistry<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): TrustedRuntimeRegistry<Contract, Definitions, Views> {\n type State = BaseGameStateOfContract<Contract>;\n type PhaseName = PhaseNamesOfDefinition<\n ReducerGameDefinition<Contract, Definitions, Views>\n >;\n\n const index = collectReducerDefinitionIndex(definition);\n const phasesByName = new Map<\n PhaseName,\n TrustedPhaseRegistry<Contract, Definitions, Views>\n >();\n const continuationsById = new Map<string, AnyContinuationCallable<State>>();\n const effectsById = new Map<\n string,\n { readonly id: string; readonly type: string }\n >();\n\n for (const phaseIndex of index.phasesByName.values()) {\n const { effects: _effects, ...trustedPhase } = phaseIndex;\n phasesByName.set(phaseIndex.phaseName, trustedPhase);\n for (const [, effect] of phaseIndex.effects) {\n effectsById.set(effect.id, { id: effect.id, type: effect.type });\n if (effect.continuation) {\n const continuationId = effect.continuation.id ?? effect.id;\n continuationsById.set(\n continuationId,\n effect.continuation as AnyContinuationCallable<State>,\n );\n }\n }\n }\n\n return {\n phaseEntries: index.phaseEntries,\n phasesByName,\n continuationsById,\n effectsById,\n };\n}\n","import { createDerivedResolver } from \"../../derived\";\nimport type { DerivedResolver } from \"../../derived\";\nimport { createReducerFx } from \"../../effects\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n ActionContext,\n BaseGameStateOfContract,\n ManifestContractOf,\n PlayerIdOfState,\n RandomHelpers,\n ReducerGameContractLike,\n TableQueriesOfState,\n} from \"../../model\";\nimport type { TrustedRuntimeHelpers, TrustedState } from \"./runtime-scope\";\n\nexport function fxForState<Contract extends ReducerGameContractLike>(\n state: TrustedState<Contract>,\n) {\n return createReducerFx<TrustedState<Contract>>(state);\n}\n\nexport function buildContext<Contract extends ReducerGameContractLike>(\n state: TrustedState<Contract>,\n manifest: ManifestContractOf<Contract>,\n): ActionContext<\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n> {\n type DomainState = BaseGameStateOfContract<Contract>;\n type PlayerId = PlayerIdOfState<DomainState>;\n type Manifest = ManifestContractOf<Contract>;\n return {\n currentPhase: state.flow.currentPhase as ActionContext<\n DomainState,\n Manifest\n >[\"currentPhase\"],\n manifest,\n playerOrder: [...state.table.playerOrder] as PlayerId[],\n activePlayers: [...state.flow.activePlayers] as PlayerId[],\n runtime: publicRuntime(state.runtime),\n setup: (state.runtime.setup\n ? {\n profileId: state.runtime.setup.profileId,\n optionValues: {\n ...state.runtime.setup.optionValues,\n },\n }\n : null) as ActionContext<DomainState, Manifest>[\"setup\"],\n };\n}\n\nfunction publicRuntime<Runtime extends { rng?: unknown }>(\n runtime: Runtime,\n): Omit<Runtime, \"rng\"> {\n const { rng: _rng, ...rest } = runtime;\n return rest;\n}\n\nconst DISABLED_RANDOM_HELPERS: RandomHelpers = {\n subset() {\n throw new Error(\n \"random helpers are only available in reducer mutation callbacks.\",\n );\n },\n};\n\nexport function buildRuntimeArgs<\n Contract extends ReducerGameContractLike,\n Extra extends object,\n>(\n state: TrustedState<Contract>,\n manifest: ManifestContractOf<Contract>,\n helpers: TrustedRuntimeHelpers<Contract>,\n toDomainState: (\n state: TrustedState<Contract>,\n ) => BaseGameStateOfContract<Contract>,\n extra: Extra,\n options: {\n q?: TableQueriesOfState<BaseGameStateOfContract<Contract>>;\n derived?: DerivedResolver;\n fx?: ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n random?: RandomHelpers;\n } = {},\n) {\n const domainState = toDomainState(state);\n const q = options.q ?? createStateQueries(domainState);\n return {\n ...buildContext(state, manifest),\n ...helpers,\n fx: options.fx ?? fxForState(state),\n q,\n derived: options.derived ?? createDerivedResolver(domainState, { q }),\n runtime: publicRuntime(state.runtime),\n random: options.random ?? DISABLED_RANDOM_HELPERS,\n ...extra,\n };\n}\n","import type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type { ReducerReject, ReducerResult } from \"../../model\";\n\nexport function acceptResult<State>(\n state: State,\n instructions: Array<RuntimeInstructionForState<State>> = [],\n) {\n return {\n type: \"accept\" as const,\n state,\n instructions,\n };\n}\n\nexport function rejectResult(\n errorCode: string,\n message?: string,\n): ReducerReject {\n return {\n type: \"reject\",\n errorCode,\n message,\n };\n}\n\nexport function normalizeResult<State>(\n result: ReducerResult<State> | void,\n fallbackState: State,\n): ReducerResult<State> {\n if (result === undefined || result === null) {\n return acceptResult(fallbackState);\n }\n return result;\n}\n\nexport const runtimeResultHelpers = {\n accept: acceptResult,\n reject: rejectResult,\n};\n","export function toDomainState<State extends { runtime: unknown }, DomainState>(\n state: State,\n): DomainState {\n const { runtime: _runtime, ...domain } = state;\n attachPhaseAccessor(domain);\n return domain as DomainState;\n}\n\nexport function toCombinedState<\n SessionState extends { domain: unknown; runtime: unknown },\n State,\n>(session: SessionState): State {\n const combined = {\n ...(session.domain as object),\n runtime: session.runtime,\n };\n attachPhaseAccessor(combined);\n return combined as State;\n}\n\nexport function toSessionState<\n State extends { runtime: unknown },\n DomainState,\n SessionState,\n>(state: State, toDomain: (state: State) => DomainState): SessionState {\n return {\n domain: toDomain(state),\n runtime: state.runtime,\n } as SessionState;\n}\n\nfunction attachPhaseAccessor(state: unknown): void {\n if (!state || typeof state !== \"object\") return;\n const candidate = state as {\n flow?: { currentPhase?: unknown };\n phase?: unknown;\n };\n const phase = candidate.phase;\n if (!phase || typeof phase !== \"object\") return;\n const descriptor = Object.getOwnPropertyDescriptor(phase, \"get\");\n if (descriptor && typeof descriptor.value === \"function\") return;\n Object.defineProperty(phase, \"get\", {\n enumerable: false,\n configurable: true,\n value: (phaseName: string) =>\n candidate.flow?.currentPhase === phaseName ? phase : null,\n });\n}\n","import type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"../../model\";\n\nexport function resolveTrustedSetupProfiles<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(definition: ReducerGameDefinition<Contract, Definitions, Views>) {\n const manifestSetupProfilesById =\n definition.contract.manifest.setupProfilesById;\n const manifestSetupProfileIds = Object.keys(manifestSetupProfilesById).sort();\n const reducerSetupProfiles = definition.setupProfiles ?? {};\n const reducerSetupProfileIds = Object.keys(reducerSetupProfiles).sort();\n if (\n manifestSetupProfileIds.length !== reducerSetupProfileIds.length ||\n manifestSetupProfileIds.some(\n (profileId, index) => reducerSetupProfileIds[index] !== profileId,\n )\n ) {\n throw new Error(\n `Reducer setupProfiles must exactly match manifest setupProfiles. Manifest=[${manifestSetupProfileIds.join(\", \")}], reducer=[${reducerSetupProfileIds.join(\", \")}].`,\n );\n }\n return {\n manifestSetupProfilesById,\n reducerSetupProfiles,\n };\n}\n\nexport function resolveDefaultInitialPhase<PhaseName extends string>(\n explicitInitialPhase: PhaseName | undefined,\n phaseEntries: ReadonlyArray<readonly [PhaseName, unknown]>,\n): PhaseName {\n const defaultInitialPhase = explicitInitialPhase ?? phaseEntries[0]?.[0];\n if (!defaultInitialPhase) {\n throw new Error(\"Reducer-native games must define at least one phase.\");\n }\n return defaultInitialPhase;\n}\n","import { createDerivedResolver } from \"../../derived\";\nimport type { DerivedResolver } from \"../../derived\";\nimport { createReducerFx } from \"../../effects\";\nimport { createReducerOps } from \"../../ops\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type { TrustedRuntimeInput } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type {\n ActionContext,\n AnyContinuationCallable,\n AnyInteractionSpec,\n BaseGameSessionOfContract,\n BaseGameStateOfContract,\n ManifestContractOf,\n PhaseMapOf,\n PhaseNamesOfDefinition,\n PlayerIdOfState,\n PlayerZoneIdOfManifest,\n RandomHelpers,\n ReducerGameContractLike,\n ReducerGameDefinition,\n StageSpec,\n TableQueriesOfState,\n ViewMapOf,\n} from \"../../model\";\nimport {\n collectTrustedRuntimeRegistry,\n type TrustedErasedPhase,\n type TrustedCardActionEntry,\n type TrustedInteractionEntry,\n type TrustedPhaseRegistry,\n type TrustedRuntimeRegistry,\n} from \"./runtime-registry\";\nimport {\n buildContext as buildTrustedContext,\n buildRuntimeArgs as buildTrustedRuntimeArgs,\n fxForState as trustedFxForState,\n} from \"./trusted-runtime-args\";\nimport {\n normalizeResult,\n rejectResult,\n runtimeResultHelpers,\n} from \"./trusted-runtime-result\";\nimport {\n toCombinedState as codecToCombinedState,\n toDomainState as codecToDomainState,\n toSessionState as codecToSessionState,\n} from \"./trusted-state-codec\";\nimport {\n resolveDefaultInitialPhase,\n resolveTrustedSetupProfiles,\n} from \"./trusted-setup-profiles\";\n\nexport { normalizeResult, rejectResult } from \"./trusted-runtime-result\";\n\nexport type TrustedDefinition<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReducerGameDefinition<Contract, Definitions, Views>;\n\nexport type TrustedDomainState<Contract extends ReducerGameContractLike> =\n BaseGameStateOfContract<Contract>;\n\nexport type TrustedSessionState<Contract extends ReducerGameContractLike> =\n BaseGameSessionOfContract<Contract>;\n\nexport type TrustedState<Contract extends ReducerGameContractLike> =\n TrustedDomainState<Contract> & {\n runtime: TrustedSessionState<Contract>[\"runtime\"];\n };\n\nexport type TrustedManifest<Contract extends ReducerGameContractLike> =\n ManifestContractOf<Contract>;\n\nexport type TrustedPhaseName<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = PhaseNamesOfDefinition<TrustedDefinition<Contract, Definitions, Views>>;\n\nexport type TrustedPlayerId<Contract extends ReducerGameContractLike> =\n PlayerIdOfState<TrustedDomainState<Contract>>;\n\nexport type TrustedInput<Contract extends ReducerGameContractLike> =\n TrustedRuntimeInput<TrustedPlayerId<Contract>>;\n\nexport type { TrustedErasedPhase } from \"./runtime-registry\";\n\nexport interface TrustedRuntimeHelpers<\n Contract extends ReducerGameContractLike,\n> {\n accept: (\n state: TrustedDomainState<Contract>,\n instructions?: Array<\n RuntimeInstructionForState<TrustedDomainState<Contract>>\n >,\n ) => {\n type: \"accept\";\n state: TrustedDomainState<Contract>;\n instructions: Array<\n RuntimeInstructionForState<TrustedDomainState<Contract>>\n >;\n };\n reject: typeof rejectResult;\n ops: ReturnType<typeof createReducerOps<TrustedDomainState<Contract>>>;\n}\n\nexport interface TrustedRuntimeScope<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> {\n definition: TrustedDefinition<Contract, Definitions, Views>;\n registry: TrustedRuntimeRegistry<Contract, Definitions, Views>;\n phaseEntries: ReadonlyArray<\n readonly [\n TrustedPhaseName<Contract, Definitions, Views>,\n TrustedErasedPhase<Contract>,\n ]\n >;\n defaultInitialPhase: TrustedPhaseName<Contract, Definitions, Views>;\n manifestSetupProfilesById: TrustedManifest<Contract>[\"setupProfilesById\"];\n reducerSetupProfiles: NonNullable<\n TrustedDefinition<Contract, Definitions, Views>[\"setupProfiles\"]\n >;\n runtimeHelpers: TrustedRuntimeHelpers<Contract>;\n toDomainState(state: TrustedState<Contract>): TrustedDomainState<Contract>;\n toCombinedState(\n session: TrustedSessionState<Contract>,\n ): TrustedState<Contract>;\n toSessionState(state: TrustedState<Contract>): TrustedSessionState<Contract>;\n phaseRegistryByName(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): TrustedPhaseRegistry<Contract, Definitions, Views> | undefined;\n phaseByName(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): TrustedErasedPhase<Contract>;\n findInteractionInPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n interactionId: string,\n ):\n | AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >\n | undefined;\n interactionEntriesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<TrustedInteractionEntry<Contract>>;\n stagesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<\n readonly [\n string,\n StageSpec<TrustedDomainState<Contract>, TrustedManifest<Contract>>,\n ]\n >;\n zonesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<PlayerZoneIdOfManifest<TrustedManifest<Contract>>>;\n cardActionEntriesForPhase(\n phaseName: TrustedPhaseName<Contract, Definitions, Views>,\n ): ReadonlyArray<TrustedCardActionEntry<Contract>>;\n continuationById(\n id: string,\n ): AnyContinuationCallable<TrustedDomainState<Contract>> | undefined;\n fxForState(\n state: TrustedState<Contract>,\n ): ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n buildContext(\n state: TrustedState<Contract>,\n ): ActionContext<TrustedDomainState<Contract>, TrustedManifest<Contract>>;\n buildRuntimeArgs<Extra extends object>(\n state: TrustedState<Contract>,\n extra: Extra,\n options?: {\n q?: TableQueriesOfState<TrustedDomainState<Contract>>;\n derived?: DerivedResolver;\n fx?: ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n random?: RandomHelpers;\n },\n ): ActionContext<TrustedDomainState<Contract>, TrustedManifest<Contract>> &\n TrustedRuntimeHelpers<Contract> & {\n fx: ReturnType<typeof createReducerFx<TrustedState<Contract>>>;\n q: ReturnType<typeof createStateQueries<TrustedDomainState<Contract>>>;\n derived: ReturnType<\n typeof createDerivedResolver<TrustedDomainState<Contract>>\n >;\n runtime: Omit<TrustedState<Contract>[\"runtime\"], \"rng\">;\n random: RandomHelpers;\n } & Extra;\n}\n\nexport function createTrustedRuntimeScope<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: TrustedDefinition<Contract, Definitions, Views>,\n): TrustedRuntimeScope<Contract, Definitions, Views> {\n type DomainState = TrustedDomainState<Contract>;\n type SessionState = TrustedSessionState<Contract>;\n type State = TrustedState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n const registry = collectTrustedRuntimeRegistry(definition);\n const { phaseEntries } = registry;\n const defaultInitialPhase = resolveDefaultInitialPhase(\n definition.initialPhase as PhaseName | undefined,\n phaseEntries,\n );\n const { manifestSetupProfilesById, reducerSetupProfiles } =\n resolveTrustedSetupProfiles(definition);\n\n function toDomainState(state: State): DomainState {\n return codecToDomainState<State, DomainState>(state);\n }\n\n function toCombinedState(session: SessionState): State {\n return codecToCombinedState<SessionState, State>(session);\n }\n\n function toSessionState(state: State): SessionState {\n return codecToSessionState<State, DomainState, SessionState>(\n state,\n toDomainState,\n );\n }\n\n function phaseRegistryByName(\n phaseName: PhaseName,\n ): TrustedPhaseRegistry<Contract, Definitions, Views> | undefined {\n return registry.phasesByName.get(phaseName);\n }\n\n function phaseByName(phaseName: PhaseName): TrustedErasedPhase<Contract> {\n const phaseRegistry = phaseRegistryByName(phaseName);\n if (!phaseRegistry) {\n throw new Error(`Unknown reducer phase '${phaseName}'.`);\n }\n return phaseRegistry.phase;\n }\n\n function findInteractionInPhase(\n phaseName: PhaseName,\n interactionId: string,\n ): AnyInteractionSpec<DomainState, Manifest> | undefined {\n const found = interactionEntriesForPhase(phaseName).find(\n ([id]) => id === interactionId,\n );\n return found?.[1];\n }\n\n function interactionEntriesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.interactions ?? [];\n }\n\n function stagesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.stages ?? [];\n }\n\n function zonesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.zones ?? [];\n }\n\n function cardActionEntriesForPhase(phaseName: PhaseName) {\n return phaseRegistryByName(phaseName)?.cardActions ?? [];\n }\n\n function continuationById(id: string) {\n return registry.continuationsById.get(id);\n }\n\n const helpers: TrustedRuntimeHelpers<Contract> = {\n ...runtimeResultHelpers,\n ops: createReducerOps<DomainState>(),\n };\n\n function fxForState(state: State) {\n return trustedFxForState<Contract>(state);\n }\n\n function buildContext(state: State): ActionContext<DomainState, Manifest> {\n return buildTrustedContext<Contract>(state, definition.contract.manifest);\n }\n\n function buildRuntimeArgs<Extra extends object>(\n state: State,\n extra: Extra,\n options?: {\n q?: TableQueriesOfState<DomainState>;\n derived?: DerivedResolver;\n fx?: ReturnType<typeof createReducerFx<State>>;\n random?: RandomHelpers;\n },\n ) {\n return buildTrustedRuntimeArgs<Contract, Extra>(\n state,\n definition.contract.manifest,\n helpers,\n toDomainState,\n extra,\n options,\n );\n }\n\n return {\n definition,\n registry,\n phaseEntries,\n defaultInitialPhase,\n manifestSetupProfilesById,\n reducerSetupProfiles: reducerSetupProfiles as NonNullable<\n TrustedDefinition<Contract, Definitions, Views>[\"setupProfiles\"]\n >,\n runtimeHelpers: helpers,\n toDomainState,\n toCombinedState,\n toSessionState,\n phaseRegistryByName,\n phaseByName,\n findInteractionInPhase,\n interactionEntriesForPhase,\n stagesForPhase,\n zonesForPhase,\n cardActionEntriesForPhase,\n continuationById,\n fxForState,\n buildContext,\n buildRuntimeArgs,\n };\n}\n","import type { DispatchTraceEntry } from \"../../core/types\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport type { RuntimePayload } from \"../../model\";\nimport { createRuntimeInstructionEngine } from \"../../engine/runtime-instruction-engine\";\nimport type {\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerResult,\n RuntimeRngState,\n ViewMapOf,\n} from \"../../model\";\nimport type { createInteractionResolver } from \"./interaction-resolver\";\nimport type { createLifecycleRunner } from \"./lifecycle-runner\";\nimport { createEngineInstructionResolver } from \"./engine-instruction-resolver\";\nimport { createFlowInstructionResolver } from \"./flow-instruction-resolver\";\nimport {\n createMutableRandomHelpers,\n sampleRngCollectorValue,\n} from \"./rng-sampler\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n simultaneousSubmitInteraction,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n} from \"./simultaneous-player\";\nimport {\n normalizeResult,\n rejectResult,\n type TrustedDomainState,\n type TrustedInput,\n type TrustedManifest,\n type TrustedPhaseName,\n type TrustedPlayerId,\n type TrustedRuntimeScope,\n type TrustedState,\n} from \"./runtime-scope\";\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, Views>>;\n\ntype LifecycleRunnerFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createLifecycleRunner<Contract, Definitions, Views>>;\n\nexport function createTrustedInstructionRunner<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n interactions: InteractionResolverFor<Contract, Definitions, Views>,\n lifecycle: LifecycleRunnerFor<Contract, Definitions, Views>,\n) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n const flowInstructions = createFlowInstructionResolver(lifecycle);\n const engineInstructions = createEngineInstructionResolver<\n Contract,\n Definitions,\n Views\n >();\n\n type RuntimeRngResult = { runtimeRng?: RuntimeRngState };\n\n function reduceInternal(\n state: State,\n input: ReducerInput,\n ): ReducerResult<DomainState> & RuntimeRngResult {\n const ctx = scope.buildContext(state);\n\n if (input.kind === \"interaction\") {\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(\n phaseName,\n input.interactionId,\n );\n if (!interaction) {\n return rejectResult(\n \"unsupported-action\",\n `Interaction '${input.interactionId}' is not available in phase '${state.flow.currentPhase}'.`,\n );\n }\n const parsed = interactions.parseInteractionParams(\n interaction,\n input.params,\n { playerId: input.playerId },\n );\n if (!parsed.ok) {\n return rejectResult(\"invalid-action-params\", parsed.message);\n }\n const random = createMutableRandomHelpers(state.runtime.rng);\n const result = normalizeResult(\n interaction.reduce(\n scope.buildRuntimeArgs(\n state,\n {\n ...ctx,\n state: scope.toDomainState(state),\n input: {\n playerId: input.playerId,\n params: parsed.params,\n },\n },\n { random: random.random },\n ),\n ) as ReducerResult<DomainState>,\n scope.toDomainState(state),\n );\n return result.type === \"accept\"\n ? { ...result, runtimeRng: random.currentRng() }\n : result;\n }\n\n if (input.kind === \"continuation\") {\n const continuation = scope.continuationById(input.continuationId);\n if (!continuation) {\n return rejectResult(\n \"missing-continuation\",\n `Continuation '${input.continuationId}' was not registered.`,\n );\n }\n const random = createMutableRandomHelpers(state.runtime.rng);\n const result = normalizeResult(\n continuation.reduce(\n scope.buildRuntimeArgs(\n state,\n {\n ...ctx,\n state: scope.toDomainState(state),\n input: {\n source: \"effect\" as const,\n effectKind: input.effectKind,\n data: input.resumeData,\n response: input.response,\n },\n },\n { random: random.random },\n ),\n ),\n scope.toDomainState(state),\n );\n return result.type === \"accept\"\n ? { ...result, runtimeRng: random.currentRng() }\n : result;\n }\n\n return scope.runtimeHelpers.accept(scope.toDomainState(state));\n }\n\n function preSampleRngForAction(\n state: State,\n input: ReducerInput,\n ): { state: State; input: ReducerInput } {\n if (input.kind !== \"interaction\") return { state, input };\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(\n phaseName,\n input.interactionId,\n );\n if (!interaction) return { state, input };\n const collectors = interaction.inputs as Record<string, InputCollector>;\n let nextRng = state.runtime.rng;\n const sampled: Record<string, unknown> = {};\n let anySampled = false;\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind !== \"rng\") continue;\n const { value, nextRng: advanced } = sampleRngCollectorValue(\n collector,\n nextRng,\n );\n sampled[key] = value;\n nextRng = advanced;\n anySampled = true;\n }\n if (!anySampled) return { state, input };\n const mergedParams: Record<string, unknown> = {\n ...((input.params ?? {}) as Record<string, unknown>),\n ...sampled,\n };\n return {\n state: {\n ...state,\n runtime: { ...state.runtime, rng: nextRng },\n } as State,\n input: { ...input, params: mergedParams } as ReducerInput,\n };\n }\n\n function clearSimultaneousCurrent(state: State): State {\n return {\n ...state,\n runtime: {\n ...state.runtime,\n simultaneous: { current: null },\n },\n } as State;\n }\n\n function reduceSimultaneousSubmit(\n state: State,\n input: ReducerInput,\n ): ReducerResult<State> | null {\n if (\n input.kind !== \"interaction\" ||\n input.interactionId !== SIMULTANEOUS_SUBMIT_INTERACTION_ID\n ) {\n return null;\n }\n\n const phaseName = state.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (!isSimultaneousPhase(phase)) {\n return null;\n }\n\n const submit = simultaneousSubmitInteraction(scope.phaseByName(phaseName));\n if (!submit) {\n return rejectResult(\n \"missing-submit-interaction\",\n `Simultaneous phase '${phaseName}' does not declare submit.`,\n );\n }\n const resolve = (phase as { resolve?: unknown }).resolve;\n if (typeof resolve !== \"function\") {\n return rejectResult(\n \"missing-simultaneous-resolve\",\n `Simultaneous phase '${phaseName}' does not declare resolve.`,\n );\n }\n\n const actors = resolveSimultaneousActors(scope, state, phase);\n if (!actors.includes(input.playerId as PlayerId)) {\n return rejectResult(\n \"NOT_YOUR_TURN\",\n `It is not your turn (interaction '${input.interactionId}').`,\n );\n }\n\n const parsed = interactions.parseInteractionParams(submit, input.params);\n if (!parsed.ok) {\n return rejectResult(\"invalid-action-params\", parsed.message);\n }\n\n const current =\n state.runtime.simultaneous?.current?.phaseName === phaseName\n ? state.runtime.simultaneous.current\n : {\n phaseName,\n actors,\n submissions: {},\n };\n const existing = current.submissions[input.playerId as PlayerId];\n const canResubmit =\n (phase as { canResubmit?: boolean }).canResubmit === true;\n if (existing && !canResubmit) {\n return rejectResult(\n \"ALREADY_SUBMITTED\",\n `Interaction '${input.interactionId}' has already been submitted by '${input.playerId}'.`,\n );\n }\n\n const submissions: Record<\n string,\n { interactionId: string; params: RuntimePayload }\n > = {\n ...current.submissions,\n [input.playerId]: {\n interactionId: input.interactionId,\n params: parsed.params as RuntimePayload,\n },\n };\n const stateWithSubmission = {\n ...state,\n runtime: {\n ...state.runtime,\n simultaneous: {\n current: {\n phaseName,\n actors,\n submissions,\n },\n },\n },\n } as State;\n const waitingPlayerIds = actors.filter((actor) => !submissions[actor]);\n if (waitingPlayerIds.length > 0) {\n return {\n type: \"accept\",\n state: stateWithSubmission,\n instructions: [],\n };\n }\n\n const resolvedSubmissions = Object.fromEntries(\n actors.map((actor) => [\n actor,\n {\n playerId: actor,\n params: submissions[actor]?.params ?? {},\n },\n ]),\n );\n const random = createMutableRandomHelpers(stateWithSubmission.runtime.rng);\n const resolved = normalizeResult(\n resolve(\n scope.buildRuntimeArgs(\n stateWithSubmission,\n {\n state: scope.toDomainState(stateWithSubmission),\n submissions: resolvedSubmissions,\n submittedPlayerIds: [...actors],\n waitingPlayerIds: [],\n },\n { random: random.random },\n ),\n ) as ReducerResult<DomainState>,\n scope.toDomainState(stateWithSubmission),\n );\n if (resolved.type === \"reject\") {\n return resolved;\n }\n return {\n type: \"accept\",\n state: clearSimultaneousCurrent({\n ...resolved.state,\n runtime: { ...stateWithSubmission.runtime, rng: random.currentRng() },\n } as State),\n instructions: resolved.instructions ?? [],\n };\n }\n\n function reduceOnce(state: State, input: ReducerInput): ReducerResult<State> {\n const sampled = preSampleRngForAction(state, input);\n const simultaneousResult = reduceSimultaneousSubmit(\n sampled.state,\n sampled.input,\n );\n if (simultaneousResult) {\n return simultaneousResult;\n }\n const result = reduceInternal(sampled.state, sampled.input);\n if (result.type === \"reject\") {\n return result;\n }\n return {\n type: \"accept\" as const,\n state: {\n ...result.state,\n runtime: {\n ...sampled.state.runtime,\n rng: result.runtimeRng ?? sampled.state.runtime.rng,\n },\n } as State,\n instructions: result.instructions ?? [],\n };\n }\n\n function resolveInstruction(\n state: State,\n instruction: RuntimeInstructionForState<State>,\n ): {\n state: State;\n queuedInputs: ReducerInput[];\n queuedInstructions: RuntimeInstructionForState<State>[];\n trace: DispatchTraceEntry<State, PlayerId, ReducerInput>[];\n } {\n switch (instruction.kind) {\n case \"flow.transition\":\n return flowInstructions.resolveTransition(state, instruction);\n case \"engine.rollDie\":\n return engineInstructions.resolveRollDie(state, instruction);\n case \"engine.shuffleSharedZone\":\n return engineInstructions.resolveShuffleSharedZone(state, instruction);\n case \"engine.shufflePlayerZone\":\n return engineInstructions.resolveShufflePlayerZone(state, instruction);\n default: {\n const _exhaustive: never = instruction;\n throw new Error(\n `Unknown runtime instruction kind: ${(_exhaustive as { kind: string }).kind}`,\n );\n }\n }\n }\n\n const instructionEngine = createRuntimeInstructionEngine<\n State,\n PlayerId,\n ReducerInput\n >({\n reduce(state, input) {\n return reduceOnce(state, input);\n },\n resolveInstruction,\n });\n\n return {\n resolveInstruction,\n dispatch: instructionEngine.dispatch,\n drainInstructions: instructionEngine.drainInstructions,\n reduceInternal,\n reduceOnce,\n };\n}\n","import { z } from \"zod\";\n\nexport function formatIssue(\n label: string,\n issue: { path: PropertyKey[]; message: string },\n): string {\n const path = issue.path\n .map((segment) =>\n typeof segment === \"symbol\" ? segment.toString() : String(segment),\n )\n .join(\".\");\n return `${path || label}: ${issue.message}`;\n}\n\nexport function safeParseOrThrow<Schema extends z.ZodTypeAny>(\n schema: Schema,\n value: unknown,\n label: string,\n): z.output<Schema> {\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n const message = parsed.error.issues\n .map((issue) => formatIssue(label, issue))\n .join(\"; \");\n throw new Error(message || `Invalid ${label}`);\n }\n return parsed.data;\n}\n","import type {\n AnyInteractionSpec,\n InputCollectorKind,\n InputDomainDescriptor,\n InteractionIdOfDefinition,\n InteractionKind,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerValidationResult,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n TrustedDefinition,\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { ProjectionContext } from \"./projection-context\";\n\nexport type TrustedInteractionId<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = InteractionIdOfDefinition<TrustedDefinition<Contract, Definitions, Views>>;\n\nexport type InteractionDescriptorContext<PlayerId extends string = string> = {\n to: PlayerId;\n title?: string;\n options?: Array<{ id: string; label?: string }>;\n};\n\nexport type InteractionCommitPolicyShape =\n | { mode: \"manual\" }\n | { mode: \"autoWhenReady\" };\n\nexport type InteractionDescriptorShape<\n PhaseName extends string = string,\n InteractionId extends string = string,\n PlayerId extends string = string,\n ZoneId extends string = string,\n> = {\n phaseName: PhaseName;\n interactionKey: `${PhaseName}.${InteractionId}`;\n interactionId: InteractionId;\n kind: InteractionKind;\n commit: InteractionCommitPolicyShape;\n zoneId?: ZoneId;\n zoneIds?: readonly ZoneId[];\n inputs: InteractionInputDescriptorShape[];\n cost?: Record<string, number>;\n currentResources?: Record<string, number>;\n missingResources?: Record<string, number>;\n available: boolean;\n unavailableReason?: string;\n context?: InteractionDescriptorContext<PlayerId>;\n};\n\nexport type TrustedInteractionDescriptorShape<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = InteractionDescriptorShape<\n TrustedPhaseName<Contract, Definitions, Views>,\n TrustedInteractionId<Contract, Definitions, Views>,\n TrustedPlayerId<Contract>\n>;\n\nexport type InteractionInputDescriptorShape = {\n key: string;\n kind: InputCollectorKind;\n domain: InputDomainDescriptor;\n defaultValue?: unknown;\n};\n\nexport type InteractionActorAuthorization<PlayerId extends string> =\n | { readonly mode: \"addressees\"; readonly addressees: ReadonlySet<PlayerId> }\n | { readonly mode: \"actors\"; readonly actors: ReadonlySet<PlayerId> }\n | { readonly mode: \"active\" };\n\nexport type ResolveDecisionMode = \"descriptor\" | \"card\" | \"submit\";\n\nexport type ResolveDecisionInput<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = {\n state: TrustedState<Contract>;\n playerId: TrustedPlayerId<Contract>;\n interactionId: string;\n params?: Record<string, unknown>;\n mode: ResolveDecisionMode;\n projection?: ProjectionContext<\n TrustedDomainState<Contract>,\n TrustedState<Contract>\n >;\n};\n\nexport type InteractionDecisionResult<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> =\n | {\n found: false;\n validation: ReducerValidationResult;\n }\n | {\n found: true;\n interaction: AnyInteractionSpec<\n TrustedDomainState<Contract>,\n TrustedManifest<Contract>\n >;\n parsedParams: Record<string, unknown>;\n visible: boolean;\n descriptor: TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n Views\n >;\n validation: ReducerValidationResult;\n };\n\nexport function makeValidationError(\n errorCode: string,\n message?: string,\n): ReducerValidationResult {\n return {\n valid: false,\n errorCode,\n message,\n };\n}\n","import { formatIssue } from \"../../parse-utils\";\nimport { createDerivedResolver, type DerivedResolver } from \"../../derived\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n CollectorState,\n InputCollector,\n InputDomainDescriptor,\n InputSelectionDescriptor,\n ManifestContract,\n ReducerValidationResult,\n TableQueriesOfState,\n TableOfState,\n} from \"../../model\";\nimport { makeValidationError } from \"./interaction-types\";\nimport type { InteractionInputDescriptorShape } from \"./interaction-types\";\n\ntype CollectorProjectionOptions<DomainState extends CollectorState> = {\n readonly queries?: TableQueriesOfState<DomainState>;\n readonly derived?: DerivedResolver;\n readonly eligibleTargetCache?: Map<string, string[]>;\n readonly eligibleTargetCachePrefix?: string;\n readonly includeEligibleTargets?: boolean;\n};\n\nfunction collectTargetDomainMetadata(\n collector: InputCollector,\n): Pick<\n Extract<InputDomainDescriptor, { type: \"target\" }>,\n \"targetKind\" | \"boardId\" | \"zoneId\" | \"zoneIds\"\n> {\n switch (collector.kind) {\n case \"card\": {\n const meta = collector.meta ?? {};\n return {\n targetKind: meta.targetKind ?? \"card\",\n zoneId: meta.zoneId,\n zoneIds:\n meta.zoneIds ??\n (meta.zoneId === undefined ? undefined : [meta.zoneId]),\n };\n }\n case \"board-edge\":\n case \"board-space\":\n case \"board-tile\":\n case \"board-vertex\": {\n const meta = collector.meta ?? {};\n return {\n targetKind: meta.targetKind ?? collector.kind.replace(\"board-\", \"\"),\n boardId: meta.boardId,\n };\n }\n default:\n return {};\n }\n}\n\nfunction isTargetCollector(collector: InputCollector): boolean {\n return (\n collector.kind === \"card\" ||\n collector.kind === \"board-edge\" ||\n collector.kind === \"board-space\" ||\n collector.kind === \"board-tile\" ||\n collector.kind === \"board-vertex\"\n );\n}\n\nfunction withSelection(\n domain: InputDomainDescriptor,\n collector: InputCollector,\n): InputDomainDescriptor {\n if (!collector.selection) return domain;\n return { ...domain, selection: collector.selection };\n}\n\nfunction finiteValuesForDependency(\n key: string,\n domain: InputDomainDescriptor | undefined,\n): string[] {\n if (!domain) {\n throw new Error(\n `Interaction input '${key}' is declared as a dependency before it has a projected domain.`,\n );\n }\n if (domain.type === \"target\") {\n if (!domain.eligibleTargets) {\n throw new Error(\n `Interaction input '${key}' cannot be used as a dependency because its target domain is not finite.`,\n );\n }\n return [...domain.eligibleTargets];\n }\n if (domain.type === \"choice\") {\n return domain.choices.map((choice) => choice.value);\n }\n throw new Error(\n `Interaction input '${key}' cannot be used as a dependency. V1 supports finite target and choice dependencies only.`,\n );\n}\n\nfunction cartesianDependencyTuples(\n dependencies: readonly string[],\n domainsByKey: Record<string, InputDomainDescriptor>,\n): Array<Record<string, string>> {\n return dependencies.reduce<Array<Record<string, string>>>(\n (tuples, key) => {\n const values = finiteValuesForDependency(key, domainsByKey[key]);\n return tuples.flatMap((tuple) =>\n values.map((value) => ({ ...tuple, [key]: value })),\n );\n },\n [{}],\n );\n}\n\nfunction withoutDependentProjection(\n domain: InputDomainDescriptor,\n): InputDomainDescriptor {\n const {\n dependsOn: _dependsOn,\n dependentCases: _dependentCases,\n ...rest\n } = domain;\n return rest as InputDomainDescriptor;\n}\n\nfunction unsupportedDefaultInputError(key: string, collector: InputCollector) {\n return new Error(\n `Interaction input '${key}' uses a '${collector.kind}' collector without a default-renderable domain or target metadata. ` +\n \"Use formInput.choice(...), formInput.choiceList(...), formInput.number(...), formInput.resourceMap(...), cardInput(...), or boardInput(...). \" +\n \"For custom payloads, use a custom interaction surface with paramsSchema instead of the default InteractionForm.\",\n );\n}\n\nexport function interactionInputsOf<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n): Record<string, InputCollector> {\n return interaction.inputs as Record<string, InputCollector>;\n}\n\nexport function collectEligibleTargets<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n options: CollectorProjectionOptions<DomainState> = {},\n): Record<string, string[]> {\n const collectors = interactionInputsOf(interaction);\n const result: Record<string, string[]> = {};\n let queriesLazy: TableQueriesOfState<DomainState> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ) as unknown as TableQueriesOfState<DomainState>);\n for (const [key, collector] of Object.entries(collectors)) {\n if (!collector.eligibleTargets) continue;\n const cacheKey = options.eligibleTargetCachePrefix\n ? `${options.eligibleTargetCachePrefix}:${key}`\n : null;\n const cached = cacheKey\n ? options.eligibleTargetCache?.get(cacheKey)\n : undefined;\n if (cached) {\n result[key] = cached;\n continue;\n }\n const targets = collector.eligibleTargets(\n domainState as unknown as Parameters<\n NonNullable<typeof collector.eligibleTargets>\n >[0],\n playerId as unknown as Parameters<\n NonNullable<typeof collector.eligibleTargets>\n >[1],\n queries() as unknown as Parameters<\n NonNullable<typeof collector.eligibleTargets>\n >[2],\n );\n const resolved = Array.from(targets as ReadonlyArray<unknown>).map((t) =>\n String(t),\n );\n result[key] = resolved;\n if (cacheKey) {\n options.eligibleTargetCache?.set(cacheKey, resolved);\n }\n }\n return result;\n}\n\nexport function collectInputMetadata<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n): Record<\n string,\n {\n kind: string;\n targetKind?: string;\n boardId?: string;\n zoneId?: string;\n zoneIds?: readonly string[];\n }\n> {\n const collectors = interactionInputsOf(interaction);\n return Object.fromEntries(\n Object.entries(collectors).map(([key, collector]) => [\n key,\n {\n kind: collector.kind,\n ...collectTargetDomainMetadata(collector),\n },\n ]),\n );\n}\n\nexport function collectInputDomains<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n eligibleTargets: Record<string, string[]>,\n options: CollectorProjectionOptions<DomainState> = {},\n): Record<string, InputDomainDescriptor> {\n const collectors = interactionInputsOf(interaction);\n let queriesLazy: TableQueriesOfState<DomainState> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ) as unknown as TableQueriesOfState<DomainState>);\n let derivedLazy: DerivedResolver | null = options.derived ?? null;\n const derived = () =>\n (derivedLazy ??= createDerivedResolver(domainState, { q: queries() }));\n const result: Record<string, InputDomainDescriptor> = {};\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\") {\n continue;\n }\n if (collector.kind === \"prompt\") {\n const optionFactory = collector.meta?.options;\n if (!optionFactory) continue;\n result[key] = {\n type: \"choice\",\n choices: optionFactory(domainState, playerId, queries() as unknown).map(\n (option) => ({\n value: String(option.id),\n label: option.label ?? String(option.id),\n ...(() => {\n const issue = collector.validateTarget?.(\n domainState,\n playerId,\n queries() as unknown,\n String(option.id),\n );\n return issue\n ? {\n disabled: true,\n disabledReason: issue.message ?? issue.errorCode,\n }\n : {};\n })(),\n }),\n ),\n };\n continue;\n }\n if (collector.domain) {\n const dependencies = collector.dependsOn ?? [];\n const baseDomain = withSelection(\n collector.domain(\n domainState,\n playerId as string,\n queries() as unknown,\n derived(),\n {},\n ) as (typeof result)[string],\n collector,\n );\n if (dependencies.length === 0) {\n result[key] = baseDomain;\n continue;\n }\n const dependentCases = cartesianDependencyTuples(\n dependencies,\n result,\n ).map((values) => ({\n when: values,\n domain: withoutDependentProjection(\n withSelection(\n collector.domain?.(\n domainState,\n playerId as string,\n queries() as unknown,\n derived(),\n values,\n ) as InputDomainDescriptor,\n collector,\n ),\n ),\n }));\n result[key] = {\n ...baseDomain,\n dependsOn: dependencies,\n dependentCases,\n };\n continue;\n }\n const targets = eligibleTargets[key];\n const targetMetadata = collectTargetDomainMetadata(collector);\n if (\n isTargetCollector(collector) ||\n Boolean(collector.eligibleTargets) ||\n Boolean(collector.validateTarget) ||\n targets ||\n Object.keys(targetMetadata).length > 0\n ) {\n result[key] = withSelection(\n {\n type: \"target\",\n ...targetMetadata,\n ...(targets ? { eligibleTargets: targets } : {}),\n },\n collector,\n );\n continue;\n }\n throw unsupportedDefaultInputError(key, collector);\n }\n return result;\n}\n\nexport function collectInteractionInputs<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n options: CollectorProjectionOptions<DomainState> = {},\n): InteractionInputDescriptorShape[] {\n const collectors = interactionInputsOf(interaction);\n const dependencyKeys = new Set(\n Object.values(collectors).flatMap((collector) => [\n ...(collector.dependsOn ?? []),\n ]),\n );\n const collectedEligibleTargets =\n options.includeEligibleTargets === false && dependencyKeys.size === 0\n ? {}\n : collectEligibleTargets(interaction, domainState, playerId, options);\n const eligibleTargets =\n options.includeEligibleTargets === false\n ? Object.fromEntries(\n Object.entries(collectedEligibleTargets).filter(([key]) =>\n dependencyKeys.has(key),\n ),\n )\n : collectedEligibleTargets;\n const domainsByKey = collectInputDomains(\n interaction,\n domainState,\n playerId,\n eligibleTargets,\n options,\n );\n let queriesLazy: TableQueriesOfState<DomainState> | null =\n options.queries ?? null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ) as unknown as TableQueriesOfState<DomainState>);\n let derivedLazy: DerivedResolver | null = options.derived ?? null;\n const derived = () =>\n (derivedLazy ??= createDerivedResolver(domainState, { q: queries() }));\n return Object.entries(collectors).flatMap(([key, collector]) => {\n if (collector.kind === \"rng\") {\n return [];\n }\n const domain = domainsByKey[key];\n if (!domain && collector.kind === \"prompt\") {\n return [];\n }\n if (!domain) {\n throw unsupportedDefaultInputError(key, collector);\n }\n const dynamicDefault = collector.resolveDefaultValue?.(\n domainState,\n playerId as string,\n queries() as unknown,\n derived(),\n domain,\n );\n return [\n {\n key,\n kind: collector.kind,\n domain,\n ...(\"defaultValue\" in collector\n ? { defaultValue: collector.defaultValue }\n : dynamicDefault !== undefined\n ? { defaultValue: dynamicDefault }\n : {}),\n },\n ];\n });\n}\n\nexport function collectFirstCardZoneId<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(interaction: AnyInteractionSpec<DomainState, Manifest>): string | undefined {\n const collectors = interactionInputsOf(interaction);\n for (const collector of Object.values(collectors)) {\n if (collector.kind === \"card\") {\n if (collector.meta.zoneId.length > 0) {\n return collector.meta.zoneId;\n }\n }\n }\n return undefined;\n}\n\nexport function collectCardZoneIds<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(interaction: AnyInteractionSpec<DomainState, Manifest>): readonly string[] {\n const collectors = interactionInputsOf(interaction);\n const zoneIds = new Set<string>();\n for (const collector of Object.values(collectors)) {\n if (collector.kind === \"card\") {\n for (const zoneId of collector.meta.zoneIds ?? [collector.meta.zoneId]) {\n if (zoneId.length > 0) zoneIds.add(zoneId);\n }\n }\n }\n return [...zoneIds];\n}\n\nexport function collectPromptOptions(\n interaction: {\n inputs: Record<string, InputCollector>;\n },\n domainState: unknown,\n playerId: string,\n queries: unknown,\n): Array<{ id: string; label?: string }> | undefined {\n for (const collector of Object.values(interaction.inputs)) {\n if (collector.kind !== \"prompt\") continue;\n const factory = collector.meta?.options;\n if (!factory) continue;\n return factory(domainState, playerId, queries).map((option) => ({\n id: String(option.id),\n ...(option.label !== undefined ? { label: option.label } : {}),\n }));\n }\n return undefined;\n}\n\nexport function parseInteractionParams<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n rawParams: unknown,\n options: { skipRng?: boolean; playerId?: string } = {},\n):\n | { ok: true; params: Record<string, unknown> }\n | { ok: false; message: string } {\n const collectors = interactionInputsOf(interaction);\n const record = (rawParams ?? {}) as Record<string, unknown>;\n if (options.skipRng && interaction.paramsSchema) {\n const result = interaction.paramsSchema.safeParse(record);\n if (!result.success) {\n return {\n ok: false,\n message: result.error.issues\n .map((issue) => formatIssue(\"params\", issue))\n .join(\"; \"),\n };\n }\n return { ok: true, params: result.data as Record<string, unknown> };\n }\n const parsed: Record<string, unknown> = {};\n const issues: string[] = [];\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\" && options.skipRng) continue;\n const rawValueBase =\n record[key] === undefined && \"defaultValue\" in collector\n ? collector.defaultValue\n : record[key];\n const rawValue =\n collector.kind === \"board-space\" &&\n collector.meta?.valueKind === \"player-board-space\" &&\n typeof rawValueBase === \"string\" &&\n options.playerId\n ? {\n boardId: collector.meta.boardId,\n playerId: options.playerId,\n spaceId: rawValueBase,\n }\n : rawValueBase;\n const result = collector.schema.safeParse(rawValue);\n if (!result.success) {\n for (const issue of result.error.issues) {\n issues.push(formatIssue(`params.${key}`, issue));\n }\n continue;\n }\n parsed[key] = result.data;\n }\n if (issues.length > 0) {\n return { ok: false, message: issues.join(\"; \") };\n }\n return { ok: true, params: parsed };\n}\n\nexport function prepareInteractionProjectionParams<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n rawParams: unknown,\n): Record<string, unknown> {\n const collectors = interactionInputsOf(interaction);\n const record = (rawParams ?? {}) as Record<string, unknown>;\n const prepared: Record<string, unknown> = { ...record };\n for (const [key, collector] of Object.entries(collectors)) {\n if (collector.kind === \"rng\") continue;\n if (record[key] !== undefined) {\n const result = collector.schema.safeParse(record[key]);\n if (result.success) {\n prepared[key] = result.data;\n }\n continue;\n }\n if (\"defaultValue\" in collector) {\n prepared[key] = collector.defaultValue;\n continue;\n }\n const defaultResult = collector.schema.safeParse(undefined);\n if (defaultResult.success) {\n prepared[key] = defaultResult.data;\n }\n }\n return prepared;\n}\n\nexport function validateCollectorTargets<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n PlayerId extends string,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n domainState: DomainState,\n playerId: PlayerId,\n params: Record<string, unknown>,\n): ReducerValidationResult {\n const collectors = interactionInputsOf(interaction);\n let queriesLazy: ReturnType<typeof createStateQueries> | null = null;\n const queries = () =>\n (queriesLazy ??= createStateQueries(\n domainState as unknown as { table: CollectorState[\"table\"] },\n ));\n for (const [key, collector] of Object.entries(collectors)) {\n const selectionIssue = validateCollectorSelection(collector, params[key]);\n if (selectionIssue) {\n return makeValidationError(\n selectionIssue.errorCode,\n selectionIssue.message,\n );\n }\n if (!collector.validateTarget) continue;\n const rawTarget = params[key];\n if (rawTarget === null || rawTarget === undefined) continue;\n const values = valuesForCollectorValidation(collector.selection, rawTarget);\n for (const value of values) {\n const issue = collector.validateTarget(\n domainState as unknown as Parameters<\n typeof collector.validateTarget\n >[0],\n playerId as unknown as Parameters<typeof collector.validateTarget>[1],\n queries() as unknown as Parameters<typeof collector.validateTarget>[2],\n value,\n );\n if (issue) {\n return makeValidationError(issue.errorCode, issue.message);\n }\n }\n }\n return { valid: true };\n}\n\nfunction valuesForCollectorValidation(\n selection: InputSelectionDescriptor | undefined,\n value: unknown,\n): readonly unknown[] {\n if (selection?.mode === \"many\") {\n return Array.isArray(value) ? value : [];\n }\n return [value];\n}\n\nfunction validateCollectorSelection(\n collector: InputCollector,\n value: unknown,\n): { errorCode: string; message?: string } | null {\n const selection = collector.selection;\n if (selection?.mode !== \"many\") return null;\n if (!Array.isArray(value)) return null;\n if (value.length < selection.min) {\n return {\n errorCode: \"INVALID_INPUT_COUNT\",\n message: `Input expected at least ${selection.min} value${selection.min === 1 ? \"\" : \"s\"}.`,\n };\n }\n if (selection.max !== undefined && value.length > selection.max) {\n return {\n errorCode: \"INVALID_INPUT_COUNT\",\n message: `Input expected at most ${selection.max} value${selection.max === 1 ? \"\" : \"s\"}.`,\n };\n }\n if (selection.distinct) {\n const seen = new Set<string>();\n for (const item of value) {\n const key = stableValueKey(item);\n if (seen.has(key)) {\n return {\n errorCode: \"DUPLICATE_INPUT_VALUE\",\n message: \"Input values must be distinct.\",\n };\n }\n seen.add(key);\n }\n }\n return null;\n}\n\nfunction stableValueKey(value: unknown): string {\n if (value === null) return \"null\";\n switch (typeof value) {\n case \"string\":\n return `string:${value}`;\n case \"number\":\n case \"boolean\":\n case \"undefined\":\n return `${typeof value}:${String(value)}`;\n default:\n return `json:${JSON.stringify(value)}`;\n }\n}\n\nexport function findCardInputKey<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(interaction: AnyInteractionSpec<DomainState, Manifest>): string | undefined {\n return Object.entries(interactionInputsOf(interaction)).find(\n ([, collector]) => collector.kind === \"card\",\n )?.[0];\n}\n\nexport function findCardInputKeyForZone<\n DomainState extends CollectorState,\n Manifest extends ManifestContract<TableOfState<DomainState>>,\n>(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n zoneId: string,\n): string | undefined {\n return Object.entries(interactionInputsOf(interaction)).find(\n ([, collector]) =>\n collector.kind === \"card\" &&\n (collector.meta.zoneIds ?? [collector.meta.zoneId])\n .map(String)\n .includes(zoneId),\n )?.[0];\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { InteractionActorAuthorization } from \"./interaction-types\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n} from \"./simultaneous-player\";\n\nfunction resolvePromptToSet<PlayerId extends string>(\n to: unknown,\n): ReadonlySet<PlayerId> {\n if (to === undefined || to === null) return new Set();\n if (Array.isArray(to)) {\n return new Set(to as PlayerId[]);\n }\n if (typeof to === \"string\") {\n return new Set([to as PlayerId]);\n }\n return new Set();\n}\n\nexport function createInteractionAuthorization<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function resolveInteractionActorAuthorization(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n projection?: ProjectionContext<DomainState, State>,\n ): InteractionActorAuthorization<PlayerId> {\n if (interaction.to) {\n const resolved = interaction.to({\n ...scope.buildContext(state),\n state: projection?.domainState ?? scope.toDomainState(state),\n });\n return {\n mode: \"addressees\",\n addressees: resolvePromptToSet<PlayerId>(resolved),\n };\n }\n if (interaction.actor) {\n const resolved = interaction.actor({\n ...scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n });\n return {\n mode: \"actors\",\n actors: resolvePromptToSet<PlayerId>(resolved),\n };\n }\n const phase = scope.phaseByName(state.flow.currentPhase as PhaseName);\n if (isSimultaneousPhase(phase)) {\n return {\n mode: \"actors\",\n actors: new Set(\n resolveSimultaneousActors(scope, state, phase, projection),\n ),\n };\n }\n if (phase.actor) {\n const resolved = phase.actor({\n ...scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n },\n projection,\n ),\n });\n return {\n mode: \"actors\",\n actors: resolvePromptToSet<PlayerId>(resolved),\n };\n }\n return { mode: \"active\" };\n }\n\n function isActorAuthorized(\n state: State,\n playerId: PlayerId,\n authorization: InteractionActorAuthorization<PlayerId>,\n ): boolean {\n if (authorization.mode === \"addressees\") {\n return authorization.addressees.has(playerId);\n }\n if (authorization.mode === \"actors\") {\n return authorization.actors.has(playerId);\n }\n const active = state.flow.activePlayers as readonly PlayerId[];\n if (active.length === 0) {\n return true;\n }\n return active.includes(playerId);\n }\n\n function isInteractionVisible(\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n authorization: InteractionActorAuthorization<PlayerId>,\n authorized: boolean,\n ): boolean {\n return (\n !(authorization.mode === \"addressees\" && !authorized) &&\n !(interaction.visibility === \"actorsOnly\" && !authorized)\n );\n }\n\n return {\n isActorAuthorized,\n isInteractionVisible,\n resolveInteractionActorAuthorization,\n };\n}\n","import { createStateQueries } from \"../../table-queries\";\nimport type {\n AnyInteractionSpec,\n InputCollector,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerValidationResult,\n ViewMapOf,\n} from \"../../model\";\nimport {\n collectCardZoneIds,\n collectFirstCardZoneId,\n collectInteractionInputs,\n collectPromptOptions,\n interactionInputsOf,\n parseInteractionParams,\n prepareInteractionProjectionParams,\n validateCollectorTargets,\n} from \"./interaction-collectors\";\nimport type { createInteractionAuthorization } from \"./interaction-authorization\";\nimport type { createStageResolver } from \"./stage-resolver\";\nimport {\n makeValidationError,\n type InteractionDecisionResult,\n type InteractionDescriptorShape,\n type ResolveDecisionInput,\n type TrustedInteractionDescriptorShape,\n type TrustedInteractionId,\n} from \"./interaction-types\";\nimport type { ProjectionContext } from \"./projection-context\";\nimport {\n isSimultaneousPhase,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n} from \"./simultaneous-player\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype StageResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createStageResolver<Contract, Definitions, Views>>;\n\ntype AuthorizationFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<\n typeof createInteractionAuthorization<Contract, Definitions, Views>\n>;\n\ntype InteractionRuleIssue = {\n errorCode: string;\n message?: string;\n};\n\nfunction issueFromRule(rule: InteractionRuleIssue): InteractionRuleIssue {\n return { errorCode: rule.errorCode, message: rule.message };\n}\n\nfunction issueFromRuleValidationResult(\n rule: InteractionRuleIssue,\n result: boolean | InteractionRuleIssue | null | undefined,\n): InteractionRuleIssue | undefined {\n if (result === false) return issueFromRule(rule);\n if (result && typeof result === \"object\") return result;\n return undefined;\n}\n\nfunction humanizeInteractionId(id: string): string {\n if (!id) return id;\n const withSpaces = id\n .replace(/[-_]+/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/([A-Z]+)([A-Z][a-z])/g, \"$1 $2\")\n .trim();\n if (!withSpaces) return id;\n return withSpaces\n .split(/\\s+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\nfunction deriveInteractionKind(\n inputs: Record<string, InputCollector>,\n): \"action\" | \"prompt\" {\n for (const collector of Object.values(inputs)) {\n if (collector.kind === \"prompt\") {\n return \"prompt\";\n }\n }\n return \"action\";\n}\n\nfunction isTargetCollector(collector: InputCollector): boolean {\n switch (collector.kind) {\n case \"card\":\n case \"board-edge\":\n case \"board-space\":\n case \"board-tile\":\n case \"board-vertex\":\n return true;\n default:\n return false;\n }\n}\n\nfunction isManyCollector(collector: InputCollector): boolean {\n return collector.selection?.mode === \"many\";\n}\n\nfunction isDefaultRenderableFormCollector(collector: InputCollector): boolean {\n return collector.kind === \"form\" && collector.domain !== undefined;\n}\n\nfunction deriveCommitPolicy(\n inputs: Record<string, InputCollector>,\n explicit: InteractionDescriptorShape[\"commit\"] | undefined,\n): InteractionDescriptorShape[\"commit\"] {\n const collectors = Object.values(inputs);\n const hasManyCollector = collectors.some(isManyCollector);\n if (explicit) {\n if (explicit.mode === \"autoWhenReady\" && hasManyCollector) {\n throw new Error(\n 'Interactions with many(...) inputs must use commit: { mode: \"manual\" }.',\n );\n }\n return explicit;\n }\n if (hasManyCollector) {\n return { mode: \"manual\" };\n }\n if (collectors.some(isDefaultRenderableFormCollector)) {\n return { mode: \"manual\" };\n }\n if (collectors.length === 0 || !collectors.some(isTargetCollector)) {\n return { mode: \"manual\" };\n }\n return collectors.every(\n (collector) => isTargetCollector(collector) || collector.kind === \"rng\",\n )\n ? { mode: \"autoWhenReady\" }\n : { mode: \"manual\" };\n}\n\nfunction projectInteractionMetadata(interaction: {\n inputs: Record<string, InputCollector>;\n commit?: InteractionDescriptorShape[\"commit\"];\n}): Pick<InteractionDescriptorShape, \"kind\" | \"commit\"> {\n return {\n kind: deriveInteractionKind(interaction.inputs),\n commit: deriveCommitPolicy(interaction.inputs, interaction.commit),\n };\n}\n\nfunction enrichResourceInputPresentation(\n inputs: InteractionDescriptorShape[\"inputs\"],\n manifest: { literals?: { resourcePresentationById?: unknown } },\n): InteractionDescriptorShape[\"inputs\"] {\n const presentationById = manifest.literals?.resourcePresentationById;\n if (!presentationById || typeof presentationById !== \"object\") {\n return inputs;\n }\n const resources = presentationById as Record<\n string,\n { label?: unknown; icon?: unknown }\n >;\n const enrichChoice = <\n Choice extends { value: string; label: string; icon?: string },\n >(\n choice: Choice,\n ): Choice & { icon?: string } => {\n const presentation = resources[choice.value];\n return {\n ...choice,\n label:\n typeof presentation?.label === \"string\" &&\n (!choice.label || choice.label === choice.value)\n ? presentation.label\n : choice.label ||\n (typeof presentation?.label === \"string\" ? presentation.label : \"\"),\n icon:\n choice.icon ??\n (typeof presentation?.icon === \"string\"\n ? presentation.icon\n : undefined),\n };\n };\n return inputs.map((input) => {\n if (input.domain.type === \"choice\" || input.domain.type === \"choiceList\") {\n return {\n ...input,\n domain: {\n ...input.domain,\n choices: input.domain.choices.map(enrichChoice),\n },\n };\n }\n if (input.domain.type !== \"resourceMap\") return input;\n return {\n ...input,\n domain: {\n ...input.domain,\n resources: input.domain.resources.map((entry) => {\n const presentation = resources[entry.resourceId];\n return {\n ...entry,\n label:\n entry.label ??\n (typeof presentation?.label === \"string\"\n ? presentation.label\n : undefined),\n icon:\n entry.icon ??\n (typeof presentation?.icon === \"string\"\n ? presentation.icon\n : undefined),\n };\n }),\n },\n };\n });\n}\n\nexport function createInteractionDecisionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n stages: StageResolverFor<Contract, Definitions, Views>,\n authorization: AuthorizationFor<Contract, Definitions, Views>,\n) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n type InteractionId = TrustedInteractionId<Contract, Definitions, Views>;\n type Descriptor = TrustedInteractionDescriptorShape<\n Contract,\n Definitions,\n Views\n >;\n\n function evaluateInteractionCost(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n playerId: PlayerId,\n params: Record<string, unknown>,\n projection?: ProjectionContext<DomainState, State>,\n ):\n | { cost?: Record<string, number>; missing?: Record<string, number> }\n | { error: unknown } {\n if (!interaction.cost) {\n return {};\n }\n const args = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: { playerId, params },\n },\n projection,\n );\n try {\n const cost = { ...interaction.cost(args) };\n const typedCost = cost as Parameters<typeof args.q.player.canAfford>[1];\n const missing = args.q.player.canAfford(playerId, typedCost)\n ? {}\n : { ...args.q.player.missingResources(playerId, typedCost) };\n return { cost, missing };\n } catch (error) {\n return { error };\n }\n }\n\n function buildBaseDescriptor(\n state: State,\n playerId: PlayerId,\n interactionId: InteractionId,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n decision: {\n available: boolean;\n unavailableReason?: string;\n cost?: Record<string, number>;\n missingResources?: Record<string, number>;\n },\n options: {\n projection?: ProjectionContext<DomainState, State>;\n includeEligibleTargets?: boolean;\n } = {},\n ): Descriptor {\n const domainState =\n options.projection?.domainState ?? scope.toDomainState(state);\n const phaseName = state.flow.currentPhase as PhaseName;\n const interactionInputs = interactionInputsOf(interaction);\n const metadata = projectInteractionMetadata({\n ...interaction,\n inputs: interactionInputs,\n });\n const queries = options.projection?.q ?? createStateQueries(domainState);\n const derived = options.projection?.derived;\n const shouldMaterializeInputDomains =\n decision.available || decision.unavailableReason !== \"Not your turn\";\n const promptContext =\n metadata.kind === \"prompt\" && shouldMaterializeInputDomains\n ? {\n to: playerId,\n title: humanizeInteractionId(interactionId),\n options: collectPromptOptions(\n { inputs: interactionInputs },\n domainState,\n playerId as unknown as string,\n queries,\n ),\n }\n : undefined;\n const inputs = shouldMaterializeInputDomains\n ? enrichResourceInputPresentation(\n collectInteractionInputs(interaction, domainState, playerId, {\n queries,\n derived,\n eligibleTargetCache: options.projection?.eligibleTargets,\n eligibleTargetCachePrefix: `${phaseName}:${String(\n interactionId,\n )}:${String(playerId)}`,\n includeEligibleTargets: options.includeEligibleTargets,\n }),\n scope.definition.contract.manifest,\n )\n : [];\n return {\n phaseName,\n interactionKey: `${phaseName}.${interactionId}`,\n interactionId,\n ...metadata,\n zoneId: collectFirstCardZoneId(interaction),\n zoneIds: collectCardZoneIds(interaction),\n inputs,\n cost: decision.cost ? { ...decision.cost } : undefined,\n currentResources: decision.cost\n ? {\n ...(queries.player.resources(playerId) as\n | Record<string, number>\n | undefined),\n }\n : undefined,\n missingResources: decision.missingResources,\n available: decision.available,\n unavailableReason: decision.unavailableReason,\n context: promptContext,\n };\n }\n\n function resolveInteractionDecision({\n state,\n playerId,\n interactionId,\n params = {},\n mode,\n projection,\n }: ResolveDecisionInput<\n Contract,\n Definitions,\n Views\n >): InteractionDecisionResult<Contract, Definitions, Views> {\n const phaseName = state.flow.currentPhase as PhaseName;\n const interaction = scope.findInteractionInPhase(phaseName, interactionId);\n if (!interaction) {\n return {\n found: false,\n validation: makeValidationError(\n \"unsupported-action\",\n `Interaction '${interactionId}' is not available in phase '${state.flow.currentPhase}'.`,\n ),\n };\n }\n const trustedInteractionId = interactionId as InteractionId;\n\n const parseForSubmit = mode === \"submit\";\n const parsed = parseForSubmit\n ? parseInteractionParams(interaction, params, {\n skipRng: true,\n playerId,\n })\n : ({\n ok: true,\n params: prepareInteractionProjectionParams(interaction, params),\n } as const);\n if (!parsed.ok) {\n return {\n found: true,\n interaction,\n parsedParams: {},\n visible: true,\n descriptor: buildBaseDescriptor(\n state,\n playerId,\n trustedInteractionId,\n interaction,\n {\n available: false,\n unavailableReason: parsed.message,\n },\n { projection, includeEligibleTargets: false },\n ),\n validation: makeValidationError(\n \"invalid-action-params\",\n parsed.message,\n ),\n };\n }\n\n const phase = scope.phaseByName(phaseName);\n const isSimultaneousSubmit =\n isSimultaneousPhase(phase) &&\n interactionId === SIMULTANEOUS_SUBMIT_INTERACTION_ID;\n const alreadySubmitted =\n isSimultaneousSubmit &&\n state.runtime.simultaneous?.current?.phaseName === phaseName &&\n Boolean(state.runtime.simultaneous.current.submissions[playerId]);\n const canResubmit =\n isSimultaneousSubmit &&\n (phase as { canResubmit?: boolean }).canResubmit === true;\n\n const actorAuthorization =\n authorization.resolveInteractionActorAuthorization(\n state,\n interaction,\n projection,\n );\n const authorized = authorization.isActorAuthorized(\n state,\n playerId,\n actorAuthorization,\n );\n let visible = authorization.isInteractionVisible(\n interaction,\n actorAuthorization,\n authorized,\n );\n if (alreadySubmitted && !canResubmit && mode !== \"submit\") {\n visible = false;\n }\n const stageAllow = stages.resolveActiveStageAllowlist(\n state,\n phaseName,\n projection,\n );\n const stageAllowed = !stageAllow || stageAllow.has(interactionId);\n const stepAllowed = stages.isInteractionAllowedInStep(\n state,\n interaction,\n projection,\n );\n\n let validation: ReducerValidationResult = { valid: true };\n if (!authorized) {\n validation =\n actorAuthorization.mode === \"addressees\"\n ? makeValidationError(\n \"prompt-not-owned\",\n `Interaction '${interactionId}' is not addressed to '${playerId}'.`,\n )\n : makeValidationError(\n \"NOT_YOUR_TURN\",\n `It is not your turn (interaction '${interactionId}').`,\n );\n } else if (alreadySubmitted && !canResubmit) {\n validation = makeValidationError(\n \"ALREADY_SUBMITTED\",\n `Interaction '${interactionId}' has already been submitted by '${playerId}'.`,\n );\n } else if (!stageAllowed) {\n validation = makeValidationError(\n \"action-unavailable\",\n `Interaction '${interactionId}' is not allowed in the current stage.`,\n );\n } else if (!stepAllowed) {\n validation = makeValidationError(\n \"action-unavailable\",\n `Interaction '${interactionId}' is not allowed in the current step.`,\n );\n }\n\n const canEvaluateProjectionDetails =\n mode !== \"submit\" && visible && authorized && stageAllowed && stepAllowed;\n const canContinueSubmitValidation = mode === \"submit\" && validation.valid;\n let cost: Record<string, number> | undefined;\n let missingResources: Record<string, number> | undefined;\n let costAffordable = true;\n if (canContinueSubmitValidation || canEvaluateProjectionDetails) {\n const costDecision = evaluateInteractionCost(\n state,\n interaction,\n playerId,\n parsed.params,\n projection,\n );\n if (\"error\" in costDecision) {\n costAffordable = false;\n validation = makeValidationError(\n \"cost-unavailable\",\n `Interaction '${interactionId}' cost could not be evaluated.`,\n );\n } else {\n cost = costDecision.cost ?? undefined;\n missingResources = costDecision.missing ?? undefined;\n costAffordable =\n !missingResources ||\n Object.values(missingResources).every((amount) => amount <= 0);\n if (!costAffordable) {\n if (mode === \"submit\" || validation.valid) {\n validation = makeValidationError(\n \"INSUFFICIENT_RESOURCES\",\n `Interaction '${interactionId}' cannot be afforded.`,\n );\n }\n }\n }\n }\n\n let ruleAvailabilityIssue: InteractionRuleIssue | undefined;\n if (\n (canContinueSubmitValidation || canEvaluateProjectionDetails) &&\n interaction.rules\n ) {\n const availabilityArgs = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: { playerId },\n },\n projection,\n );\n for (const rule of interaction.rules) {\n if (!rule.available) continue;\n if (!rule.available(availabilityArgs)) {\n ruleAvailabilityIssue = issueFromRule(rule);\n if (mode === \"submit\" || validation.valid) {\n validation = makeValidationError(\n ruleAvailabilityIssue.errorCode,\n ruleAvailabilityIssue.message,\n );\n }\n break;\n }\n }\n }\n\n let authoredValidation:\n | {\n errorCode: string;\n message?: string;\n }\n | undefined;\n if (\n (validation.valid || (mode === \"card\" && canEvaluateProjectionDetails)) &&\n (mode === \"submit\" || mode === \"card\")\n ) {\n if (validation.valid && mode === \"submit\") {\n validation = validateCollectorTargets(\n interaction,\n projection?.domainState ?? scope.toDomainState(state),\n playerId,\n parsed.params,\n );\n }\n }\n\n if (\n (validation.valid || (mode === \"card\" && canEvaluateProjectionDetails)) &&\n (mode === \"submit\" || mode === \"card\")\n ) {\n const validateArgs = scope.buildRuntimeArgs(\n state,\n {\n state: projection?.domainState ?? scope.toDomainState(state),\n input: {\n playerId,\n params: parsed.params,\n },\n },\n projection,\n );\n for (const rule of interaction.rules ?? []) {\n if (!rule.validate) continue;\n authoredValidation = issueFromRuleValidationResult(\n rule,\n rule.validate(validateArgs),\n );\n if (authoredValidation) break;\n }\n if (authoredValidation) {\n if (mode === \"submit\" || validation.valid) {\n validation = makeValidationError(\n authoredValidation.errorCode,\n authoredValidation.message,\n );\n }\n }\n }\n\n const available =\n stageAllowed &&\n stepAllowed &&\n authorized &&\n !ruleAvailabilityIssue &&\n costAffordable &&\n !authoredValidation;\n const unavailableReason = available\n ? undefined\n : !authorized\n ? \"Not your turn\"\n : !stageAllowed\n ? \"Interaction not allowed in current stage\"\n : !stepAllowed\n ? \"Interaction not allowed in current step\"\n : ruleAvailabilityIssue\n ? (ruleAvailabilityIssue.message ??\n ruleAvailabilityIssue.errorCode)\n : !costAffordable\n ? \"INSUFFICIENT_RESOURCES\"\n : mode === \"card\"\n ? (authoredValidation?.message ?? \"Interaction unavailable\")\n : \"Interaction unavailable\";\n const descriptor = buildBaseDescriptor(\n state,\n playerId,\n trustedInteractionId,\n interaction,\n {\n available,\n unavailableReason,\n cost,\n missingResources,\n },\n {\n projection,\n includeEligibleTargets: available || mode === \"card\",\n },\n );\n return {\n found: true,\n interaction,\n parsedParams: parsed.params,\n visible,\n descriptor,\n validation,\n };\n }\n\n function resolveAvailableInteractionsFor(\n state: State,\n playerId: PlayerId,\n options: { projection?: ProjectionContext<DomainState, State> } = {},\n ) {\n const phaseName = state.flow.currentPhase as PhaseName;\n const descriptors: Descriptor[] = [];\n for (const [interactionId] of scope.interactionEntriesForPhase(phaseName)) {\n const decision = resolveInteractionDecision({\n state,\n playerId,\n interactionId,\n params: {},\n mode: \"descriptor\",\n projection: options.projection,\n });\n if (!decision.found || !decision.visible) continue;\n descriptors.push(decision.descriptor);\n }\n return descriptors;\n }\n\n return {\n evaluateInteractionCost,\n resolveAvailableInteractionsFor,\n resolveInteractionDecision,\n };\n}\n","import type {\n AnyInteractionSpec,\n PhaseMapOf,\n ReducerGameContractLike,\n StageSpec,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedRuntimeScope,\n TrustedState,\n} from \"./runtime-scope\";\nimport type { ProjectionContext } from \"./projection-context\";\n\nexport function createStageResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n type DomainState = TrustedDomainState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n\n function resolveActiveStage(\n state: State,\n phaseName: PhaseName,\n projection?: ProjectionContext<DomainState, State>,\n ): { id: string; stage: StageSpec<DomainState, Manifest> } | null {\n const stages = scope.stagesForPhase(phaseName);\n if (stages.length === 0) return null;\n const domainState = projection?.domainState ?? scope.toDomainState(state);\n const context = scope.buildContext(state);\n for (const [stageId, stage] of stages) {\n const matches = stage.when\n ? stage.when({\n ...context,\n state: domainState,\n })\n : true;\n if (matches) return { id: stageId, stage };\n }\n return null;\n }\n\n function resolveActiveStageAllowlist(\n state: State,\n phaseName: PhaseName,\n projection?: ProjectionContext<DomainState, State>,\n ): Set<string> | null {\n const cacheKey = String(phaseName);\n if (projection?.stageAllowlists.has(cacheKey)) {\n return projection.stageAllowlists.get(cacheKey) ?? null;\n }\n const activeStage = resolveActiveStage(state, phaseName, projection);\n const allowlist = activeStage ? new Set(activeStage.stage.allow) : null;\n projection?.stageAllowlists.set(cacheKey, allowlist);\n return allowlist;\n }\n\n function isInteractionAllowedInStep(\n state: State,\n interaction: AnyInteractionSpec<DomainState, Manifest>,\n projection?: ProjectionContext<DomainState, State>,\n ): boolean {\n const allowedSteps = interaction.__steps ?? [];\n if (allowedSteps.length === 0) {\n return true;\n }\n const currentStep = (\n (projection?.domainState ?? scope.toDomainState(state)).phase as {\n step?: unknown;\n }\n ).step;\n return (\n typeof currentStep === \"string\" && allowedSteps.includes(currentStep)\n );\n }\n\n return {\n isInteractionAllowedInStep,\n resolveActiveStage,\n resolveActiveStageAllowlist,\n };\n}\n","import type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerReject,\n ReducerValidationResult,\n ViewMapOf,\n} from \"../../model\";\nimport {\n collectEligibleTargets,\n collectFirstCardZoneId,\n findCardInputKey,\n findCardInputKeyForZone,\n parseInteractionParams,\n} from \"./interaction-collectors\";\nimport { createInteractionAuthorization } from \"./interaction-authorization\";\nimport { createInteractionDecisionResolver } from \"./interaction-decision\";\nimport { createStageResolver } from \"./stage-resolver\";\nimport {\n rejectResult,\n type TrustedInput,\n type TrustedPlayerId,\n type TrustedRuntimeScope,\n type TrustedState,\n} from \"./runtime-scope\";\n\nexport type { InteractionDescriptorShape } from \"./interaction-types\";\n\nexport function createInteractionResolver<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n type State = TrustedState<Contract>;\n type PlayerId = TrustedPlayerId<Contract>;\n type ReducerInput = TrustedInput<Contract>;\n\n const stages = createStageResolver(scope);\n const authorization = createInteractionAuthorization(scope);\n const decisions = createInteractionDecisionResolver(\n scope,\n stages,\n authorization,\n );\n\n function validateClientInput(\n state: State,\n input: ReducerInput,\n ): ReducerValidationResult {\n if (input.kind === \"interaction\") {\n const decision = decisions.resolveInteractionDecision({\n state,\n playerId: input.playerId as PlayerId,\n interactionId: input.interactionId,\n params: (input.params ?? {}) as Record<string, unknown>,\n mode: \"submit\",\n });\n return decision.validation;\n }\n return { valid: true };\n }\n\n function validateOrReject(\n state: State,\n input: ReducerInput,\n ): ReducerReject | null {\n const validation = validateClientInput(state, input);\n if (validation.valid) {\n return null;\n }\n const invalidValidation = validation as Exclude<\n ReducerValidationResult,\n { valid: true }\n >;\n return rejectResult(invalidValidation.errorCode, invalidValidation.message);\n }\n\n return {\n collectEligibleTargets,\n collectFirstCardZoneId,\n evaluateInteractionCost: decisions.evaluateInteractionCost,\n findCardInputKey,\n findCardInputKeyForZone,\n isActorAuthorized: authorization.isActorAuthorized,\n isInteractionAllowedInStep: stages.isInteractionAllowedInStep,\n parseInteractionParams,\n resolveActiveStage: stages.resolveActiveStage,\n resolveActiveStageAllowlist: stages.resolveActiveStageAllowlist,\n resolveAvailableInteractionsFor: decisions.resolveAvailableInteractionsFor,\n resolveInteractionActorAuthorization:\n authorization.resolveInteractionActorAuthorization,\n resolveInteractionDecision: decisions.resolveInteractionDecision,\n validateClientInput,\n validateOrReject,\n };\n}\n","import {\n assertCardAllowedInContainer,\n assertCardAllowedInZone,\n cloneRuntimeTable,\n ensureArray,\n getComponentsInContainer,\n getComponentsOnSpace,\n} from \"./table-ops\";\nimport { nextRandomInt } from \"./rng\";\nimport type {\n RuntimeComponentLocation,\n RuntimeRngState,\n RuntimeTableRecord,\n SetupBootstrapContainerRef,\n SetupBootstrapDestinationRef,\n SetupBootstrapPerPlayerContainerTemplateRef,\n SetupBootstrapStep,\n} from \"./model\";\nimport type { PlayerId } from \"./per-player\";\nimport { perPlayerGet, perPlayerSet } from \"./per-player\";\n\ntype StatefulBootstrapContext = {\n table: RuntimeTableRecord;\n runtime: {\n rng: RuntimeRngState;\n };\n};\n\ntype ResolvedSharedZoneRef = {\n kind: \"sharedZone\";\n zoneId: string;\n};\n\ntype ResolvedPlayerZoneRef = {\n kind: \"playerZone\";\n zoneId: string;\n playerId: string;\n};\n\ntype ResolvedBoardZoneRef = {\n kind: \"container\";\n boardId: string;\n containerId: string;\n zoneId: string;\n};\n\ntype ResolvedBoardSpaceRef = {\n kind: \"space\";\n boardId: string;\n spaceId: string;\n zoneId: string;\n};\n\ntype ResolvedContainerRef =\n | ResolvedSharedZoneRef\n | ResolvedPlayerZoneRef\n | ResolvedBoardZoneRef\n | ResolvedBoardSpaceRef;\n\nfunction isCardComponent(\n table: RuntimeTableRecord,\n componentId: string,\n): boolean {\n return componentId in table.cards;\n}\n\nfunction resolveRuntimeBoardId(\n table: RuntimeTableRecord,\n boardId: string,\n playerId?: string,\n): string {\n if (playerId) {\n const perPlayerBoardId = `${boardId}:${playerId}`;\n if (table.boards.byId[perPlayerBoardId]) {\n return perPlayerBoardId;\n }\n }\n if (table.boards.byId[boardId]) {\n return boardId;\n }\n throw new Error(`Unknown board '${boardId}'.`);\n}\n\nfunction resolveContainerRef(\n table: RuntimeTableRecord,\n ref: SetupBootstrapContainerRef | SetupBootstrapDestinationRef,\n): ResolvedContainerRef {\n if (ref.type === \"sharedZone\") {\n return {\n kind: \"sharedZone\",\n zoneId: ref.zoneId,\n };\n }\n\n if (ref.type === \"playerZone\") {\n return {\n kind: \"playerZone\",\n zoneId: ref.zoneId,\n playerId: ref.playerId,\n };\n }\n\n if (ref.type === \"sharedBoardContainer\") {\n const board = table.boards.byId[resolveRuntimeBoardId(table, ref.boardId)];\n const container = board?.containers[ref.containerId];\n if (!container) {\n throw new Error(\n `Unknown board container '${ref.containerId}' on board '${ref.boardId}'.`,\n );\n }\n return {\n kind: \"container\",\n boardId: board.id,\n containerId: ref.containerId,\n zoneId: container.zoneId,\n };\n }\n\n if (ref.type === \"playerBoardContainer\") {\n const board =\n table.boards.byId[\n resolveRuntimeBoardId(table, ref.boardId, ref.playerId)\n ];\n const container = board?.containers[ref.containerId];\n if (!container) {\n throw new Error(\n `Unknown board container '${ref.containerId}' on board '${ref.boardId}' for '${ref.playerId}'.`,\n );\n }\n return {\n kind: \"container\",\n boardId: board.id,\n containerId: ref.containerId,\n zoneId: container.zoneId,\n };\n }\n\n if (ref.type === \"sharedBoardSpace\") {\n const board = table.boards.byId[resolveRuntimeBoardId(table, ref.boardId)];\n if (!board) {\n throw new Error(`Unknown board '${ref.boardId}'.`);\n }\n const space = board?.spaces[ref.spaceId];\n if (!space?.zoneId) {\n throw new Error(\n `Board space '${ref.spaceId}' on board '${ref.boardId}' has no container zone.`,\n );\n }\n return {\n kind: \"space\",\n boardId: board.id,\n spaceId: ref.spaceId,\n zoneId: space.zoneId,\n };\n }\n\n const board =\n table.boards.byId[resolveRuntimeBoardId(table, ref.boardId, ref.playerId)];\n if (!board) {\n throw new Error(\n `Unknown board '${ref.boardId}' for player '${ref.playerId}'.`,\n );\n }\n const space = board?.spaces[ref.spaceId];\n if (!space?.zoneId) {\n throw new Error(\n `Board space '${ref.spaceId}' on board '${ref.boardId}' for '${ref.playerId}' has no container zone.`,\n );\n }\n return {\n kind: \"space\",\n boardId: board.id,\n spaceId: ref.spaceId,\n zoneId: space.zoneId,\n };\n}\n\nfunction readContainerComponents(\n table: RuntimeTableRecord,\n ref: ResolvedContainerRef,\n): string[] {\n if (ref.kind === \"sharedZone\") {\n return [\n ...ensureArray(table.zones.shared[ref.zoneId] ?? table.decks[ref.zoneId]),\n ];\n }\n\n if (ref.kind === \"playerZone\") {\n const zoneValue = table.zones.perPlayer[ref.zoneId];\n const handValue = table.hands[ref.zoneId];\n const seat = ref.playerId as PlayerId;\n return [\n ...ensureArray(\n (zoneValue !== undefined ? perPlayerGet(zoneValue, seat) : undefined) ??\n (handValue !== undefined ? perPlayerGet(handValue, seat) : undefined),\n ),\n ];\n }\n\n if (ref.kind === \"space\") {\n return getComponentsOnSpace(table, ref.boardId, ref.spaceId);\n }\n\n return getComponentsInContainer(table, ref.boardId, ref.containerId);\n}\n\nfunction sharedZoneLocationFor(\n table: RuntimeTableRecord,\n componentId: string,\n zoneId: string,\n position: number,\n): RuntimeComponentLocation {\n if (isCardComponent(table, componentId)) {\n return {\n type: \"InDeck\",\n deckId: zoneId,\n playedBy: null,\n position,\n };\n }\n\n return {\n type: \"InZone\",\n zoneId,\n playedBy: null,\n position,\n };\n}\n\nfunction updateCardVisibilityForZone(\n table: RuntimeTableRecord,\n componentId: string,\n ref: ResolvedContainerRef,\n): void {\n if (!isCardComponent(table, componentId)) {\n return;\n }\n\n if (ref.kind === \"playerZone\") {\n const visibility = table.zones.visibility[ref.zoneId];\n table.ownerOfCard[componentId] = ref.playerId;\n table.visibility[componentId] =\n visibility === \"all\" || visibility === \"public\"\n ? { faceUp: true }\n : { faceUp: false, visibleTo: [ref.playerId] };\n return;\n }\n\n if (ref.kind === \"sharedZone\") {\n const visibility = table.zones.visibility[ref.zoneId];\n if (visibility === \"hidden\" || visibility === \"ownerOnly\") {\n table.visibility[componentId] = { faceUp: false };\n return;\n }\n table.visibility[componentId] = { faceUp: true };\n }\n}\n\nfunction writeContainerComponents(\n table: RuntimeTableRecord,\n ref: ResolvedContainerRef,\n componentIds: readonly string[],\n): void {\n if (ref.kind === \"sharedZone\") {\n componentIds.forEach((componentId) => {\n assertCardAllowedInZone(table, ref.zoneId, componentId);\n });\n table.decks[ref.zoneId] = [...componentIds];\n table.zones.shared[ref.zoneId] = [...componentIds];\n componentIds.forEach((componentId, index) => {\n table.componentLocations[componentId] = sharedZoneLocationFor(\n table,\n componentId,\n ref.zoneId,\n index,\n );\n updateCardVisibilityForZone(table, componentId, ref);\n });\n return;\n }\n\n if (ref.kind === \"playerZone\") {\n componentIds.forEach((componentId) => {\n assertCardAllowedInZone(table, ref.zoneId, componentId);\n });\n const seat = ref.playerId as PlayerId;\n const prevHand = table.hands[ref.zoneId] ?? {\n __perPlayer: true as const,\n entries: [],\n };\n table.hands[ref.zoneId] = perPlayerSet(prevHand, seat, [...componentIds]);\n\n const prevZone = table.zones.perPlayer[ref.zoneId] ?? {\n __perPlayer: true as const,\n entries: [],\n };\n table.zones.perPlayer[ref.zoneId] = perPlayerSet(prevZone, seat, [\n ...componentIds,\n ]);\n\n componentIds.forEach((componentId, index) => {\n table.componentLocations[componentId] = {\n type: \"InHand\",\n handId: ref.zoneId,\n playerId: ref.playerId,\n position: index,\n };\n updateCardVisibilityForZone(table, componentId, ref);\n });\n return;\n }\n\n if (ref.kind === \"space\") {\n componentIds.forEach((componentId, index) => {\n table.componentLocations[componentId] = {\n type: \"OnSpace\",\n boardId: ref.boardId,\n spaceId: ref.spaceId,\n position: index,\n };\n });\n return;\n }\n\n componentIds.forEach((componentId) => {\n assertCardAllowedInContainer(\n table,\n ref.boardId,\n ref.containerId,\n componentId,\n );\n });\n componentIds.forEach((componentId, index) => {\n table.componentLocations[componentId] = {\n type: \"InContainer\",\n boardId: ref.boardId,\n containerId: ref.containerId,\n position: index,\n };\n });\n}\n\nfunction selectMovedComponents(\n current: readonly string[],\n step: Extract<SetupBootstrapStep, { type: \"move\" }>,\n): string[] {\n if (step.componentIds && typeof step.count === \"number\") {\n throw new Error(\n \"Setup bootstrap move step cannot specify both count and componentIds.\",\n );\n }\n\n if (step.componentIds) {\n const missing = step.componentIds.filter(\n (componentId) => !current.includes(componentId),\n );\n if (missing.length > 0) {\n throw new Error(\n `Setup bootstrap move step references missing components: ${missing.join(\", \")}`,\n );\n }\n return [...step.componentIds];\n }\n\n if (typeof step.count === \"number\") {\n return current.slice(0, step.count);\n }\n\n return [...current];\n}\n\nfunction resolveDealTargetRef(\n table: RuntimeTableRecord,\n ref: SetupBootstrapPerPlayerContainerTemplateRef,\n playerId: string,\n): ResolvedContainerRef {\n if (ref.type === \"playerZone\") {\n return {\n kind: \"playerZone\",\n zoneId: ref.zoneId,\n playerId,\n };\n }\n\n const board =\n table.boards.byId[resolveRuntimeBoardId(table, ref.boardId, playerId)];\n const container = board?.containers[ref.containerId];\n if (!container) {\n throw new Error(\n `Unknown board container '${ref.containerId}' on board '${ref.boardId}' for '${playerId}'.`,\n );\n }\n return {\n kind: \"container\",\n boardId: board.id,\n containerId: ref.containerId,\n zoneId: container.zoneId,\n };\n}\n\nexport function applySetupBootstrap<State extends StatefulBootstrapContext>(\n state: State,\n steps: readonly SetupBootstrapStep[],\n): State {\n if (steps.length === 0) {\n return state;\n }\n\n const nextTable = cloneRuntimeTable(state.table);\n let nextRng = state.runtime.rng;\n\n for (const step of steps) {\n if (step.type === \"shuffle\") {\n const container = resolveContainerRef(nextTable, step.container);\n const shuffled = readContainerComponents(nextTable, container);\n for (let lastIndex = shuffled.length - 1; lastIndex > 0; lastIndex -= 1) {\n const [swapIndex, updatedRng] = nextRandomInt(lastIndex + 1, nextRng);\n nextRng = updatedRng;\n const current = shuffled[lastIndex];\n const swap = shuffled[swapIndex];\n if (current === undefined || swap === undefined) {\n throw new Error(\n `setup shuffle: invalid index (lastIndex=${lastIndex}, swapIndex=${swapIndex}, length=${shuffled.length})`,\n );\n }\n shuffled[lastIndex] = swap;\n shuffled[swapIndex] = current;\n }\n writeContainerComponents(nextTable, container, shuffled);\n continue;\n }\n\n if (step.type === \"move\") {\n const from = resolveContainerRef(nextTable, step.from);\n const to = resolveContainerRef(nextTable, step.to);\n const currentFrom = readContainerComponents(nextTable, from);\n const moved = selectMovedComponents(currentFrom, step);\n const remaining = currentFrom.filter(\n (componentId) => !moved.includes(componentId),\n );\n const currentTo = readContainerComponents(nextTable, to);\n\n writeContainerComponents(nextTable, from, remaining);\n writeContainerComponents(nextTable, to, [...currentTo, ...moved]);\n continue;\n }\n\n const from = resolveContainerRef(nextTable, step.from);\n if (from.kind === \"playerZone\") {\n throw new Error(\n \"Setup bootstrap deal steps require a shared source container.\",\n );\n }\n const playerIds = step.playerIds\n ? [...step.playerIds]\n : [...nextTable.playerOrder];\n let sourceComponents = readContainerComponents(nextTable, from);\n\n for (const playerId of playerIds) {\n if (sourceComponents.length === 0) {\n break;\n }\n const dealt = sourceComponents.slice(0, step.count);\n if (dealt.length === 0) {\n break;\n }\n sourceComponents = sourceComponents.slice(dealt.length);\n const target = resolveDealTargetRef(nextTable, step.to, playerId);\n const currentTo = readContainerComponents(nextTable, target);\n writeContainerComponents(nextTable, target, [...currentTo, ...dealt]);\n }\n\n writeContainerComponents(nextTable, from, sourceComponents);\n }\n\n return {\n ...state,\n table: nextTable,\n runtime: {\n ...state.runtime,\n rng: nextRng,\n },\n };\n}\n","import { safeParseOrThrow } from \"../../parse-utils\";\nimport { applySetupBootstrap } from \"../../setup-bootstrap\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type {\n ExactManifestContractOf,\n PhaseMapOf,\n ReducerGameContractLike,\n RuntimeSetupSelection,\n RuntimeSetupSelectionInput,\n ViewMapOf,\n} from \"../../model\";\nimport type { RuntimeInstructionForState } from \"../../core/runtime-instruction\";\nimport { isPerPlayer } from \"../../per-player\";\nimport { normalizeResult } from \"./runtime-scope\";\nimport { createMutableRandomHelpers } from \"./rng-sampler\";\nimport type { createInteractionResolver } from \"./interaction-resolver\";\nimport type {\n TrustedDomainState,\n TrustedManifest,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedSessionState,\n TrustedState,\n} from \"./runtime-scope\";\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, Views>>;\n\nexport function createLifecycleRunner<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n interactions: InteractionResolverFor<Contract, Definitions, Views>,\n) {\n type DomainState = TrustedDomainState<Contract>;\n type SessionState = TrustedSessionState<Contract>;\n type State = TrustedState<Contract>;\n type Manifest = TrustedManifest<Contract>;\n type ExactManifest = ExactManifestContractOf<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function resolveSelectedSetup(\n setup: RuntimeSetupSelectionInput<Manifest> | null | undefined,\n ): State[\"runtime\"][\"setup\"] {\n if (!setup) {\n return null;\n }\n const manifestProfile = scope.manifestSetupProfilesById[setup.profileId];\n if (!manifestProfile) {\n throw new Error(`Unknown setup profile '${setup.profileId}'.`);\n }\n const resolvedOptionValues: Record<string, string | null> =\n Object.fromEntries(\n scope.definition.contract.manifest.literals.setupOptionIds.map(\n (optionId: string) => [optionId, null] as const,\n ),\n );\n\n for (const [optionId, choiceId] of Object.entries(\n manifestProfile.optionValues ?? {},\n ) as Array<[string, string]>) {\n resolvedOptionValues[optionId] = choiceId;\n }\n for (const [optionId, choiceId] of Object.entries(\n setup.optionValues ?? {},\n ) as Array<[string, string]>) {\n resolvedOptionValues[optionId] = choiceId ?? null;\n }\n\n return {\n profileId: setup.profileId,\n optionValues:\n resolvedOptionValues as RuntimeSetupSelection<Manifest>[\"optionValues\"],\n };\n }\n\n function resolveInitialPhase(setup: State[\"runtime\"][\"setup\"]): PhaseName {\n const setupProfile = setup\n ? scope.reducerSetupProfiles[setup.profileId]\n : null;\n const resolvedPhase = (setupProfile?.initialPhase ??\n scope.defaultInitialPhase ??\n scope.phaseEntries[0]?.[0]) as PhaseName | undefined;\n if (!resolvedPhase) {\n throw new Error(\"Reducer-native games must define at least one phase.\");\n }\n if (!scope.definition.phases[resolvedPhase]) {\n throw new Error(`Unknown initial phase '${resolvedPhase}'.`);\n }\n return resolvedPhase;\n }\n\n function applySelectedSetupBootstrap(state: State): State {\n const setup = state.runtime.setup;\n if (!setup) {\n return state;\n }\n\n const bootstrap = scope.reducerSetupProfiles[setup.profileId]?.bootstrap;\n if (!bootstrap || bootstrap.length === 0) {\n return state;\n }\n\n return applySetupBootstrap(state, bootstrap) as State;\n }\n\n function initPhaseState(\n state: State,\n phaseName: PhaseName,\n playerIds: PlayerId[],\n ): State {\n const phase = scope.phaseByName(phaseName);\n const phaseState = phase.initialState\n ? phase.initialState({\n manifest: scope.definition.contract.manifest,\n state,\n playerIds,\n setup: state.runtime.setup,\n })\n : safeParseOrThrow(phase.state, {}, `phase:${phaseName}:initialState`);\n return {\n ...state,\n phase: safeParseOrThrow(\n phase.state,\n phaseState,\n `phase:${phaseName}`,\n ) as State[\"phase\"],\n flow: {\n ...state.flow,\n currentPhase: phaseName as State[\"flow\"][\"currentPhase\"],\n },\n };\n }\n\n function enterPhase({\n state,\n phaseName,\n playerIds,\n event,\n }: {\n state: State;\n phaseName: PhaseName;\n playerIds: PlayerId[];\n event: \"initialize\" | \"transition\";\n }): {\n state: State;\n instructions: RuntimeInstructionForState<State>[];\n } {\n const workingState = initPhaseState(state, phaseName, playerIds);\n const phase = scope.phaseByName(phaseName);\n let nextState: State = workingState;\n const instructions: RuntimeInstructionForState<State>[] = [];\n if (phase.enter) {\n const random = createMutableRandomHelpers(workingState.runtime.rng);\n const entered = normalizeResult(\n phase.enter(\n scope.buildRuntimeArgs(\n workingState,\n {\n event,\n state: scope.toDomainState(workingState),\n },\n { random: random.random },\n ),\n ),\n scope.toDomainState(workingState),\n );\n if (entered.type === \"reject\") {\n throw new Error(\n entered.message ??\n (event === \"initialize\"\n ? `Reducer phase '${phaseName}' rejected during initialization.`\n : `Reducer phase '${phaseName}' rejected during phase initialization.`),\n );\n }\n nextState = {\n ...entered.state,\n runtime: { ...workingState.runtime, rng: random.currentRng() },\n } as State;\n if (entered.instructions) instructions.push(...entered.instructions);\n }\n\n const activeStage = interactions.resolveActiveStage(nextState, phaseName);\n if (activeStage?.stage.onEnter) {\n const random = createMutableRandomHelpers(nextState.runtime.rng);\n const stageEntered = normalizeResult(\n activeStage.stage.onEnter(\n scope.buildRuntimeArgs(\n nextState,\n {\n event,\n state: scope.toDomainState(nextState),\n },\n { random: random.random },\n ),\n ),\n scope.toDomainState(nextState),\n );\n if (stageEntered.type === \"reject\") {\n throw new Error(\n stageEntered.message ??\n (event === \"initialize\"\n ? `Reducer stage '${phaseName}.${activeStage.id}' rejected during initialization.`\n : `Reducer stage '${phaseName}.${activeStage.id}' rejected during stage initialization.`),\n );\n }\n nextState = {\n ...stageEntered.state,\n runtime: { ...nextState.runtime, rng: random.currentRng() },\n } as State;\n if (stageEntered.instructions) {\n instructions.push(...stageEntered.instructions);\n }\n }\n return { state: nextState, instructions };\n }\n\n function initializePhaseResult(\n state: State,\n phaseName: PhaseName,\n ): {\n state: State;\n instructions: RuntimeInstructionForState<State>[];\n } {\n return enterPhase({\n state,\n phaseName,\n playerIds: scope.buildContext(state).playerOrder as PlayerId[],\n event: \"transition\",\n });\n }\n\n function createInitialState({\n table,\n playerIds,\n rngSeed,\n setup,\n }: {\n table: State[\"table\"];\n playerIds: PlayerId[];\n rngSeed?: number | null;\n setup?: RuntimeSetupSelectionInput<Manifest> | null;\n }): { state: State; initialPhase: PhaseName } {\n const tableWithManifestDefaults = applyManifestTableDefaults(\n table,\n playerIds,\n );\n const parsedTable = safeParseOrThrow(\n scope.definition.contract.manifest.tableSchema,\n tableWithManifestDefaults,\n \"table\",\n ) as State[\"table\"];\n const selectedSetup = resolveSelectedSetup(setup);\n const initialSetup =\n selectedSetup as RuntimeSetupSelection<ExactManifest> | null;\n const initialPhase = resolveInitialPhase(selectedSetup);\n const initialQueries = createStateQueries({ table: parsedTable });\n return {\n initialPhase,\n state: {\n table: parsedTable,\n publicState: safeParseOrThrow(\n scope.definition.contract.state.public,\n scope.definition.initial?.public?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n rngSeed,\n setup: initialSetup,\n q: initialQueries,\n }) ?? {},\n \"publicState\",\n ) as State[\"publicState\"],\n privateState: Object.fromEntries(\n playerIds.map((playerId) => [\n playerId,\n safeParseOrThrow(\n scope.definition.contract.state.private,\n scope.definition.initial?.private?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n playerId,\n rngSeed,\n setup: initialSetup,\n q: initialQueries,\n }) ?? {},\n `privateState:${playerId}`,\n ),\n ]),\n ) as State[\"privateState\"],\n hiddenState: safeParseOrThrow(\n scope.definition.contract.state.hidden,\n scope.definition.initial?.hidden?.({\n manifest: scope.definition.contract.manifest,\n table: parsedTable,\n playerIds,\n rngSeed,\n setup: initialSetup,\n q: initialQueries,\n }) ?? {},\n \"hiddenState\",\n ) as State[\"hiddenState\"],\n flow: {\n currentPhase: initialPhase as State[\"flow\"][\"currentPhase\"],\n turn: 0,\n round: 0,\n activePlayers: [],\n },\n phase: {} as State[\"phase\"],\n runtime: {\n rng: {\n seed: rngSeed ?? null,\n cursor: 0,\n trace: [],\n },\n setup: selectedSetup,\n simultaneous: { current: null },\n lastTransition: null,\n } as State[\"runtime\"],\n },\n };\n }\n\n function applyManifestTableDefaults(\n table: State[\"table\"],\n playerIds: PlayerId[],\n ): State[\"table\"] {\n const manifest = scope.definition.contract.manifest;\n const defaultZones = manifest.defaults.zones(playerIds);\n const tableZones = table.zones ?? {};\n const tableResources = table.resources;\n return {\n ...table,\n playerOrder:\n table.playerOrder && table.playerOrder.length > 0\n ? table.playerOrder\n : playerIds,\n zones: {\n ...defaultZones,\n ...tableZones,\n shared: {\n ...(defaultZones.shared ?? {}),\n ...(tableZones.shared ?? {}),\n },\n perPlayer: {\n ...(defaultZones.perPlayer ?? {}),\n ...(tableZones.perPlayer ?? {}),\n },\n visibility: {\n ...(defaultZones.visibility ?? {}),\n ...(tableZones.visibility ?? {}),\n },\n cardSetIdsByZoneId: {\n ...(defaultZones.cardSetIdsByZoneId ?? {}),\n ...(tableZones.cardSetIdsByZoneId ?? {}),\n },\n },\n decks: {\n ...manifest.defaults.decks(playerIds),\n ...table.decks,\n },\n hands: {\n ...manifest.defaults.hands(playerIds),\n ...table.hands,\n },\n handVisibility: {\n ...manifest.defaults.handVisibility(playerIds),\n ...table.handVisibility,\n },\n ownerOfCard: {\n ...manifest.defaults.ownerOfCard(playerIds),\n ...table.ownerOfCard,\n },\n visibility: {\n ...manifest.defaults.visibility(playerIds),\n ...table.visibility,\n },\n resources:\n isPerPlayer(tableResources) && tableResources.entries.length > 0\n ? tableResources\n : manifest.defaults.resources(playerIds),\n } as State[\"table\"];\n }\n\n function initializeSession(\n input: {\n table: State[\"table\"];\n playerIds: PlayerId[];\n rngSeed?: number | null;\n setup?: RuntimeSetupSelectionInput<Manifest> | null;\n },\n drainInstructions: (\n state: State,\n instructions: RuntimeInstructionForState<State>[],\n ) => State,\n ): SessionState {\n const initial = createInitialState(input);\n const bootstrappedState = applySelectedSetupBootstrap(initial.state);\n const entered = enterPhase({\n state: bootstrappedState,\n phaseName: initial.initialPhase,\n playerIds: input.playerIds,\n event: \"initialize\",\n });\n return scope.toSessionState(\n drainInstructions(entered.state, entered.instructions),\n );\n }\n\n return {\n createInitialState,\n enterPhase,\n initializePhaseResult,\n initializeSession,\n initPhaseState,\n resolveInitialPhase,\n resolveSelectedSetup,\n };\n}\n","import { createDerivedResolver, type DerivedResolver } from \"../../derived\";\nimport { createReducerFx } from \"../../effects\";\nimport { createStateQueries } from \"../../table-queries\";\nimport type { RuntimeTableRecord, TableQueriesOfState } from \"../../model\";\n\ntype ProjectionFxState = {\n table: RuntimeTableRecord;\n flow: { currentPhase: string };\n};\n\nexport type ProjectionContext<\n State extends { table: RuntimeTableRecord },\n FxState extends ProjectionFxState = ProjectionFxState,\n> = {\n readonly domainState: State;\n readonly q: TableQueriesOfState<State>;\n readonly derived: DerivedResolver;\n readonly fx: ReturnType<typeof createReducerFx<FxState>>;\n readonly eligibleTargets: Map<string, string[]>;\n readonly stageAllowlists: Map<string, Set<string> | null>;\n};\n\nexport function createProjectionContext<\n State extends { table: RuntimeTableRecord },\n FxState extends ProjectionFxState,\n>(options: {\n domainState: State;\n combinedState: FxState;\n}): ProjectionContext<State, FxState> {\n const q = createStateQueries(options.domainState);\n return {\n domainState: options.domainState,\n q,\n derived: createDerivedResolver(options.domainState, { q }),\n fx: createReducerFx(options.combinedState),\n eligibleTargets: new Map(),\n stageAllowlists: new Map(),\n };\n}\n","import type {\n PhaseMapOf,\n ReducerGameContractLike,\n ViewMapOf,\n} from \"../../model\";\nimport type {\n InteractionDescriptorShape,\n createInteractionResolver,\n} from \"./interaction-resolver\";\nimport type {\n TrustedDomainState,\n TrustedPhaseName,\n TrustedPlayerId,\n TrustedRuntimeScope,\n TrustedSessionState,\n TrustedState,\n} from \"./runtime-scope\";\nimport {\n createProjectionContext,\n type ProjectionContext,\n} from \"./projection-context\";\nimport { collectCardZoneIds } from \"./interaction-collectors\";\nimport {\n isSimultaneousPhase,\n resolveSimultaneousActors,\n SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n simultaneousSubmitInteraction,\n} from \"./simultaneous-player\";\n\ntype InteractionResolverFor<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n> = ReturnType<typeof createInteractionResolver<Contract, Definitions, Views>>;\n\nexport function createProjectionBuilder<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n scope: TrustedRuntimeScope<Contract, Definitions, Views>,\n interactions: InteractionResolverFor<Contract, Definitions, Views>,\n) {\n type SessionState = TrustedSessionState<Contract>;\n type DomainState = TrustedDomainState<Contract>;\n type State = TrustedState<Contract>;\n type PhaseName = TrustedPhaseName<Contract, Definitions, Views>;\n type PlayerId = TrustedPlayerId<Contract>;\n\n function resolveZoneHandlesFor(\n combinedState: State,\n playerId: PlayerId,\n projection: ProjectionContext<DomainState, State>,\n ) {\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const zoneIds = new Set<string>(scope.zonesForPhase(phaseName).map(String));\n for (const [, interaction] of scope.interactionEntriesForPhase(phaseName)) {\n for (const zoneId of collectCardZoneIds(interaction)) {\n zoneIds.add(String(zoneId));\n }\n }\n const zones = [...zoneIds];\n if (zones.length === 0) return {};\n const q = projection.q;\n const result: Record<\n string,\n {\n cardIds: string[];\n cardsById: Record<string, string>;\n playableByCardId: Record<string, InteractionDescriptorShape[]>;\n }\n > = {};\n for (const zoneId of zones) {\n const table = combinedState.table as {\n decks?: Record<string, unknown>;\n hands?: Record<string, unknown>;\n zones?: {\n shared?: Record<string, unknown>;\n perPlayer?: Record<string, unknown>;\n };\n };\n const isPlayerZone =\n zoneId in (table.hands ?? {}) ||\n zoneId in (table.zones?.perPlayer ?? {});\n const cardIds = Array.from(\n isPlayerZone\n ? (q.zone.playerCards(\n playerId as never,\n zoneId as never,\n ) as readonly string[])\n : (q.zone.sharedCards(zoneId as never) as readonly string[]),\n );\n const cardInteractionIds = scope\n .interactionEntriesForPhase(phaseName)\n .filter(([, interaction]) =>\n collectCardZoneIds(interaction).map(String).includes(zoneId),\n )\n .map(([interactionId]) => interactionId);\n const cardsById: Record<string, string> = {};\n const playableByCardId: Record<string, InteractionDescriptorShape[]> = {};\n for (const cardId of cardIds) {\n cardsById[cardId] = JSON.stringify(q.card.get(cardId as never));\n const perCard: InteractionDescriptorShape[] = [];\n for (const interactionId of cardInteractionIds) {\n const interaction = scope.findInteractionInPhase(\n phaseName,\n interactionId,\n );\n if (!interaction) continue;\n const cardKey = interactions.findCardInputKeyForZone(\n interaction,\n zoneId,\n );\n const params = cardKey ? { [cardKey]: cardId } : {};\n const decision = interactions.resolveInteractionDecision({\n state: combinedState,\n playerId,\n interactionId,\n params,\n mode: \"card\",\n projection,\n });\n if (!decision.found || !decision.visible) continue;\n const cardDomain = cardKey\n ? decision.descriptor.inputs.find((input) => input.key === cardKey)\n ?.domain\n : undefined;\n const cardTargets =\n cardDomain?.type === \"target\"\n ? cardDomain.eligibleTargets\n : undefined;\n if (cardKey && !cardTargets?.includes(cardId)) {\n continue;\n }\n perCard.push({\n ...decision.descriptor,\n zoneId,\n });\n }\n playableByCardId[cardId] = perCard;\n }\n result[zoneId] = {\n cardIds,\n cardsById,\n playableByCardId,\n };\n }\n return result;\n }\n\n function resolveCurrentStageFor(\n combinedState: State,\n projection?: ProjectionContext<DomainState, State>,\n ): string {\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n return (\n interactions.resolveActiveStage(combinedState, phaseName, projection)\n ?.id ?? phaseName\n );\n }\n\n function resolveStageSeatsFor(state: SessionState): string[] {\n const combinedState = scope.toCombinedState(state);\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (isSimultaneousPhase(phase)) {\n return resolveSimultaneousActors(scope, combinedState, phase).map(String);\n }\n return [...state.domain.flow.activePlayers];\n }\n\n function resolveSimultaneousPhaseFor(state: SessionState) {\n const combinedState = scope.toCombinedState(state);\n const phaseName = combinedState.flow.currentPhase as PhaseName;\n const phase = scope.phaseByName(phaseName);\n if (!isSimultaneousPhase(phase)) return null;\n const current = state.runtime.simultaneous?.current;\n if (!current || current.phaseName !== phaseName) return null;\n const submit = simultaneousSubmitInteraction(phase);\n if (!submit) return null;\n const actorIds = current.actors.map(String);\n const sealedPlayerIds = actorIds.filter(\n (playerId) => current.submissions[playerId as PlayerId] !== undefined,\n );\n const pendingPlayerIds = actorIds.filter(\n (playerId) => current.submissions[playerId as PlayerId] === undefined,\n );\n return {\n phaseName: String(current.phaseName),\n interactionId: SIMULTANEOUS_SUBMIT_INTERACTION_ID,\n actorIds,\n sealedPlayerIds,\n pendingPlayerIds,\n };\n }\n\n function resolveViewFor(\n combinedState: State,\n playerId: PlayerId,\n viewId: string,\n projection: ProjectionContext<DomainState, State>,\n ): unknown {\n const views = scope.definition.views;\n const view = views?.[viewId as keyof typeof views];\n if (!view) {\n return null;\n }\n const viewArgs = {\n ...scope.buildContext(combinedState),\n ...scope.runtimeHelpers,\n fx: projection.fx,\n q: projection.q,\n derived: projection.derived,\n state: projection.domainState,\n playerId,\n } as Parameters<typeof view.project>[0];\n return view.project(viewArgs);\n }\n\n function projectSeatsDynamic({\n state,\n playerIds,\n viewId = \"player\",\n }: {\n state: SessionState;\n playerIds: PlayerId[];\n viewId?: string;\n }) {\n const combinedState = scope.toCombinedState(state);\n const projection = createProjectionContext({\n combinedState,\n domainState: scope.toDomainState(combinedState),\n });\n type SeatProjection = {\n view: ReturnType<typeof resolveViewFor>;\n availableInteractions: ReturnType<\n typeof interactions.resolveAvailableInteractionsFor\n >;\n zones: ReturnType<typeof resolveZoneHandlesFor>;\n };\n const seats: Record<string, SeatProjection> = {};\n for (const playerId of playerIds) {\n seats[playerId as unknown as string] = {\n view: resolveViewFor(combinedState, playerId, viewId, projection),\n availableInteractions: interactions.resolveAvailableInteractionsFor(\n combinedState,\n playerId,\n { projection },\n ),\n zones: resolveZoneHandlesFor(combinedState, playerId, projection),\n };\n }\n return {\n currentStage: resolveCurrentStageFor(combinedState, projection),\n stageSeats: resolveStageSeatsFor(state),\n simultaneousPhase: resolveSimultaneousPhaseFor(state),\n seats,\n };\n }\n\n function projectSeatViewDynamic({\n state,\n playerId,\n viewId = \"player\",\n }: {\n state: SessionState;\n playerId: PlayerId;\n viewId?: string;\n }) {\n const combinedState = scope.toCombinedState(state);\n const projection = createProjectionContext({\n combinedState,\n domainState: scope.toDomainState(combinedState),\n });\n return resolveViewFor(combinedState, playerId, viewId, projection);\n }\n\n return {\n projectSeatsDynamic,\n projectSeatViewDynamic,\n resolveCurrentStageFor,\n resolveStageSeatsFor,\n resolveViewFor,\n resolveZoneHandlesFor,\n };\n}\n","import type {\n ManifestContract,\n PhaseMapOf,\n ReducerGameContractLike,\n RuntimeTableRecord,\n StaticViewQueries,\n ViewMapOf,\n} from \"../../model\";\nimport type { TrustedRuntimeScope } from \"./runtime-scope\";\n\nfunction stableStringify(value: unknown): string {\n if (value === null || typeof value !== \"object\") {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n }\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n return `{${entries\n .map(([k, v]) => `${JSON.stringify(k)}:${stableStringify(v)}`)\n .join(\",\")}}`;\n}\n\nfunction hashProjection(input: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < input.length; i += 1) {\n h ^= input.charCodeAt(i);\n h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;\n }\n return h.toString(16).padStart(8, \"0\");\n}\n\nfunction readManifestVersion(manifest: unknown): string {\n const m = manifest as { version?: unknown; literals?: unknown };\n if (typeof m.version === \"string\" && m.version.length > 0) {\n return m.version;\n }\n if (m.literals && typeof m.literals === \"object\") {\n return hashProjection(stableStringify(m.literals));\n }\n return \"0\";\n}\n\nfunction createStaticViewQueries<\n Manifest extends ManifestContract<RuntimeTableRecord>,\n>(manifest: Manifest): StaticViewQueries<Manifest> {\n const staticBoards = manifest.staticBoards ?? {\n byId: {},\n hex: {},\n square: {},\n };\n const requireBoard = (\n boards: Record<string, unknown>,\n boardId: string,\n layout: \"board\" | \"hex\" | \"square\",\n ) => {\n const board = boards[boardId];\n if (!board) {\n throw new Error(`Unknown static ${layout} board '${boardId}'.`);\n }\n return board;\n };\n\n return {\n board: {\n get: (boardId) =>\n requireBoard(\n staticBoards.byId as Record<string, unknown>,\n boardId,\n \"board\",\n ) as never,\n hex: (boardId) =>\n requireBoard(\n staticBoards.hex as Record<string, unknown>,\n boardId,\n \"hex\",\n ) as never,\n square: (boardId) =>\n requireBoard(\n staticBoards.square as Record<string, unknown>,\n boardId,\n \"square\",\n ) as never,\n },\n };\n}\n\nexport function createStaticProjectionBuilder<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(scope: TrustedRuntimeScope<Contract, Definitions, Views>) {\n return {\n projectStatic(): {\n view: unknown;\n hash: string;\n manifestVersion: string;\n } | null {\n const staticView = scope.definition.staticView;\n if (!staticView) return null;\n const manifest = scope.definition.contract.manifest;\n const view = staticView.project({\n manifest,\n q: createStaticViewQueries(manifest),\n });\n const serialized = stableStringify(view);\n return {\n view: JSON.parse(serialized) as unknown,\n hash: hashProjection(serialized),\n manifestVersion: readManifestVersion(manifest),\n };\n },\n };\n}\n","import type { TrustedReducerBundle } from \"./types\";\nimport type {\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ViewMapOf,\n} from \"../model\";\nimport { createTrustedInstructionRunner } from \"./trusted/instruction-runner\";\nimport { createInteractionResolver } from \"./trusted/interaction-resolver\";\nimport { createLifecycleRunner } from \"./trusted/lifecycle-runner\";\nimport { createProjectionBuilder } from \"./trusted/projection-builder\";\nimport { createTrustedRuntimeScope } from \"./trusted/runtime-scope\";\nimport { createStaticProjectionBuilder } from \"./trusted/static-projection\";\n\nexport function createTrustedReducerBundle<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): TrustedReducerBundle<Contract, Definitions, Views> {\n const scope = createTrustedRuntimeScope(definition);\n const interactions = createInteractionResolver(scope);\n const lifecycle = createLifecycleRunner(scope, interactions);\n const instructions = createTrustedInstructionRunner(\n scope,\n interactions,\n lifecycle,\n );\n const staticProjection = createStaticProjectionBuilder(scope);\n const projection = createProjectionBuilder(scope, interactions);\n\n return {\n async initialize(input) {\n return lifecycle.initializeSession(input, instructions.drainInstructions);\n },\n async initializePhase({ state, to }) {\n const initialized = lifecycle.initializePhaseResult(\n scope.toCombinedState(state),\n to,\n );\n return scope.toSessionState(\n instructions.drainInstructions(\n initialized.state,\n initialized.instructions,\n ),\n );\n },\n async validateInput({ state, input }) {\n return interactions.validateClientInput(\n scope.toCombinedState(state),\n input,\n );\n },\n async reduce({ state, input }) {\n const combinedState = scope.toCombinedState(state);\n const reject = interactions.validateOrReject(combinedState, input);\n if (reject) {\n return reject;\n }\n const result = instructions.reduceOnce(combinedState, input);\n if (result.type === \"reject\") {\n return result;\n }\n return {\n type: \"accept\" as const,\n state: scope.toSessionState(result.state),\n instructions: result.instructions ?? [],\n };\n },\n async dispatch({ state, input }) {\n const combinedState = scope.toCombinedState(state);\n const reject = interactions.validateOrReject(combinedState, input);\n if (reject) {\n return reject;\n }\n const result = instructions.dispatch(combinedState, input);\n if (result.type === \"reject\") {\n return result;\n }\n return {\n type: \"accept\" as const,\n state: scope.toSessionState(result.state),\n trace: result.trace,\n };\n },\n projectStatic() {\n return staticProjection.projectStatic();\n },\n projectSeatsDynamic(input) {\n return projection.projectSeatsDynamic(input);\n },\n projectSeatViewDynamic(input) {\n return projection.projectSeatViewDynamic(input);\n },\n };\n}\n","// @generated by packages/reducer-contract/scripts/generate-ts.mjs\n// DO NOT EDIT BY HAND. Edit schema/reducer-runtime.schema.json and rerun `pnpm generate`.\n\n/* eslint-disable */\nimport type * as Wire from \"./wire\";\n\n/**\n * Typed effect constructors. Authors MUST go through these; hand-constructing\n * Wire.Effect objects is banned by convention because it's how wire drift\n * re-enters the codebase.\n *\n * The `effectId` is minted by the runtime (see createEffectIdMinter below),\n * not by the author. Each builder returns a `PendingEffect` that carries\n * the optional continuation; the reducer bundle's accept materializer splits\n * pending effects into the wire's `effects[]` + `continuations` map.\n */\n\nexport type PendingEffect = Wire.Effect & {\n readonly __continuation?: Wire.ContinuationToken;\n};\n\nexport type EffectIdMinter = () => Wire.EffectId;\n\n/**\n * Produces sequential, deterministic effect ids scoped to a single accept\n * payload: \"ef0\", \"ef1\", ... . Uniqueness only needs to be local to the\n * payload because the host consumes and discards them per dispatch.\n */\nexport function createEffectIdMinter(): EffectIdMinter {\n let i = 0;\n return () => `ef${i++}` as Wire.EffectId;\n}\n\nexport type EffectBuilders = {\n transition(args: { to: string }, continuation?: Wire.ContinuationToken): PendingEffect;\n rollDie(args: { dieId: string }, continuation?: Wire.ContinuationToken): PendingEffect;\n shuffleSharedZone(args: { zoneId: string }, continuation?: Wire.ContinuationToken): PendingEffect;\n shufflePlayerZone(args: { zoneId: string; playerId: string }, continuation?: Wire.ContinuationToken): PendingEffect;\n};\n\nexport function createEffectBuilders(mint: EffectIdMinter): EffectBuilders {\n return {\n transition(args, continuation) {\n const effect = { effectId: mint(), type: \"transition\" as const, to: args.to };\n return continuation === undefined\n ? (effect as PendingEffect)\n : Object.assign(effect, { __continuation: continuation });\n },\n rollDie(args, continuation) {\n const effect = { effectId: mint(), type: \"rollDie\" as const, dieId: args.dieId };\n return continuation === undefined\n ? (effect as PendingEffect)\n : Object.assign(effect, { __continuation: continuation });\n },\n shuffleSharedZone(args, continuation) {\n const effect = { effectId: mint(), type: \"shuffleSharedZone\" as const, zoneId: args.zoneId };\n return continuation === undefined\n ? (effect as PendingEffect)\n : Object.assign(effect, { __continuation: continuation });\n },\n shufflePlayerZone(args, continuation) {\n const effect = { effectId: mint(), type: \"shufflePlayerZone\" as const, zoneId: args.zoneId, playerId: args.playerId };\n return continuation === undefined\n ? (effect as PendingEffect)\n : Object.assign(effect, { __continuation: continuation });\n },\n };\n}\n\n/**\n * Takes a list of PendingEffects and splits them into the canonical wire\n * shape: `effects[]` (stripped of `__continuation`) + `continuations` map\n * keyed by effectId. Use at the boundary where reduce/dispatch results leave\n * author code and enter the wire.\n */\nexport function materializeAccept(pending: ReadonlyArray<PendingEffect>): {\n effects: Wire.Effect[];\n continuations: Wire.ContinuationMap;\n} {\n const effects: Wire.Effect[] = [];\n const continuations: Wire.ContinuationMap = {};\n for (const pe of pending) {\n const { __continuation, ...effect } = pe as PendingEffect & { __continuation?: Wire.ContinuationToken };\n effects.push(effect as Wire.Effect);\n if (__continuation !== undefined) {\n continuations[(effect as Wire.Effect).effectId] = __continuation;\n }\n }\n return { effects, continuations };\n}\n","// @generated by packages/reducer-contract/scripts/generate-ts.mjs\n// DO NOT EDIT BY HAND. Edit schema/reducer-runtime.schema.json and rerun `pnpm generate`.\n\n/**\n * The wire-protocol version this package implements. Bumped in lockstep with\n * any breaking change to schema/reducer-runtime.schema.json. At bundle load\n * time the Kotlin adapter refuses bundles whose major version differs.\n */\nexport const REDUCER_CONTRACT_VERSION = \"7.0.0\" as const;\n","import { z } from \"zod\";\nimport type { RuntimePayload } from \"../model\";\n\nexport const runtimePayloadSchema: z.ZodType<RuntimePayload> = z.lazy(() =>\n z.union([\n z.boolean(),\n z.number(),\n z.string(),\n z.null(),\n z.array(runtimePayloadSchema),\n z.record(z.string(), z.union([runtimePayloadSchema, z.undefined()])),\n ]),\n);\n","import { z } from \"zod\";\nimport { safeParseOrThrow } from \"../parse-utils\";\nimport type { RawRuntimeInput } from \"./raw-types\";\nimport { runtimePayloadSchema } from \"./runtime-payload\";\n\nexport function createRuntimeInputParser<PlayerId extends string>(\n playerIdSchema: z.ZodType<PlayerId>,\n): (rawInput: unknown) => RawRuntimeInput {\n const rawRuntimeInputSchema = z.object({\n kind: z.literal(\"interaction\"),\n playerId: playerIdSchema,\n interactionId: z.string(),\n params: runtimePayloadSchema.default({}),\n });\n\n return (rawInput: unknown) =>\n safeParseOrThrow(rawRuntimeInputSchema, rawInput, \"input\");\n}\n","import { z } from \"zod\";\nimport type {\n BaseGameStateOfContract,\n ManifestContractOf,\n PhaseDefinition,\n PhaseMapOf,\n PhaseNameOfContract,\n ReducerGameContractLike,\n ReducerGameDefinition,\n SchemaLike,\n ViewMapOf,\n} from \"../model\";\n\nfunction createPhaseNameSchema<PhaseName extends string>(\n phaseNames: readonly PhaseName[],\n): z.ZodType<PhaseName> {\n const allowed = new Set(phaseNames);\n return z.custom<PhaseName>(\n (value: unknown) =>\n typeof value === \"string\" && allowed.has(value as PhaseName),\n { message: \"Invalid phase name\" },\n );\n}\n\nexport function collectIngressPhaseSchemas<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): {\n phaseEntries: Array<\n [\n PhaseNameOfContract<Contract>,\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n ]\n >;\n phaseNames: PhaseNameOfContract<Contract>[];\n phaseNameSchema: z.ZodType<PhaseNameOfContract<Contract>>;\n} {\n type PhaseName = PhaseNameOfContract<Contract>;\n const phaseEntries = Object.entries(definition.phases) as Array<\n [\n PhaseName,\n PhaseDefinition<\n SchemaLike<object>,\n BaseGameStateOfContract<Contract>,\n ManifestContractOf<Contract>\n >,\n ]\n >;\n const phaseNames = phaseEntries.map(([phaseName]) => phaseName);\n return {\n phaseEntries,\n phaseNames,\n phaseNameSchema: createPhaseNameSchema(phaseNames),\n };\n}\n","import { z } from \"zod\";\nimport { Zod as ContractZod } from \"@dreamboard/reducer-contract\";\nimport { safeParseOrThrow } from \"../parse-utils\";\nimport type {\n BaseGameSessionOfContract,\n GameStateOf,\n HiddenSchemaOfContract,\n ManifestContractOf,\n ManifestOf,\n PhaseMapOf,\n PhaseNameOfContract,\n PlayerIdOfState,\n PrivateSchemaOfContract,\n PublicSchemaOfContract,\n ReducerGameContractLike,\n ReducerGameDefinition,\n RuntimeSetupSelection,\n TableOfManifest,\n ViewMapOf,\n} from \"../model\";\nimport type { IngressRuntimeCodec, RawReducerSessionState } from \"./raw-types\";\nimport { createRuntimeInputParser } from \"./input-codec\";\nimport { collectIngressPhaseSchemas } from \"./phase-schemas\";\n\nconst runtimePayloadSchema: z.ZodType<unknown> = z.lazy(() =>\n z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.null(),\n z.array(runtimePayloadSchema),\n z.record(z.string(), runtimePayloadSchema),\n ]),\n);\nconst runtimeRecordSchema = z.record(z.string(), runtimePayloadSchema);\nconst perPlayerSchema = <Value extends z.ZodTypeAny>(valueSchema: Value) =>\n z\n .object({\n __perPlayer: z.literal(true),\n entries: z.array(z.tuple([z.string(), valueSchema])),\n })\n .strict();\nconst runtimeComponentLocationSchema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"Detached\") }).strict(),\n z\n .object({\n type: z.literal(\"InDeck\"),\n deckId: z.string(),\n playedBy: z.string().nullable(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InHand\"),\n handId: z.string(),\n playerId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InZone\"),\n zoneId: z.string(),\n playedBy: z.string().nullable().optional(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnSpace\"),\n boardId: z.string(),\n spaceId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InContainer\"),\n boardId: z.string(),\n containerId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnEdge\"),\n boardId: z.string(),\n edgeId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"OnVertex\"),\n boardId: z.string(),\n vertexId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n z\n .object({\n type: z.literal(\"InSlot\"),\n host: z.union([\n z.object({ kind: z.literal(\"piece\"), id: z.string() }).strict(),\n z.object({ kind: z.literal(\"die\"), id: z.string() }).strict(),\n ]),\n slotId: z.string(),\n position: z.number().int().nullable().optional(),\n })\n .strict(),\n]);\nconst currentRuntimeTableSchema = z\n .object({\n playerOrder: z.array(z.string()),\n zones: z\n .object({\n shared: z.record(z.string(), z.array(z.string())),\n perPlayer: z.record(z.string(), perPlayerSchema(z.array(z.string()))),\n visibility: z.record(\n z.string(),\n z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"]),\n ),\n cardSetIdsByZoneId: z\n .record(z.string(), z.array(z.string()))\n .optional(),\n })\n .strict(),\n decks: z.record(z.string(), z.array(z.string())),\n hands: z.record(z.string(), perPlayerSchema(z.array(z.string()))),\n handVisibility: z.record(\n z.string(),\n z.enum([\"all\", \"ownerOnly\", \"public\", \"hidden\"]),\n ),\n cards: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n cardSetId: z.string(),\n cardType: z.string(),\n name: z.string().optional(),\n text: z.string().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n pieces: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n pieceTypeId: z.string(),\n pieceName: z.string().nullable().optional(),\n ownerId: z.string().nullable().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n componentLocations: z.record(z.string(), runtimeComponentLocationSchema),\n ownerOfCard: z.record(z.string(), z.string().nullable()),\n visibility: z.record(\n z.string(),\n z\n .object({\n faceUp: z.boolean(),\n visibleTo: z.array(z.string()).nullable().optional(),\n })\n .strict(),\n ),\n resources: perPlayerSchema(runtimeRecordSchema),\n boards: z\n .object({\n byId: z.record(z.string(), runtimeRecordSchema),\n hex: z.record(z.string(), runtimeRecordSchema),\n square: z.record(z.string(), runtimeRecordSchema),\n network: z.record(z.string(), runtimeRecordSchema).optional(),\n track: z.record(z.string(), runtimeRecordSchema).optional(),\n })\n .strict(),\n dice: z.record(\n z.string(),\n z\n .object({\n componentType: z.string().optional(),\n id: z.string(),\n dieTypeId: z.string(),\n dieName: z.string().nullable().optional(),\n ownerId: z.string().nullable().optional(),\n sides: z.number().int(),\n value: z.number().int().nullable().optional(),\n properties: runtimeRecordSchema,\n })\n .strict(),\n ),\n })\n .strict();\n\nexport function createIngressRuntimeCodec<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): IngressRuntimeCodec<\n TableOfManifest<ManifestOf<Contract>>,\n ManifestContractOf<Contract>,\n PublicSchemaOfContract<Contract>,\n PrivateSchemaOfContract<Contract>,\n HiddenSchemaOfContract<Contract>,\n PhaseNameOfContract<Contract>\n> {\n type Definition = ReducerGameDefinition<Contract, Definitions, Views>;\n type DomainState = GameStateOf<Definition>;\n type State = BaseGameSessionOfContract<Contract>;\n type Manifest = ManifestContractOf<Contract>;\n type PhaseName = PhaseNameOfContract<Contract>;\n type ReturnType = IngressRuntimeCodec<\n TableOfManifest<ManifestOf<Contract>>,\n Manifest,\n PublicSchemaOfContract<Contract>,\n PrivateSchemaOfContract<Contract>,\n HiddenSchemaOfContract<Contract>,\n PhaseName\n >;\n type PlayerId = PlayerIdOfState<DomainState>;\n\n const { phaseNameSchema } = collectIngressPhaseSchemas(definition);\n const playerIdSchema = definition.contract.manifest.ids\n .playerId as z.ZodType<PlayerId>;\n\n const flowSchema = z.object({\n currentPhase: phaseNameSchema,\n turn: z.number().int(),\n round: z.number().int(),\n activePlayers: z.array(playerIdSchema),\n });\n const runtimeStateSchema = z.object({\n rng: z.object({\n seed: z.number().int().nullable(),\n cursor: z.number().int(),\n trace: z.array(z.string()),\n }),\n setup: z\n .object({\n profileId: z.string(),\n optionValues: z.record(z.string(), z.string().nullable()),\n })\n .nullable(),\n simultaneous: z.object({\n current: z\n .object({\n phaseName: phaseNameSchema,\n actors: z.array(playerIdSchema),\n submissions: z.record(\n z.string(),\n z.object({\n interactionId: z.string(),\n params: runtimePayloadSchema,\n }),\n ),\n })\n .nullable(),\n }),\n lastTransition: z\n .object({\n from: phaseNameSchema,\n to: phaseNameSchema,\n })\n .nullable(),\n });\n const parseRuntimeInput = createRuntimeInputParser(playerIdSchema);\n\n // The return type uses branded/mapped types derived from the contract generic.\n // TypeScript cannot verify that plain objects satisfy these deep mapped types,\n // but the runtime Zod parsing ensures correctness.\n return {\n defaultRuntimeState(\n seed: number | null = null,\n setup: RuntimeSetupSelection<Manifest> | null = null,\n ) {\n const runtimeState: State[\"runtime\"] = {\n rng: {\n seed,\n cursor: 0,\n trace: [],\n },\n setup,\n simultaneous: { current: null },\n lastTransition: null,\n };\n return runtimeState;\n },\n parseInitialTable(rawTable: unknown, playerIds: string[] | undefined) {\n const table = safeParseOrThrow(\n currentRuntimeTableSchema,\n rawTable,\n \"table\",\n ) as unknown as TableOfManifest<ManifestOf<Contract>>;\n return {\n table,\n playerIds: safeParseOrThrow(\n z.array(playerIdSchema),\n playerIds && playerIds.length > 0 ? playerIds : table.playerOrder,\n \"table.playerOrder\",\n ),\n };\n },\n parseState(rawState: RawReducerSessionState) {\n const envelope = safeParseOrThrow(\n ContractZod.ReducerSessionStateSchema,\n rawState,\n \"state\",\n );\n const table = safeParseOrThrow(\n definition.contract.manifest.tableSchema,\n envelope.domain.table,\n \"domain.table\",\n );\n const playerIds = [...table.playerOrder] as PlayerId[];\n const privateState = Object.fromEntries(\n playerIds.map((playerId) => [\n playerId,\n safeParseOrThrow(\n definition.contract.state.private,\n envelope.domain.privateState[playerId] ?? {},\n `privateState:${playerId}`,\n ),\n ]),\n ) as State[\"domain\"][\"privateState\"];\n const flow = safeParseOrThrow(\n flowSchema,\n {\n currentPhase: envelope.domain.flow.currentPhase,\n turn: envelope.domain.flow.turn,\n round: envelope.domain.flow.round,\n activePlayers: envelope.domain.flow.activePlayers,\n },\n \"domain.flow\",\n );\n const currentPhaseDefinition = definition.phases[flow.currentPhase];\n if (!currentPhaseDefinition) {\n throw new Error(`Unknown reducer phase '${flow.currentPhase}'.`);\n }\n const rawPhaseState = envelope.domain.phase;\n const phase = safeParseOrThrow(\n currentPhaseDefinition.state,\n rawPhaseState ?? {},\n `phase:${flow.currentPhase}`,\n ) as State[\"domain\"][\"phase\"];\n\n const parsedState: State = {\n domain: {\n table,\n publicState: safeParseOrThrow(\n definition.contract.state.public,\n envelope.domain.publicState,\n \"domain.publicState\",\n ) as State[\"domain\"][\"publicState\"],\n privateState,\n hiddenState: safeParseOrThrow(\n definition.contract.state.hidden,\n envelope.domain.hiddenState,\n \"domain.hiddenState\",\n ) as State[\"domain\"][\"hiddenState\"],\n flow,\n phase,\n },\n runtime: safeParseOrThrow(\n runtimeStateSchema,\n envelope.runtime,\n \"runtime\",\n ) as unknown as State[\"runtime\"],\n };\n return parsedState;\n },\n serializeState(state: State) {\n return {\n domain: { ...state.domain },\n runtime: state.runtime,\n } as RawReducerSessionState;\n },\n parsePlayerId(rawPlayerId: string) {\n return safeParseOrThrow(playerIdSchema, rawPlayerId, \"playerId\");\n },\n parseInput(rawInput: unknown) {\n return parseRuntimeInput(rawInput);\n },\n } as unknown as ReturnType;\n}\n","import { createTrustedReducerBundle } from \"./trusted-bundle\";\nimport { createIngressRuntimeCodec } from \"../ingress/runtime-codec\";\nimport {\n Builders,\n REDUCER_CONTRACT_VERSION,\n Wire,\n} from \"@dreamboard/reducer-contract\";\nimport type {\n ManifestContractOf,\n PhaseMapOf,\n ReducerGameContractLike,\n ReducerGameDefinition,\n ReducerReject,\n RuntimeSetupSelectionInput,\n ViewMapOf,\n} from \"../model\";\nimport type { RuntimeInstructionForState } from \"../core/runtime-instruction\";\nimport type { DispatchTraceEntry } from \"../core/types\";\nimport type {\n UntrustedReducerSessionState,\n UntrustedRuntimeInput,\n UntrustedRuntimeTable,\n} from \"../ingress/types\";\nimport type { ReducerBundle } from \"./types\";\n\n/**\n * Pass the wire-validated `interaction` input through to the trusted\n * bundle. Both layers speak the same single-kind shape now — the routing\n * here only normalizes `params` to a concrete object when the caller\n * elided it.\n *\n * The wire schema admits exactly one player-originated variant\n * (`{ kind: \"interaction\" }`) and the engine's `TrustedRuntimeInput`\n * uses the same discriminator, so this is a straight pass-through.\n * Continuation inputs are engine-internal and never traverse this routing.\n */\nfunction routeInteraction(input: UntrustedRuntimeInput): {\n kind: \"interaction\";\n playerId: string;\n interactionId: string;\n params: unknown;\n} {\n return {\n kind: \"interaction\",\n playerId: input.playerId,\n interactionId: input.interactionId,\n params: input.params,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Wire-protocol adapter.\n//\n// The trusted bundle (see ./trusted-bundle.ts) keeps the app-sdk runtime\n// instruction shape at reducer boundaries where:\n// - Results discriminate on `type: \"accept\" | \"reject\"`.\n// - Reducer-returned instructions carry `kind`.\n// - Dispatch traces use normalized runtime instructions.\n// The generated reducer-contract (`packages/reducer-contract`) defines the\n// canonical wire shape consumed by the Kotlin host:\n// - Results discriminate on `kind: \"accept\" | \"reject\"`.\n// - Each effect carries an `effectId`, never an inline `resume`.\n// - Continuations live in a sibling `continuations: Record<effectId, ...>`\n// map on reduce results, or on the matching `appliedEffect` trace entry\n// for dispatch results.\n// - Each DispatchTrace entry discriminates on `kind` (no `type` field).\n//\n// This module is the ONLY place in the app-sdk that converts runtime\n// instructions into wire effects. It does so through\n// `@dreamboard/reducer-contract/builders` (the single source of truth for\n// wire-effect construction) rather than hand-rolling the mapping locally —\n// hand-rolled mappings are how wire drift sneaks in (see the catan\n// rollDie regression).\n// ---------------------------------------------------------------------------\n\ntype InternalInstruction<State> = RuntimeInstructionForState<State>;\n\nfunction extractContinuation<State>(\n instruction: InternalInstruction<State>,\n): Wire.ContinuationToken | undefined {\n const continuation = (\n instruction as {\n continuation?: Wire.ContinuationToken | null | undefined;\n }\n ).continuation;\n if (continuation === undefined || continuation === null) return undefined;\n return {\n id: continuation.id,\n data: continuation.data as Wire.JsonValue,\n };\n}\n\n/**\n * Route one engine-internal effect through the generated builder that owns\n * its wire shape. The builder mints the effectId, enforces the correct\n * required/optional key set, and attaches the continuation privately via\n * `__continuation` so `materializeAccept` can split it out at the wire\n * boundary.\n *\n * Why dispatch through the builder instead of constructing `Wire.Effect`\n * directly? The schema + builders are the SSOT for wire shapes. Duplicating\n * that knowledge here once caused the catan rollDie bug; never again.\n */\nfunction toPendingEffect<State>(\n instruction: InternalInstruction<State>,\n fx: Builders.EffectBuilders,\n): Builders.PendingEffect {\n const continuation = extractContinuation<State>(instruction);\n switch (instruction.kind) {\n case \"flow.transition\":\n return fx.transition({ to: instruction.to as string }, continuation);\n case \"engine.rollDie\":\n return fx.rollDie(\n { dieId: (instruction as { dieId: string }).dieId },\n continuation,\n );\n case \"engine.shuffleSharedZone\":\n return fx.shuffleSharedZone(\n { zoneId: (instruction as { zoneId: string }).zoneId as string },\n continuation,\n );\n case \"engine.shufflePlayerZone\":\n return fx.shufflePlayerZone(\n {\n zoneId: (instruction as { zoneId: string }).zoneId as string,\n playerId: (instruction as { playerId: string }).playerId as string,\n },\n continuation,\n );\n default: {\n const _exhaustive: never = instruction;\n throw new Error(\n `toPendingEffect: unsupported instruction kind '${(_exhaustive as { kind: string }).kind}'.`,\n );\n }\n }\n}\n\nfunction toWireReduceResult<State>(\n result:\n | ReducerReject\n | {\n type: \"accept\";\n state: State;\n instructions?: InternalInstruction<State>[];\n },\n serializeState: (state: State) => UntrustedReducerSessionState,\n): Wire.ReduceResult {\n if (result.type === \"reject\") {\n return result.message === undefined\n ? { kind: \"reject\", errorCode: result.errorCode }\n : {\n kind: \"reject\",\n errorCode: result.errorCode,\n message: result.message,\n };\n }\n const mint = Builders.createEffectIdMinter();\n const fx = Builders.createEffectBuilders(mint);\n const pending = (result.instructions ?? []).map((instruction) =>\n toPendingEffect<State>(instruction, fx),\n );\n const { effects, continuations } = Builders.materializeAccept(pending);\n return {\n kind: \"accept\",\n state: serializeState(result.state),\n effects,\n continuations,\n };\n}\n\nfunction toWireDispatchResult<State, PlayerId extends string>(\n result:\n | ReducerReject\n | {\n type: \"accept\";\n state: State;\n trace: DispatchTraceEntry<State, PlayerId>[];\n },\n serializeState: (state: State) => UntrustedReducerSessionState,\n): Wire.DispatchResult {\n if (result.type === \"reject\") {\n return result.message === undefined\n ? { kind: \"reject\", errorCode: result.errorCode }\n : {\n kind: \"reject\",\n errorCode: result.errorCode,\n message: result.message,\n };\n }\n const mint = Builders.createEffectIdMinter();\n const fx = Builders.createEffectBuilders(mint);\n const trace: Wire.DispatchTrace[] = [];\n for (const entry of result.trace) {\n switch (entry.type) {\n case \"acceptedClientInput\": {\n const engineInput = entry.input as {\n kind: \"interaction\" | \"continuation\";\n playerId?: string;\n interactionId?: string;\n params?: Wire.JsonValue;\n };\n let wireInput: Wire.GameInput;\n if (engineInput.kind === \"interaction\") {\n wireInput = {\n kind: \"interaction\",\n playerId: engineInput.playerId ?? \"\",\n interactionId: engineInput.interactionId ?? \"\",\n params: engineInput.params ?? {},\n };\n } else {\n // Continuation inputs are engine-internal and shouldn't appear in\n // client-addressed dispatch traces; synthesize a best-effort wire\n // shape so the trace stays well-typed.\n wireInput = {\n kind: \"interaction\",\n playerId: \"\",\n interactionId: \"\",\n params: {},\n };\n }\n trace.push({\n kind: \"acceptedClientInput\",\n input: wireInput,\n });\n break;\n }\n case \"appliedInstruction\": {\n const pending = toPendingEffect<State>(\n entry.instruction as InternalInstruction<State>,\n fx,\n );\n const { effects, continuations } = Builders.materializeAccept([\n pending,\n ]);\n const [wireEffect] = effects;\n if (wireEffect === undefined) {\n throw new Error(\n \"materializeAccept returned no effects for a single pending effect\",\n );\n }\n const continuation = continuations[wireEffect.effectId];\n trace.push(\n continuation === undefined\n ? { kind: \"appliedEffect\", effect: wireEffect }\n : { kind: \"appliedEffect\", effect: wireEffect, continuation },\n );\n break;\n }\n case \"rngConsumption\":\n trace.push({\n kind: \"rngConsumption\",\n operation: entry.operation,\n traceEntry: entry.traceEntry,\n });\n break;\n default: {\n const _exhaustive: never = entry;\n throw new Error(\n `toWireDispatchResult: unknown trace entry type '${(_exhaustive as { type: string }).type}'.`,\n );\n }\n }\n }\n return {\n kind: \"accept\",\n state: serializeState(result.state),\n trace,\n };\n}\n\nexport function createReducerBundle<\n Contract extends ReducerGameContractLike,\n Definitions extends PhaseMapOf<Contract>,\n Views extends ViewMapOf<Contract>,\n>(\n definition: ReducerGameDefinition<Contract, Definitions, Views>,\n): ReducerBundle {\n type Definition = ReducerGameDefinition<Contract, Definitions, Views>;\n const trustedBundle = createTrustedReducerBundle(definition);\n const codec = createIngressRuntimeCodec(definition);\n type Manifest = ManifestContractOf<Definition[\"contract\"]>;\n type TrustedState = Awaited<ReturnType<typeof trustedBundle.initialize>>;\n\n function parseTrustedState(state: unknown): TrustedState {\n return codec.parseState(\n state as UntrustedReducerSessionState,\n ) as TrustedState;\n }\n\n function parseRuntimePlayerId(playerId: unknown) {\n if (typeof playerId !== \"string\") {\n throw new Error(\"Expected a string playerId.\");\n }\n return codec.parsePlayerId(playerId);\n }\n\n const bundle = {\n ...trustedBundle,\n // Top-level protocol version. The Kotlin ReducerBundleAdapter reads this\n // on bundle load and rejects bundles whose major version does not match\n // the host's compiled-in REDUCER_CONTRACT_VERSION.\n reducerContractVersion: REDUCER_CONTRACT_VERSION,\n async initialize({\n table,\n playerIds,\n rngSeed,\n setup,\n }: Wire.InitializeRequest) {\n const { table: parsedTable, playerIds: parsedPlayerIds } =\n codec.parseInitialTable(\n table as Parameters<typeof codec.parseInitialTable>[0],\n playerIds,\n );\n return codec.serializeState(\n await trustedBundle.initialize({\n table: parsedTable,\n playerIds: parsedPlayerIds,\n rngSeed,\n setup: setup as RuntimeSetupSelectionInput<Manifest> | null,\n }),\n );\n },\n async initializePhase({ state, to }: Wire.InitializePhaseRequest) {\n const decodedState = parseTrustedState(state);\n return codec.serializeState(\n await trustedBundle.initializePhase({\n state: decodedState,\n to: to as never,\n }),\n );\n },\n async validateInput({ state, input }: Wire.ValidateInputRequest) {\n const validatedWire = codec.parseInput(input as UntrustedRuntimeInput);\n const routed = routeInteraction(validatedWire);\n return trustedBundle.validateInput({\n state: parseTrustedState(state),\n input: routed as never,\n });\n },\n async reduce({\n state,\n input,\n }: Wire.ReduceRequest): Promise<Wire.ReduceResult> {\n const validatedWire = codec.parseInput(input as UntrustedRuntimeInput);\n const routed = routeInteraction(validatedWire);\n const result = await trustedBundle.reduce({\n state: parseTrustedState(state),\n input: routed as never,\n });\n return toWireReduceResult<TrustedState>(result as never, (nextState) =>\n codec.serializeState(nextState as never),\n );\n },\n async dispatch({\n state,\n input,\n }: Wire.DispatchRequest): Promise<Wire.DispatchResult> {\n const validatedWire = codec.parseInput(input as UntrustedRuntimeInput);\n const routed = routeInteraction(validatedWire);\n const result = await trustedBundle.dispatch({\n state: parseTrustedState(state),\n input: routed as never,\n });\n return toWireDispatchResult(result as never, (nextState: TrustedState) =>\n codec.serializeState(nextState as never),\n );\n },\n /**\n * Wire-side passthrough for the session-scoped static projection. The\n * host calls this once per reducer session, caches the payload, and\n * thereafter merges it back into every seat view on the client. Returns\n * `null` when `defineGame` did not declare a `staticView`.\n */\n projectStatic() {\n return trustedBundle.projectStatic() as Wire.BoardStaticProjection | null;\n },\n /**\n * Wire-side passthrough for per-tick seat projection. The seat views carry\n * only the fields produced by `defineView`; static topology, when present,\n * was served once via `projectStatic` and is re-merged on the client.\n */\n projectSeatsDynamic({\n state,\n playerIds,\n viewId = \"player\",\n }: Wire.ProjectSeatsDynamicRequest) {\n const parsedState = parseTrustedState(state);\n const parsedPlayerIds = playerIds.map((pid) => codec.parsePlayerId(pid));\n return trustedBundle.projectSeatsDynamic({\n state: parsedState,\n playerIds: parsedPlayerIds,\n viewId,\n }) as Wire.SeatProjectionBundle;\n },\n projectSeatViewDynamic({ state, playerId, viewId = \"player\" }) {\n const parsedState = parseTrustedState(state);\n return trustedBundle.projectSeatViewDynamic({\n state: parsedState,\n playerId: parseRuntimePlayerId(playerId),\n viewId,\n });\n },\n createInProcessRuntime() {\n let state: TrustedState | null = null;\n const requireState = () => {\n if (!state) {\n throw new Error(\"In-process reducer runtime has no state.\");\n }\n return state;\n };\n return {\n async initialize({ table, playerIds, rngSeed, setup }) {\n const { table: parsedTable, playerIds: parsedPlayerIds } =\n codec.parseInitialTable(\n table as Parameters<typeof codec.parseInitialTable>[0],\n playerIds,\n );\n state = await trustedBundle.initialize({\n table: parsedTable,\n playerIds: parsedPlayerIds,\n rngSeed,\n setup: setup as RuntimeSetupSelectionInput<Manifest> | null,\n });\n },\n hydrate({ state: snapshot }) {\n state = parseTrustedState(snapshot);\n },\n async dispatch({ input }) {\n const validatedWire = codec.parseInput(\n input as UntrustedRuntimeInput,\n );\n const routed = routeInteraction(validatedWire);\n const result = await trustedBundle.dispatch({\n state: requireState(),\n input: routed as never,\n });\n if (result.type === \"reject\") {\n return {\n kind: \"reject\" as const,\n errorCode: result.errorCode,\n message: result.message,\n };\n }\n state = result.state;\n return { kind: \"accept\" as const };\n },\n projectSeatViewDynamic({ playerId, viewId = \"player\" }) {\n return trustedBundle.projectSeatViewDynamic({\n state: requireState(),\n playerId: parseRuntimePlayerId(playerId),\n viewId,\n });\n },\n projectSeatsDynamic({ playerIds, viewId = \"player\" }) {\n const parsedPlayerIds = playerIds.map((pid) =>\n parseRuntimePlayerId(pid),\n );\n return trustedBundle.projectSeatsDynamic({\n state: requireState(),\n playerIds: parsedPlayerIds,\n viewId,\n });\n },\n snapshot() {\n return codec.serializeState(requireState());\n },\n unsafeState() {\n return requireState();\n },\n };\n },\n } satisfies ReducerBundle;\n\n return bundle;\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: \"node20\",\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 { createHash } from \"node:crypto\";\nimport { spawn, type ChildProcess } from \"node:child_process\";\nimport { constants, createWriteStream } from \"node:fs\";\nimport {\n access,\n lstat,\n mkdir,\n mkdtemp,\n readFile,\n rm,\n symlink,\n} from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport path from \"node:path\";\nimport { createInterface } from \"node:readline\";\nimport type { Readable } from \"node:stream\";\nimport { fileURLToPath } from \"node:url\";\nimport { client } from \"@dreamboard/api-client/client.gen\";\nimport consola from \"consola\";\nimport { MATERIALIZED_MANIFEST_FILE } from \"../../constants.js\";\nimport type { ProjectConfig } from \"../../types.js\";\nimport { exists } from \"../../utils/fs.js\";\nimport { hashContent } from \"../../utils/crypto.js\";\nimport { getProjectAuthoringState } from \"../project/project-state.js\";\nimport { loadManifest } from \"../project/local-files.js\";\nimport { readMaterializedManifestText } from \"../project/manifest-authoring.js\";\n\nconst READY_PREFIX = \"HARNESS_READY \";\nconst HARNESS_START_IDLE_TIMEOUT_MS = 180_000;\nconst HARNESS_START_MAX_TIMEOUT_MS = 600_000;\nconst HARNESS_STOP_TIMEOUT_MS = 10_000;\nconst UUID_PATTERN =\n /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;\nconst MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));\nconst REPO_ROOT = path.resolve(MODULE_DIR, \"../../../../..\");\nconst PROJECT_DEPENDENCY_NODE_MODULES = path.join(\n REPO_ROOT,\n \"apps\",\n \"dreamboard-cli\",\n \"node_modules\",\n);\nconst UI_SDK_NODE_MODULES = path.join(\n REPO_ROOT,\n \"packages\",\n \"ui-sdk\",\n \"node_modules\",\n);\n\ntype EmbeddedHarnessReady = {\n status: \"ready\";\n baseUrl: string;\n port: number;\n gameId: string;\n compiledResultId: string;\n manifestId: string;\n ruleId: string;\n hostUserId: string;\n hostToken: string;\n guestUserId: string;\n guestToken: string;\n};\n\ntype LocalHarnessFixture = {\n bundleRoot: string;\n manifestHash: string;\n gameId: string;\n manifestId: string;\n compiledResultId: string;\n ruleId: string;\n gameSlug: string;\n gameName: string;\n};\n\ntype HarnessMonitor = {\n ready: EmbeddedHarnessReady;\n dispose: () => void;\n};\n\nexport type EmbeddedHarnessSession = {\n gameId: string;\n compiledResultId: string;\n manifestHash: string;\n baseUrl: string;\n logFilePath: string;\n stop: () => Promise<void>;\n};\n\nexport async function startEmbeddedHarnessSession(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n configureClient?: boolean;\n}): Promise<EmbeddedHarnessSession> {\n const repoRoot = await resolveRepoRoot(options.projectRoot);\n const gradlew = await resolveGradleLauncher(repoRoot);\n const fixture = await prepareLocalHarnessFixture(options);\n const logDir = path.join(options.projectRoot, \"test\", \"generated\");\n const logFilePath = path.join(logDir, \"embedded-harness.log\");\n await mkdir(logDir, { recursive: true });\n\n const previousClientConfig = client.getConfig();\n const child = spawn(\n gradlew.command,\n [\n ...gradlew.args,\n \"--console=plain\",\n \":apps:backend:runEmbeddedHarness\",\n `-PharnessManifestPath=${path.join(options.projectRoot, MATERIALIZED_MANIFEST_FILE)}`,\n `-PharnessBundlePath=${fixture.bundleRoot}`,\n `-PharnessGameId=${fixture.gameId}`,\n `-PharnessManifestId=${fixture.manifestId}`,\n `-PharnessCompiledResultId=${fixture.compiledResultId}`,\n `-PharnessRuleId=${fixture.ruleId}`,\n `-PharnessGameSlug=${fixture.gameSlug}`,\n `-PharnessGameName=${fixture.gameName}`,\n \"-PharnessHostEmail=host@example.com\",\n \"-PharnessGuestEmail=guest@example.com\",\n ],\n {\n cwd: repoRoot,\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n },\n );\n\n let stopped = false;\n let restoreClientConfig: (() => void) | undefined;\n let monitor: HarnessMonitor;\n try {\n monitor = await waitForHarnessReady(child, logFilePath);\n if (options.configureClient !== false) {\n client.setConfig({\n ...previousClientConfig,\n baseUrl: monitor.ready.baseUrl,\n headers: {\n ...(previousClientConfig.headers ?? {}),\n Authorization: `Bearer ${monitor.ready.hostToken}`,\n },\n });\n restoreClientConfig = () => client.setConfig(previousClientConfig);\n }\n } catch (error) {\n await terminateChild(child);\n await rm(fixture.bundleRoot, { recursive: true, force: true });\n throw error;\n }\n\n consola.info(`Embedded harness ready at ${monitor.ready.baseUrl}`);\n\n return {\n gameId: fixture.gameId,\n compiledResultId: fixture.compiledResultId,\n manifestHash: fixture.manifestHash,\n baseUrl: monitor.ready.baseUrl,\n logFilePath,\n stop: async () => {\n if (stopped) return;\n stopped = true;\n restoreClientConfig?.();\n await terminateChild(child);\n monitor.dispose();\n await rm(fixture.bundleRoot, { recursive: true, force: true });\n },\n };\n}\n\nasync function pathExists(targetPath: string): Promise<boolean> {\n try {\n await lstat(targetPath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function ensureSymlink(targetPath: string, linkPath: string) {\n if (await pathExists(linkPath)) {\n return;\n }\n\n await mkdir(path.dirname(linkPath), { recursive: true });\n await symlink(\n targetPath,\n linkPath,\n process.platform === \"win32\" ? \"junction\" : \"dir\",\n );\n}\n\nasync function ensureEmbeddedHarnessDependencies(\n projectRoot: string,\n): Promise<void> {\n if (await pathExists(PROJECT_DEPENDENCY_NODE_MODULES)) {\n await ensureSymlink(\n PROJECT_DEPENDENCY_NODE_MODULES,\n path.join(projectRoot, \"node_modules\"),\n );\n }\n\n if (await pathExists(UI_SDK_NODE_MODULES)) {\n await ensureSymlink(\n UI_SDK_NODE_MODULES,\n path.join(projectRoot, \"ui\", \"node_modules\"),\n );\n }\n}\n\nasync function prepareLocalHarnessFixture(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n}): Promise<LocalHarnessFixture> {\n await ensureEmbeddedHarnessDependencies(options.projectRoot);\n\n await loadManifest(options.projectRoot);\n const manifestContent = await readMaterializedManifestText(\n options.projectRoot,\n );\n\n const appEntryPath = path.join(options.projectRoot, \"app\", \"index.ts\");\n if (!(await exists(appEntryPath))) {\n throw new Error(\n `Embedded harness requires ${path.relative(options.projectRoot, appEntryPath)}.`,\n );\n }\n\n const bundleRoot = await mkdtemp(path.join(tmpdir(), \"dreamboard-harness-\"));\n const bundleEntryPath = path.join(bundleRoot, \"src\", \"app\", \"index.js\");\n await mkdir(path.dirname(bundleEntryPath), { recursive: true });\n\n const bunExecutable = await resolveBunExecutable();\n if (!bunExecutable) {\n await rm(bundleRoot, { recursive: true, force: true });\n throw new Error(\n \"Failed to locate the Bun executable for embedded harness bundling.\",\n );\n }\n\n const buildResult = spawn(\n bunExecutable,\n [\n \"build\",\n \"app/index.ts\",\n `--outfile=${bundleEntryPath}`,\n \"--format=esm\",\n \"--target=browser\",\n \"--sourcemap=none\",\n ],\n {\n cwd: options.projectRoot,\n env: process.env,\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n },\n );\n\n const [stdout, stderr, exitCode] = await Promise.all([\n readStreamText(buildResult.stdout),\n readStreamText(buildResult.stderr),\n waitForExitCode(buildResult),\n ]);\n\n if (exitCode !== 0) {\n await rm(bundleRoot, { recursive: true, force: true });\n const issues =\n [stdout.trim(), stderr.trim()]\n .filter((value) => value.length > 0)\n .join(\"\\n\")\n .trim() || \"unknown Bun build failure\";\n throw new Error(`Failed to bundle local game logic: ${issues}`);\n }\n\n const bundleContent = await readFile(bundleEntryPath, \"utf8\");\n const manifestHash = hashContent(manifestContent);\n const bundleHash = hashContent(bundleContent);\n const gameSlug =\n options.projectConfig.slug || path.basename(options.projectRoot);\n const authoring = getProjectAuthoringState(options.projectConfig);\n\n return {\n bundleRoot,\n manifestHash,\n gameId: normalizeUuid(\n options.projectConfig.gameId,\n `game:${gameSlug}:${options.projectRoot}`,\n ),\n manifestId: normalizeUuid(authoring.manifestId, `manifest:${manifestHash}`),\n compiledResultId: stableUuid(`compiled:${manifestHash}:${bundleHash}`),\n ruleId: normalizeUuid(\n authoring.ruleId,\n `rule:${gameSlug}:${authoring.ruleId ?? \"local\"}`,\n ),\n gameSlug,\n gameName: toTitleCase(gameSlug),\n };\n}\n\nasync function resolveBunExecutable(): Promise<string | null> {\n const currentExecutable = path.basename(process.execPath).toLowerCase();\n if (currentExecutable === \"bun\" || currentExecutable === \"bun.exe\") {\n return process.execPath;\n }\n\n const candidatePaths = [\n ...(process.env.PATH ?? \"\")\n .split(path.delimiter)\n .filter((directory) => directory.length > 0)\n .flatMap((directory) => executableCandidates(directory, \"bun\")),\n ...(process.env.BUN_INSTALL\n ? executableCandidates(path.join(process.env.BUN_INSTALL, \"bin\"), \"bun\")\n : []),\n ...(process.env.HOME\n ? executableCandidates(path.join(process.env.HOME, \".bun\", \"bin\"), \"bun\")\n : []),\n ];\n\n for (const candidate of candidatePaths) {\n try {\n await access(candidate, constants.X_OK);\n return candidate;\n } catch {\n // Keep looking: Bun is only required for local harness runs.\n }\n }\n\n return null;\n}\n\nfunction executableCandidates(\n directory: string,\n executableName: string,\n): string[] {\n if (!directory) {\n return [];\n }\n\n if (process.platform !== \"win32\") {\n return [path.join(directory, executableName)];\n }\n\n const extensions = (process.env.PATHEXT ?? \".EXE;.CMD;.BAT;.COM\")\n .split(\";\")\n .filter((extension) => extension.length > 0);\n return extensions.map((extension) =>\n path.join(directory, `${executableName}${extension.toLowerCase()}`),\n );\n}\n\nasync function waitForExitCode(child: ChildProcess): Promise<number> {\n if (child.exitCode !== null) {\n return child.exitCode;\n }\n\n return await new Promise<number>((resolve, reject) => {\n child.once(\"error\", reject);\n child.once(\"close\", (code) => resolve(code ?? 1));\n });\n}\n\nasync function readStreamText(\n stream: Readable | null | undefined,\n): Promise<string> {\n if (!stream) {\n return \"\";\n }\n\n let text = \"\";\n for await (const chunk of stream) {\n text += Buffer.isBuffer(chunk) ? chunk.toString(\"utf8\") : String(chunk);\n }\n return text;\n}\n\nasync function waitForHarnessReady(\n child: ChildProcess,\n logFilePath: string,\n): Promise<HarnessMonitor> {\n const stdout = child.stdout;\n const stderr = child.stderr;\n if (!stdout || !stderr) {\n throw new Error(\"Embedded harness process did not expose stdout/stderr.\");\n }\n\n const logStream = createWriteStream(logFilePath, { flags: \"w\" });\n stdout.pipe(logStream, { end: false });\n stderr.pipe(logStream, { end: false });\n\n const stdoutReader = createInterface({ input: stdout });\n const stderrReader = createInterface({ input: stderr });\n const recentLines: string[] = [];\n\n const rememberLine = (line: string): void => {\n if (!line.trim()) return;\n recentLines.push(line);\n while (recentLines.length > 30) {\n recentLines.shift();\n }\n };\n\n return await new Promise<HarnessMonitor>((resolve, reject) => {\n let settled = false;\n let idleTimeoutHandle: ReturnType<typeof setTimeout> | undefined;\n let maxTimeoutHandle: ReturnType<typeof setTimeout> | undefined;\n\n const dispose = (): void => {\n stdout.off(\"data\", refreshIdleTimeout);\n stderr.off(\"data\", refreshIdleTimeout);\n stdoutReader.close();\n stderrReader.close();\n stdout.unpipe(logStream);\n stderr.unpipe(logStream);\n logStream.end();\n };\n\n const finish = (callback: () => void): void => {\n if (settled) return;\n settled = true;\n if (idleTimeoutHandle) {\n clearTimeout(idleTimeoutHandle);\n }\n if (maxTimeoutHandle) {\n clearTimeout(maxTimeoutHandle);\n }\n callback();\n };\n\n const refreshIdleTimeout = (): void => {\n if (settled) {\n return;\n }\n if (idleTimeoutHandle) {\n clearTimeout(idleTimeoutHandle);\n }\n idleTimeoutHandle = setTimeout(() => {\n rejectWithContext(\n `Timed out after ${HARNESS_START_IDLE_TIMEOUT_MS}ms without harness output while waiting for embedded harness readiness.`,\n );\n }, HARNESS_START_IDLE_TIMEOUT_MS);\n };\n const rejectWithContext = (message: string): void => {\n finish(() => {\n dispose();\n const tail =\n recentLines.length > 0\n ? `\\nRecent output:\\n${recentLines.join(\"\\n\")}`\n : \"\";\n reject(new Error(`${message}\\nHarness log: ${logFilePath}${tail}`));\n });\n };\n\n stdoutReader.on(\"line\", (line) => {\n rememberLine(line);\n if (!line.startsWith(READY_PREFIX)) {\n return;\n }\n\n try {\n const payload = JSON.parse(\n line.slice(READY_PREFIX.length),\n ) as EmbeddedHarnessReady;\n finish(() =>\n resolve({\n ready: payload,\n dispose,\n }),\n );\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"invalid readiness payload\";\n rejectWithContext(\n `Embedded harness emitted malformed readiness JSON: ${message}`,\n );\n }\n });\n\n stderrReader.on(\"line\", rememberLine);\n stdout.on(\"data\", refreshIdleTimeout);\n stderr.on(\"data\", refreshIdleTimeout);\n\n child.once(\"error\", (error) => {\n rejectWithContext(`Failed to launch embedded harness: ${error.message}`);\n });\n\n child.once(\"exit\", (code, signal) => {\n if (settled) {\n return;\n }\n rejectWithContext(\n `Embedded harness exited before becoming ready (code=${code ?? \"null\"}, signal=${signal ?? \"null\"}).`,\n );\n });\n\n refreshIdleTimeout();\n\n maxTimeoutHandle = setTimeout(() => {\n rejectWithContext(\n `Timed out waiting ${HARNESS_START_MAX_TIMEOUT_MS}ms total for embedded harness readiness.`,\n );\n }, HARNESS_START_MAX_TIMEOUT_MS);\n });\n}\n\nasync function terminateChild(child: ChildProcess): Promise<void> {\n if (child.exitCode !== null || child.signalCode !== null) {\n return;\n }\n\n child.kill(\"SIGTERM\");\n const exited = await waitForExit(child, HARNESS_STOP_TIMEOUT_MS);\n if (exited) {\n return;\n }\n\n child.kill(\"SIGKILL\");\n await waitForExit(child, HARNESS_STOP_TIMEOUT_MS);\n}\n\nasync function waitForExit(\n child: ChildProcess,\n timeoutMs: number,\n): Promise<boolean> {\n if (child.exitCode !== null || child.signalCode !== null) {\n return true;\n }\n\n return await new Promise<boolean>((resolve) => {\n const timeoutHandle = setTimeout(() => resolve(false), timeoutMs);\n child.once(\"exit\", () => {\n clearTimeout(timeoutHandle);\n resolve(true);\n });\n });\n}\n\nasync function resolveGradleLauncher(repoRoot: string): Promise<{\n command: string;\n args: string[];\n}> {\n if (process.platform === \"win32\") {\n const gradleBat = path.join(repoRoot, \"gradlew.bat\");\n if (!(await exists(gradleBat))) {\n throw new Error(`Missing Gradle launcher at ${gradleBat}`);\n }\n return { command: gradleBat, args: [] };\n }\n\n const gradleShell = path.join(repoRoot, \"gradlew\");\n if (!(await exists(gradleShell))) {\n throw new Error(`Missing Gradle launcher at ${gradleShell}`);\n }\n return { command: gradleShell, args: [] };\n}\n\nasync function resolveRepoRoot(projectRoot: string): Promise<string> {\n const currentFile = fileURLToPath(import.meta.url);\n const searchRoots = [path.dirname(currentFile), projectRoot, process.cwd()];\n\n for (const root of searchRoots) {\n const repoRoot = await findSourceCheckoutRepoRoot(root);\n if (repoRoot) {\n return repoRoot;\n }\n }\n\n throw new Error(\n \"Embedded harness is only available from a source checkout with local Dreamboard backend support. Use 'dreamboard test ... --env prod' from a published install.\",\n );\n}\n\nasync function findSourceCheckoutRepoRoot(\n startDir: string,\n): Promise<string | null> {\n let currentDir = path.resolve(startDir);\n\n while (true) {\n if (await isSourceCheckoutRepoRoot(currentDir)) {\n return currentDir;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n return null;\n }\n currentDir = parentDir;\n }\n}\n\nasync function isSourceCheckoutRepoRoot(rootDir: string): Promise<boolean> {\n return (\n (await exists(path.join(rootDir, \"gradlew\"))) &&\n (await exists(path.join(rootDir, \"apps\", \"backend\", \"build.gradle.kts\")))\n );\n}\n\nfunction normalizeUuid(\n candidate: string | undefined,\n fallbackSeed: string,\n): string {\n if (candidate && UUID_PATTERN.test(candidate)) {\n return candidate;\n }\n return stableUuid(fallbackSeed);\n}\n\nfunction stableUuid(seed: string): string {\n const hex = createHash(\"sha256\")\n .update(seed, \"utf8\")\n .digest(\"hex\")\n .slice(0, 32);\n const chars = hex.split(\"\");\n chars[12] = \"5\";\n chars[16] = ((parseInt(chars[16] ?? \"0\", 16) & 0x3) | 0x8).toString(16);\n return `${chars.slice(0, 8).join(\"\")}-${chars.slice(8, 12).join(\"\")}-${chars.slice(12, 16).join(\"\")}-${chars.slice(16, 20).join(\"\")}-${chars.slice(20, 32).join(\"\")}`;\n}\n\nfunction toTitleCase(slug: string): string {\n return slug\n .split(/[-_\\s]+/)\n .filter((part) => part.length > 0)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n","import { randomUUID } from \"node:crypto\";\nimport {\n disconnectSessionEvents,\n subscribeToSessionEvents,\n} from \"@dreamboard/api-client\";\n\nconst cliSessionEventClientId = `dreamboard-cli-${randomUUID()}`;\n\nexport async function subscribeToCliSessionEvents(options: {\n sessionId: string;\n signal: AbortSignal;\n clientSource: string;\n playerId: string;\n onSseError?: (error: unknown) => void;\n sseMaxRetryAttempts?: number;\n sseDefaultRetryDelay?: number;\n}) {\n const connectionAttemptId = randomUUID();\n const response = await subscribeToSessionEvents({\n path: { sessionId: options.sessionId },\n query: {\n playerId: options.playerId,\n clientId: cliSessionEventClientId,\n connectionAttemptId,\n clientSource: options.clientSource,\n },\n onSseError: options.onSseError,\n sseDefaultRetryDelay: options.sseDefaultRetryDelay,\n sseMaxRetryAttempts: options.sseMaxRetryAttempts,\n signal: options.signal,\n });\n return {\n ...response,\n disconnect: () =>\n disconnectSessionEvents({\n path: { sessionId: options.sessionId },\n query: {\n playerId: options.playerId,\n clientId: cliSessionEventClientId,\n connectionAttemptId,\n },\n }),\n };\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\nimport type { ResolvedConfig } from \"../types.js\";\n\n/**\n * Browser test runner helpers shared with reducer-native-test-harness (browser runner).\n * Screenshot / JSON scenario navigation helpers lived in the deleted `run` command.\n */\nexport function configurePlaywrightBrowsersPath(): void {\n if (process.env.PLAYWRIGHT_BROWSERS_PATH) {\n return;\n }\n\n const runtimeHome = process.env.HOME;\n let realHome: string;\n try {\n realHome = os.userInfo().homedir;\n } catch {\n return;\n }\n\n if (!runtimeHome || path.resolve(runtimeHome) === path.resolve(realHome)) {\n return;\n }\n\n const browserCachePath =\n process.platform === \"darwin\"\n ? path.join(realHome, \"Library\", \"Caches\", \"ms-playwright\")\n : process.platform === \"win32\"\n ? path.join(realHome, \"AppData\", \"Local\", \"ms-playwright\")\n : path.join(realHome, \".cache\", \"ms-playwright\");\n\n process.env.PLAYWRIGHT_BROWSERS_PATH = browserCachePath;\n}\n\nexport async function buildBrowserAuthInitScript(\n config: ResolvedConfig,\n): Promise<string | null> {\n if (!config.authToken) return null;\n\n if (!config.supabaseUrl || !config.supabaseAnonKey) {\n return `(function(){localStorage.setItem('supabase_token',${JSON.stringify(config.authToken)});})();`;\n }\n\n try {\n const { createClient } = await import(\"@supabase/supabase-js\");\n const supabase = createClient(config.supabaseUrl, config.supabaseAnonKey);\n\n let sessionData: Record<string, unknown> | null = null;\n\n if (!sessionData) {\n const { data: userData } = await supabase.auth.getUser(config.authToken);\n if (userData?.user) {\n const parts = config.authToken.split(\".\");\n let expiresAt: number | undefined;\n if (parts.length === 3) {\n try {\n const payload = JSON.parse(atob(parts[1]!));\n expiresAt = payload.exp;\n } catch {\n // ignore decode errors\n }\n }\n sessionData = {\n access_token: config.authToken,\n token_type: \"bearer\",\n expires_in: expiresAt\n ? expiresAt - Math.floor(Date.now() / 1000)\n : 3600,\n expires_at: expiresAt,\n refresh_token: config.refreshToken ?? \"\",\n user: userData.user,\n };\n }\n }\n\n if (!sessionData) return null;\n\n const storageKey = `sb-${new URL(config.supabaseUrl).hostname.split(\".\")[0]}-auth-token`;\n const sessionJson = JSON.stringify(sessionData);\n const accessToken = String(sessionData.access_token ?? config.authToken);\n\n return `(function(){localStorage.setItem(${JSON.stringify(storageKey)},${JSON.stringify(sessionJson)});localStorage.setItem('supabase_token',${JSON.stringify(accessToken)});})();`;\n } catch {\n return `(function(){localStorage.setItem('supabase_token',${JSON.stringify(config.authToken)});})();`;\n }\n}\n\nexport async function waitForGameReady(\n page: import(\"playwright\").Page,\n timeoutMs = 60000,\n): Promise<void> {\n await page.waitForSelector('iframe[title=\"Game UI Plugin\"]', {\n timeout: timeoutMs,\n });\n}\n","import type { GameTopologyManifest } from \"@dreamboard/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 = 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 path from \"node:path\";\nimport { importTypeScriptModule } from \"../../utils/ts-module-loader.js\";\n\nconst GAME_CONTRACT_ENTRY_PATH = path.join(\"app\", \"game-contract.ts\");\n\nfunction normalizeErrorMessage(error: unknown): string {\n const rawMessage =\n error instanceof Error ? error.message : String(error ?? \"Unknown error\");\n return (\n rawMessage\n .split(\"\\n\")\n .map((line) => line.trim())\n .find(Boolean)\n ?.replace(/^Error:\\s*/u, \"\") ?? \"Unknown error\"\n );\n}\n\nfunction isManifestScopedIdBrandingError(message: string): boolean {\n return (\n message.includes(\"defineGameContract:\") &&\n message.includes(\"manifest-scoped\") &&\n (message.includes(\"uses a raw z.string()\") ||\n message.includes(\"uses z.array(z.string())\"))\n );\n}\n\nexport async function assertReducerContractPreflight(\n projectRoot: string,\n): Promise<void> {\n const entryPath = path.join(projectRoot, GAME_CONTRACT_ENTRY_PATH);\n\n try {\n await importTypeScriptModule(entryPath);\n } catch (error) {\n const message = normalizeErrorMessage(error);\n if (isManifestScopedIdBrandingError(message)) {\n throw new Error(\n [\n `Dreamboard could not validate \\`${GAME_CONTRACT_ENTRY_PATH}\\` during \\`dreamboard sync\\`.`,\n \"This happens because a state field name looks like a manifest-scoped id, but the schema uses a plain string instead of the manifest-backed id schema.\",\n \"Workaround: use `gameContract.schemas.<id>` (or `manifest.ids.<id>`) for manifest ids. If the field is intentionally free-form text, rename it so it does not look like a manifest id field.\",\n `Original error: ${message}`,\n ].join(\" \"),\n );\n }\n\n throw new Error(\n [\n `Dreamboard could not validate \\`${GAME_CONTRACT_ENTRY_PATH}\\` during \\`dreamboard sync\\`.`,\n \"Fix the authored reducer contract module so it can be imported locally, then run `dreamboard sync` again.\",\n `Original error: ${message}`,\n ].join(\" \"),\n );\n }\n}\n","import path from \"node:path\";\nimport type { GameTopologyManifest } from \"@dreamboard/sdk-types\";\nimport { isPerPlayer, perPlayerSchema } from \"@dreamboard/app-sdk/reducer\";\nimport type { ReducerBundleContract } from \"@dreamboard/reducer-contract/bundle\";\nimport type * as Wire from \"@dreamboard/reducer-contract/wire\";\nimport { materializeManifestTable } from \"@dreamboard/workspace-codegen\";\nimport { z } from \"zod\";\nimport { importTypeScriptModule } from \"../../utils/ts-module-loader.js\";\n\n/**\n * Path to the reducer bundle entry, relative to the project root. Matches\n * the scaffold produced by `dreamboard new`.\n */\nconst REDUCER_BUNDLE_ENTRY_PATH = path.join(\"app\", \"index.ts\");\n\n/**\n * Deterministic rng seed used to drive the reducer during preflight.\n * Matches `ReducerBundleSmokeTester.DEFAULT_RNG_SEED` so failures reproduce\n * consistently across TS and Kotlin smoke testers.\n */\nconst PREFLIGHT_RNG_SEED = 1337;\n\n/**\n * Phase of the preflight smoke test that a failure occurred in. Mirrors\n * `ReducerBundleSmokeTester.Phase` in `packages/engine-core` so the author\n * gets the same diagnostic taxonomy locally and during compile.\n */\nexport type ReducerBundleSmokePhase =\n | \"BUILD_GAME_STATE\"\n | \"INITIALIZE\"\n | \"PROJECT_SEATS\"\n | \"VALIDATE_VIEW\";\n\nexport interface ReducerBundleSmokeScenario {\n readonly setupProfileId: string | null;\n readonly playerCount: number;\n}\n\nexport interface ReducerBundleSmokeFailure {\n readonly scenario: ReducerBundleSmokeScenario;\n readonly phase: ReducerBundleSmokePhase;\n readonly playerId?: string;\n readonly headline: string;\n readonly detail?: string;\n}\n\n/**\n * Shape of a single seat's slice in `projectSeatsDynamic(...)`. Only `view`\n * is consumed by the preflight, but the full wire DTO keeps local tests\n * aligned with the canonical reducer boundary.\n */\nexport type ReducerBundleSeatProjection = Wire.SeatProjection;\n\n/** Result of calling `bundle.projectSeatsDynamic({ state, playerIds })`. */\nexport type ReducerBundleSeatProjectionBundle = Wire.SeatProjectionBundle;\n\n/**\n * Minimal structural shape the preflight needs from the authored reducer\n * bundle. Matches the subset of `createReducerBundle(game)` that\n * `ReducerBundleSmokeTester.kt` also uses.\n */\nexport type ReducerBundleLike = Pick<\n ReducerBundleContract,\n \"initialize\" | \"projectSeatsDynamic\"\n>;\n\nfunction buildPlayerIds(playerCount: number): string[] {\n const ids: string[] = [];\n for (let index = 1; index <= playerCount; index += 1) {\n ids.push(`player-${index}`);\n }\n return ids;\n}\n\n/**\n * Build the matrix of scenarios to drive, mirroring the dedup behavior of\n * `ReducerBundleSmokeTester.buildScenarios` in `packages/engine-core`.\n * Exported for tests so we can assert scenario generation without loading\n * a full reducer bundle.\n */\nexport function buildScenarios(\n manifest: GameTopologyManifest,\n): ReducerBundleSmokeScenario[] {\n const rawCounts = [\n manifest.players?.minPlayers,\n manifest.players?.maxPlayers,\n ].filter(\n (count): count is number =>\n typeof count === \"number\" && Number.isFinite(count) && count > 0,\n );\n const playerCounts = Array.from(new Set(rawCounts));\n if (playerCounts.length === 0) {\n return [];\n }\n const profiles = manifest.setupProfiles ?? [];\n const profileIds: Array<string | null> =\n profiles.length > 0 ? profiles.map((profile) => profile.id) : [null];\n\n const scenarios: ReducerBundleSmokeScenario[] = [];\n const seen = new Set<string>();\n for (const profileId of profileIds) {\n for (const count of playerCounts) {\n const key = `${profileId ?? \"<default>\"}:${count}`;\n if (seen.has(key)) continue;\n seen.add(key);\n scenarios.push({ setupProfileId: profileId, playerCount: count });\n }\n }\n return scenarios;\n}\n\nfunction describeScenario(scenario: ReducerBundleSmokeScenario): string {\n const profileDesc = scenario.setupProfileId\n ? `setup profile '${scenario.setupProfileId}'`\n : \"no setup profile\";\n return `${profileDesc}, ${scenario.playerCount} player${\n scenario.playerCount === 1 ? \"\" : \"s\"\n }`;\n}\n\nfunction summarizeError(error: unknown): { headline: string; detail?: string } {\n if (error instanceof Error) {\n const firstLine =\n error.message\n .split(\"\\n\")\n .map((line) => line.trim())\n .find((line) => line.length > 0) ?? \"Unknown failure\";\n const detail =\n error.stack && error.stack !== error.message ? error.stack : undefined;\n return { headline: firstLine, detail };\n }\n return { headline: String(error ?? \"Unknown failure\") };\n}\n\n/**\n * Walk `view` recursively and, for every embedded `PerPlayer<T>` shape,\n * assert its seat list matches `expectedPlayerIds` using\n * `perPlayerSchema({ players })`. Returns `null` on success, or a headline\n * describing the first mismatch.\n *\n * This catches the class of bug where an author returns a `PerPlayer<T>`\n * that was built from the wrong seat list (e.g. a manifest-derived\n * `maxPlayers` literal union) while the runtime session has a different\n * number of seats. The Zod bound schema produces an identical error shape\n * to the one the backend raises in production so authors see the same\n * diagnostic locally.\n */\nexport function assertViewPerPlayerSeatsValid(\n view: unknown,\n expectedPlayerIds: readonly string[],\n breadcrumb: string[] = [],\n): string | null {\n if (view === null || view === undefined) {\n return null;\n }\n\n if (isPerPlayer(view)) {\n const schema = perPlayerSchema(z.unknown(), {\n players: expectedPlayerIds as never,\n });\n const result = schema.safeParse(view);\n if (!result.success) {\n const firstIssue = result.error.issues[0];\n const location =\n breadcrumb.length > 0 ? ` at view.${breadcrumb.join(\".\")}` : \"\";\n const message = firstIssue?.message ?? \"PerPlayer seat mismatch\";\n return `PerPlayer seat mismatch${location}: ${message}`;\n }\n return null;\n }\n\n if (Array.isArray(view)) {\n for (let index = 0; index < view.length; index += 1) {\n const result = assertViewPerPlayerSeatsValid(\n view[index],\n expectedPlayerIds,\n [...breadcrumb, `[${index}]`],\n );\n if (result) return result;\n }\n return null;\n }\n\n if (typeof view === \"object\") {\n for (const [key, value] of Object.entries(\n view as Record<string, unknown>,\n )) {\n const result = assertViewPerPlayerSeatsValid(value, expectedPlayerIds, [\n ...breadcrumb,\n key,\n ]);\n if (result) return result;\n }\n return null;\n }\n\n return null;\n}\n\nfunction identityShuffle<Value>(values: readonly Value[]): Value[] {\n return [...values];\n}\n\n/**\n * Drive an already-loaded reducer bundle through the provided scenarios.\n * Shared between the full `runReducerBundleSmoke` entrypoint and the\n * unit tests, which feed a fake bundle directly.\n *\n * For each (setup profile × player count) scenario this:\n *\n * 1. materializes an initial table via `materializeManifestTable`,\n * 2. calls `bundle.initialize({ table, playerIds, rngSeed, setup })`,\n * 3. calls `bundle.projectSeatsDynamic({ state, playerIds })` once, and\n * 4. validates any embedded `PerPlayer<T>` views match the runtime seat\n * list using `perPlayerSchema({ players: playerIds })`.\n *\n * Failures are collected instead of thrown so authors get the full list\n * of broken scenarios in one preflight pass.\n */\nexport async function driveReducerBundleThroughScenarios(options: {\n manifest: GameTopologyManifest;\n bundle: ReducerBundleLike;\n scenarios: readonly ReducerBundleSmokeScenario[];\n rngSeed?: number;\n}): Promise<ReducerBundleSmokeFailure[]> {\n const { manifest, bundle, scenarios } = options;\n const rngSeed = options.rngSeed ?? PREFLIGHT_RNG_SEED;\n\n const failures: ReducerBundleSmokeFailure[] = [];\n const tableCache = new Map<\n number,\n { table: unknown; playerIds: string[] } | { error: unknown }\n >();\n\n for (const scenario of scenarios) {\n let tableEntry = tableCache.get(scenario.playerCount);\n if (!tableEntry) {\n try {\n const playerIds = buildPlayerIds(scenario.playerCount);\n const table = materializeManifestTable({\n manifest,\n playerIds,\n shuffleItems: identityShuffle,\n });\n tableEntry = { table, playerIds };\n } catch (error) {\n tableEntry = { error };\n }\n tableCache.set(scenario.playerCount, tableEntry);\n }\n if (\"error\" in tableEntry) {\n const summary = summarizeError(tableEntry.error);\n failures.push({\n scenario,\n phase: \"BUILD_GAME_STATE\",\n headline: summary.headline,\n detail: summary.detail,\n });\n continue;\n }\n\n const { table, playerIds } = tableEntry;\n\n let sessionState: unknown;\n try {\n sessionState = await bundle.initialize({\n table: table as Wire.JsonValue,\n playerIds: [...playerIds],\n rngSeed,\n setup: scenario.setupProfileId\n ? { profileId: scenario.setupProfileId, optionValues: {} }\n : null,\n });\n } catch (error) {\n const summary = summarizeError(error);\n failures.push({\n scenario,\n phase: \"INITIALIZE\",\n headline: summary.headline,\n detail: summary.detail,\n });\n continue;\n }\n\n let projection: ReducerBundleSeatProjectionBundle | undefined;\n try {\n projection = bundle.projectSeatsDynamic({\n state: sessionState as Wire.ReducerSessionState,\n playerIds: [...playerIds],\n });\n } catch (error) {\n const summary = summarizeError(error);\n failures.push({\n scenario,\n phase: \"PROJECT_SEATS\",\n headline: summary.headline,\n detail: summary.detail,\n });\n continue;\n }\n\n const seats = projection?.seats ?? {};\n for (const playerId of playerIds) {\n const seat = seats[playerId];\n if (!seat) {\n failures.push({\n scenario,\n phase: \"PROJECT_SEATS\",\n playerId,\n headline: `projectSeatsDynamic() did not return an entry for seat '${playerId}'.`,\n });\n continue;\n }\n const mismatch = assertViewPerPlayerSeatsValid(seat.view, playerIds);\n if (mismatch) {\n failures.push({\n scenario,\n phase: \"VALIDATE_VIEW\",\n playerId,\n headline: mismatch,\n });\n }\n }\n }\n\n return failures;\n}\n\n/**\n * Import the authored reducer bundle from `projectRoot/app/index.ts` and\n * drive it through every (setup profile × player count) scenario the\n * manifest declares. Returns the collected failures without throwing so\n * callers can decide whether to surface them.\n */\nexport async function runReducerBundleSmoke(options: {\n projectRoot: string;\n manifest: GameTopologyManifest;\n}): Promise<ReducerBundleSmokeFailure[]> {\n const { projectRoot, manifest } = options;\n const scenarios = buildScenarios(manifest);\n if (scenarios.length === 0) {\n return [];\n }\n\n const entryPath = path.join(projectRoot, REDUCER_BUNDLE_ENTRY_PATH);\n let module: { default?: ReducerBundleLike };\n try {\n module = await importTypeScriptModule<{ default?: ReducerBundleLike }>(\n entryPath,\n );\n } catch (error) {\n const summary = summarizeError(error);\n throw new Error(\n [\n `Dreamboard could not import \\`${REDUCER_BUNDLE_ENTRY_PATH}\\` during \\`dreamboard sync\\`.`,\n \"Fix the reducer bundle entry so it can be imported locally, then run `dreamboard sync` again.\",\n `Original error: ${summary.headline}`,\n ].join(\" \"),\n );\n }\n const bundle = module.default;\n if (!bundle || typeof bundle.initialize !== \"function\") {\n throw new Error(\n [\n `\\`${REDUCER_BUNDLE_ENTRY_PATH}\\` does not export a reducer bundle as its default export.`,\n \"Export `createReducerBundle(game)` from `app/index.ts` so the compile pipeline can smoke-test it.\",\n ].join(\" \"),\n );\n }\n\n return driveReducerBundleThroughScenarios({ manifest, bundle, scenarios });\n}\n\nfunction formatFailureLines(\n failures: readonly ReducerBundleSmokeFailure[],\n): string {\n return failures\n .map((failure) => {\n const location = failure.playerId ? ` (seat ${failure.playerId})` : \"\";\n return `• [${failure.phase}] ${describeScenario(failure.scenario)}${location}: ${failure.headline}`;\n })\n .join(\"\\n\");\n}\n\n/**\n * Preflight wrapper used by `dreamboard sync`. Runs\n * `runReducerBundleSmoke` and throws an aggregated error if any scenario\n * failed so the author sees every broken seat/profile in one shot.\n *\n * Sync already guarantees that the authored contract imports cleanly\n * (via `assertReducerContractPreflight`) and that `tsc --noEmit` is\n * green (via `runLocalTypecheck`) before this runs, so failures from\n * this step are always runtime-shaped (`initialize`/`projectSeatsDynamic` rejecting,\n * `perPlayer` seat mismatches, …) rather than static type or import\n * errors.\n */\nexport async function assertReducerBundleSmoke(options: {\n projectRoot: string;\n manifest: GameTopologyManifest;\n}): Promise<void> {\n const failures = await runReducerBundleSmoke(options);\n if (failures.length === 0) {\n return;\n }\n throw new Error(\n [\n \"Reducer bundle preflight failed during `dreamboard sync`.\",\n \"Fix the reported scenarios locally before syncing so the backend does not catch them after start-game:\",\n formatFailureLines(failures),\n ].join(\"\\n\"),\n );\n}\n","import path from \"node:path\";\nimport { getSessionSnapshot } from \"@dreamboard/api-client\";\nimport { defineCommand } from \"citty\";\nimport { CONFIG_FLAG_ARGS } from \"../command-args.js\";\nimport { PROJECT_DIR_NAME } from \"../constants.js\";\nimport { loadGlobalConfig } from \"../config/global-config.js\";\nimport { getStoredSession } from \"../config/credential-store.js\";\nimport {\n findProjectRoot,\n loadProjectConfig,\n} from \"../config/project-config.js\";\nimport {\n configureClient,\n requireAuth,\n resolveConfig,\n} from \"../config/resolve.js\";\nimport { parseJoinCommandArgs } from \"../flags.js\";\nimport { runJoinJsonlSession } from \"../services/join/jsonl-bot-session.js\";\nimport { loadPersistedDevSession } from \"../utils/dev-session.js\";\nimport { toDreamboardApiError } from \"../utils/errors.js\";\n\nexport default defineCommand({\n meta: {\n name: \"join\",\n description: \"Join an existing game session as a JSONL bot client\",\n },\n args: {\n session: {\n type: \"string\",\n description:\n \"Backend session id to join (defaults to .dreamboard/dev/session.json)\",\n },\n player: {\n type: \"string\",\n description: \"Player id this bot controls\",\n required: true,\n },\n \"raw-events\": {\n type: \"boolean\",\n description:\n \"Stream raw backend gameplay events instead of compact bot.gameplay events\",\n default: false,\n },\n ...CONFIG_FLAG_ARGS,\n },\n async run({ args }) {\n const parsedArgs = parseJoinCommandArgs(args);\n const projectRoot = await findProjectRoot(process.cwd());\n const [globalConfig, storedSession, projectConfig] = await Promise.all([\n loadGlobalConfig(),\n getStoredSession(),\n projectRoot ? loadProjectConfig(projectRoot) : Promise.resolve(undefined),\n ]);\n const config = resolveConfig(\n globalConfig,\n parsedArgs,\n projectConfig,\n storedSession,\n );\n requireAuth(config);\n await configureClient(config);\n const sessionId =\n parsedArgs.session ?? (await resolveDefaultSessionId(projectRoot));\n const playerId = normalizeJoinPlayerId(parsedArgs.player);\n await assertKnownPlayerId(sessionId, playerId);\n\n const abortController = new AbortController();\n const abort = () => abortController.abort();\n process.once(\"SIGINT\", abort);\n process.once(\"SIGTERM\", abort);\n try {\n await runJoinJsonlSession({\n sessionId,\n playerId,\n rawEvents: parsedArgs[\"raw-events\"],\n signal: abortController.signal,\n });\n } finally {\n process.off(\"SIGINT\", abort);\n process.off(\"SIGTERM\", abort);\n }\n },\n});\n\nasync function resolveDefaultSessionId(\n projectRoot: string | null,\n): Promise<string> {\n if (!projectRoot) {\n throw new Error(\n \"No session id provided and this directory is not a Dreamboard project. Pass --session or run from a workspace with .dreamboard/dev/session.json.\",\n );\n }\n\n const sessionFilePath = path.join(\n projectRoot,\n PROJECT_DIR_NAME,\n \"dev\",\n \"session.json\",\n );\n const persistedSession = await loadPersistedDevSession(sessionFilePath);\n if (!persistedSession) {\n throw new Error(\n \"No session id provided and no Dreamboard dev session was found. Pass --session or run `dreamboard dev` from this project first.\",\n );\n }\n return persistedSession.sessionId;\n}\n\nfunction normalizeJoinPlayerId(player: string): string {\n return /^\\d+$/.test(player) ? `player-${player}` : player;\n}\n\nasync function assertKnownPlayerId(\n sessionId: string,\n playerId: string,\n): Promise<void> {\n const {\n data: snapshot,\n error,\n response,\n } = await getSessionSnapshot({\n path: { sessionId },\n });\n if (error || !snapshot) {\n throw toDreamboardApiError(\n error,\n response,\n `Failed to load session snapshot for session ${sessionId}.`,\n );\n }\n\n const playerIds = snapshot.lobby.seats.map((seat) => seat.playerId);\n if (!playerIds.includes(playerId)) {\n throw new Error(\n `Unknown player id '${playerId}' for session ${sessionId}. Available players: ${playerIds.join(\", \") || \"none\"}.`,\n );\n }\n}\n","import { createInterface } from \"node:readline\";\nimport {\n describePlayerAction,\n getPlayerActionTargets,\n listPlayerActions,\n submitPlayerAction,\n validatePlayerAction,\n type HostPlayerGameplayView,\n type HostSessionEvent,\n type InteractionDescriptor,\n} from \"@dreamboard/api-client\";\nimport { toApiProblem } from \"../../utils/errors.js\";\nimport { subscribeToCliSessionEvents } from \"../../utils/session-event-stream.js\";\n\ntype JsonValue =\n | null\n | boolean\n | number\n | string\n | JsonValue[]\n | { [key: string]: JsonValue };\n\ntype JsonObject = { [key: string]: JsonValue };\ntype RequestId = string | number;\n\ntype JoinRequest = {\n id?: unknown;\n method?: unknown;\n params?: unknown;\n};\n\ntype JoinProtocolError = {\n code: string;\n message: string;\n details?: JsonObject;\n};\n\ntype JoinSuccessEnvelope = {\n id: RequestId;\n result: JsonValue;\n};\n\ntype JoinErrorEnvelope = {\n id: RequestId | null;\n error: JoinProtocolError;\n};\n\ntype JoinEventEnvelope = {\n type: \"event\";\n event: JsonObject;\n};\n\ntype JoinStreamErrorEnvelope = {\n type: \"error\";\n error: JoinProtocolError;\n};\n\ntype ProtocolEnvelope =\n | JoinSuccessEnvelope\n | JoinErrorEnvelope\n | JoinEventEnvelope\n | JoinStreamErrorEnvelope;\n\ntype SubscribeToEvents = typeof subscribeToCliSessionEvents;\ntype ListPlayerActions = typeof listPlayerActions;\ntype DescribePlayerAction = typeof describePlayerAction;\ntype GetPlayerActionTargets = typeof getPlayerActionTargets;\ntype ValidatePlayerAction = typeof validatePlayerAction;\ntype SubmitPlayerAction = typeof submitPlayerAction;\n\nexport type JoinJsonlSessionOptions = {\n sessionId: string;\n playerId: string;\n rawEvents?: boolean;\n input?: NodeJS.ReadableStream;\n output?: NodeJS.WritableStream;\n errorOutput?: NodeJS.WritableStream;\n subscribeToEvents?: SubscribeToEvents;\n listPlayerActions?: ListPlayerActions;\n describePlayerAction?: DescribePlayerAction;\n getPlayerActionTargets?: GetPlayerActionTargets;\n validatePlayerAction?: ValidatePlayerAction;\n submitPlayerAction?: SubmitPlayerAction;\n signal?: AbortSignal;\n};\n\nclass JsonlWriter {\n private writeChain: Promise<void> = Promise.resolve();\n\n constructor(private readonly output: NodeJS.WritableStream) {}\n\n write(envelope: ProtocolEnvelope): Promise<void> {\n this.writeChain = this.writeChain.then(\n () =>\n new Promise<void>((resolve, reject) => {\n const line = `${JSON.stringify(normalizeEnvelopeForJsonl(envelope))}\\n`;\n const flushed = this.output.write(line, (error?: Error | null) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n if (!flushed) {\n this.output.once(\"error\", reject);\n }\n }),\n );\n return this.writeChain;\n }\n}\n\nfunction normalizeEnvelopeForJsonl(\n envelope: ProtocolEnvelope,\n): ProtocolEnvelope {\n if (\"event\" in envelope) {\n return {\n ...envelope,\n event: normalizeProtocolValue(envelope.event) as JsonObject,\n };\n }\n if (\"result\" in envelope) {\n return {\n ...envelope,\n result: normalizeProtocolValue(envelope.result),\n };\n }\n return envelope;\n}\n\nfunction normalizeProtocolValue(value: JsonValue): JsonValue {\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeProtocolValue(entry));\n }\n if (!isJsonObject(value)) {\n return value;\n }\n\n const normalized: JsonObject = {};\n for (const [key, entry] of Object.entries(value)) {\n if (key === \"gameplay\" && isJsonObject(entry)) {\n normalized[key] = normalizeGameplaySnapshotForJsonl(entry);\n continue;\n }\n normalized[key] = normalizeProtocolValue(entry);\n }\n return normalized;\n}\n\nfunction normalizeGameplaySnapshotForJsonl(gameplay: JsonObject): JsonObject {\n const normalized: JsonObject = {};\n for (const [key, value] of Object.entries(gameplay)) {\n if (\n (key === \"view\" || key === \"boardStatic\") &&\n typeof value === \"string\"\n ) {\n normalized[key] = parseJsonField(key, value);\n continue;\n }\n normalized[key] = normalizeProtocolValue(value);\n }\n return normalized;\n}\n\nfunction parseJsonField(field: string, value: string): JsonValue {\n try {\n return JSON.parse(value) as JsonValue;\n } catch (error) {\n throw protocolError(\n \"INVALID_GAMEPLAY_JSON\",\n `Gameplay field '${field}' was not valid JSON: ${formatUnknown(error)}`,\n );\n }\n}\n\nexport async function runJoinJsonlSession(\n options: JoinJsonlSessionOptions,\n): Promise<void> {\n const input = options.input ?? process.stdin;\n const writer = new JsonlWriter(options.output ?? process.stdout);\n const errorOutput = options.errorOutput ?? process.stderr;\n const abortController = new AbortController();\n const inFlightIds = new Set<RequestId>();\n const pendingRequests = new Set<Promise<void>>();\n const state = new JoinBotState(options.playerId);\n const subscribe = options.subscribeToEvents ?? subscribeToCliSessionEvents;\n const listActions = options.listPlayerActions ?? listPlayerActions;\n const describeAction = options.describePlayerAction ?? describePlayerAction;\n const getActionTargets =\n options.getPlayerActionTargets ?? getPlayerActionTargets;\n const validateAction = options.validatePlayerAction ?? validatePlayerAction;\n const submitAction = options.submitPlayerAction ?? submitPlayerAction;\n\n const rl = createInterface({\n input,\n crlfDelay: Infinity,\n terminal: false,\n });\n const abort = () => {\n abortController.abort();\n rl.close();\n };\n\n const eventPump = pumpSessionEvents({\n sessionId: options.sessionId,\n playerId: options.playerId,\n writer,\n state,\n subscribe,\n rawEvents: options.rawEvents ?? false,\n signal: abortController.signal,\n errorOutput,\n })\n .catch((error) => {\n errorOutput.write(\n `dreamboard join event pump failed: ${formatUnknown(error)}\\n`,\n );\n })\n .finally(() => {\n if (!abortController.signal.aborted) {\n abort();\n }\n });\n options.signal?.addEventListener(\"abort\", abort, { once: true });\n if (options.signal?.aborted) {\n abort();\n }\n\n try {\n for await (const line of rl) {\n const trimmed = line.trim();\n if (!trimmed) {\n continue;\n }\n\n let parsed: JoinRequest;\n try {\n parsed = JSON.parse(trimmed) as JoinRequest;\n } catch (error) {\n void writer.write({\n id: null,\n error: protocolError(\n \"INVALID_JSON\",\n error instanceof Error ? error.message : \"Invalid JSON line.\",\n ),\n });\n continue;\n }\n\n const requestId = parseRequestId(parsed.id);\n if (!requestId.ok) {\n void writer.write({\n id: null,\n error: requestId.error,\n });\n continue;\n }\n\n if (inFlightIds.has(requestId.value)) {\n void writer.write({\n id: requestId.value,\n error: protocolError(\n \"DUPLICATE_IN_FLIGHT_ID\",\n `Request id '${String(requestId.value)}' is already in flight.`,\n ),\n });\n continue;\n }\n\n inFlightIds.add(requestId.value);\n const requestPromise = handleRequest({\n request: parsed,\n requestId: requestId.value,\n sessionId: options.sessionId,\n playerId: options.playerId,\n state,\n listActions,\n describeAction,\n getActionTargets,\n validateAction,\n submitAction,\n })\n .then((result) =>\n writer.write({\n id: requestId.value,\n result,\n }),\n )\n .catch((error) =>\n writer.write({\n id: requestId.value,\n error: coerceProtocolError(error),\n }),\n )\n .finally(() => {\n inFlightIds.delete(requestId.value);\n pendingRequests.delete(requestPromise);\n });\n pendingRequests.add(requestPromise);\n }\n\n await Promise.all([...pendingRequests]);\n } finally {\n rl.close();\n abortController.abort();\n options.signal?.removeEventListener(\"abort\", abort);\n void eventPump;\n }\n}\n\nasync function pumpSessionEvents(options: {\n sessionId: string;\n playerId: string;\n writer: JsonlWriter;\n state: JoinBotState;\n subscribe: SubscribeToEvents;\n rawEvents: boolean;\n signal: AbortSignal;\n errorOutput: NodeJS.WritableStream;\n}): Promise<void> {\n try {\n let lastSseError: unknown;\n const subscription = await options.subscribe({\n sessionId: options.sessionId,\n playerId: options.playerId,\n signal: options.signal,\n clientSource: \"dreamboard-join\",\n onSseError: (error) => {\n lastSseError = error;\n },\n sseDefaultRetryDelay: 250,\n sseMaxRetryAttempts: 1,\n });\n const { stream } = subscription;\n\n try {\n for await (const event of stream) {\n if (!event) {\n continue;\n }\n const compactEvent = options.state.applyEvent(event);\n const eventToWrite = options.rawEvents\n ? (event as unknown as JsonObject)\n : compactEvent;\n if (!eventToWrite) {\n continue;\n }\n await options.writer.write({\n type: \"event\",\n event: eventToWrite,\n });\n }\n if (!options.signal.aborted) {\n throw (\n lastSseError ??\n new Error(\n \"Gameplay event stream closed before the join session ended.\",\n )\n );\n }\n } finally {\n await subscription.disconnect?.().catch(() => {});\n }\n } catch (error) {\n if (options.signal.aborted) {\n return;\n }\n options.errorOutput.write(\n `dreamboard join event stream failed: ${formatUnknown(error)}\\n`,\n );\n await options.writer.write({\n type: \"error\",\n error: protocolError(\"EVENT_STREAM_ERROR\", formatUnknown(error)),\n });\n }\n}\n\nclass JoinBotState {\n private hasBootstrap = false;\n private latestGameplay: HostPlayerGameplayView | undefined;\n private latestActions: InteractionActionCache | undefined;\n private previousCompactActions: CompactAction[] | undefined;\n\n constructor(readonly playerId: string) {}\n\n applyEvent(event: HostSessionEvent): JsonObject | undefined {\n switch (event.type) {\n case \"session.snapshot\": {\n if (event.snapshot.type !== \"gameplay\") {\n return undefined;\n }\n this.assertScopedGameplay(event.snapshot.gameplay);\n this.hasBootstrap = true;\n return this.applyGameplayEvent(event.type, event.snapshot.gameplay);\n }\n case \"session.gameplayUpdated\": {\n this.assertScopedGameplay(event.gameplay);\n return this.applyGameplayEvent(event.type, event.gameplay);\n }\n }\n return undefined;\n }\n\n applyGameplay(gameplay: HostPlayerGameplayView | undefined): void {\n if (gameplay) {\n this.assertScopedGameplay(gameplay);\n this.latestGameplay = gameplay;\n this.latestActions = actionCacheFromGameplay(gameplay);\n }\n }\n\n assertReady(): void {\n if (!this.hasBootstrap) {\n throw protocolError(\n \"NOT_READY\",\n \"No gameplay bootstrap is available yet. Wait for bot.gameplay.\",\n );\n }\n }\n\n getLatestGameplay(): JsonObject {\n this.assertReady();\n if (!this.latestGameplay) {\n throw protocolError(\n \"NOT_READY\",\n \"No gameplay snapshot is available yet. Wait for bot.gameplay.\",\n );\n }\n return normalizeGameplaySnapshotForJsonl(\n this.latestGameplay as unknown as JsonObject,\n );\n }\n\n latestActionRequest(\n interactionId: string,\n inputs: JsonObject,\n ): LatestActionRequest {\n this.assertReady();\n const cache = this.latestActions;\n if (!cache) {\n throw protocolError(\n \"NOT_READY\",\n \"No action set is available yet. Wait for bot.gameplay.\",\n );\n }\n if (\n !cache.actions.some((action) => action.interactionId === interactionId)\n ) {\n throw protocolError(\n \"ACTION_NOT_FOUND\",\n `Action '${interactionId}' is not available.`,\n );\n }\n return {\n interactionId,\n expectedVersion: cache.version,\n actionSetVersion: cache.actionSetVersion,\n inputs,\n };\n }\n\n applyActionSet(actionSet: {\n version: number;\n actionSetVersion: string;\n actions: ReadonlyArray<InteractionDescriptorLike>;\n }): void {\n this.latestActions = {\n version: actionSet.version,\n actionSetVersion: actionSet.actionSetVersion,\n actions: [...actionSet.actions],\n };\n }\n\n hasInteraction(interactionId: string): boolean {\n return (\n this.latestActions?.actions.some(\n (action) => action.interactionId === interactionId,\n ) ?? false\n );\n }\n\n private applyGameplayEvent(\n sourceType: string,\n gameplay: HostPlayerGameplayView | undefined,\n ): JsonObject | undefined {\n if (!gameplay) {\n return undefined;\n }\n this.latestGameplay = gameplay;\n this.latestActions = actionCacheFromGameplay(gameplay);\n const compactActions = (gameplay.availableInteractions ?? []).map(\n compactActionFromDescriptor,\n );\n const event = compactGameplayEvent({\n sourceType,\n gameplay,\n actions: compactActions,\n previousActions: this.previousCompactActions,\n });\n this.previousCompactActions = compactActions;\n return event;\n }\n\n private assertScopedGameplay(\n gameplay: HostPlayerGameplayView | null | undefined,\n ): void {\n if (!gameplay) {\n return;\n }\n if (gameplay.playerId !== this.playerId) {\n throw protocolError(\n \"PLAYER_SCOPE_MISMATCH\",\n `Received gameplay for '${gameplay.playerId}' while joined as '${this.playerId}'.`,\n );\n }\n }\n}\n\ntype InteractionDescriptorLike = Pick<\n InteractionDescriptor,\n | \"interactionId\"\n | \"interactionKey\"\n | \"kind\"\n | \"available\"\n | \"unavailableReason\"\n | \"inputs\"\n | \"cost\"\n | \"currentResources\"\n | \"missingResources\"\n | \"context\"\n>;\n\ntype InteractionActionCache = {\n version: number;\n actionSetVersion: string;\n actions: InteractionDescriptorLike[];\n};\n\ntype CompactAction = {\n interactionId: string;\n interactionKey?: string;\n kind?: string;\n available: boolean;\n unavailableReason?: string;\n inputs?: JsonValue;\n cost?: JsonValue;\n currentResources?: JsonValue;\n missingResources?: Record<string, number>;\n context?: JsonValue;\n};\n\ntype LatestActionRequest = {\n interactionId: string;\n expectedVersion: number;\n actionSetVersion: string;\n inputs: JsonObject;\n};\n\nfunction actionCacheFromGameplay(\n gameplay: HostPlayerGameplayView,\n): InteractionActionCache {\n return {\n version: gameplay.version,\n actionSetVersion: gameplay.actionSetVersion,\n actions: [...(gameplay.availableInteractions ?? [])],\n };\n}\n\nfunction compactActionFromDescriptor(\n descriptor: InteractionDescriptorLike,\n): CompactAction {\n return compactObject({\n interactionId: descriptor.interactionId,\n interactionKey: descriptor.interactionKey,\n kind: descriptor.kind,\n available: descriptor.available ?? false,\n unavailableReason: descriptor.unavailableReason,\n inputs: normalizeUnknownJson(descriptor.inputs),\n cost: normalizeUnknownJson(descriptor.cost),\n currentResources: normalizeUnknownJson(descriptor.currentResources),\n missingResources: descriptor.missingResources,\n context: normalizeUnknownJson(descriptor.context),\n }) as CompactAction;\n}\n\nfunction compactGameplayEvent(options: {\n sourceType: string;\n gameplay: HostPlayerGameplayView;\n actions: CompactAction[];\n previousActions: CompactAction[] | undefined;\n}): JsonObject {\n const { gameplay, actions, previousActions } = options;\n return compactObject({\n type: \"bot.gameplay\",\n sourceType: options.sourceType,\n version: gameplay.version,\n actionSetVersion: gameplay.actionSetVersion,\n playerId: gameplay.playerId,\n activePlayers: normalizeUnknownJson(gameplay.activePlayers),\n currentPhase: gameplay.currentPhase,\n currentStage: gameplay.currentStage,\n stageSeats: normalizeUnknownJson(gameplay.stageSeats),\n isActivePlayer: gameplay.activePlayers.includes(gameplay.playerId),\n actions: actions as unknown as JsonValue,\n deltas:\n previousActions === undefined\n ? undefined\n : (actionDeltas(previousActions, actions) as unknown as JsonValue),\n });\n}\n\nfunction actionDeltas(previous: CompactAction[], current: CompactAction[]) {\n const previousById = new Map(\n previous.map((action) => [action.interactionId, action]),\n );\n const currentById = new Map(\n current.map((action) => [action.interactionId, action]),\n );\n const appeared = current.filter(\n (action) => !previousById.has(action.interactionId),\n );\n const disappeared = previous\n .filter((action) => !currentById.has(action.interactionId))\n .map((action) => action.interactionId);\n const availabilityChanged = current.flatMap((action) => {\n const before = previousById.get(action.interactionId);\n if (\n !before ||\n (before.available === action.available &&\n before.unavailableReason === action.unavailableReason)\n ) {\n return [];\n }\n return [\n compactObject({\n interactionId: action.interactionId,\n interactionKey: action.interactionKey,\n previousAvailable: before.available,\n available: action.available,\n previousUnavailableReason: before.unavailableReason,\n unavailableReason: action.unavailableReason,\n }),\n ];\n });\n const promptsAppeared = appeared.filter((action) => action.kind === \"prompt\");\n const promptsCleared = previous\n .filter(\n (action) =>\n action.kind === \"prompt\" && !currentById.has(action.interactionId),\n )\n .map((action) => action.interactionId);\n return {\n appeared,\n disappeared,\n availabilityChanged,\n promptsAppeared,\n promptsCleared,\n };\n}\n\nfunction compactObject(value: Record<string, unknown>): JsonObject {\n const result: JsonObject = {};\n for (const [key, entry] of Object.entries(value)) {\n if (entry !== undefined) {\n result[key] = entry as JsonValue;\n }\n }\n return result;\n}\n\nfunction normalizeUnknownJson(value: unknown): JsonValue | undefined {\n if (value === undefined) {\n return undefined;\n }\n return normalizeProtocolValue(value as JsonValue);\n}\n\nasync function handleRequest(options: {\n request: JoinRequest;\n requestId: RequestId;\n sessionId: string;\n playerId: string;\n state: JoinBotState;\n listActions: ListPlayerActions;\n describeAction: DescribePlayerAction;\n getActionTargets: GetPlayerActionTargets;\n validateAction: ValidatePlayerAction;\n submitAction: SubmitPlayerAction;\n}): Promise<JsonValue> {\n if (typeof options.request.method !== \"string\") {\n throw protocolError(\"INVALID_REQUEST\", \"Request method must be a string.\");\n }\n if (\n options.request.method.startsWith(\"actions.\") ||\n options.request.method === \"state.get\"\n ) {\n options.state.assertReady();\n }\n\n switch (options.request.method) {\n case \"state.get\":\n return {\n gameplay: options.state.getLatestGameplay(),\n };\n case \"actions.list\": {\n const { data, error, response } = await options.listActions({\n path: { sessionId: options.sessionId, playerId: options.playerId },\n });\n if (error || !data) {\n throw apiProtocolError(error, response, \"Failed to list actions.\");\n }\n options.state.applyActionSet(data);\n return data as unknown as JsonValue;\n }\n case \"actions.describe\": {\n const params = requireObjectParams(options.request.params);\n const { data, error, response } = await options.describeAction({\n path: {\n sessionId: options.sessionId,\n playerId: options.playerId,\n interactionId: requireString(params, \"interactionId\"),\n },\n });\n if (error || !data) {\n throw apiProtocolError(error, response, \"Failed to describe action.\");\n }\n return data as unknown as JsonValue;\n }\n case \"actions.targets\": {\n const params = requireObjectParams(options.request.params);\n const { data, error, response } = await options.getActionTargets({\n path: {\n sessionId: options.sessionId,\n playerId: options.playerId,\n interactionId: requireString(params, \"interactionId\"),\n inputKey: requireString(params, \"inputKey\"),\n },\n });\n if (error || !data) {\n throw apiProtocolError(\n error,\n response,\n \"Failed to get action targets.\",\n );\n }\n return data as unknown as JsonValue;\n }\n case \"actions.validate\": {\n const params = parseInputRequestParams(\n options.request.params,\n options.playerId,\n );\n const { data, error, response } = await options.validateAction({\n path: {\n sessionId: options.sessionId,\n playerId: options.playerId,\n interactionId: params.interactionId,\n },\n body: {\n expectedVersion: params.expectedVersion,\n actionSetVersion: params.actionSetVersion,\n inputs: params.inputs,\n },\n });\n if (error || !data) {\n throw apiProtocolError(\n error,\n response,\n \"Failed to validate interaction.\",\n );\n }\n return data as unknown as JsonValue;\n }\n case \"actions.validateLatest\": {\n const params = parseLatestInputRequestParams(\n options.request.params,\n options.playerId,\n );\n const latest = options.state.latestActionRequest(\n params.interactionId,\n params.inputs,\n );\n const data = await callValidateAction({\n sessionId: options.sessionId,\n playerId: options.playerId,\n validateAction: options.validateAction,\n params: latest,\n });\n return withRetry(data, { attempted: false });\n }\n case \"actions.submitLatest\": {\n const params = parseLatestInputRequestParams(\n options.request.params,\n options.playerId,\n );\n const latest = options.state.latestActionRequest(\n params.interactionId,\n params.inputs,\n );\n const first = await callSubmitAction({\n sessionId: options.sessionId,\n playerId: options.playerId,\n submitAction: options.submitAction,\n params: latest,\n });\n options.state.applyGameplay(gameplayFromSubmitResult(first));\n if (!isActionSetStaleResponse(first)) {\n return withRetry(first, { attempted: false });\n }\n\n await refreshCurrentActions({\n sessionId: options.sessionId,\n playerId: options.playerId,\n listActions: options.listActions,\n state: options.state,\n });\n if (!options.state.hasInteraction(params.interactionId)) {\n return withRetry(first, {\n attempted: true,\n reason: \"ACTION_SET_STALE\",\n });\n }\n\n const refreshed = options.state.latestActionRequest(\n params.interactionId,\n params.inputs,\n );\n const validation = await callValidateAction({\n sessionId: options.sessionId,\n playerId: options.playerId,\n validateAction: options.validateAction,\n params: refreshed,\n });\n if (isValidationRejected(validation)) {\n return withRetry(first, {\n attempted: true,\n reason: \"ACTION_SET_STALE\",\n });\n }\n\n const retryResult = await callSubmitAction({\n sessionId: options.sessionId,\n playerId: options.playerId,\n submitAction: options.submitAction,\n params: refreshed,\n });\n options.state.applyGameplay(gameplayFromSubmitResult(retryResult));\n return withRetry(retryResult, {\n attempted: true,\n reason: \"ACTION_SET_STALE\",\n });\n }\n case \"actions.submit\": {\n const params = parseInputRequestParams(\n options.request.params,\n options.playerId,\n );\n const { data, error, response } = await options.submitAction({\n path: {\n sessionId: options.sessionId,\n playerId: options.playerId,\n interactionId: params.interactionId,\n },\n body: {\n expectedVersion: params.expectedVersion,\n actionSetVersion: params.actionSetVersion,\n inputs: params.inputs,\n },\n });\n if (error || !data) {\n throw apiProtocolError(\n error,\n response,\n \"Failed to submit interaction.\",\n );\n }\n options.state.applyGameplay(\n data.event?.type === \"session.gameplayUpdated\"\n ? data.event.gameplay\n : undefined,\n );\n return data as unknown as JsonValue;\n }\n default:\n throw protocolError(\n \"UNKNOWN_METHOD\",\n `Unknown method '${options.request.method}'.`,\n );\n }\n}\n\nasync function callValidateAction(options: {\n sessionId: string;\n playerId: string;\n validateAction: ValidatePlayerAction;\n params: LatestActionRequest;\n}): Promise<JsonValue> {\n const { data, error, response } = await options.validateAction({\n path: {\n sessionId: options.sessionId,\n playerId: options.playerId,\n interactionId: options.params.interactionId,\n },\n body: {\n expectedVersion: options.params.expectedVersion,\n actionSetVersion: options.params.actionSetVersion,\n inputs: options.params.inputs,\n },\n });\n if (error || !data) {\n throw apiProtocolError(error, response, \"Failed to validate interaction.\");\n }\n return data as unknown as JsonValue;\n}\n\nasync function callSubmitAction(options: {\n sessionId: string;\n playerId: string;\n submitAction: SubmitPlayerAction;\n params: LatestActionRequest;\n}): Promise<JsonValue> {\n const { data, error, response } = await options.submitAction({\n path: {\n sessionId: options.sessionId,\n playerId: options.playerId,\n interactionId: options.params.interactionId,\n },\n body: {\n expectedVersion: options.params.expectedVersion,\n actionSetVersion: options.params.actionSetVersion,\n inputs: options.params.inputs,\n },\n });\n if (error || !data) {\n throw apiProtocolError(error, response, \"Failed to submit interaction.\");\n }\n return data as unknown as JsonValue;\n}\n\nfunction gameplayFromSubmitResult(\n result: JsonValue,\n): HostPlayerGameplayView | undefined {\n if (!isJsonObject(result)) {\n return undefined;\n }\n const event = result.event;\n if (!isJsonObject(event) || event.type !== \"session.gameplayUpdated\") {\n return undefined;\n }\n return event.gameplay as HostPlayerGameplayView | undefined;\n}\n\nasync function refreshCurrentActions(options: {\n sessionId: string;\n playerId: string;\n listActions: ListPlayerActions;\n state: JoinBotState;\n}): Promise<void> {\n const { data, error, response } = await options.listActions({\n path: { sessionId: options.sessionId, playerId: options.playerId },\n });\n if (error || !data) {\n throw apiProtocolError(error, response, \"Failed to refresh actions.\");\n }\n options.state.applyActionSet(data);\n}\n\nfunction withRetry(\n data: JsonValue,\n retry: { attempted: boolean; reason?: \"ACTION_SET_STALE\" },\n): JsonValue {\n if (!isJsonObject(data)) {\n return { value: data, retry };\n }\n return {\n ...data,\n retry,\n };\n}\n\nfunction isActionSetStaleResponse(data: JsonValue): boolean {\n return isJsonObject(data) && data.errorCode === \"ACTION_SET_STALE\";\n}\n\nfunction isValidationRejected(data: JsonValue): boolean {\n return isJsonObject(data) && data.valid === false;\n}\n\nfunction parseRequestId(\n value: unknown,\n): { ok: true; value: RequestId } | { ok: false; error: JoinProtocolError } {\n if (typeof value === \"string\" && value.length > 0) {\n return { ok: true, value };\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return { ok: true, value };\n }\n return {\n ok: false,\n error: protocolError(\n \"MISSING_ID\",\n \"Every JSONL request must include a string or numeric id.\",\n ),\n };\n}\n\nfunction requireObjectParams(params: unknown): JsonObject {\n if (params === undefined) {\n return {};\n }\n if (isJsonObject(params)) {\n return params;\n }\n throw protocolError(\"INVALID_PARAMS\", \"Request params must be an object.\");\n}\n\nfunction parseInputRequestParams(\n rawParams: unknown,\n defaultPlayerId: string,\n): {\n interactionId: string;\n expectedVersion: number;\n actionSetVersion: string;\n inputs: JsonObject;\n} {\n const params = requireObjectParams(rawParams);\n const requestPlayerId = params.playerId;\n if (requestPlayerId !== undefined && requestPlayerId !== defaultPlayerId) {\n throw protocolError(\n \"PLAYER_MISMATCH\",\n `This join session is scoped to player '${defaultPlayerId}'.`,\n );\n }\n const expectedVersion = params.expectedVersion;\n if (\n typeof expectedVersion !== \"number\" ||\n !Number.isFinite(expectedVersion)\n ) {\n throw protocolError(\n \"INVALID_PARAMS\",\n \"actions.validate and actions.submit require numeric expectedVersion.\",\n );\n }\n const interactionParams = params.params;\n if (interactionParams !== undefined) {\n throw protocolError(\n \"INVALID_PARAMS\",\n \"Use 'inputs' for action input payloads; 'params.params' is no longer supported.\",\n );\n }\n const inputs = params.inputs;\n if (inputs !== undefined && !isJsonObject(inputs)) {\n throw protocolError(\n \"INVALID_PARAMS\",\n \"Action inputs must be an object when provided.\",\n );\n }\n return {\n interactionId: requireString(params, \"interactionId\"),\n expectedVersion,\n actionSetVersion: requireString(params, \"actionSetVersion\"),\n inputs: inputs ?? {},\n };\n}\n\nfunction parseLatestInputRequestParams(\n rawParams: unknown,\n defaultPlayerId: string,\n): {\n interactionId: string;\n inputs: JsonObject;\n} {\n const params = requireObjectParams(rawParams);\n const requestPlayerId = params.playerId;\n if (requestPlayerId !== undefined && requestPlayerId !== defaultPlayerId) {\n throw protocolError(\n \"PLAYER_MISMATCH\",\n `This join session is scoped to player '${defaultPlayerId}'.`,\n );\n }\n if (\n params.expectedVersion !== undefined ||\n params.actionSetVersion !== undefined\n ) {\n throw protocolError(\n \"INVALID_PARAMS\",\n \"actions.validateLatest and actions.submitLatest fill expectedVersion and actionSetVersion automatically.\",\n );\n }\n if (params.params !== undefined) {\n throw protocolError(\n \"INVALID_PARAMS\",\n \"Use 'inputs' for action input payloads; 'params.params' is no longer supported.\",\n );\n }\n const inputs = params.inputs;\n if (inputs !== undefined && !isJsonObject(inputs)) {\n throw protocolError(\n \"INVALID_PARAMS\",\n \"Action inputs must be an object when provided.\",\n );\n }\n return {\n interactionId: requireString(params, \"interactionId\"),\n inputs: inputs ?? {},\n };\n}\n\nfunction requireString(params: JsonObject, key: string): string {\n const value = params[key];\n if (typeof value !== \"string\" || value.length === 0) {\n throw protocolError(\"INVALID_PARAMS\", `Param '${key}' must be a string.`);\n }\n return value;\n}\n\nfunction isJsonObject(value: unknown): value is JsonObject {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction protocolError(\n code: string,\n message: string,\n details?: JsonObject,\n): JoinProtocolError {\n return { code, message, ...(details ? { details } : {}) };\n}\n\nfunction apiProtocolError(\n error: unknown,\n response: unknown,\n fallback: string,\n): JoinProtocolError {\n const problem = toApiProblem(error as never, response as never, fallback);\n return protocolError(problem.type, problem.detail || problem.title, {\n status: problem.status,\n title: problem.title,\n detail: problem.detail,\n requestId: problem.requestId ?? null,\n retryable: problem.retryable ?? null,\n } as JsonObject);\n}\n\nfunction coerceProtocolError(error: unknown): JoinProtocolError {\n if (\n error &&\n typeof error === \"object\" &&\n typeof (error as { code?: unknown }).code === \"string\" &&\n typeof (error as { message?: unknown }).message === \"string\"\n ) {\n return error as JoinProtocolError;\n }\n return protocolError(\"INTERNAL_ERROR\", formatUnknown(error));\n}\n\nfunction formatUnknown(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n return String(error);\n}\n","import crypto from \"node:crypto\";\nimport { defineCommand } from \"citty\";\nimport consola from \"consola\";\nimport { DEFAULT_LOGIN_TIMEOUT_MS } from \"../constants.js\";\nimport { IS_PUBLISHED_BUILD, PUBLISHED_ENVIRONMENT } from \"../build-target.js\";\nimport { resolveConfig } from \"../config/resolve.js\";\nimport { parseLoginCommandArgs } from \"../flags.js\";\nimport {\n getGlobalAuthPath,\n loadGlobalConfig,\n saveGlobalConfig,\n} from \"../config/global-config.js\";\nimport {\n getStoredSession,\n setAccessOnlySession,\n setCredentials,\n} from \"../config/credential-store.js\";\nimport { startCliAuthServer, openBrowser } from \"../auth/auth-server.js\";\n\nexport default defineCommand({\n meta: {\n name: \"login\",\n description:\n \"Open browser login and store a refreshable Dreamboard session\",\n },\n args: {\n ...(IS_PUBLISHED_BUILD\n ? {}\n : {\n env: {\n type: \"string\" as const,\n description: \"Environment: local | dev | prod\",\n },\n }),\n },\n async run({ args }) {\n const parsedArgs = parseLoginCommandArgs(args);\n const [globalConfig, storedSession] = await Promise.all([\n loadGlobalConfig(),\n getStoredSession(),\n ]);\n const config = resolveConfig(\n globalConfig,\n parsedArgs,\n undefined,\n storedSession,\n );\n const state = crypto.randomUUID();\n\n const server = await startCliAuthServer(state, DEFAULT_LOGIN_TIMEOUT_MS);\n const loginUrl = `${config.webBaseUrl.replace(/\\/$/, \"\")}/cli-login?port=${server.port}&state=${state}`;\n\n consola.info(\"Opening browser for login...\");\n consola.info(`If the browser does not open, visit: ${loginUrl}`);\n openBrowser(loginUrl);\n\n consola.start(\"Waiting for login to complete...\");\n try {\n const { token, refreshToken } = await server.waitForToken;\n\n const resolvedEnvironment = IS_PUBLISHED_BUILD\n ? PUBLISHED_ENVIRONMENT\n : parsedArgs.env || globalConfig.environment;\n\n // Persist environment choice separately from credentials. The\n // credential write itself goes through CredentialStore, which\n // applies atomic-write + 0600 + cross-process lock.\n await saveGlobalConfig({\n ...globalConfig,\n environment: resolvedEnvironment,\n });\n\n if (refreshToken) {\n await setCredentials({\n accessToken: token,\n refreshToken,\n });\n } else {\n // Browser flow normally always returns both tokens; fall back\n // to an access-only session if not so we do not regress older\n // servers that only emit the access token.\n consola.warn(\n \"Auth server did not return a refresh token. Session saved without auto-refresh support.\",\n );\n await setAccessOnlySession(token);\n }\n\n consola.success(\n `Login successful. Session saved to ${getGlobalAuthPath()}`,\n );\n } finally {\n server.close();\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport consola from \"consola\";\nimport { getGlobalAuthPath } from \"../config/global-config.js\";\nimport { clearCredentials } from \"../config/credential-store.js\";\n\nexport default defineCommand({\n meta: { name: \"logout\", description: \"Clear the stored Dreamboard session\" },\n args: {},\n async run() {\n await clearCredentials();\n consola.success(`Logged out. Cleared session from ${getGlobalAuthPath()}.`);\n },\n});\n","import path from \"node:path\";\nimport { defineCommand } from \"citty\";\nimport consola from \"consola\";\nimport { createGame, deleteGame } from \"@dreamboard/api-client\";\nimport type { GameTopologyManifest } from \"@dreamboard/sdk-types\";\nimport {\n resolveConfig,\n requireAuth,\n configureClient,\n} from \"../config/resolve.js\";\nimport { parseNewCommandArgs } from \"../flags.js\";\nimport { loadGlobalConfig } from \"../config/global-config.js\";\nimport { getStoredSession } from \"../config/credential-store.js\";\nimport { normalizeSlug, titleFromSlug } from \"../utils/strings.js\";\nimport { ensureDir } from \"../utils/fs.js\";\nimport { CONFIG_FLAG_ARGS } from \"../command-args.js\";\nimport {\n tryGetGameBySlug,\n getLatestRuleIdSdk,\n saveManifestSdk,\n} from \"../services/api/index.js\";\nimport {\n writeManifest,\n writeRule,\n writeSnapshot,\n} from \"../services/project/local-files.js\";\nimport { updateProjectState } from \"../config/project-config.js\";\nimport { scaffoldStaticWorkspace } from \"../services/project/static-scaffold.js\";\nimport { updateProjectAuthoringState } from \"../services/project/project-state.js\";\nimport { isProblemType, toDreamboardApiError } from \"../utils/errors.js\";\nimport { CLI_PROBLEM_TYPES } from \"../utils/problem-types.js\";\nimport { applyWorkspaceCodegen } from \"../services/project/workspace-codegen.js\";\nimport { installWorkspaceDependencies } from \"../services/project/workspace-dependencies.js\";\nimport { ensureLocalMaintainerSnapshot } from \"../services/project/local-maintainer-registry.js\";\nimport { updateProjectLocalMaintainerRegistry } from \"../services/project/project-state.js\";\n\nexport default defineCommand({\n meta: {\n name: \"new\",\n description: \"Create a new game and scaffold a local workspace\",\n },\n args: {\n slug: { type: \"positional\", description: \"Game slug\", required: true },\n description: {\n type: \"string\",\n description: \"Short description of the game to create\",\n required: true,\n },\n force: {\n type: \"boolean\",\n description: \"Delete existing game with the same slug before creating\",\n default: false,\n },\n ...CONFIG_FLAG_ARGS,\n },\n async run({ args }) {\n const parsedArgs = parseNewCommandArgs(args);\n const slugInput = parsedArgs.slug;\n const description = parsedArgs.description.trim();\n\n const normalizedSlug = normalizeSlug(slugInput);\n if (!normalizedSlug) {\n throw new Error(\"Slug must contain at least one alphanumeric character.\");\n }\n if (normalizedSlug !== slugInput) {\n consola.info(`Normalized slug to '${normalizedSlug}'.`);\n }\n\n const [globalConfig, storedSession] = await Promise.all([\n loadGlobalConfig(),\n getStoredSession(),\n ]);\n const config = resolveConfig(\n globalConfig,\n parsedArgs,\n undefined,\n storedSession,\n );\n requireAuth(config);\n await configureClient(config);\n const localMaintainerRegistry = await ensureLocalMaintainerSnapshot(\n config.apiBaseUrl,\n );\n\n if (parsedArgs.force) {\n const existing = await tryGetGameBySlug(normalizedSlug, {\n includeDeleted: true,\n });\n if (existing) {\n consola.warn(`Deleting existing game '${normalizedSlug}' (--force)...`);\n const { error: deleteError, response: deleteResponse } =\n await deleteGame({ path: { gameId: existing.id } });\n if (\n deleteError &&\n !isProblemType(\n toDreamboardApiError(\n deleteError,\n deleteResponse,\n `Failed to delete existing game '${normalizedSlug}'`,\n ),\n CLI_PROBLEM_TYPES.RESOURCE_NOT_FOUND,\n )\n ) {\n throw toDreamboardApiError(\n deleteError,\n deleteResponse,\n `Failed to delete existing game '${normalizedSlug}'`,\n );\n }\n }\n }\n\n const {\n data: game,\n error: createError,\n response: createResponse,\n } = await createGame({\n body: {\n name: titleFromSlug(normalizedSlug),\n slug: normalizedSlug,\n description,\n ruleText: \"\",\n },\n });\n if (createError || !game) {\n const apiError = toDreamboardApiError(\n createError,\n createResponse,\n \"Failed to create game\",\n );\n if (isProblemType(apiError, CLI_PROBLEM_TYPES.GAME_SLUG_CONFLICT)) {\n throw new Error(\n `Game with slug '${normalizedSlug}' already exists. Use --force to delete and recreate it, or choose a different slug.`,\n );\n }\n throw apiError;\n }\n\n try {\n const ruleId = await getLatestRuleIdSdk(game.id);\n\n const blankManifest: GameTopologyManifest = {\n players: {\n minPlayers: 2,\n maxPlayers: 4,\n optimalPlayers: 4,\n },\n cardSets: [],\n zones: [],\n boardTemplates: [],\n boards: [],\n pieceTypes: [],\n pieceSeeds: [],\n dieTypes: [],\n dieSeeds: [],\n resources: [],\n setupOptions: [],\n setupProfiles: [],\n };\n\n consola.start(\"Saving initial manifest...\");\n const { manifestId, contentHash } = await saveManifestSdk(\n game.id,\n blankManifest,\n ruleId,\n );\n\n consola.start(\"Scaffolding local workspace...\");\n\n const targetDir = path.resolve(process.cwd(), normalizedSlug);\n await ensureDir(targetDir);\n await writeManifest(targetDir, blankManifest);\n await writeRule(targetDir, \"\");\n\n await scaffoldStaticWorkspace(targetDir, \"new\", {\n localMaintainerRegistry,\n });\n await applyWorkspaceCodegen({\n projectRoot: targetDir,\n manifest: blankManifest,\n });\n await installWorkspaceDependencies(targetDir);\n\n await updateProjectState(\n targetDir,\n updateProjectLocalMaintainerRegistry(\n updateProjectAuthoringState(\n {\n gameId: game.id,\n slug: normalizedSlug,\n apiBaseUrl: config.apiBaseUrl,\n webBaseUrl: config.webBaseUrl,\n },\n {\n ruleId,\n manifestId,\n manifestContentHash: contentHash,\n },\n ),\n localMaintainerRegistry ?? undefined,\n ),\n );\n await writeSnapshot(targetDir);\n\n consola.success(`Created new game in ${targetDir}`);\n consola.info(\n \"Next: edit your files, then run 'dreamboard sync' followed by 'dreamboard compile'.\",\n );\n } catch (err) {\n consola.warn(`Creation failed, deleting game '${normalizedSlug}'...`);\n await deleteGame({ path: { gameId: game.id } });\n throw err;\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport consola from \"consola\";\nimport { updateProjectState } from \"../config/project-config.js\";\nimport { resolveProjectContext } from \"../config/resolve.js\";\nimport { parsePullCommandArgs } from \"../flags.js\";\nimport {\n buildRemoteAlignedSnapshotFiles,\n fetchLatestRemoteSources,\n pullIntoDirectory,\n reconcileRemoteChangesIntoWorkspace,\n} from \"../services/project/sync.js\";\nimport {\n collectLocalFiles,\n getLocalDiff,\n loadManifest,\n writeSnapshotFromFiles,\n} from \"../services/project/local-files.js\";\nimport {\n getProjectAuthoringState,\n updateProjectLocalMaintainerRegistry,\n updateProjectAuthoringState,\n} from \"../services/project/project-state.js\";\nimport { applyWorkspaceCodegen } from \"../services/project/workspace-codegen.js\";\nimport {\n ensureLocalMaintainerSnapshot,\n readWorkspaceLocalMaintainerRegistry,\n} from \"../services/project/local-maintainer-registry.js\";\nimport { scaffoldStaticWorkspace } from \"../services/project/static-scaffold.js\";\nimport { installWorkspaceDependencies } from \"../services/project/workspace-dependencies.js\";\n\nexport default defineCommand({\n meta: {\n name: \"pull\",\n description: \"Reconcile remote authored changes into the current project\",\n },\n args: {\n force: {\n type: \"boolean\",\n description: \"Override conflicts\",\n default: false,\n },\n env: { type: \"string\", description: \"Environment: local | dev | prod\" },\n token: { type: \"string\", description: \"Auth token (Supabase JWT)\" },\n },\n async run({ args }) {\n const parsedArgs = parsePullCommandArgs(args);\n const { projectRoot, projectConfig, config } =\n await resolveProjectContext(parsedArgs);\n const localMaintainerRegistry = await ensureLocalMaintainerSnapshot(\n config.apiBaseUrl,\n );\n const localAuthoring = getProjectAuthoringState(projectConfig);\n const latestRemote = await fetchLatestRemoteSources(projectConfig.gameId);\n\n if (localAuthoring.pendingSync && !parsedArgs.force) {\n throw new Error(\n \"This workspace is still finalizing a previous sync. Run 'dreamboard sync' again to finish it, or use 'dreamboard pull --force' to replace local files with remote state.\",\n );\n }\n\n if (!latestRemote) {\n consola.info(\"Remote has no authored state yet.\");\n return;\n }\n\n if (!localAuthoring.authoringStateId) {\n if (!parsedArgs.force) {\n throw new Error(\n `This workspace has no authored base. Use 'dreamboard pull --force' to replace local files with remote authored state ${latestRemote.authoringStateId}.`,\n );\n }\n const pulledProjectConfig = await pullIntoDirectory(\n config,\n projectRoot,\n projectConfig,\n );\n const fallbackRegistryUrl = localMaintainerRegistry?.registryUrl;\n const workspaceLocalMaintainerRegistry =\n localMaintainerRegistry ??\n (await readWorkspaceLocalMaintainerRegistry(\n projectRoot,\n fallbackRegistryUrl,\n ));\n await scaffoldStaticWorkspace(projectRoot, \"update\", {\n localMaintainerRegistry: workspaceLocalMaintainerRegistry,\n });\n if (workspaceLocalMaintainerRegistry) {\n await installWorkspaceDependencies(projectRoot);\n await updateProjectState(\n projectRoot,\n updateProjectLocalMaintainerRegistry(\n pulledProjectConfig,\n workspaceLocalMaintainerRegistry,\n ),\n );\n }\n consola.success(\"Pulled remote authored state into the workspace.\");\n return;\n }\n\n if (localAuthoring.authoringStateId === latestRemote.authoringStateId) {\n consola.info(\"Remote authored state already matches this workspace.\");\n return;\n }\n\n if (parsedArgs.force) {\n const pulledProjectConfig = await pullIntoDirectory(\n config,\n projectRoot,\n projectConfig,\n );\n const fallbackRegistryUrl = localMaintainerRegistry?.registryUrl;\n const workspaceLocalMaintainerRegistry =\n localMaintainerRegistry ??\n (await readWorkspaceLocalMaintainerRegistry(\n projectRoot,\n fallbackRegistryUrl,\n ));\n await scaffoldStaticWorkspace(projectRoot, \"update\", {\n localMaintainerRegistry: workspaceLocalMaintainerRegistry,\n });\n if (workspaceLocalMaintainerRegistry) {\n await installWorkspaceDependencies(projectRoot);\n await updateProjectState(\n projectRoot,\n updateProjectLocalMaintainerRegistry(\n pulledProjectConfig,\n workspaceLocalMaintainerRegistry,\n ),\n );\n }\n consola.success(\n \"Replaced local files with the current remote authored state.\",\n );\n return;\n }\n\n const reconcileResult = await reconcileRemoteChangesIntoWorkspace({\n projectRoot,\n projectConfig,\n baseAuthoringStateId: localAuthoring.authoringStateId,\n latestAuthoringStateId: latestRemote.authoringStateId,\n });\n\n if (reconcileResult.conflicts.length > 0) {\n for (const filePath of reconcileResult.conflicts) {\n consola.error(`Conflict: ${filePath}`);\n }\n throw new Error(\n `Remote reconciliation wrote conflict markers to ${reconcileResult.conflicts.length} file(s). Resolve them and rerun 'dreamboard pull'.`,\n );\n }\n\n await applyWorkspaceCodegen({\n projectRoot,\n manifest: await loadManifest(projectRoot),\n });\n const fallbackRegistryUrl = localMaintainerRegistry?.registryUrl;\n const workspaceLocalMaintainerRegistry =\n localMaintainerRegistry ??\n (await readWorkspaceLocalMaintainerRegistry(\n projectRoot,\n fallbackRegistryUrl,\n ));\n await scaffoldStaticWorkspace(projectRoot, \"update\", {\n localMaintainerRegistry: workspaceLocalMaintainerRegistry,\n });\n if (workspaceLocalMaintainerRegistry) {\n await installWorkspaceDependencies(projectRoot);\n }\n\n const nextProjectConfig = updateProjectLocalMaintainerRegistry(\n updateProjectAuthoringState(projectConfig, {\n authoringStateId: reconcileResult.latest.authoringStateId,\n sourceRevisionId: reconcileResult.latest.sourceRevisionId,\n sourceTreeHash: reconcileResult.latest.treeHash,\n manifestId:\n reconcileResult.latest.manifestId ??\n projectConfig.authoring?.manifestId,\n manifestContentHash:\n reconcileResult.latest.manifestContentHash ??\n projectConfig.authoring?.manifestContentHash,\n ruleId:\n reconcileResult.latest.ruleId ?? projectConfig.authoring?.ruleId,\n }),\n workspaceLocalMaintainerRegistry ?? undefined,\n );\n await updateProjectState(projectRoot, nextProjectConfig);\n\n const reconciledLocalFiles = await collectLocalFiles(projectRoot);\n await writeSnapshotFromFiles(\n projectRoot,\n buildRemoteAlignedSnapshotFiles({\n localFiles: reconciledLocalFiles,\n remoteUserFiles: reconcileResult.remoteUserFiles,\n }),\n );\n\n const localDiff = await getLocalDiff(projectRoot);\n if (\n localDiff.modified.length === 0 &&\n localDiff.added.length === 0 &&\n localDiff.deleted.length === 0\n ) {\n consola.success(\"Pulled remote authored changes.\");\n return;\n }\n\n consola.success(\n \"Pulled remote authored changes. Local edits were preserved where possible.\",\n );\n },\n});\n","import { defineCommand } from \"citty\";\nimport consola from \"consola\";\nimport { getGame } from \"@dreamboard/api-client\";\nimport { CONFIG_FLAG_ARGS } from \"../command-args.js\";\nimport { resolveProjectContext, configureClient } from \"../config/resolve.js\";\nimport { parseStatusCommandArgs } from \"../flags.js\";\nimport { getLocalDiff } from \"../services/project/local-files.js\";\nimport {\n findCompiledResultsForAuthoringState,\n getAuthoringHeadSdk,\n} from \"../services/api/index.js\";\nimport {\n getProjectAuthoringState,\n getProjectCompileState,\n getProjectPendingAuthoringSync,\n} from \"../services/project/project-state.js\";\n\nexport default defineCommand({\n meta: { name: \"status\", description: \"Show local vs remote status\" },\n args: {\n json: {\n type: \"boolean\",\n description: \"Print machine-readable status JSON\",\n default: false,\n },\n ...CONFIG_FLAG_ARGS,\n },\n async run({ args }) {\n const parsedArgs = parseStatusCommandArgs(args);\n const { projectRoot, projectConfig, config } = await resolveProjectContext(\n parsedArgs,\n { requireAuth: false },\n );\n\n const diff = await getLocalDiff(projectRoot);\n const localAuthoring = getProjectAuthoringState(projectConfig);\n const pendingSync = getProjectPendingAuthoringSync(projectConfig);\n const localCompile = getProjectCompileState(projectConfig);\n let remoteHeadId: string | null = null;\n let authoredRelation:\n | \"in_sync\"\n | \"ahead\"\n | \"behind\"\n | \"diverged\"\n | \"pending_finalize\"\n | \"unknown\" = \"unknown\";\n let compileRelation:\n | \"successful\"\n | \"failed\"\n | \"never_compiled\"\n | \"stale_success\" = \"never_compiled\";\n let completionLights: {\n rules: unknown;\n manifest: unknown;\n phases: unknown;\n ui: unknown;\n } | null = null;\n\n if (config.authToken) {\n await configureClient(config);\n const remoteHead = await getAuthoringHeadSdk(projectConfig.gameId);\n remoteHeadId = remoteHead?.authoringStateId ?? null;\n\n const { data: game } = await getGame({\n path: { gameId: projectConfig.gameId },\n });\n if (game) {\n completionLights = game.completionLights;\n }\n\n const hasLocalDiff =\n diff.modified.length > 0 ||\n diff.added.length > 0 ||\n diff.deleted.length > 0;\n if (pendingSync) {\n authoredRelation = \"pending_finalize\";\n } else if (!localAuthoring.authoringStateId) {\n authoredRelation = \"unknown\";\n } else if (remoteHeadId === null) {\n authoredRelation = hasLocalDiff ? \"ahead\" : \"unknown\";\n } else if (remoteHeadId === localAuthoring.authoringStateId) {\n authoredRelation = hasLocalDiff ? \"ahead\" : \"in_sync\";\n } else {\n authoredRelation = hasLocalDiff ? \"diverged\" : \"behind\";\n }\n\n if (remoteHeadId) {\n const remoteResults = await findCompiledResultsForAuthoringState({\n gameId: projectConfig.gameId,\n authoringStateId: remoteHeadId,\n });\n const latestAttempt = remoteResults[0] ?? null;\n\n if (latestAttempt?.success) {\n compileRelation = \"successful\";\n } else if (latestAttempt && !latestAttempt.success) {\n compileRelation = \"failed\";\n } else if (\n localCompile.latestSuccessful &&\n localCompile.latestSuccessful.authoringStateId !== remoteHeadId\n ) {\n compileRelation = \"stale_success\";\n } else {\n compileRelation = \"never_compiled\";\n }\n }\n }\n\n if (parsedArgs.json) {\n console.log(\n JSON.stringify(\n {\n gameId: projectConfig.gameId,\n slug: projectConfig.slug,\n authoring: {\n localAuthoringStateId: localAuthoring.authoringStateId ?? null,\n remoteAuthoringStateId: remoteHeadId,\n relation: authoredRelation,\n pendingSync: pendingSync ?? null,\n },\n compile: {\n relation: compileRelation,\n latestAttempt: localCompile.latestAttempt ?? null,\n latestSuccessful: localCompile.latestSuccessful ?? null,\n },\n authenticated: Boolean(config.authToken),\n localDiff: {\n modified: diff.modified.length,\n added: diff.added.length,\n deleted: diff.deleted.length,\n },\n localDiffPaths: diff,\n completionLights,\n },\n null,\n 2,\n ),\n );\n return;\n }\n\n consola.info(\n `Local changes: ${diff.modified.length} modified, ${diff.added.length} added, ${diff.deleted.length} deleted`,\n );\n if (diff.modified.length > 0)\n consola.log(`Modified: ${diff.modified.join(\", \")}`);\n if (diff.added.length > 0) consola.log(`Added: ${diff.added.join(\", \")}`);\n if (diff.deleted.length > 0)\n consola.log(`Deleted: ${diff.deleted.join(\", \")}`);\n\n if (completionLights) {\n const lightSummary = [\n `rules:${completionLights.rules}`,\n `manifest:${completionLights.manifest}`,\n `phases:${completionLights.phases}`,\n `ui:${completionLights.ui}`,\n ].join(\" \");\n consola.info(`Completion lights: ${lightSummary}`);\n }\n\n if (!config.authToken) {\n consola.warn(\"Remote status unavailable (no auth token).\");\n return;\n }\n\n consola.info(\n `Authored state: ${authoredRelation} (local=${localAuthoring.authoringStateId ?? \"unknown\"}, remote=${remoteHeadId ?? \"none\"})`,\n );\n if (pendingSync) {\n consola.warn(\n `Previous sync is still being finalized (${pendingSync.phase}). Run 'dreamboard sync' again to finish updating local scaffold files.`,\n );\n }\n consola.info(`Compile state: ${compileRelation}`);\n if (compileRelation === \"failed\") {\n consola.warn(\n \"Latest compile for the current authored state failed. Fix diagnostics and run 'dreamboard compile' again.\",\n );\n }\n if (authoredRelation === \"behind\" || authoredRelation === \"diverged\") {\n consola.warn(\n \"Remote authored changes are available. Run 'dreamboard pull' to reconcile them into this workspace.\",\n );\n }\n },\n});\n","import { defineCommand } from \"citty\";\nimport consola from \"consola\";\nimport { type SourceChangeMode } from \"@dreamboard/api-client\";\nimport {\n mapUpsertBlobContentsByContentHash,\n materializeSourceChangeOperations,\n type SourceContentChangeOperation,\n} from \"@dreamboard/api-client/source-revisions\";\nimport { CONFIG_FLAG_ARGS } from \"../command-args.js\";\nimport { MANIFEST_FILE, RULE_FILE } from \"../constants.js\";\nimport { resolveProjectContext } from \"../config/resolve.js\";\nimport { updateProjectState } from \"../config/project-config.js\";\nimport { parseSyncCommandArgs } from \"../flags.js\";\nimport {\n collectLocalFiles,\n computeManifestHash,\n getLocalDiff,\n isAllowedGamePath,\n loadManifest,\n loadRule,\n writeSnapshot,\n} from \"../services/project/local-files.js\";\nimport {\n assertCliStaticScaffoldComplete,\n scaffoldStaticWorkspace,\n} from \"../services/project/static-scaffold.js\";\nimport {\n createAuthoringStateSdk,\n createGameSdk,\n createSourceRevisionSdk,\n getGameSdk,\n getAuthoringHeadSdk,\n getLatestManifestIdSdk,\n getLatestRuleIdSdk,\n isManifestDifferentFromServer,\n saveManifestSdk,\n saveRuleSdk,\n tryGetGameBySlug,\n uploadSourceBlobsSdk,\n} from \"../services/api/index.js\";\nimport { getProblemContextValue, isProblemType } from \"../utils/errors.js\";\nimport { CLI_PROBLEM_TYPES } from \"../utils/problem-types.js\";\nimport {\n clearProjectPendingAuthoringSync,\n finalizeProjectPendingAuthoringSync,\n getProjectAuthoringState,\n getProjectLocalMaintainerRegistry,\n getProjectPendingAuthoringSync,\n setProjectPendingAuthoringSync,\n updateProjectAuthoringState,\n updateProjectLocalMaintainerRegistry,\n} from \"../services/project/project-state.js\";\nimport type {\n ProjectConfig,\n ProjectPendingAuthoringSync,\n ResolvedConfig,\n} from \"../types.js\";\nimport { isDynamicGeneratedPath } from \"../services/project/scaffold-ownership.js\";\nimport { applyWorkspaceCodegen } from \"../services/project/workspace-codegen.js\";\nimport {\n didLocalMaintainerSnapshotChange,\n ensureLocalMaintainerSnapshot,\n isLocalMaintainerRegistryEnabled,\n} from \"../services/project/local-maintainer-registry.js\";\nimport { reconcileWorkspaceDependencies } from \"../services/project/workspace-dependencies.js\";\nimport { assertReducerContractPreflight } from \"../services/project/reducer-contract-preflight.js\";\nimport { assertReducerBundleSmoke } from \"../services/project/reducer-bundle-preflight.js\";\nimport { runLocalTypecheck } from \"../services/project/local-typecheck.js\";\nimport { titleFromSlug } from \"../utils/strings.js\";\n\nasync function runLoggedStep<T>(\n message: string,\n task: () => Promise<T>,\n): Promise<T> {\n consola.start(message);\n return task();\n}\n\nfunction isSourceRevisionPath(filePath: string): boolean {\n return (\n filePath !== RULE_FILE &&\n isAllowedGamePath(filePath) &&\n !isDynamicGeneratedPath(filePath)\n );\n}\n\nfunction shouldAlwaysUpsertSourcePath(filePath: string): boolean {\n return filePath === \".npmrc\";\n}\n\nfunction buildSourceChanges(options: {\n mode: SourceChangeMode;\n localFiles: Record<string, string>;\n diff: { modified: string[]; added: string[]; deleted: string[] };\n}): SourceContentChangeOperation[] {\n const { mode, localFiles, diff } = options;\n\n if (mode === \"replace\") {\n return Object.entries(localFiles)\n .filter(\n ([filePath]) =>\n isSourceRevisionPath(filePath) ||\n shouldAlwaysUpsertSourcePath(filePath),\n )\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([path, content]) => ({\n kind: \"upsert\",\n path,\n content,\n }));\n }\n\n const changesByPath = new Map<string, SourceContentChangeOperation>();\n\n for (const filePath of [...diff.modified, ...diff.added]\n .filter(isSourceRevisionPath)\n .sort()) {\n const content = localFiles[filePath];\n if (content !== undefined) {\n changesByPath.set(filePath, { kind: \"upsert\", path: filePath, content });\n }\n }\n\n for (const filePath of diff.deleted.filter(isSourceRevisionPath).sort()) {\n changesByPath.set(filePath, { kind: \"delete\", path: filePath });\n }\n\n for (const [filePath, content] of Object.entries(localFiles)\n .filter(([filePath]) => shouldAlwaysUpsertSourcePath(filePath))\n .sort(([left], [right]) => left.localeCompare(right))) {\n changesByPath.set(filePath, {\n kind: \"upsert\",\n path: filePath,\n content,\n });\n }\n\n return Array.from(changesByPath.values()).sort((left, right) =>\n left.path.localeCompare(right.path),\n );\n}\n\nfunction isFirstSyncSourceRevisionConflict(error: unknown): boolean {\n return (\n isProblemType(error, CLI_PROBLEM_TYPES.SOURCE_REVISION_DRIFT) &&\n !getProblemContextValue(error, \"receivedBaseSourceRevisionId\")\n );\n}\n\nfunction formatFirstSyncSourceRevisionConflict(\n gameId: string,\n error: unknown,\n): string {\n const expectedHead = getProblemContextValue(\n error,\n \"expectedHeadSourceRevisionId\",\n );\n const remoteHeadDescription = expectedHead\n ? `remote source revision ${expectedHead}`\n : \"a remote source revision\";\n\n return [\n `First sync could not be completed because the server already has ${remoteHeadDescription} for this game, but this workspace has no authored base yet.`,\n \"This usually means a previous sync uploaded source files but did not finish creating the authored head.\",\n \"If `dreamboard pull --force` in a clean workspace finds a remote authored state, use that to recover.\",\n \"If `dreamboard pull` reports that the remote has no authored state, this game needs backend repair before `dreamboard sync` can continue.\",\n `Game ID: ${gameId}.`,\n ].join(\" \");\n}\n\nfunction isMissingSourceRevisionDuringSync(\n error: unknown,\n sourceRevisionId: string,\n): boolean {\n return (\n isProblemType(error, CLI_PROBLEM_TYPES.SOURCE_REVISION_NOT_FOUND) &&\n getProblemContextValue(error, \"sourceRevisionId\") === sourceRevisionId\n );\n}\n\nfunction formatMissingSourceRevisionDuringSync(options: {\n gameId: string;\n sourceRevisionId: string;\n}): string {\n return [\n `Sync could not finish because the backend no longer has source revision ${options.sourceRevisionId} for game ${options.gameId}.`,\n \"This usually means a previous sync uploaded source files but never finished creating the authored head.\",\n \"Run `dreamboard sync --force` to recreate the remote source revision from your current local files.\",\n \"If that still fails and `dreamboard pull --force` in a clean workspace cannot find a remote authored state, this game needs backend repair before sync can continue.\",\n ].join(\" \");\n}\n\nasync function persistProjectConfig(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n}): Promise<ProjectConfig> {\n await updateProjectState(options.projectRoot, options.projectConfig);\n return options.projectConfig;\n}\n\nasync function persistPendingSyncCheckpoint(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n pendingSync: ProjectPendingAuthoringSync;\n}): Promise<ProjectConfig> {\n return persistProjectConfig({\n projectRoot: options.projectRoot,\n projectConfig: setProjectPendingAuthoringSync(\n options.projectConfig,\n options.pendingSync,\n ),\n });\n}\n\nasync function persistFinalizedAuthoringState(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n}): Promise<ProjectConfig> {\n return persistProjectConfig({\n projectRoot: options.projectRoot,\n projectConfig: finalizeProjectPendingAuthoringSync(options.projectConfig),\n });\n}\n\nasync function clearPendingSyncCheckpoint(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n}): Promise<ProjectConfig> {\n return persistProjectConfig({\n projectRoot: options.projectRoot,\n projectConfig: clearProjectPendingAuthoringSync(options.projectConfig),\n });\n}\n\nfunction resetRemoteBackedProjectState(\n projectConfig: ProjectConfig,\n options: {\n gameId: string;\n slug: string;\n config: ResolvedConfig;\n },\n): ProjectConfig {\n return {\n ...projectConfig,\n gameId: options.gameId,\n slug: options.slug,\n authoring: {},\n compile: {},\n apiBaseUrl: options.config.apiBaseUrl,\n webBaseUrl: options.config.webBaseUrl,\n };\n}\n\nasync function repairMissingLocalGame(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n config: ResolvedConfig;\n ruleText: string;\n}): Promise<ProjectConfig> {\n const { projectRoot, projectConfig, config, ruleText } = options;\n const existingById = await getGameSdk(projectConfig.gameId);\n if (existingById) {\n return projectConfig;\n }\n\n consola.warn(\n `Local backend no longer has game ${projectConfig.gameId}. Recreating local game '${projectConfig.slug}' before syncing.`,\n );\n\n const existingBySlug = await tryGetGameBySlug(projectConfig.slug);\n const game =\n existingBySlug ??\n (await createGameSdk({\n name: titleFromSlug(projectConfig.slug),\n slug: projectConfig.slug,\n description: `Local Dreamboard workspace for ${projectConfig.slug}.`,\n ruleText,\n }));\n\n const repairedProjectConfig = resetRemoteBackedProjectState(projectConfig, {\n gameId: game.id,\n slug: game.slug ?? projectConfig.slug,\n config,\n });\n await persistProjectConfig({\n projectRoot,\n projectConfig: repairedProjectConfig,\n });\n\n consola.info(\n existingBySlug\n ? `Using existing local game ${game.id} for slug '${game.slug ?? projectConfig.slug}'.`\n : `Created local game ${game.id} for slug '${game.slug ?? projectConfig.slug}'.`,\n );\n\n return repairedProjectConfig;\n}\n\nfunction doesRemoteHeadMatchPendingSync(\n remoteHead: {\n authoringStateId?: string;\n sourceRevisionId?: string;\n sourceTreeHash?: string;\n manifestId?: string;\n manifestContentHash?: string;\n ruleId?: string;\n } | null,\n pendingSync: ProjectPendingAuthoringSync,\n): boolean {\n return (\n remoteHead?.sourceRevisionId === pendingSync.sourceRevisionId &&\n remoteHead.sourceTreeHash === pendingSync.sourceTreeHash &&\n remoteHead.manifestId === pendingSync.manifestId &&\n remoteHead.manifestContentHash === pendingSync.manifestContentHash &&\n remoteHead.ruleId === pendingSync.ruleId\n );\n}\n\nfunction formatPendingSyncConflict(options: {\n remoteHeadId: string;\n pendingSync: ProjectPendingAuthoringSync;\n}): string {\n return `Remote authored state has moved to ${options.remoteHeadId} while this workspace was still finalizing a previous sync (${options.pendingSync.phase}). Run 'dreamboard pull' before syncing local changes.`;\n}\n\nasync function finalizeLocalSync(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n}): Promise<ProjectConfig> {\n const { projectRoot, projectConfig } = options;\n await scaffoldStaticWorkspace(projectRoot, \"update\", {\n localMaintainerRegistry: getProjectLocalMaintainerRegistry(projectConfig),\n });\n await applyWorkspaceCodegen({\n projectRoot,\n manifest: await loadManifest(projectRoot),\n });\n\n const finalizedProjectConfig = await persistFinalizedAuthoringState({\n projectRoot,\n projectConfig,\n });\n await writeSnapshot(projectRoot);\n return finalizedProjectConfig;\n}\n\nexport default defineCommand({\n meta: {\n name: \"sync\",\n description:\n \"Upload authored changes and advance the remote authoring head\",\n },\n args: {\n force: {\n type: \"boolean\",\n description:\n \"Replace the full authored source tree, manifest, and rules, overwriting the remote head with the local copy even when the remote has moved\",\n default: false,\n },\n yes: {\n type: \"boolean\",\n alias: \"y\",\n description: \"Reserved for non-interactive scaffold flows\",\n default: false,\n },\n ...CONFIG_FLAG_ARGS,\n },\n async run({ args }) {\n const parsedArgs = parseSyncCommandArgs(args);\n const { projectRoot, projectConfig, config } =\n await resolveProjectContext(parsedArgs);\n let nextProjectConfig = projectConfig;\n const localMaintainerEnabled = isLocalMaintainerRegistryEnabled(\n config.apiBaseUrl,\n );\n const localMaintainerRegistry = localMaintainerEnabled\n ? await runLoggedStep(\"Checking local SDK snapshot...\", () =>\n ensureLocalMaintainerSnapshot(config.apiBaseUrl),\n )\n : await ensureLocalMaintainerSnapshot(config.apiBaseUrl);\n const localMaintainerSnapshotChanged = didLocalMaintainerSnapshotChange(\n getProjectLocalMaintainerRegistry(projectConfig),\n localMaintainerRegistry,\n );\n if (localMaintainerRegistry) {\n nextProjectConfig = updateProjectLocalMaintainerRegistry(\n nextProjectConfig,\n localMaintainerRegistry,\n );\n consola.info(\n localMaintainerSnapshotChanged\n ? \"Local SDK snapshot refreshed.\"\n : \"Using existing local SDK snapshot.\",\n );\n }\n\n await runLoggedStep(\"Refreshing static scaffold...\", () =>\n scaffoldStaticWorkspace(projectRoot, \"update\", {\n localMaintainerRegistry,\n }),\n );\n const localManifest = await loadManifest(projectRoot);\n await runLoggedStep(\"Applying workspace codegen...\", async () =>\n applyWorkspaceCodegen({\n projectRoot,\n manifest: localManifest,\n }),\n );\n const dependencyState = await runLoggedStep(\n \"Reconciling workspace dependencies...\",\n () => reconcileWorkspaceDependencies(projectRoot),\n );\n if (\n dependencyState.packageManagerNormalized ||\n dependencyState.lockfileGenerated ||\n dependencyState.installed ||\n localMaintainerSnapshotChanged\n ) {\n consola.info(\"Workspace dependencies reconciled.\");\n } else {\n consola.info(\"Workspace dependencies already up to date.\");\n }\n await runLoggedStep(\"Validating reducer contract...\", () =>\n assertReducerContractPreflight(projectRoot),\n );\n const typecheckResult = await runLoggedStep(\n \"Running local typecheck...\",\n () => runLocalTypecheck(projectRoot),\n );\n if (typecheckResult.skipped) {\n if (typecheckResult.output) {\n consola.warn(typecheckResult.output);\n }\n } else if (!typecheckResult.success) {\n if (typecheckResult.output) {\n consola.error(typecheckResult.output);\n }\n throw new Error(\n \"Local typecheck failed. Fix the diagnostics before syncing.\",\n );\n }\n await runLoggedStep(\"Smoke-testing reducer bundle...\", async () =>\n assertReducerBundleSmoke({\n projectRoot,\n manifest: localManifest,\n }),\n );\n\n let localBackendRepaired = false;\n if (localMaintainerEnabled) {\n const gameIdBeforeRepair = nextProjectConfig.gameId;\n nextProjectConfig = await runLoggedStep(\n \"Verifying local backend game...\",\n async () =>\n repairMissingLocalGame({\n projectRoot,\n projectConfig: nextProjectConfig,\n config,\n ruleText: await loadRule(projectRoot),\n }),\n );\n localBackendRepaired = gameIdBeforeRepair !== nextProjectConfig.gameId;\n }\n\n const localDiff = await getLocalDiff(projectRoot);\n await assertCliStaticScaffoldComplete(projectRoot, localDiff.deleted);\n\n let localAuthoring = getProjectAuthoringState(nextProjectConfig);\n let pendingSync = getProjectPendingAuthoringSync(nextProjectConfig);\n const remoteHead = await getAuthoringHeadSdk(nextProjectConfig.gameId);\n const remoteHeadId = remoteHead?.authoringStateId;\n let localHeadId = localAuthoring.authoringStateId;\n\n if (localMaintainerEnabled && !remoteHeadId && localHeadId) {\n consola.warn(\n `Local backend has no authored head for game ${nextProjectConfig.gameId}. Recreating it from local files.`,\n );\n nextProjectConfig = await persistProjectConfig({\n projectRoot,\n projectConfig: resetRemoteBackedProjectState(nextProjectConfig, {\n gameId: nextProjectConfig.gameId,\n slug: nextProjectConfig.slug,\n config,\n }),\n });\n localBackendRepaired = true;\n localAuthoring = getProjectAuthoringState(nextProjectConfig);\n pendingSync = getProjectPendingAuthoringSync(nextProjectConfig);\n localHeadId = localAuthoring.authoringStateId;\n }\n\n if (pendingSync) {\n if (parsedArgs.force) {\n const remoteHeadMatchesPending =\n pendingSync.phase === \"authoring_state_created\"\n ? remoteHeadId === pendingSync.authoringStateId\n : doesRemoteHeadMatchPendingSync(remoteHead, pendingSync);\n const remoteSafeToRebuildFrom =\n !remoteHeadId || remoteHeadId === localHeadId;\n if (\n pendingSync.phase === \"source_revision_created\" &&\n (remoteSafeToRebuildFrom || !remoteHeadMatchesPending)\n ) {\n nextProjectConfig = await clearPendingSyncCheckpoint({\n projectRoot,\n projectConfig: nextProjectConfig,\n });\n pendingSync = undefined;\n } else if (\n pendingSync.phase === \"authoring_state_created\" &&\n !remoteHeadMatchesPending\n ) {\n nextProjectConfig = await clearPendingSyncCheckpoint({\n projectRoot,\n projectConfig: nextProjectConfig,\n });\n pendingSync = undefined;\n }\n }\n }\n\n if (pendingSync) {\n if (pendingSync.phase === \"source_revision_created\") {\n if (\n !pendingSync.manifestId ||\n !pendingSync.manifestContentHash ||\n !pendingSync.localManifestContentHash ||\n !pendingSync.ruleId\n ) {\n throw new Error(\n \"Previous sync checkpoint is incomplete. Run 'dreamboard pull --force' into a clean workspace or ask for backend help.\",\n );\n }\n if (remoteHeadId) {\n if (!doesRemoteHeadMatchPendingSync(remoteHead, pendingSync)) {\n throw new Error(\n formatPendingSyncConflict({\n remoteHeadId,\n pendingSync,\n }),\n );\n }\n\n pendingSync = {\n ...pendingSync,\n phase: \"authoring_state_created\",\n authoringStateId: remoteHead.authoringStateId,\n };\n nextProjectConfig = await persistPendingSyncCheckpoint({\n projectRoot,\n projectConfig: nextProjectConfig,\n pendingSync,\n });\n } else {\n let resumedAuthoringState;\n try {\n resumedAuthoringState = await createAuthoringStateSdk(\n nextProjectConfig.gameId,\n {\n sourceRevisionId: pendingSync.sourceRevisionId,\n sourceTreeHash: pendingSync.sourceTreeHash,\n manifestId: pendingSync.manifestId,\n manifestContentHash: pendingSync.manifestContentHash,\n ruleId: pendingSync.ruleId,\n },\n );\n } catch (error) {\n if (\n isMissingSourceRevisionDuringSync(\n error,\n pendingSync.sourceRevisionId,\n )\n ) {\n throw new Error(\n formatMissingSourceRevisionDuringSync({\n gameId: nextProjectConfig.gameId,\n sourceRevisionId: pendingSync.sourceRevisionId,\n }),\n );\n }\n throw error;\n }\n pendingSync = {\n ...pendingSync,\n phase: \"authoring_state_created\",\n authoringStateId: resumedAuthoringState.authoringStateId,\n };\n nextProjectConfig = await persistPendingSyncCheckpoint({\n projectRoot,\n projectConfig: nextProjectConfig,\n pendingSync,\n });\n }\n } else if (!remoteHeadId) {\n throw new Error(\n \"Previous sync created a remote authored checkpoint, but the remote authored head is no longer available. Run 'dreamboard pull --force' into a clean workspace or ask for backend help.\",\n );\n } else if (remoteHeadId !== pendingSync.authoringStateId) {\n throw new Error(\n formatPendingSyncConflict({\n remoteHeadId,\n pendingSync,\n }),\n );\n }\n\n if (\n !pendingSync.authoringStateId ||\n !pendingSync.manifestId ||\n !pendingSync.localManifestContentHash ||\n !pendingSync.ruleId\n ) {\n throw new Error(\n \"Previous sync checkpoint is incomplete. Run 'dreamboard pull --force' into a clean workspace or ask for backend help.\",\n );\n }\n\n nextProjectConfig = await finalizeLocalSync({\n projectRoot,\n projectConfig: nextProjectConfig,\n });\n\n consola.success(\n `Synced authored state ${pendingSync.authoringStateId}. Run 'dreamboard compile' when you're ready.`,\n );\n return;\n }\n\n if (remoteHeadId && localHeadId && remoteHeadId !== localHeadId) {\n if (parsedArgs.force) {\n consola.warn(\n `Remote authored state has moved to ${remoteHeadId}. --force will overwrite the remote with this workspace's local copy.`,\n );\n } else {\n throw new Error(\n `Remote authored state has moved to ${remoteHeadId}. Run 'dreamboard pull' before syncing local changes, or pass --force to overwrite the remote with the local copy.`,\n );\n }\n }\n\n if (remoteHeadId && !localHeadId) {\n if (parsedArgs.force) {\n consola.warn(\n `This workspace has no authored base but the remote head is ${remoteHeadId}. --force will overwrite the remote with this workspace's local copy.`,\n );\n } else {\n throw new Error(\n `This workspace has no authored base but the remote head is ${remoteHeadId}. Re-clone, run 'dreamboard pull --force' into a clean workspace, or pass --force to overwrite the remote with the local copy.`,\n );\n }\n }\n\n const hasChanges =\n localDiff.modified.length > 0 ||\n localDiff.added.length > 0 ||\n localDiff.deleted.length > 0;\n const ruleChanged =\n localDiff.modified.includes(RULE_FILE) ||\n localDiff.added.includes(RULE_FILE);\n const manifestChanged =\n localDiff.modified.includes(MANIFEST_FILE) ||\n localDiff.added.includes(MANIFEST_FILE);\n\n let ruleId = localAuthoring.ruleId ?? remoteHead?.ruleId ?? undefined;\n let manifestId =\n localAuthoring.manifestId ?? remoteHead?.manifestId ?? undefined;\n let manifestContentHash =\n localAuthoring.manifestContentHash ??\n remoteHead?.manifestContentHash ??\n undefined;\n const localManifestContentHash = computeManifestHash(localManifest);\n const manifestOutOfSync =\n !manifestId ||\n localAuthoring.localManifestContentHash !== localManifestContentHash;\n if (\n !hasChanges &&\n !parsedArgs.force &&\n localHeadId != null &&\n remoteHeadId === localHeadId &&\n !pendingSync &&\n !manifestOutOfSync\n ) {\n consola.info(\"No local authored changes to sync.\");\n return;\n }\n\n let sourceRevisionId =\n remoteHead?.sourceRevisionId ?? localAuthoring.sourceRevisionId;\n let sourceTreeHash =\n remoteHead?.sourceTreeHash ?? localAuthoring.sourceTreeHash;\n\n if (parsedArgs.force || ruleChanged || localBackendRepaired) {\n ruleId = (\n await saveRuleSdk(nextProjectConfig.gameId, await loadRule(projectRoot))\n ).ruleId;\n }\n\n const manifestNeedsSave =\n parsedArgs.force ||\n manifestChanged ||\n manifestOutOfSync ||\n !manifestId ||\n (await isManifestDifferentFromServer(manifestId, manifestContentHash));\n if (manifestNeedsSave) {\n if (!ruleId) {\n ruleId = await getLatestRuleIdSdk(nextProjectConfig.gameId);\n }\n const saved = await saveManifestSdk(\n nextProjectConfig.gameId,\n localManifest,\n ruleId,\n );\n manifestId = saved.manifestId;\n manifestContentHash = saved.contentHash;\n }\n\n const localFiles = await collectLocalFiles(projectRoot);\n const mode: SourceChangeMode =\n parsedArgs.force || !sourceRevisionId ? \"replace\" : \"incremental\";\n const sourceChanges = buildSourceChanges({\n mode,\n localFiles,\n diff: localDiff,\n });\n if (sourceChanges.length > 0 || !sourceRevisionId) {\n const { changes } =\n await materializeSourceChangeOperations(sourceChanges);\n const uploadBlobs = mapUpsertBlobContentsByContentHash(\n sourceChanges,\n changes,\n );\n\n await uploadSourceBlobsSdk(\n nextProjectConfig.gameId,\n Array.from(uploadBlobs.values()),\n );\n let sourceRevision;\n try {\n sourceRevision = await createSourceRevisionSdk(\n nextProjectConfig.gameId,\n {\n ...(sourceRevisionId\n ? { baseSourceRevisionId: sourceRevisionId }\n : {}),\n mode,\n changes,\n },\n );\n } catch (error) {\n const expectedSourceRevisionHead =\n parsedArgs.force && mode === \"replace\"\n ? getProblemContextValue(error, \"expectedHeadSourceRevisionId\")\n : undefined;\n if (\n expectedSourceRevisionHead &&\n isProblemType(error, CLI_PROBLEM_TYPES.SOURCE_REVISION_DRIFT) &&\n expectedSourceRevisionHead !== sourceRevisionId\n ) {\n sourceRevision = await createSourceRevisionSdk(\n nextProjectConfig.gameId,\n {\n baseSourceRevisionId: expectedSourceRevisionHead,\n mode,\n changes,\n },\n );\n } else if (\n !remoteHeadId &&\n !localHeadId &&\n !sourceRevisionId &&\n isFirstSyncSourceRevisionConflict(error)\n ) {\n throw new Error(\n formatFirstSyncSourceRevisionConflict(\n nextProjectConfig.gameId,\n error,\n ),\n );\n } else {\n throw error;\n }\n }\n sourceRevisionId = sourceRevision.id;\n sourceTreeHash = sourceRevision.treeHash;\n nextProjectConfig = await persistPendingSyncCheckpoint({\n projectRoot,\n projectConfig: nextProjectConfig,\n pendingSync: {\n phase: \"source_revision_created\",\n sourceRevisionId,\n sourceTreeHash,\n manifestId,\n manifestContentHash,\n localManifestContentHash,\n ruleId,\n },\n });\n }\n\n if (!ruleId) {\n ruleId = await getLatestRuleIdSdk(nextProjectConfig.gameId);\n }\n if (!manifestId) {\n manifestId =\n (await getLatestManifestIdSdk(nextProjectConfig.gameId, ruleId)) ??\n undefined;\n }\n if (\n !manifestId ||\n !manifestContentHash ||\n !sourceRevisionId ||\n !sourceTreeHash\n ) {\n throw new Error(\"Sync could not resolve a complete authored state.\");\n }\n\n let authoringState;\n try {\n authoringState = await createAuthoringStateSdk(nextProjectConfig.gameId, {\n ...(remoteHeadId ? { baseAuthoringStateId: remoteHeadId } : {}),\n sourceRevisionId,\n sourceTreeHash,\n manifestId,\n manifestContentHash,\n ruleId,\n });\n } catch (error) {\n if (isMissingSourceRevisionDuringSync(error, sourceRevisionId)) {\n throw new Error(\n formatMissingSourceRevisionDuringSync({\n gameId: nextProjectConfig.gameId,\n sourceRevisionId,\n }),\n );\n }\n throw error;\n }\n nextProjectConfig = await persistPendingSyncCheckpoint({\n projectRoot,\n projectConfig: nextProjectConfig,\n pendingSync: {\n phase: \"authoring_state_created\",\n authoringStateId: authoringState.authoringStateId,\n sourceRevisionId: authoringState.sourceRevisionId,\n sourceTreeHash: authoringState.sourceTreeHash,\n manifestId: authoringState.manifestId,\n manifestContentHash: authoringState.manifestContentHash,\n localManifestContentHash,\n ruleId: authoringState.ruleId,\n },\n });\n nextProjectConfig = await finalizeLocalSync({\n projectRoot,\n projectConfig: nextProjectConfig,\n });\n\n consola.success(\n `Synced authored state ${authoringState.authoringStateId}. Run 'dreamboard compile' when you're ready.`,\n );\n },\n});\n","import { defineCommand } from \"citty\";\nimport consola from \"consola\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { CONFIG_FLAG_ARGS } from \"../command-args.js\";\nimport { configureClient, resolveProjectContext } from \"../config/resolve.js\";\nimport { parseConfigFlags } from \"../flags.js\";\nimport { uploadInitialProjectionSdk } from \"../services/api/index.js\";\nimport {\n generateReducerNativeArtifacts,\n isReducerNativeTestingWorkspace,\n runReducerNativeScenarios,\n} from \"../services/testing/reducer-native-test-harness.js\";\nimport { shouldUseRemoteTestRuntime } from \"../services/testing/runtime-mode.js\";\nimport { resolveLatestCompiledResult } from \"../services/workflows/resolve-latest-compiled-result.js\";\nimport type { ProjectConfig } from \"../types.js\";\nimport { isDreamboardApiError } from \"../utils/errors.js\";\n\ntype RequestedTestRunner = \"reducer\" | \"embedded\" | \"browser\";\n\nexport const REDUCER_NATIVE_TEST_WORKSPACE_ERROR =\n \"dreamboard test now requires a reducer-native workspace with app/game.ts, shared/generated/ui-contract.ts, test/bases/*.base.ts, and test/scenarios/*.scenario.ts. Legacy test/base-scenarios.json workspaces are no longer supported.\";\n\nexport const NO_REDUCER_NATIVE_BASES_FOUND_ERROR =\n \"No bases found under test/bases/*.base.ts\";\n\nexport const NO_REDUCER_NATIVE_SCENARIOS_FOUND_ERROR =\n \"No scenarios found under test/scenarios/*.scenario.ts\";\n\nexport function isPreviewProjectionEndpointUnavailable(\n error: unknown,\n): boolean {\n if (!isDreamboardApiError(error) || error.status !== 404) {\n return false;\n }\n\n const endpoint = error.problem.instance ?? error.problem.context?.endpoint;\n const message = error.problem.detail ?? error.problem.title;\n return (\n endpoint?.includes(\"/preview/initial-projection\") === true &&\n message?.toLowerCase() === \"not found\"\n );\n}\n\nasync function uploadGeneratedPreviewProjection(options: {\n projectRoot: string;\n gameId: string;\n bases: Array<{ definition: { id: string } }>;\n}): Promise<void> {\n const previewBase =\n options.bases.find((base) => base.definition.id === \"initial-turn\") ??\n options.bases[0];\n if (!previewBase) {\n return;\n }\n const projectionPath = path.join(\n options.projectRoot,\n \"test\",\n \"generated\",\n \"bases\",\n previewBase.definition.id,\n \"player-1.projection.json\",\n );\n const projectionJson = await readFile(projectionPath, \"utf8\");\n try {\n await uploadInitialProjectionSdk(options.gameId, projectionJson);\n } catch (error) {\n if (isPreviewProjectionEndpointUnavailable(error)) {\n consola.warn(\n \"Skipping preview projection upload because the selected backend does not expose the preview projection endpoint.\",\n );\n return;\n }\n throw error;\n }\n}\n\nexport function resolveRequestedRunner(\n value: unknown,\n): RequestedTestRunner | undefined {\n if (value == null || value === \"\") {\n return undefined;\n }\n if (value === \"reducer\" || value === \"embedded\" || value === \"browser\") {\n return value;\n }\n throw new Error(\n `Unsupported test runner '${String(value)}'. Expected one of reducer, embedded, browser.`,\n );\n}\n\nasync function assertReducerNativeTestingWorkspace(\n projectRoot: string,\n): Promise<void> {\n if (await isReducerNativeTestingWorkspace(projectRoot)) {\n return;\n }\n\n throw new Error(REDUCER_NATIVE_TEST_WORKSPACE_ERROR);\n}\n\nasync function resolveReducerNativeRuntimeIdentity(options: {\n projectRoot: string;\n projectConfig: ProjectConfig;\n useRemoteRuntime: boolean;\n runner?: RequestedTestRunner;\n}): Promise<{\n gameId: string;\n compiledResultId?: string;\n}> {\n if (options.useRemoteRuntime || options.runner === \"browser\") {\n const latestCompiledResult = await resolveLatestCompiledResult(\n options.projectRoot,\n options.projectConfig,\n );\n return {\n gameId: options.projectConfig.gameId,\n compiledResultId: latestCompiledResult.id,\n };\n }\n\n return {\n gameId: options.projectConfig.gameId,\n compiledResultId: options.projectConfig.compile?.latestSuccessful?.resultId,\n };\n}\n\nconst generateCommand = defineCommand({\n meta: {\n name: \"generate\",\n description: \"Generate reducer-native base artifacts for typed scenarios\",\n },\n args: {\n scenario: {\n type: \"string\",\n description: \"Optional scenario file path under test/scenarios\",\n },\n debug: {\n type: \"boolean\",\n description: \"Print full reducer-native validation details\",\n default: false,\n },\n \"update-snapshots\": {\n type: \"boolean\",\n description: \"Refresh generated projection and scenario snapshots\",\n default: false,\n },\n ...CONFIG_FLAG_ARGS,\n },\n async run({ args }) {\n const parsedFlags = parseConfigFlags(args);\n const useRemoteRuntime = shouldUseRemoteTestRuntime(parsedFlags.env);\n const { projectRoot, projectConfig, config } = await resolveProjectContext(\n parsedFlags,\n { requireAuth: useRemoteRuntime },\n );\n\n await assertReducerNativeTestingWorkspace(projectRoot);\n\n const runtimeIdentity = await resolveReducerNativeRuntimeIdentity({\n projectRoot,\n projectConfig,\n useRemoteRuntime,\n });\n const { bases, scenarios } = await generateReducerNativeArtifacts({\n projectRoot,\n scenarioPath: args.scenario,\n compiledResultId: runtimeIdentity.compiledResultId,\n gameId: runtimeIdentity.gameId,\n debug: Boolean(args.debug),\n });\n\n if (bases.length === 0) {\n throw new Error(NO_REDUCER_NATIVE_BASES_FOUND_ERROR);\n }\n if (scenarios.length === 0) {\n throw new Error(NO_REDUCER_NATIVE_SCENARIOS_FOUND_ERROR);\n }\n\n if (config.authToken) {\n await configureClient(config);\n await uploadGeneratedPreviewProjection({\n projectRoot,\n gameId: runtimeIdentity.gameId,\n bases,\n });\n } else {\n consola.info(\n \"Skipping preview projection upload because this CLI invocation is not authenticated.\",\n );\n }\n\n consola.success(\n `Generated ${bases.length} base state(s) for ${scenarios.length} scenario(s).`,\n );\n },\n});\n\nconst runCommand = defineCommand({\n meta: {\n name: \"run\",\n description: \"Run reducer-native scenarios from test/scenarios\",\n },\n args: {\n scenario: {\n type: \"string\",\n description: \"Optional scenario file path under test/scenarios\",\n },\n debug: {\n type: \"boolean\",\n description: \"Print full reducer-native validation details\",\n default: false,\n },\n \"update-snapshots\": {\n type: \"boolean\",\n description: \"Refresh generated projection and scenario snapshots\",\n default: false,\n },\n runner: {\n type: \"string\",\n valueHint: \"internal-lane\",\n description:\n \"Internal source-checkout parity lane override. Public installs should omit this flag.\",\n },\n ...CONFIG_FLAG_ARGS,\n },\n async run({ args }) {\n const parsedFlags = parseConfigFlags(args);\n const useRemoteRuntime = shouldUseRemoteTestRuntime(parsedFlags.env);\n const runner = resolveRequestedRunner(args.runner) ?? \"reducer\";\n const { projectRoot, projectConfig, config } = await resolveProjectContext(\n parsedFlags,\n {\n requireAuth: useRemoteRuntime || runner === \"browser\",\n },\n );\n\n await assertReducerNativeTestingWorkspace(projectRoot);\n\n const runtimeIdentity = await resolveReducerNativeRuntimeIdentity({\n projectRoot,\n projectConfig,\n useRemoteRuntime,\n runner,\n });\n const summary = await runReducerNativeScenarios({\n projectRoot,\n projectConfig,\n resolvedConfig: config,\n runner,\n scenarioPath: args.scenario,\n compiledResultId: runtimeIdentity.compiledResultId,\n gameId: runtimeIdentity.gameId,\n debug: Boolean(args.debug),\n updateSnapshots: Boolean(args[\"update-snapshots\"]),\n });\n\n for (const result of summary.results) {\n if (result.success) {\n consola.success(`PASS ${result.id}`);\n } else {\n consola.error(\n `FAIL ${result.id}: ${result.error ?? \"Scenario failed\"}`,\n );\n }\n }\n\n consola.info(\n `Test summary: ${summary.passed} passed, ${summary.failed} failed.`,\n );\n if (summary.failed > 0) {\n process.exitCode = 1;\n }\n },\n});\n\nexport default defineCommand({\n meta: {\n name: \"test\",\n description: \"Reducer-native test runner with typed bases and scenarios\",\n },\n subCommands: {\n generate: generateCommand,\n run: runCommand,\n },\n});\n","import { IS_PUBLISHED_BUILD } from \"../../build-target.js\";\n\nexport function isRemoteTestEnvironment(\n environment: string | undefined,\n): environment is \"dev\" | \"prod\" {\n return environment === \"dev\" || environment === \"prod\";\n}\n\nexport function shouldUseRemoteTestRuntime(\n environment: string | undefined,\n): boolean {\n return IS_PUBLISHED_BUILD || isRemoteTestEnvironment(environment);\n}\n","import consola from \"consola\";\nimport type { CompiledResult } from \"@dreamboard/api-client\";\nimport type { ProjectConfig } from \"../../types.js\";\nimport { findCompiledResultsForAuthoringState } from \"../api/compiled-results-api.js\";\nimport {\n getProjectAuthoringState,\n getProjectPendingAuthoringSync,\n} from \"../project/project-state.js\";\n\nexport async function resolveLatestCompiledResult(\n projectRoot: string,\n projectConfig: ProjectConfig,\n): Promise<CompiledResult> {\n void projectRoot;\n const authoring = getProjectAuthoringState(projectConfig);\n if (getProjectPendingAuthoringSync(projectConfig)) {\n throw new Error(\n \"Previous sync did not finish updating local scaffold files. Run 'dreamboard sync' again first.\",\n );\n }\n if (!authoring.authoringStateId) {\n throw new Error(\n \"This workspace does not know its authored base yet. Run 'dreamboard sync' first.\",\n );\n }\n const latestSuccess = (\n await findCompiledResultsForAuthoringState({\n gameId: projectConfig.gameId,\n authoringStateId: authoring.authoringStateId,\n })\n ).find((result) => result.success);\n if (!latestSuccess) {\n throw new Error(\n \"No successful compile exists for the current authored state. Run 'dreamboard compile' first.\",\n );\n }\n\n if (latestSuccess.authoringStateId !== authoring.authoringStateId) {\n consola.warn(\n `Latest successful compile ${latestSuccess.id} belongs to ${latestSuccess.authoringStateId}, not ${authoring.authoringStateId}.`,\n );\n }\n\n consola.info(\n `Game summary:\\n compiledResultId: ${latestSuccess.id}\\n ruleId: ${latestSuccess.ruleId}\\n manifestId: ${latestSuccess.manifestId}`,\n );\n\n return latestSuccess;\n}\n","import { defineCommand, runMain, type CommandDef } from \"citty\";\nimport consola from \"consola\";\nimport cmdClone from \"./commands/clone.js\";\nimport cmdCompile from \"./commands/compile.js\";\nimport cmdConfig from \"./commands/config.js\";\nimport cmdDev from \"./commands/dev.js\";\nimport cmdJoin from \"./commands/join.js\";\nimport cmdLogin from \"./commands/login.js\";\nimport cmdLogout from \"./commands/logout.js\";\nimport cmdNew from \"./commands/new.js\";\nimport cmdPull from \"./commands/pull.js\";\nimport cmdStatus from \"./commands/status.js\";\nimport cmdSync from \"./commands/sync.js\";\nimport cmdTest from \"./commands/test.js\";\nimport { formatCliError } from \"./utils/errors.js\";\n\n// ---------------------------------------------------------------------------\n// Global error handlers prevent runtime-specific stack previews from spilling\n// into CLI output. Instead we emit a single clean error line.\n// ---------------------------------------------------------------------------\ntype FatalErrorHandler = (error: unknown) => never;\n\nfunction handleFatalError(error: unknown): never {\n const message = formatCliError(error);\n process.stderr.write(`Error: ${message}\\n`);\n process.exit(1);\n throw error;\n}\n\nprocess.on(\"uncaughtException\", handleFatalError);\nprocess.on(\"unhandledRejection\", handleFatalError);\n\nconsola.options.formatOptions.date = false;\n\nconst publicSubCommands = {\n new: cmdNew,\n clone: cmdClone,\n sync: cmdSync,\n compile: cmdCompile,\n pull: cmdPull,\n status: cmdStatus,\n dev: cmdDev,\n join: cmdJoin,\n test: cmdTest,\n login: cmdLogin,\n logout: cmdLogout,\n config: cmdConfig,\n};\n\nexport type DreamboardSubCommand = CommandDef<any>;\n\ntype DreamboardCommandMap = Record<string, DreamboardSubCommand>;\n\nfunction wrapCommandMapForCli(\n commands: DreamboardCommandMap,\n fatalErrorHandler: FatalErrorHandler,\n): DreamboardCommandMap {\n return Object.fromEntries(\n Object.entries(commands).map(([name, command]) => [\n name,\n wrapCommandForCli(command, fatalErrorHandler),\n ]),\n );\n}\n\nexport function wrapCommandForCli(\n command: DreamboardSubCommand,\n fatalErrorHandler: FatalErrorHandler = handleFatalError,\n): DreamboardSubCommand {\n const subCommands = command.subCommands as DreamboardCommandMap | undefined;\n return {\n ...command,\n subCommands: subCommands\n ? wrapCommandMapForCli(subCommands, fatalErrorHandler)\n : undefined,\n run: command.run\n ? async (context) => {\n try {\n return await command.run?.(context);\n } catch (error) {\n fatalErrorHandler(error);\n }\n }\n : undefined,\n };\n}\n\nexport function runDreamboardCli(\n internalSubCommands: Record<string, DreamboardSubCommand> = {},\n): void {\n const subCommands = wrapCommandMapForCli(\n {\n ...publicSubCommands,\n ...internalSubCommands,\n },\n handleFatalError,\n );\n\n const main = defineCommand({\n meta: {\n name: \"dreamboard\",\n version: \"0.1.23\",\n description: \"Dreamboard CLI — game development platform\",\n },\n subCommands,\n });\n\n void runMain(main).catch(handleFatalError);\n}\n"],"mappings":"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AAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,KAAK,QAAU,KAAK,QACpB,KAAK,QAAU,KAAK,QACpB,MAAM,QACN,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","names":["i","l","c","env","r","t","o","i","a","l","c","i","l","i","s","ansiRegex","stripAnsi","env","c","_","getColor","createConsola","path","i","argv","parseArgs","parseArgs","path","detail","error","path","crypto","path","y","_","HEX_CORNERS","HEX_CORNER_OFFSETS","cubeFromAxial","cornerGeometryKey","y","a","b","template","_","cardSetIds","zoneIds","resolveRuntimeBoardId","isHexBoardTemplateSpec","isHexBoardSpec","renderCardInstanceIds","_","expandSeedIds","path","resolveHexSpaces","path","path","existsSync","path","path","path","existsSync","build","path","isAllowedGamePath","path","path","path","existsSync","readFileSync","readdir","rm","unlink","path","fileURLToPath","path","unlink","normalizeProjectPath","rm","readdir","fileURLToPath","existsSync","readFileSync","unlink","path","path","unlink","existsSync","path","fileURLToPath","crypto","path","path","fileURLToPath","existsSync","crypto","spawn","existsSync","readFile","rm","writeFile","path","fileURLToPath","MODULE_DIR","path","fileURLToPath","path","readJsonFile","rm","writeJsonFile","readFile","mergePnpmConfig","writeFile","crypto","existsSync","spawn","path","path","path","spawn","lstat","path","fileURLToPath","MODULE_DIR","REPO_ROOT","pathExists","queue","nextProjectConfig","path","createHash","spawn","platform","createRequire","createServer","EventEmitter","EventEmitter","client","usesStoredSession","path","fileURLToPath","existsSync","require","path","existsSync","fileURLToPath","path","formatUnknown","path","existsSync","path","normalizePath","require","createRequire","platform","createServer","path","existsSync","mkdirSync","readFileSync","rmSync","writeFileSync","readdir","f","validate","r","i","i","r","inflight","toDomainState","toDomainState","toCombinedState","toSessionState","fxForState","buildContext","buildRuntimeArgs","path","t","isTargetCollector","board","space","from","a","b","i","i","runtimePayloadSchema","perPlayerSchema","mkdtemp","rm","writeFile","tmpdir","path","pathToFileURL","build","path","build","mkdtemp","tmpdir","writeFile","pathToFileURL","rm","createHash","spawn","lstat","mkdir","mkdtemp","readFile","rm","tmpdir","path","fileURLToPath","MODULE_DIR","path","fileURLToPath","REPO_ROOT","resolveRepoRoot","mkdir","spawn","rm","pathExists","lstat","mkdtemp","tmpdir","readFile","createHash","randomUUID","randomUUID","os","path","createClient","GENERATED_TESTING_TYPES_PREFIX","TESTING_TYPES_STUB","readdir","path","DEFAULT_REJECTION_CODES","_","sleep","sleep","path","mkdirSync","existsSync","writeFileSync","readFileSync","data","generatedBaseStates","generatedBase","cached","scenario","base","path","scenario","base","data","path","rmSync","mkdirSync","writeFileSync","path","path","path","path","playerIds","table","path","createHash","a","b","path","createInterface","formatUnknown","createInterface","requireString","path","crypto","crypto","path","path","fallbackRegistryUrl","workspaceLocalMaintainerRegistry","runLoggedStep","isAllowedGamePath","path","filePath","readFile","path","path","readFile","runCommand"]}