@dreamboard-games/cli 0.1.30-alpha.1 → 0.1.30-alpha.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/README.md +179 -22
  2. package/dist/agent-verifier/agent-workspace-verifier.mjs +31 -30
  3. package/dist/agent-verifier/agent-workspace-verifier.mjs.map +1 -0
  4. package/dist/agent-verifier/{chunk-4WD3YU2E.mjs → chunk-3IJBOLGT.mjs} +4 -12
  5. package/dist/agent-verifier/chunk-3IJBOLGT.mjs.map +1 -0
  6. package/dist/agent-verifier/{chunk-6A5HRJMQ.mjs → chunk-4GU3PCHV.mjs} +62 -99
  7. package/dist/agent-verifier/chunk-4GU3PCHV.mjs.map +1 -0
  8. package/dist/agent-verifier/{chunk-SYPLYRGB.mjs → chunk-6XRC5PWB.mjs} +119 -310
  9. package/dist/agent-verifier/chunk-6XRC5PWB.mjs.map +1 -0
  10. package/dist/agent-verifier/{chunk-BVVNBJM4.mjs → chunk-COB56ESI.mjs} +2 -1
  11. package/dist/agent-verifier/chunk-COB56ESI.mjs.map +1 -0
  12. package/dist/agent-verifier/{chunk-2GBBP27W.mjs → chunk-F2DIOJJZ.mjs} +1 -0
  13. package/dist/agent-verifier/chunk-F2DIOJJZ.mjs.map +1 -0
  14. package/dist/agent-verifier/{chunk-CFU5EWIC.mjs → chunk-G42BGGG2.mjs} +7 -6
  15. package/dist/agent-verifier/chunk-G42BGGG2.mjs.map +1 -0
  16. package/dist/agent-verifier/{chunk-XYDL7GY6.mjs → chunk-H6XDQJ3N.mjs} +1 -0
  17. package/dist/agent-verifier/{chunk-LM3OZLZG.mjs → chunk-IAYRNVUC.mjs} +1 -0
  18. package/dist/agent-verifier/chunk-IAYRNVUC.mjs.map +1 -0
  19. package/dist/agent-verifier/{chunk-2QMNAVV4.mjs → chunk-JZTH3EMV.mjs} +2 -1
  20. package/dist/agent-verifier/chunk-JZTH3EMV.mjs.map +1 -0
  21. package/dist/agent-verifier/chunk-KK47X7RV.mjs +14 -0
  22. package/dist/agent-verifier/chunk-KK47X7RV.mjs.map +1 -0
  23. package/dist/agent-verifier/{chunk-SHUMAVAP.mjs → chunk-M7UVBANQ.mjs} +8 -9
  24. package/dist/agent-verifier/chunk-M7UVBANQ.mjs.map +1 -0
  25. package/dist/agent-verifier/{chunk-2E5P5NWG.mjs → chunk-NAK77WXW.mjs} +58 -126
  26. package/dist/agent-verifier/chunk-NAK77WXW.mjs.map +1 -0
  27. package/dist/agent-verifier/{chunk-CEQ2VJWN.mjs → chunk-POBFNXD4.mjs} +2 -1
  28. package/dist/agent-verifier/chunk-POBFNXD4.mjs.map +1 -0
  29. package/dist/agent-verifier/{chunk-6UUJEYDV.mjs → chunk-QBAF7EYR.mjs} +1 -0
  30. package/dist/agent-verifier/chunk-QBAF7EYR.mjs.map +1 -0
  31. package/dist/agent-verifier/{chunk-7653FPGJ.mjs → chunk-RHI6S4SU.mjs} +3 -2
  32. package/dist/agent-verifier/chunk-RHI6S4SU.mjs.map +1 -0
  33. package/dist/agent-verifier/{chunk-MINCYHXN.mjs → chunk-TAEQKBJB.mjs} +1 -0
  34. package/dist/agent-verifier/chunk-TAEQKBJB.mjs.map +1 -0
  35. package/dist/agent-verifier/{chunk-7E65UQLY.mjs → chunk-TLYGTHXU.mjs} +3 -2
  36. package/dist/agent-verifier/chunk-TLYGTHXU.mjs.map +1 -0
  37. package/dist/agent-verifier/{chunk-JH22JNYD.mjs → chunk-UIJ2NDG6.mjs} +93 -24
  38. package/dist/agent-verifier/chunk-UIJ2NDG6.mjs.map +1 -0
  39. package/dist/agent-verifier/{chunk-EIQWDQWJ.mjs → chunk-UWJIZML3.mjs} +13 -14
  40. package/dist/agent-verifier/chunk-UWJIZML3.mjs.map +1 -0
  41. package/dist/agent-verifier/{chunk-CJEEA6NJ.mjs → chunk-VLOIZDR6.mjs} +15 -31
  42. package/dist/agent-verifier/chunk-VLOIZDR6.mjs.map +1 -0
  43. package/dist/agent-verifier/{chunk-HJFQDSTU.mjs → chunk-W2MDP5ZN.mjs} +6 -5
  44. package/dist/agent-verifier/chunk-W2MDP5ZN.mjs.map +1 -0
  45. package/dist/agent-verifier/{chunk-CEDUHGNH.mjs → chunk-XKCJBIRY.mjs} +2 -1
  46. package/dist/agent-verifier/chunk-XKCJBIRY.mjs.map +1 -0
  47. package/dist/agent-verifier/{chunk-VYJTHSYR.mjs → chunk-YDIOW2BO.mjs} +2 -1
  48. package/dist/agent-verifier/chunk-YDIOW2BO.mjs.map +1 -0
  49. package/dist/agent-verifier/{chunk-MRCUP5SW.mjs → chunk-YE7UAO3T.mjs} +1 -0
  50. package/dist/agent-verifier/chunk-YE7UAO3T.mjs.map +1 -0
  51. package/dist/agent-verifier/{chunk-EOQIV6PS.mjs → chunk-YR664DJX.mjs} +111 -116
  52. package/dist/agent-verifier/chunk-YR664DJX.mjs.map +1 -0
  53. package/dist/agent-verifier/{chunk-2SZHMP6F.mjs → chunk-Z6OZWUIZ.mjs} +6 -9
  54. package/dist/agent-verifier/chunk-Z6OZWUIZ.mjs.map +1 -0
  55. package/dist/agent-verifier/{chunk-RBDDIIPM.mjs → chunk-ZEELHSY3.mjs} +1 -0
  56. package/dist/agent-verifier/chunk-ZEELHSY3.mjs.map +1 -0
  57. package/dist/agent-verifier/{compile-5QSPIOUT.mjs → compile-WZ7X6I2A.mjs} +27 -27
  58. package/dist/agent-verifier/compile-WZ7X6I2A.mjs.map +1 -0
  59. package/dist/agent-verifier/{global-config-WX3ZZIVU.mjs → global-config-XHL7BCKN.mjs} +6 -5
  60. package/dist/agent-verifier/global-config-XHL7BCKN.mjs.map +1 -0
  61. package/dist/agent-verifier/{keychain-backend-TNOPQV3Z.mjs → keychain-backend-A3MRWLPF.mjs} +2 -1
  62. package/dist/agent-verifier/keychain-backend-A3MRWLPF.mjs.map +1 -0
  63. package/dist/agent-verifier/{local-files-MTPLP62S.mjs → local-files-ZW52HSVT.mjs} +10 -11
  64. package/dist/agent-verifier/local-files-ZW52HSVT.mjs.map +1 -0
  65. package/dist/agent-verifier/local-typecheck-3JXL2NMG.mjs +10 -0
  66. package/dist/agent-verifier/local-typecheck-3JXL2NMG.mjs.map +1 -0
  67. package/dist/agent-verifier/{materialize-workspace-FKALAE2T.mjs → materialize-workspace-BKZLLFI4.mjs} +20 -20
  68. package/dist/agent-verifier/materialize-workspace-BKZLLFI4.mjs.map +1 -0
  69. package/dist/agent-verifier/{project-state-7GR6BQTQ.mjs → project-state-XKUSCFSV.mjs} +3 -2
  70. package/dist/agent-verifier/project-state-XKUSCFSV.mjs.map +1 -0
  71. package/dist/agent-verifier/{prompt-3BAINGAQ.mjs → prompt-VKHMCQT6.mjs} +2 -1
  72. package/dist/agent-verifier/prompt-VKHMCQT6.mjs.map +1 -0
  73. package/dist/agent-verifier/{reducer-bundle-preflight-C73LEXI2.mjs → reducer-bundle-preflight-7NYZF5ZT.mjs} +6 -9
  74. package/dist/agent-verifier/reducer-bundle-preflight-7NYZF5ZT.mjs.map +1 -0
  75. package/dist/agent-verifier/reducer-contract-preflight-COD2CO22.mjs +11 -0
  76. package/dist/agent-verifier/reducer-contract-preflight-COD2CO22.mjs.map +1 -0
  77. package/dist/agent-verifier/{reducer-native-test-harness-GMWBUISX.mjs → reducer-native-test-harness-D4VWPIAC.mjs} +14 -17
  78. package/dist/agent-verifier/reducer-native-test-harness-D4VWPIAC.mjs.map +1 -0
  79. package/dist/agent-verifier/static-scaffold-JCRBDKEH.mjs +26 -0
  80. package/dist/agent-verifier/static-scaffold-JCRBDKEH.mjs.map +1 -0
  81. package/dist/agent-verifier/{sync-3DUQH32H.mjs → sync-ELLJEWMB.mjs} +41 -39
  82. package/dist/agent-verifier/sync-ELLJEWMB.mjs.map +1 -0
  83. package/dist/agent-verifier/{test-P4U5INTD.mjs → test-OSXBPLSP.mjs} +29 -31
  84. package/dist/agent-verifier/test-OSXBPLSP.mjs.map +1 -0
  85. package/dist/agent-verifier/workspace-codegen-WPZHMATU.mjs +10 -0
  86. package/dist/agent-verifier/workspace-codegen-WPZHMATU.mjs.map +1 -0
  87. package/dist/agent-verifier/{workspace-dependencies-HZ6VVS4G.mjs → workspace-dependencies-ULZZZPNX.mjs} +5 -4
  88. package/dist/agent-verifier/workspace-dependencies-ULZZZPNX.mjs.map +1 -0
  89. package/dist/{chunk-C6UAT6EH.js → chunk-GXM7RRZJ.js} +9 -11
  90. package/dist/chunk-GXM7RRZJ.js.map +1 -0
  91. package/dist/{chunk-RS7UXJZV.js → chunk-P5TITCD3.js} +790 -17875
  92. package/dist/chunk-P5TITCD3.js.map +1 -0
  93. package/dist/{global-config-AGFBDFYD.js → global-config-WPJRXVDO.js} +2 -2
  94. package/dist/global-config-WPJRXVDO.js.map +1 -0
  95. package/dist/index.js +455 -54
  96. package/dist/index.js.map +1 -1
  97. package/dist/internal.js +2 -3
  98. package/package.json +8 -7
  99. package/skills/dreamboard/references/building-your-first-game.md +510 -0
  100. package/skills/dreamboard/references/cli.md +104 -0
  101. package/skills/dreamboard/references/game-interface.md +548 -0
  102. package/skills/dreamboard/references/manifest-authoring.md +597 -0
  103. package/skills/dreamboard/references/quickstart.md +66 -0
  104. package/skills/dreamboard/references/reducer.md +864 -0
  105. package/skills/dreamboard/references/rule-authoring.md +147 -0
  106. package/skills/dreamboard/references/testing.md +249 -0
  107. package/skills/dreamboard/scripts/events-extract.mjs +218 -0
  108. package/dist/agent-verifier/chunk-54TAYXUD.mjs +0 -12
  109. package/dist/agent-verifier/chunk-HBNDKQT5.mjs +0 -8381
  110. package/dist/agent-verifier/chunk-LI3ZR3BI.mjs +0 -41
  111. package/dist/agent-verifier/chunk-U6OJN7XS.mjs +0 -8092
  112. package/dist/agent-verifier/local-typecheck-QFYYAZOK.mjs +0 -9
  113. package/dist/agent-verifier/reducer-contract-preflight-22X7DSZW.mjs +0 -10
  114. package/dist/agent-verifier/static-scaffold-AJMZZQWS.mjs +0 -28
  115. package/dist/agent-verifier/testing-5K2BJYF2.mjs +0 -674
  116. package/dist/agent-verifier/workspace-codegen-JDZJRSDV.mjs +0 -11
  117. package/dist/chunk-7FOO4AJI.js +0 -50
  118. package/dist/chunk-7FOO4AJI.js.map +0 -1
  119. package/dist/chunk-C6UAT6EH.js.map +0 -1
  120. package/dist/chunk-RS7UXJZV.js.map +0 -1
  121. package/dist/internal.d.ts +0 -311
  122. package/dist/runtime-packages/ui-host-runtime/src/actor-principal.ts +0 -71
  123. package/dist/runtime-packages/ui-host-runtime/src/browser-interaction.ts +0 -139
  124. package/dist/runtime-packages/ui-host-runtime/src/components/host-controls.tsx +0 -374
  125. package/dist/runtime-packages/ui-host-runtime/src/components/host-feedback-toaster.tsx +0 -266
  126. package/dist/runtime-packages/ui-host-runtime/src/components/host-feedback.tsx +0 -212
  127. package/dist/runtime-packages/ui-host-runtime/src/components/host-primitives.tsx +0 -271
  128. package/dist/runtime-packages/ui-host-runtime/src/components/host-session-metadata.tsx +0 -135
  129. package/dist/runtime-packages/ui-host-runtime/src/components/index.ts +0 -5
  130. package/dist/runtime-packages/ui-host-runtime/src/components/perf-overlay.tsx +0 -194
  131. package/dist/runtime-packages/ui-host-runtime/src/gameplay-authority-transport.ts +0 -626
  132. package/dist/runtime-packages/ui-host-runtime/src/host-controls.tsx +0 -1
  133. package/dist/runtime-packages/ui-host-runtime/src/host-feedback.tsx +0 -1
  134. package/dist/runtime-packages/ui-host-runtime/src/host-session-transport.ts +0 -294
  135. package/dist/runtime-packages/ui-host-runtime/src/index.ts +0 -3
  136. package/dist/runtime-packages/ui-host-runtime/src/logger.ts +0 -11
  137. package/dist/runtime-packages/ui-host-runtime/src/perf.ts +0 -324
  138. package/dist/runtime-packages/ui-host-runtime/src/plugin-bridge.ts +0 -195
  139. package/dist/runtime-packages/ui-host-runtime/src/plugin-health-check.ts +0 -138
  140. package/dist/runtime-packages/ui-host-runtime/src/plugin-messages.ts +0 -159
  141. package/dist/runtime-packages/ui-host-runtime/src/plugin-session-gateway.ts +0 -551
  142. package/dist/runtime-packages/ui-host-runtime/src/runtime/index.ts +0 -13
  143. package/dist/runtime-packages/ui-host-runtime/src/screenshot/projection-to-snapshot.ts +0 -122
  144. package/dist/runtime-packages/ui-host-runtime/src/screenshot/static-store-api.ts +0 -26
  145. package/dist/runtime-packages/ui-host-runtime/src/session-ingress-controller.ts +0 -583
  146. package/dist/runtime-packages/ui-host-runtime/src/session-ingress.ts +0 -219
  147. package/dist/runtime-packages/ui-host-runtime/src/session-live-runtime.ts +0 -117
  148. package/dist/runtime-packages/ui-host-runtime/src/session-model.ts +0 -431
  149. package/dist/runtime-packages/ui-host-runtime/src/session-projection.ts +0 -211
  150. package/dist/runtime-packages/ui-host-runtime/src/session-recovery.ts +0 -80
  151. package/dist/runtime-packages/ui-host-runtime/src/session-state-reducer.ts +0 -1034
  152. package/dist/runtime-packages/ui-host-runtime/src/sse-manager.ts +0 -416
  153. package/dist/runtime-packages/ui-host-runtime/src/unified-session-store.ts +0 -184
  154. package/dist/testing-KLSV6CPJ.js +0 -674
  155. package/dist/testing-KLSV6CPJ.js.map +0 -1
  156. /package/dist/{global-config-AGFBDFYD.js.map → agent-verifier/chunk-H6XDQJ3N.mjs.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../node_modules/.pnpm/citty@0.2.2/node_modules/citty/dist/index.mjs","../../../../packages/api-client/dist/source-revisions.js","../../src/command-args.ts","../../src/flags.ts","../../src/utils/strings.ts","../../src/services/api/compiled-results-api.ts","../../src/services/api/project-api.ts","../../src/services/api/preview-api.ts","../../src/services/api/source-revisions-api.ts"],"sourcesContent":["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","import { createProjectSourceBlobUploadSession, createSourceBlobUploadSession, } from \"./sdk.gen.js\";\nconst textEncoder = new TextEncoder();\nconst SOURCE_BLOB_UPLOAD_SESSION_BATCH_SIZE = 20;\nfunction bytesToHex(bytes) {\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n}\nasync function sha256Hex(bytes) {\n const normalizedBytes = new Uint8Array(bytes.byteLength);\n normalizedBytes.set(bytes);\n const digest = await crypto.subtle.digest(\"SHA-256\", normalizedBytes.buffer);\n return bytesToHex(new Uint8Array(digest));\n}\nfunction getUtf8ByteSize(content) {\n return textEncoder.encode(content).byteLength;\n}\nasync function computeSourceContentHash(content) {\n return sha256Hex(textEncoder.encode(content));\n}\nasync function describeSourceBlob(content) {\n return {\n contentHash: await computeSourceContentHash(content),\n byteSize: getUtf8ByteSize(content),\n };\n}\nexport async function materializeSourceChangeOperations(changes) {\n const blobsByHash = new Map();\n const materialized = await Promise.all(Array.from(changes, async (change) => {\n if (change.kind === \"delete\") {\n return change;\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 return {\n kind: \"upsert\",\n path: change.path,\n contentHash: blob.contentHash,\n byteSize: blob.byteSize,\n };\n }));\n return {\n blobs: Array.from(blobsByHash.values()).sort((left, right) => left.contentHash.localeCompare(right.contentHash)),\n changes: materialized,\n };\n}\nexport function mapUpsertBlobContentsByContentHash(localChanges, materializedChanges) {\n const uploadBlobs = new Map();\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 (localChange?.kind !== \"upsert\" ||\n materializedChange?.kind !== \"upsert\") {\n continue;\n }\n uploadBlobs.set(materializedChange.contentHash, {\n contentHash: materializedChange.contentHash,\n byteSize: materializedChange.byteSize,\n content: localChange.content,\n });\n }\n return uploadBlobs;\n}\nclass SourceBlobUploadError extends Error {\n constructor(status, details) {\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}\nfunction isDuplicateDirectUploadError(error) {\n if (!(error instanceof SourceBlobUploadError)) {\n return false;\n }\n if (error.status === 409) {\n return true;\n }\n const normalizedDetails = error.details.toLowerCase();\n return (normalizedDetails.includes(\"duplicate\") ||\n normalizedDetails.includes(\"already exists\") ||\n normalizedDetails.includes(\"resource already exists\"));\n}\nasync function uploadSourceBlob(uploadTarget, content) {\n const response = await fetch(uploadTarget.url, {\n method: uploadTarget.method,\n headers: uploadTarget.headers,\n body: textEncoder.encode(content),\n });\n if (response.ok) {\n return;\n }\n const details = await response.text().catch(() => \"\");\n throw new SourceBlobUploadError(response.status, details);\n}\nexport class SourceBlobSessionRequestError extends Error {\n constructor(message, apiError, response) {\n super(message);\n this.name = \"SourceBlobSessionRequestError\";\n this.apiError = apiError;\n this.response = response;\n }\n}\nfunction assertSourceBlobUploadSession(data, response) {\n if (!data ||\n typeof data !== \"object\" ||\n !Array.isArray(data.uploads)) {\n throw new SourceBlobSessionRequestError(\"Source blob upload session response did not include an uploads array\", data, response);\n }\n}\nasync function confirmSourceBlobAlreadyExists(options) {\n const { requestUploadSession, blob } = options;\n const { data, error, response } = await requestUploadSession([\n {\n contentHash: blob.contentHash,\n byteSize: blob.byteSize,\n },\n ]);\n if (error || !data) {\n throw new SourceBlobSessionRequestError(\"Failed to create source blob upload session\", error, response);\n }\n assertSourceBlobUploadSession(data, response);\n return data.uploads[0]?.status === \"exists\";\n}\nasync function uploadSourceBlobs(options) {\n const { blobs, requestUploadSession } = options;\n const uniqueBlobs = new Map();\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 if (existing.byteSize !== blob.byteSize) {\n throw new Error(`Source blob ${blob.contentHash} has conflicting byte sizes.`);\n }\n }\n if (uniqueBlobs.size === 0) {\n return;\n }\n for (const uploadBatch of chunkSourceBlobs(Array.from(uniqueBlobs.values()), SOURCE_BLOB_UPLOAD_SESSION_BATCH_SIZE)) {\n const { data, error, response } = await requestUploadSession(uploadBatch.map(({ contentHash, byteSize }) => ({\n contentHash,\n byteSize,\n })));\n if (error || !data) {\n throw new SourceBlobSessionRequestError(\"Failed to create source blob upload session\", error, response);\n }\n assertSourceBlobUploadSession(data, response);\n for (const upload of data.uploads) {\n if (upload.status !== \"upload_required\") {\n continue;\n }\n const blob = uniqueBlobs.get(upload.contentHash);\n if (!blob) {\n throw new Error(`Upload session referenced unknown source blob ${upload.contentHash}.`);\n }\n if (!upload.uploadTarget) {\n throw new Error(`Upload target missing for source blob ${upload.contentHash}.`);\n }\n try {\n await uploadSourceBlob(upload.uploadTarget, blob.content);\n if (!(await confirmSourceBlobAlreadyExists({ requestUploadSession, blob }))) {\n throw new Error(`Source blob ${blob.contentHash} was uploaded but not registered.`);\n }\n }\n catch (error) {\n if (isDuplicateDirectUploadError(error) &&\n (await confirmSourceBlobAlreadyExists({ requestUploadSession, blob }))) {\n continue;\n }\n throw error;\n }\n }\n }\n}\nfunction chunkSourceBlobs(blobs, batchSize) {\n const chunks = [];\n for (let index = 0; index < blobs.length; index += batchSize) {\n chunks.push(blobs.slice(index, index + batchSize));\n }\n return chunks;\n}\nexport async function uploadGameSourceBlobs(options) {\n const { gameId, blobs } = options;\n return uploadSourceBlobs({\n blobs,\n requestUploadSession: (uploadBlobs) => createSourceBlobUploadSession({\n path: { gameId },\n body: { blobs: uploadBlobs },\n }),\n });\n}\nexport async function uploadProjectSourceBlobs(options) {\n const { projectId, blobs } = options;\n return uploadSourceBlobs({\n blobs,\n requestUploadSession: (uploadBlobs) => createProjectSourceBlobUploadSession({\n path: { projectId },\n body: { blobs: uploadBlobs },\n }),\n });\n}\n","export const CONFIG_FLAG_ARGS = {\n env: {\n type: \"string\" as const,\n description: \"Environment: local | staging | prod\",\n },\n token: {\n type: \"string\" as const,\n description: \"Auth token (Dreamboard bearer JWT)\",\n },\n};\n","import { z } from \"zod\";\n\nconst configFlagsSchema = z.object({\n env: z.enum([\"local\", \"staging\", \"prod\"]).optional(),\n token: z.string().optional(),\n});\n\nconst ruleInputFlagsSchema = z.object({\n \"rule-file\": z.string().optional(),\n rule: z.string().optional(),\n});\n\nconst playerCountFlagsSchema = z.object({\n players: z.string().optional(),\n \"player-count\": z.string().optional(),\n});\n\nconst newCommandArgsSchema = configFlagsSchema.extend({\n slug: z.string().min(1),\n description: z.string().min(1),\n force: z.boolean().default(false),\n});\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 scope: z.enum([\"global\", \"workspace\"]).optional().default(\"global\"),\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\", \"staging\", \"prod\"]).optional(),\n});\n\nexport type ConfigFlags = z.infer<typeof configFlagsSchema>;\nexport type RuleInputFlags = z.infer<typeof ruleInputFlagsSchema>;\nexport type PlayerCountFlags = z.infer<typeof playerCountFlagsSchema>;\n\nexport type NewCommandArgs = z.infer<typeof newCommandArgsSchema>;\nexport type CloneCommandArgs = z.infer<typeof cloneCommandArgsSchema>;\nexport type QueryCommandArgs = z.infer<typeof queryCommandArgsSchema>;\nexport type PullCommandArgs = z.infer<typeof pullCommandArgsSchema>;\nexport type SyncCommandArgs = z.infer<typeof syncCommandArgsSchema>;\nexport type CompileCommandArgs = z.infer<typeof compileCommandArgsSchema>;\nexport type StatusCommandArgs = z.infer<typeof statusCommandArgsSchema>;\nexport type 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","import {\n getCompiledResult,\n getJob,\n getLatestCompiledResult,\n getProjectCompiledResult,\n listProjectCompiledResults,\n listCompiledResults,\n queueProjectRevisionCompile,\n type CompiledResult,\n type JobDetailResponse,\n type QueueCompiledResultJobResponse,\n} from \"@dreamboard-games/api-client\";\nimport { toDreamboardApiError } from \"../../utils/errors.js\";\n\nconst COMPILE_JOB_POLL_INTERVAL_MS = 1000;\nconst DEFAULT_COMPILE_JOB_WAIT_TIMEOUT_MS = 10 * 60 * 1000;\nimport { sleep } from \"../../utils/strings.js\";\n\nfunction firstNonEmpty(\n ...values: Array<string | null | undefined>\n): string | null {\n for (const value of values) {\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value.trim();\n }\n }\n return null;\n}\n\nfunction formatTerminalCompileJobMessage(\n job: Pick<\n JobDetailResponse,\n \"createdAt\" | \"errorMessage\" | \"jobId\" | \"message\" | \"phase\" | \"status\"\n >,\n): string {\n const detail = firstNonEmpty(job.errorMessage, job.message);\n const phase = firstNonEmpty(job.phase);\n const prefix = `Compile ${job.status.toLowerCase()}${phase ? ` [${phase}]` : \"\"}`;\n return detail\n ? `${prefix}: ${detail}`\n : `${prefix}: job ${job.jobId} ended before a compiled result was created.`;\n}\n\nfunction compareCreatedAtDesc(\n left: Pick<CompiledResult, \"createdAt\">,\n right: Pick<CompiledResult, \"createdAt\">,\n): number {\n const leftTime = Date.parse(left.createdAt);\n const rightTime = Date.parse(right.createdAt);\n if (Number.isFinite(leftTime) && Number.isFinite(rightTime)) {\n return rightTime - leftTime;\n }\n if (Number.isFinite(rightTime)) {\n return 1;\n }\n if (Number.isFinite(leftTime)) {\n return -1;\n }\n return 0;\n}\n\nasync function findFallbackCompiledResultForJob(options: {\n gameId?: string;\n projectId?: string;\n job: Pick<JobDetailResponse, \"createdAt\">;\n}): Promise<CompiledResult | null> {\n const { gameId, projectId, job } = options;\n const results = projectId\n ? await listProjectCompiledResults({\n path: { projectId },\n query: { limit: 100 },\n })\n : await listCompiledResults({\n path: { gameId: gameId! },\n query: { limit: 100 },\n });\n if (results.error || !results.data) {\n return null;\n }\n if (results.data.results.length === 0) {\n return null;\n }\n\n const jobCreatedAtMs = Date.parse(job.createdAt);\n const resultsCreatedAfterJob = Number.isFinite(jobCreatedAtMs)\n ? results.data.results.filter((result) => {\n const resultCreatedAtMs = Date.parse(result.createdAt);\n return (\n !Number.isFinite(resultCreatedAtMs) ||\n resultCreatedAtMs >= jobCreatedAtMs\n );\n })\n : results.data.results;\n const candidateResults =\n resultsCreatedAfterJob.length > 0\n ? resultsCreatedAfterJob\n : results.data.results;\n\n return [...candidateResults].sort(compareCreatedAtDesc)[0] ?? null;\n}\n\nexport async function findLatestSuccessfulCompiledResult(\n 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 findProjectCompiledResultsForRevision(options: {\n projectId: string;\n revisionDigest: string;\n}): Promise<CompiledResult[]> {\n const { projectId, revisionDigest } = options;\n const { data, error, response } = await listProjectCompiledResults({\n path: { projectId },\n query: { limit: 100 },\n });\n if (error || !data) {\n throw toDreamboardApiError(\n error,\n response,\n \"Failed to list compiled results\",\n );\n }\n return data.results.filter(\n (result) => {\n const maybeRevisionDigest = (result as { revisionDigest?: string })\n .revisionDigest;\n return (\n maybeRevisionDigest === revisionDigest ||\n result.authoringStateId === revisionDigest\n );\n },\n );\n}\n\nexport async function getProjectCompiledResultSdk(\n projectId: string,\n compiledResultId: string,\n): Promise<CompiledResult> {\n const { data, error, response } = await getProjectCompiledResult({\n path: { projectId, compiledResultId },\n });\n if (error || !data) {\n throw toDreamboardApiError(\n error,\n response,\n \"Failed to fetch compiled result\",\n );\n }\n return data;\n}\n\nexport async function queueProjectRevisionCompileSdk(options: {\n projectId: string;\n revisionDigest: string;\n}): Promise<QueueCompiledResultJobResponse> {\n const { data, error, response } = await queueProjectRevisionCompile({\n path: {\n projectId: options.projectId,\n revisionDigest: options.revisionDigest,\n },\n });\n\n if (error || !data) {\n throw toDreamboardApiError(error, response, \"Failed to create compile job\");\n }\n\n return data;\n}\n\nexport async function waitForCompiledResultJobSdk(options: {\n gameId?: string;\n projectId?: string;\n jobId: string;\n onProgress?: (job: JobDetailResponse) => void;\n}): Promise<{\n job: JobDetailResponse;\n compiledResult: CompiledResult;\n}> {\n const { gameId, projectId, jobId, onProgress } = options;\n let previousTransitionKey: string | null = null;\n const startedAt = Date.now();\n const timeoutMs = readCompileJobWaitTimeoutMs();\n\n while (Date.now() - startedAt < timeoutMs) {\n const {\n data: job,\n error,\n response,\n } = await getJob({\n path: { jobId },\n });\n if (error || !job) {\n if (isTransientJobPollError(error, response)) {\n await sleep(COMPILE_JOB_POLL_INTERVAL_MS);\n continue;\n }\n throw toDreamboardApiError(error, response, \"Failed to get job\");\n }\n\n const transitionKey = `${job.status}:${job.phase ?? \"\"}`;\n if (transitionKey !== previousTransitionKey) {\n previousTransitionKey = transitionKey;\n onProgress?.(job);\n }\n\n if (job.status === \"COMPLETED\" || job.status === \"FAILED\") {\n const compiledResultId =\n job.createdCompiledResultId ?? job.createdAppScriptId;\n if (compiledResultId) {\n if (projectId) {\n const compiledResult = await getProjectCompiledResultSdk(\n projectId,\n compiledResultId,\n );\n return { job, compiledResult };\n }\n const compiledResult = await getCompiledResultSdk(\n gameId!,\n compiledResultId,\n );\n return { job, compiledResult };\n }\n\n const fallbackCompiledResult = await findFallbackCompiledResultForJob({\n gameId,\n projectId,\n job,\n });\n if (fallbackCompiledResult) {\n return { job, compiledResult: fallbackCompiledResult };\n }\n\n throw new Error(formatTerminalCompileJobMessage(job));\n }\n\n if (job.status === \"CANCELLED\" || job.status === \"INTERRUPTED\") {\n throw new Error(formatTerminalCompileJobMessage(job));\n }\n\n await sleep(COMPILE_JOB_POLL_INTERVAL_MS);\n }\n\n throw new Error(`Compile job ${jobId} did not complete in time.`);\n}\n\nfunction readCompileJobWaitTimeoutMs(): number {\n const raw = process.env.DREAMBOARD_COMPILE_WAIT_TIMEOUT_MS;\n if (!raw) return DEFAULT_COMPILE_JOB_WAIT_TIMEOUT_MS;\n const parsed = Number(raw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return DEFAULT_COMPILE_JOB_WAIT_TIMEOUT_MS;\n }\n return parsed;\n}\n\nfunction isTransientJobPollError(error: unknown, response: unknown): boolean {\n if (response) return false;\n if (!error) return false;\n if (error instanceof Error) {\n return isTransientJobPollMessage(error.message);\n }\n if (typeof error === \"object\" && error !== null && \"message\" in error) {\n return isTransientJobPollMessage(String(error.message));\n }\n return isTransientJobPollMessage(String(error));\n}\n\nfunction isTransientJobPollMessage(message: string): boolean {\n const normalized = message.toLowerCase();\n return (\n normalized.includes(\"fetch failed\") ||\n normalized.includes(\"network\") ||\n normalized.includes(\"timeout\") ||\n normalized.includes(\"econnreset\") ||\n normalized.includes(\"econnrefused\") ||\n normalized.includes(\"socket\")\n );\n}\n","import {\n createGameRevision,\n createProjectSession,\n createProjectSessionFromReducerSnapshot,\n ensureProject,\n ensureProjectDevCompile,\n getApiVersion,\n getCurrentAuthUser,\n getProjectBySlug,\n getProjectRevisionSources,\n getProjectSources,\n type CreateSessionFromReducerSnapshotRequest,\n type CreateSessionRequest,\n type CreateSessionResponse,\n type CreateGameRevisionRequest,\n type EnsureDevCompileRequest,\n type EnsureDevCompileResponse,\n type GameRevision,\n type GameSourcesResponse,\n type HostSessionSnapshot,\n type Project,\n type ProjectRevisionSourcesResponse,\n} from \"@dreamboard-games/api-client\";\nimport { toDreamboardApiError } from \"../../utils/errors.js\";\nimport { titleFromSlug } from \"../../utils/strings.js\";\n\nexport type RemoteProjectIdentity = {\n deploymentId: string;\n ownerScopeId: string;\n bindingKey: string;\n};\n\nexport async function loadRemoteProjectIdentity(): Promise<RemoteProjectIdentity> {\n const [versionResponse, userResponse] = await Promise.all([\n getApiVersion(),\n getCurrentAuthUser(),\n ]);\n\n if (versionResponse.error || !versionResponse.data) {\n throw toDreamboardApiError(\n versionResponse.error as Parameters<typeof toDreamboardApiError>[0],\n versionResponse.response,\n \"Failed to resolve backend deployment identity\",\n );\n }\n if (userResponse.error || !userResponse.data) {\n throw toDreamboardApiError(\n userResponse.error,\n userResponse.response,\n \"Failed to resolve authenticated owner scope\",\n );\n }\n\n const deploymentId = versionResponse.data.deploymentId;\n const ownerScopeId = userResponse.data.ownerScopeId;\n return {\n deploymentId,\n ownerScopeId,\n bindingKey: `${deploymentId}:${ownerScopeId}`,\n };\n}\n\nexport async function ensureProjectSdk(options: {\n projectId: string;\n slug: string;\n description?: string;\n updateAlias?: boolean;\n}): Promise<Project> {\n const { data, error, response } = await ensureProject({\n path: { projectId: options.projectId },\n body: {\n slug: options.slug,\n name: titleFromSlug(options.slug),\n description:\n options.description ?? `Dreamboard workspace for ${options.slug}.`,\n ...(options.updateAlias ? { updateAlias: true } : {}),\n },\n });\n\n if (error || !data) {\n throw toDreamboardApiError(error, response, \"Failed to ensure project\");\n }\n\n return data;\n}\n\nexport async function getProjectBySlugSdk(slug: string): Promise<Project> {\n const { data, error, response } = await getProjectBySlug({\n path: { slug },\n });\n\n if (error || !data) {\n throw toDreamboardApiError(\n error,\n response,\n `Project '${slug}' not found`,\n );\n }\n\n return data;\n}\n\nexport async function createGameRevisionSdk(options: {\n projectId: string;\n request: CreateGameRevisionRequest;\n}): Promise<GameRevision> {\n const { data, error, response } = await createGameRevision({\n path: { projectId: options.projectId },\n body: options.request,\n });\n\n if (error || !data) {\n throw toDreamboardApiError(\n error,\n response,\n \"Failed to create game revision\",\n );\n }\n\n return data;\n}\n\nexport async function getProjectSourcesSdk(\n projectId: string,\n): Promise<GameSourcesResponse | null> {\n const { data, error, response } = await getProjectSources({\n path: { projectId },\n });\n\n if (response?.status === 404) {\n return null;\n }\n if (error || !data) {\n throw toDreamboardApiError(\n error,\n response,\n \"Failed to fetch project sources\",\n );\n }\n\n return data;\n}\n\nexport async function getProjectRevisionSourcesSdk(options: {\n projectId: string;\n revisionDigest: string;\n}): Promise<ProjectRevisionSourcesResponse> {\n const { data, error, response } = await getProjectRevisionSources({\n path: {\n projectId: options.projectId,\n revisionDigest: options.revisionDigest,\n },\n });\n\n if (error || !data) {\n throw toDreamboardApiError(\n error,\n response,\n \"Failed to fetch project revision sources\",\n );\n }\n\n return data;\n}\n\nexport async function ensureProjectDevCompileSdk(options: {\n projectId: string;\n request: EnsureDevCompileRequest;\n}): Promise<EnsureDevCompileResponse> {\n const { data, error, response } = await ensureProjectDevCompile({\n path: { projectId: options.projectId },\n body: options.request,\n });\n\n if (error || !data) {\n throw toDreamboardApiError(error, response, \"Failed to ensure dev compile\");\n }\n\n return data;\n}\n\nexport async function createProjectSessionSdk(options: {\n projectId: string;\n request: CreateSessionRequest;\n}): Promise<CreateSessionResponse> {\n const { data, error, response } = await createProjectSession({\n path: { projectId: options.projectId },\n body: options.request,\n });\n\n if (error || !data) {\n throw toDreamboardApiError(error, response, \"Failed to create session\");\n }\n\n return data;\n}\n\nexport async function createProjectSessionFromReducerSnapshotSdk(options: {\n projectId: string;\n request: CreateSessionFromReducerSnapshotRequest;\n}): Promise<HostSessionSnapshot> {\n const { data, error, response } =\n await createProjectSessionFromReducerSnapshot({\n path: { projectId: options.projectId },\n body: options.request,\n });\n\n if (error || !data) {\n throw toDreamboardApiError(\n error,\n response,\n \"Failed to create session from reducer snapshot\",\n );\n }\n\n return data;\n}\n","import { uploadInitialProjection } from \"@dreamboard-games/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 {\n createSourceRevision,\n type CreateSourceRevisionRequest,\n queueCompiledResultJob,\n type QueueCompiledResultJobResponse,\n type SourceRevision,\n} from \"@dreamboard-games/api-client\";\nimport {\n SourceBlobSessionRequestError,\n uploadGameSourceBlobs,\n uploadProjectSourceBlobs,\n type SourceBlobUploadInput,\n} from \"@dreamboard-games/api-client/source-revisions\";\nimport { toDreamboardApiError } from \"../../utils/errors.js\";\n\nconst SOURCE_BLOB_UPLOAD_BATCH_SIZE = 20;\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 for (const batch of chunkSourceBlobs(blobs)) {\n await uploadGameSourceBlobs({ gameId, blobs: batch });\n }\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 uploadProjectSourceBlobsSdk(\n projectId: string,\n blobs: SourceBlobUploadInput[],\n): Promise<void> {\n try {\n for (const batch of chunkSourceBlobs(blobs)) {\n await uploadProjectSourceBlobs({ projectId, blobs: batch });\n }\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\nfunction chunkSourceBlobs(\n blobs: SourceBlobUploadInput[],\n): SourceBlobUploadInput[][] {\n const chunks: SourceBlobUploadInput[][] = [];\n for (let index = 0; index < blobs.length; index += SOURCE_BLOB_UPLOAD_BATCH_SIZE) {\n chunks.push(blobs.slice(index, index + SOURCE_BLOB_UPLOAD_BATCH_SIZE));\n }\n return chunks;\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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,aAAa,mBAAmB;AA8LzC,SAAS,cAAc,KAAK;AAC3B,SAAO;AACR;;;AChMA,IAAM,cAAc,IAAI,YAAY;AACpC,IAAM,wCAAwC;AAC9C,SAAS,WAAW,OAAO;AACvB,SAAO,MAAM,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAClF;AACA,eAAe,UAAU,OAAO;AAC5B,QAAM,kBAAkB,IAAI,WAAW,MAAM,UAAU;AACvD,kBAAgB,IAAI,KAAK;AACzB,QAAM,SAAS,MAAM,OAAO,OAAO,OAAO,WAAW,gBAAgB,MAAM;AAC3E,SAAO,WAAW,IAAI,WAAW,MAAM,CAAC;AAC5C;AACA,SAAS,gBAAgB,SAAS;AAC9B,SAAO,YAAY,OAAO,OAAO,EAAE;AACvC;AACA,eAAe,yBAAyB,SAAS;AAC7C,SAAO,UAAU,YAAY,OAAO,OAAO,CAAC;AAChD;AACA,eAAe,mBAAmB,SAAS;AACvC,SAAO;AAAA,IACH,aAAa,MAAM,yBAAyB,OAAO;AAAA,IACnD,UAAU,gBAAgB,OAAO;AAAA,EACrC;AACJ;AACA,eAAsB,kCAAkC,SAAS;AAC7D,QAAM,cAAc,oBAAI,IAAI;AAC5B,QAAM,eAAe,MAAM,QAAQ,IAAI,MAAM,KAAK,SAAS,OAAO,WAAW;AACzE,QAAI,OAAO,SAAS,UAAU;AAC1B,aAAO;AAAA,IACX;AACA,UAAM,OAAO,MAAM,mBAAmB,OAAO,OAAO;AACpD,UAAM,WAAW,YAAY,IAAI,KAAK,WAAW;AACjD,QAAI,CAAC,UAAU;AACX,kBAAY,IAAI,KAAK,aAAa,IAAI;AAAA,IAC1C;AACA,WAAO;AAAA,MACH,MAAM;AAAA,MACN,MAAM,OAAO;AAAA,MACb,aAAa,KAAK;AAAA,MAClB,UAAU,KAAK;AAAA,IACnB;AAAA,EACJ,CAAC,CAAC;AACF,SAAO;AAAA,IACH,OAAO,MAAM,KAAK,YAAY,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,YAAY,cAAc,MAAM,WAAW,CAAC;AAAA,IAC/G,SAAS;AAAA,EACb;AACJ;AACO,SAAS,mCAAmC,cAAc,qBAAqB;AAClF,QAAM,cAAc,oBAAI,IAAI;AAC5B,QAAM,SAAS,KAAK,IAAI,aAAa,QAAQ,oBAAoB,MAAM;AACvE,WAAS,QAAQ,GAAG,QAAQ,QAAQ,SAAS,GAAG;AAC5C,UAAM,cAAc,aAAa,KAAK;AACtC,UAAM,qBAAqB,oBAAoB,KAAK;AACpD,QAAI,aAAa,SAAS,YACtB,oBAAoB,SAAS,UAAU;AACvC;AAAA,IACJ;AACA,gBAAY,IAAI,mBAAmB,aAAa;AAAA,MAC5C,aAAa,mBAAmB;AAAA,MAChC,UAAU,mBAAmB;AAAA,MAC7B,SAAS,YAAY;AAAA,IACzB,CAAC;AAAA,EACL;AACA,SAAO;AACX;AACA,IAAM,wBAAN,cAAoC,MAAM;AAAA,EACtC,YAAY,QAAQ,SAAS;AACzB,UAAM,SAAS,QAAQ,KAAK,EAAE,SAAS,IAAI,KAAK,QAAQ,KAAK,CAAC,KAAK;AACnE,UAAM,sCAAsC,MAAM,GAAG,MAAM,GAAG;AAC9D,SAAK,OAAO;AACZ,SAAK,SAAS;AACd,SAAK,UAAU;AAAA,EACnB;AACJ;AACA,SAAS,6BAA6B,OAAO;AACzC,MAAI,EAAE,iBAAiB,wBAAwB;AAC3C,WAAO;AAAA,EACX;AACA,MAAI,MAAM,WAAW,KAAK;AACtB,WAAO;AAAA,EACX;AACA,QAAM,oBAAoB,MAAM,QAAQ,YAAY;AACpD,SAAQ,kBAAkB,SAAS,WAAW,KAC1C,kBAAkB,SAAS,gBAAgB,KAC3C,kBAAkB,SAAS,yBAAyB;AAC5D;AACA,eAAe,iBAAiB,cAAc,SAAS;AACnD,QAAM,WAAW,MAAM,MAAM,aAAa,KAAK;AAAA,IAC3C,QAAQ,aAAa;AAAA,IACrB,SAAS,aAAa;AAAA,IACtB,MAAM,YAAY,OAAO,OAAO;AAAA,EACpC,CAAC;AACD,MAAI,SAAS,IAAI;AACb;AAAA,EACJ;AACA,QAAM,UAAU,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACpD,QAAM,IAAI,sBAAsB,SAAS,QAAQ,OAAO;AAC5D;AACO,IAAM,gCAAN,cAA4C,MAAM;AAAA,EACrD,YAAY,SAAS,UAAU,UAAU;AACrC,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,WAAW;AAAA,EACpB;AACJ;AACA,SAAS,8BAA8B,MAAM,UAAU;AACnD,MAAI,CAAC,QACD,OAAO,SAAS,YAChB,CAAC,MAAM,QAAQ,KAAK,OAAO,GAAG;AAC9B,UAAM,IAAI,8BAA8B,wEAAwE,MAAM,QAAQ;AAAA,EAClI;AACJ;AACA,eAAe,+BAA+B,SAAS;AACnD,QAAM,EAAE,sBAAsB,KAAK,IAAI;AACvC,QAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,qBAAqB;AAAA,IACzD;AAAA,MACI,aAAa,KAAK;AAAA,MAClB,UAAU,KAAK;AAAA,IACnB;AAAA,EACJ,CAAC;AACD,MAAI,SAAS,CAAC,MAAM;AAChB,UAAM,IAAI,8BAA8B,+CAA+C,OAAO,QAAQ;AAAA,EAC1G;AACA,gCAA8B,MAAM,QAAQ;AAC5C,SAAO,KAAK,QAAQ,CAAC,GAAG,WAAW;AACvC;AACA,eAAe,kBAAkB,SAAS;AACtC,QAAM,EAAE,OAAO,qBAAqB,IAAI;AACxC,QAAM,cAAc,oBAAI,IAAI;AAC5B,aAAW,QAAQ,OAAO;AACtB,UAAM,WAAW,YAAY,IAAI,KAAK,WAAW;AACjD,QAAI,CAAC,UAAU;AACX,kBAAY,IAAI,KAAK,aAAa,IAAI;AACtC;AAAA,IACJ;AACA,QAAI,SAAS,aAAa,KAAK,UAAU;AACrC,YAAM,IAAI,MAAM,eAAe,KAAK,WAAW,8BAA8B;AAAA,IACjF;AAAA,EACJ;AACA,MAAI,YAAY,SAAS,GAAG;AACxB;AAAA,EACJ;AACA,aAAW,eAAe,iBAAiB,MAAM,KAAK,YAAY,OAAO,CAAC,GAAG,qCAAqC,GAAG;AACjH,UAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,qBAAqB,YAAY,IAAI,CAAC,EAAE,aAAa,SAAS,OAAO;AAAA,MACzG;AAAA,MACA;AAAA,IACJ,EAAE,CAAC;AACH,QAAI,SAAS,CAAC,MAAM;AAChB,YAAM,IAAI,8BAA8B,+CAA+C,OAAO,QAAQ;AAAA,IAC1G;AACA,kCAA8B,MAAM,QAAQ;AAC5C,eAAW,UAAU,KAAK,SAAS;AAC/B,UAAI,OAAO,WAAW,mBAAmB;AACrC;AAAA,MACJ;AACA,YAAM,OAAO,YAAY,IAAI,OAAO,WAAW;AAC/C,UAAI,CAAC,MAAM;AACP,cAAM,IAAI,MAAM,iDAAiD,OAAO,WAAW,GAAG;AAAA,MAC1F;AACA,UAAI,CAAC,OAAO,cAAc;AACtB,cAAM,IAAI,MAAM,yCAAyC,OAAO,WAAW,GAAG;AAAA,MAClF;AACA,UAAI;AACA,cAAM,iBAAiB,OAAO,cAAc,KAAK,OAAO;AACxD,YAAI,CAAE,MAAM,+BAA+B,EAAE,sBAAsB,KAAK,CAAC,GAAI;AACzE,gBAAM,IAAI,MAAM,eAAe,KAAK,WAAW,mCAAmC;AAAA,QACtF;AAAA,MACJ,SACOA,QAAO;AACV,YAAI,6BAA6BA,MAAK,KACjC,MAAM,+BAA+B,EAAE,sBAAsB,KAAK,CAAC,GAAI;AACxE;AAAA,QACJ;AACA,cAAMA;AAAA,MACV;AAAA,IACJ;AAAA,EACJ;AACJ;AACA,SAAS,iBAAiB,OAAO,WAAW;AACxC,QAAM,SAAS,CAAC;AAChB,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,WAAW;AAC1D,WAAO,KAAK,MAAM,MAAM,OAAO,QAAQ,SAAS,CAAC;AAAA,EACrD;AACA,SAAO;AACX;AAWA,eAAsB,yBAAyB,SAAS;AACpD,QAAM,EAAE,WAAW,MAAM,IAAI;AAC7B,SAAO,kBAAkB;AAAA,IACrB;AAAA,IACA,sBAAsB,CAAC,gBAAgB,qCAAqC;AAAA,MACxE,MAAM,EAAE,UAAU;AAAA,MAClB,MAAM,EAAE,OAAO,YAAY;AAAA,IAC/B,CAAC;AAAA,EACL,CAAC;AACL;;;AC7MO,IAAM,mBAAmB;AAAA,EAC9B,KAAK;AAAA,IACH,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,aAAa;AAAA,EACf;AACF;;;ACPA,IAAM,oBAAoB,iBAAE,OAAO;AAAA,EACjC,KAAK,iBAAE,KAAK,CAAC,SAAS,WAAW,MAAM,CAAC,EAAE,SAAS;AAAA,EACnD,OAAO,iBAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAED,IAAM,uBAAuB,iBAAE,OAAO;AAAA,EACpC,aAAa,iBAAE,OAAO,EAAE,SAAS;AAAA,EACjC,MAAM,iBAAE,OAAO,EAAE,SAAS;AAC5B,CAAC;AAED,IAAM,yBAAyB,iBAAE,OAAO;AAAA,EACtC,SAAS,iBAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,gBAAgB,iBAAE,OAAO,EAAE,SAAS;AACtC,CAAC;AAED,IAAM,uBAAuB,kBAAkB,OAAO;AAAA,EACpD,MAAM,iBAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,aAAa,iBAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,OAAO,iBAAE,QAAQ,EAAE,QAAQ,KAAK;AAClC,CAAC;AAED,IAAM,yBAAyB,kBAAkB,OAAO;AAAA,EACtD,MAAM,iBAAE,OAAO,EAAE,IAAI,CAAC;AACxB,CAAC;AAED,IAAM,yBAAyB,kBAAkB,OAAO;AAAA,EACtD,OAAO,iBAAE,OAAO,EAAE,IAAI,CAAC;AACzB,CAAC;AAED,IAAM,wBAAwB,kBAAkB,OAAO;AAAA,EACrD,OAAO,iBAAE,QAAQ,EAAE,QAAQ,KAAK;AAClC,CAAC;AAED,IAAM,wBAAwB,kBAAkB,OAAO;AAAA,EACrD,OAAO,iBAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAChC,KAAK,iBAAE,QAAQ,EAAE,QAAQ,KAAK;AAChC,CAAC;AAED,IAAM,2BAA2B,kBAAkB,OAAO;AAAA,EACxD,OAAO,iBAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAChC,oBAAoB,iBAAE,QAAQ,EAAE,QAAQ,KAAK;AAC/C,CAAC;AAED,IAAM,0BAA0B,kBAAkB,OAAO;AAAA,EACvD,MAAM,iBAAE,QAAQ,EAAE,QAAQ,KAAK;AACjC,CAAC;AAED,IAAM,uBAAuB,kBAAkB,OAAO;AAAA,EACpD,MAAM,iBAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,iBAAiB,iBAAE,OAAO,EAAE,SAAS;AAAA,EACrC,SAAS,iBAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,gBAAgB,iBAAE,OAAO,EAAE,SAAS;AAAA,EACpC,OAAO,iBAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAChC,QAAQ,iBAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,iBAAiB,iBAAE,OAAO,EAAE,SAAS;AAAA,EACrC,eAAe,iBAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACxC,MAAM,iBAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAC/B,MAAM,iBAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,MAAM,iBAAE,MAAM,CAAC,iBAAE,OAAO,GAAG,iBAAE,QAAQ,CAAC,CAAC,EAAE,SAAS;AAAA,EAClD,gBAAgB,iBAAE,OAAO,EAAE,SAAS;AACtC,CAAC;AAED,IAAM,wBAAwB,kBAAkB,OAAO;AAAA,EACrD,SAAS,iBAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACpC,QAAQ,iBAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACxB,cAAc,iBAAE,QAAQ,EAAE,QAAQ,KAAK;AACzC,CAAC;AAID,IAAM,0BAA0B,kBAAkB,OAAO;AAAA,EACvD,QAAQ,iBAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,MAAM;AAAA,EAC5C,OAAO,iBAAE,KAAK,CAAC,UAAU,WAAW,CAAC,EAAE,SAAS,EAAE,QAAQ,QAAQ;AACpE,CAAC;AAED,IAAM,wBAAwB,iBAAE,OAAO;AAAA,EACrC,QAAQ,iBAAE,KAAK,CAAC,OAAO,SAAS,SAAS,OAAO,QAAQ,CAAC;AAAA,EACzD,YAAY,iBAAE,OAAO,EAAE,SAAS;AAAA,EAChC,OAAO,iBAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,KAAK,iBAAE,QAAQ,EAAE,SAAS;AAAA,EAC1B,KAAK,iBAAE,KAAK,CAAC,SAAS,WAAW,MAAM,CAAC,EAAE,SAAS;AACrD,CAAC;AAmBD,SAAS,UACP,aACA,QACA,MACS;AACT,QAAM,SAAS,OAAO,UAAU,IAAI;AACpC,MAAI,OAAO,SAAS;AAClB,WAAO,OAAO;AAAA,EAChB;AAEA,QAAM,UAAU,OAAO,MAAM,OAC1B,IAAI,CAAC,UAAU;AACd,UAAM,QAAQ,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,KAAK,GAAG,IAAI;AAC7D,WAAO,GAAG,KAAK,KAAK,MAAM,OAAO;AAAA,EACnC,CAAC,EACA,KAAK,IAAI;AACZ,QAAM,IAAI,MAAM,0BAA0B,WAAW,MAAM,OAAO,EAAE;AACtE;AAEO,SAAS,iBAAiB,MAA4B;AAC3D,SAAO,UAAU,gBAAgB,mBAAmB,IAAI;AAC1D;AA0BO,SAAS,qBAAqB,MAAgC;AACnE,SAAO,UAAU,QAAQ,uBAAuB,IAAI;AACtD;AAEO,SAAS,wBAAwB,MAAmC;AACzE,SAAO,UAAU,WAAW,0BAA0B,IAAI;AAC5D;;;AC3JA,OAAO,UAAU;AAUV,SAAS,cAAc,MAAsB;AAClD,SAAO,KACJ,MAAM,GAAG,EACT,OAAO,OAAO,EACd,IAAI,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,GAAG;AACb;AAqBO,SAAS,MAAM,IAA2B;AAC/C,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;;;ACzBA,IAAM,+BAA+B;AACrC,IAAM,sCAAsC,KAAK,KAAK;AAGtD,SAAS,iBACJ,QACY;AACf,aAAW,SAAS,QAAQ;AAC1B,QAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,GAAG;AACxD,aAAO,MAAM,KAAK;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,gCACP,KAIQ;AACR,QAAM,SAAS,cAAc,IAAI,cAAc,IAAI,OAAO;AAC1D,QAAM,QAAQ,cAAc,IAAI,KAAK;AACrC,QAAM,SAAS,WAAW,IAAI,OAAO,YAAY,CAAC,GAAG,QAAQ,KAAK,KAAK,MAAM,EAAE;AAC/E,SAAO,SACH,GAAG,MAAM,KAAK,MAAM,KACpB,GAAG,MAAM,SAAS,IAAI,KAAK;AACjC;AAEA,SAAS,qBACP,MACA,OACQ;AACR,QAAM,WAAW,KAAK,MAAM,KAAK,SAAS;AAC1C,QAAM,YAAY,KAAK,MAAM,MAAM,SAAS;AAC5C,MAAI,OAAO,SAAS,QAAQ,KAAK,OAAO,SAAS,SAAS,GAAG;AAC3D,WAAO,YAAY;AAAA,EACrB;AACA,MAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,SAAS,QAAQ,GAAG;AAC7B,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,eAAe,iCAAiC,SAIb;AACjC,QAAM,EAAE,QAAQ,WAAW,IAAI,IAAI;AACnC,QAAM,UAAU,YACZ,MAAM,2BAA2B;AAAA,IAC/B,MAAM,EAAE,UAAU;AAAA,IAClB,OAAO,EAAE,OAAO,IAAI;AAAA,EACtB,CAAC,IACD,MAAM,oBAAoB;AAAA,IACxB,MAAM,EAAE,OAAgB;AAAA,IACxB,OAAO,EAAE,OAAO,IAAI;AAAA,EACtB,CAAC;AACL,MAAI,QAAQ,SAAS,CAAC,QAAQ,MAAM;AAClC,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,KAAK,QAAQ,WAAW,GAAG;AACrC,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,KAAK,MAAM,IAAI,SAAS;AAC/C,QAAM,yBAAyB,OAAO,SAAS,cAAc,IACzD,QAAQ,KAAK,QAAQ,OAAO,CAAC,WAAW;AACtC,UAAM,oBAAoB,KAAK,MAAM,OAAO,SAAS;AACrD,WACE,CAAC,OAAO,SAAS,iBAAiB,KAClC,qBAAqB;AAAA,EAEzB,CAAC,IACD,QAAQ,KAAK;AACjB,QAAM,mBACJ,uBAAuB,SAAS,IAC5B,yBACA,QAAQ,KAAK;AAEnB,SAAO,CAAC,GAAG,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,CAAC,KAAK;AAChE;AAkCA,eAAsB,qBACpB,QACA,kBACyB;AACzB,QAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,kBAAkB;AAAA,IACxD,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AACD,MAAI,SAAS,CAAC,MAAM;AAClB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,sCAAsC,SAG9B;AAC5B,QAAM,EAAE,WAAW,eAAe,IAAI;AACtC,QAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,2BAA2B;AAAA,IACjE,MAAM,EAAE,UAAU;AAAA,IAClB,OAAO,EAAE,OAAO,IAAI;AAAA,EACtB,CAAC;AACD,MAAI,SAAS,CAAC,MAAM;AAClB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO,KAAK,QAAQ;AAAA,IAClB,CAAC,WAAW;AACV,YAAM,sBAAuB,OAC1B;AACH,aACE,wBAAwB,kBACxB,OAAO,qBAAqB;AAAA,IAEhC;AAAA,EACF;AACF;AAEA,eAAsB,4BACpB,WACA,kBACyB;AACzB,QAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,yBAAyB;AAAA,IAC/D,MAAM,EAAE,WAAW,iBAAiB;AAAA,EACtC,CAAC;AACD,MAAI,SAAS,CAAC,MAAM;AAClB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,+BAA+B,SAGT;AAC1C,QAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,4BAA4B;AAAA,IAClE,MAAM;AAAA,MACJ,WAAW,QAAQ;AAAA,MACnB,gBAAgB,QAAQ;AAAA,IAC1B;AAAA,EACF,CAAC;AAED,MAAI,SAAS,CAAC,MAAM;AAClB,UAAM,qBAAqB,OAAO,UAAU,8BAA8B;AAAA,EAC5E;AAEA,SAAO;AACT;AAEA,eAAsB,4BAA4B,SAQ/C;AACD,QAAM,EAAE,QAAQ,WAAW,OAAO,WAAW,IAAI;AACjD,MAAI,wBAAuC;AAC3C,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,YAAY,4BAA4B;AAE9C,SAAO,KAAK,IAAI,IAAI,YAAY,WAAW;AACzC,UAAM;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,IACF,IAAI,MAAM,OAAO;AAAA,MACf,MAAM,EAAE,MAAM;AAAA,IAChB,CAAC;AACD,QAAI,SAAS,CAAC,KAAK;AACjB,UAAI,wBAAwB,OAAO,QAAQ,GAAG;AAC5C,cAAM,MAAM,4BAA4B;AACxC;AAAA,MACF;AACA,YAAM,qBAAqB,OAAO,UAAU,mBAAmB;AAAA,IACjE;AAEA,UAAM,gBAAgB,GAAG,IAAI,MAAM,IAAI,IAAI,SAAS,EAAE;AACtD,QAAI,kBAAkB,uBAAuB;AAC3C,8BAAwB;AACxB,mBAAa,GAAG;AAAA,IAClB;AAEA,QAAI,IAAI,WAAW,eAAe,IAAI,WAAW,UAAU;AACzD,YAAM,mBACJ,IAAI,2BAA2B,IAAI;AACrC,UAAI,kBAAkB;AACpB,YAAI,WAAW;AACb,gBAAMC,kBAAiB,MAAM;AAAA,YAC3B;AAAA,YACA;AAAA,UACF;AACA,iBAAO,EAAE,KAAK,gBAAAA,gBAAe;AAAA,QAC/B;AACA,cAAM,iBAAiB,MAAM;AAAA,UAC3B;AAAA,UACA;AAAA,QACF;AACA,eAAO,EAAE,KAAK,eAAe;AAAA,MAC/B;AAEA,YAAM,yBAAyB,MAAM,iCAAiC;AAAA,QACpE;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AACD,UAAI,wBAAwB;AAC1B,eAAO,EAAE,KAAK,gBAAgB,uBAAuB;AAAA,MACvD;AAEA,YAAM,IAAI,MAAM,gCAAgC,GAAG,CAAC;AAAA,IACtD;AAEA,QAAI,IAAI,WAAW,eAAe,IAAI,WAAW,eAAe;AAC9D,YAAM,IAAI,MAAM,gCAAgC,GAAG,CAAC;AAAA,IACtD;AAEA,UAAM,MAAM,4BAA4B;AAAA,EAC1C;AAEA,QAAM,IAAI,MAAM,eAAe,KAAK,4BAA4B;AAClE;AAEA,SAAS,8BAAsC;AAC7C,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,SAAS,OAAO,GAAG;AACzB,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,UAAU,GAAG;AAC3C,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEA,SAAS,wBAAwB,OAAgB,UAA4B;AAC3E,MAAI,SAAU,QAAO;AACrB,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,iBAAiB,OAAO;AAC1B,WAAO,0BAA0B,MAAM,OAAO;AAAA,EAChD;AACA,MAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,aAAa,OAAO;AACrE,WAAO,0BAA0B,OAAO,MAAM,OAAO,CAAC;AAAA,EACxD;AACA,SAAO,0BAA0B,OAAO,KAAK,CAAC;AAChD;AAEA,SAAS,0BAA0B,SAA0B;AAC3D,QAAM,aAAa,QAAQ,YAAY;AACvC,SACE,WAAW,SAAS,cAAc,KAClC,WAAW,SAAS,SAAS,KAC7B,WAAW,SAAS,SAAS,KAC7B,WAAW,SAAS,YAAY,KAChC,WAAW,SAAS,cAAc,KAClC,WAAW,SAAS,QAAQ;AAEhC;;;ACpSA,eAAsB,4BAA4D;AAChF,QAAM,CAAC,iBAAiB,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,IACxD,cAAc;AAAA,IACd,mBAAmB;AAAA,EACrB,CAAC;AAED,MAAI,gBAAgB,SAAS,CAAC,gBAAgB,MAAM;AAClD,UAAM;AAAA,MACJ,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACA,MAAI,aAAa,SAAS,CAAC,aAAa,MAAM;AAC5C,UAAM;AAAA,MACJ,aAAa;AAAA,MACb,aAAa;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,gBAAgB,KAAK;AAC1C,QAAM,eAAe,aAAa,KAAK;AACvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,GAAG,YAAY,IAAI,YAAY;AAAA,EAC7C;AACF;AAEA,eAAsB,iBAAiB,SAKlB;AACnB,QAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,cAAc;AAAA,IACpD,MAAM,EAAE,WAAW,QAAQ,UAAU;AAAA,IACrC,MAAM;AAAA,MACJ,MAAM,QAAQ;AAAA,MACd,MAAM,cAAc,QAAQ,IAAI;AAAA,MAChC,aACE,QAAQ,eAAe,4BAA4B,QAAQ,IAAI;AAAA,MACjE,GAAI,QAAQ,cAAc,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,IACrD;AAAA,EACF,CAAC;AAED,MAAI,SAAS,CAAC,MAAM;AAClB,UAAM,qBAAqB,OAAO,UAAU,0BAA0B;AAAA,EACxE;AAEA,SAAO;AACT;AAkBA,eAAsB,sBAAsB,SAGlB;AACxB,QAAM,EAAE,MAAM,OAAO,SAAS,IAAI,MAAM,mBAAmB;AAAA,IACzD,MAAM,EAAE,WAAW,QAAQ,UAAU;AAAA,IACrC,MAAM,QAAQ;AAAA,EAChB,CAAC;AAED,MAAI,SAAS,CAAC,MAAM;AAClB,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;ACrHA,eAAsB,2BACpB,QACA,gBACe;AACf,QAAM,EAAE,OAAO,SAAS,IAAI,MAAM,wBAAwB;AAAA,IACxD,MAAM,EAAE,OAAO;AAAA,IACf,MAAM,EAAE,eAAe;AAAA,EACzB,CAAC;AACD,MAAI,OAAO;AACT,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;ACHA,IAAM,gCAAgC;AA0CtC,eAAsB,4BACpB,WACA,OACe;AACf,MAAI;AACF,eAAW,SAASC,kBAAiB,KAAK,GAAG;AAC3C,YAAM,yBAAyB,EAAE,WAAW,OAAO,MAAM,CAAC;AAAA,IAC5D;AAAA,EACF,SAAS,OAAO;AACd,QAAI,iBAAiB,+BAA+B;AAClD,YAAM;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;AAEA,SAASA,kBACP,OAC2B;AAC3B,QAAM,SAAoC,CAAC;AAC3C,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,+BAA+B;AAChF,WAAO,KAAK,MAAM,MAAM,OAAO,QAAQ,6BAA6B,CAAC;AAAA,EACvE;AACA,SAAO;AACT;","names":["error","compiledResult","chunkSourceBlobs"]}
@@ -1,20 +1,16 @@
1
1
  #!/usr/bin/env node
2
- import {
3
- isPerPlayer,
4
- perPlayerSchema
5
- } from "./chunk-HBNDKQT5.mjs";
6
2
  import {
7
3
  importTypeScriptModule
8
- } from "./chunk-CEDUHGNH.mjs";
4
+ } from "./chunk-XKCJBIRY.mjs";
9
5
  import {
10
6
  external_exports
11
- } from "./chunk-2QMNAVV4.mjs";
12
- import {
13
- materializeManifestTable
14
- } from "./chunk-U6OJN7XS.mjs";
7
+ } from "./chunk-JZTH3EMV.mjs";
15
8
 
16
9
  // src/services/project/reducer-bundle-preflight.ts
17
10
  import path from "path";
11
+ import { isPerPlayer, perPlayerSchema } from "@dreamboard-games/sdk/reducer";
12
+ import "@dreamboard-games/sdk/reducer-contract";
13
+ import { materializeManifestTable } from "@dreamboard-games/sdk/codegen";
18
14
  globalThis.__DREAMBOARD_AUTHORING_WARNINGS__ = true;
19
15
  var REDUCER_BUNDLE_ENTRY_PATH = path.join("app", "index.ts");
20
16
  var PREFLIGHT_RNG_SEED = 1337;
@@ -262,3 +258,4 @@ export {
262
258
  runReducerBundleSmoke,
263
259
  assertReducerBundleSmoke
264
260
  };
261
+ //# sourceMappingURL=chunk-Z6OZWUIZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/project/reducer-bundle-preflight.ts"],"sourcesContent":["import path from \"node:path\";\nimport type {\n GameTopologyManifest,\n SetupProfileSpec,\n} from \"@dreamboard-games/sdk/types\";\nimport { isPerPlayer, perPlayerSchema } from \"@dreamboard-games/sdk/reducer\";\nimport {\n type ReducerBundleContract,\n type ReducerWire as Wire,\n} from \"@dreamboard-games/sdk/reducer-contract\";\nimport { materializeManifestTable } from \"@dreamboard-games/sdk/codegen\";\nimport { z } from \"zod\";\nimport { importTypeScriptModule } from \"../../utils/ts-module-loader.js\";\n\n// Opt in to SDK authoring warnings (e.g. concrete dependent-choice defaults).\n// Trusted reducer code cannot read process.env, so the SDK gates authoring\n// warnings on this host-set global instead.\n(globalThis as Record<string, unknown>).__DREAMBOARD_AUTHORING_WARNINGS__ =\n true;\n\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 * Kept stable so local preflight failures reproduce across CLI runs.\n */\nconst PREFLIGHT_RNG_SEED = 1337;\n\n/**\n * Phase of the preflight smoke test that a failure occurred in.\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)` used by the\n * reducer runtime.\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. Exported for tests so we can\n * assert scenario generation without loading 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: SetupProfileSpec[] = 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 // JSON-roundtrip the materialized table to mirror the backend wire\n // boundary: real flows serialize the table over HTTP, which drops\n // explicit `undefined` property values (e.g. optional card text) that\n // the bundle's strict JSON state schema would otherwise reject.\n const table: unknown = JSON.parse(\n JSON.stringify(\n materializeManifestTable({\n manifest,\n playerIds,\n shuffleItems: identityShuffle,\n }),\n ),\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"],"mappings":"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","names":["playerIds","table"]}
@@ -17,3 +17,4 @@ export {
17
17
  FRAMEWORK_REACT_DEPENDENCIES,
18
18
  FRAMEWORK_PNPM_OVERRIDES
19
19
  };
20
+ //# sourceMappingURL=chunk-ZEELHSY3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/project/framework-dependencies.ts"],"sourcesContent":["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"],"mappings":";;;AAAO,IAAM,0BAA0B;AAChC,IAAM,wBAAwB;AAE9B,IAAM,+BAA+B;AAAA,EAC1C,OAAO;AAAA,EACP,aAAa;AACf;AAEO,IAAM,2BAA2B;AAAA,EACtC,GAAG;AAAA,EACH,KAAK;AACP;","names":[]}
@@ -1,56 +1,55 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  resolveRemoteProject
4
- } from "./chunk-7E65UQLY.mjs";
4
+ } from "./chunk-TLYGTHXU.mjs";
5
5
  import {
6
6
  CONFIG_FLAG_ARGS,
7
+ defineCommand,
7
8
  findProjectCompiledResultsForRevision,
8
9
  parseCompileCommandArgs,
9
10
  queueProjectRevisionCompileSdk,
10
11
  waitForCompiledResultJobSdk
11
- } from "./chunk-EOQIV6PS.mjs";
12
- import {
13
- formatCliError
14
- } from "./chunk-BVVNBJM4.mjs";
12
+ } from "./chunk-YR664DJX.mjs";
15
13
  import {
16
14
  getProjectAuthoringState,
17
15
  getProjectPendingAuthoringSync,
18
16
  setLatestCompileAttempt
19
- } from "./chunk-MRCUP5SW.mjs";
17
+ } from "./chunk-YE7UAO3T.mjs";
20
18
  import {
21
19
  runLocalTypecheck
22
- } from "./chunk-CEQ2VJWN.mjs";
20
+ } from "./chunk-POBFNXD4.mjs";
21
+ import {
22
+ formatCliError
23
+ } from "./chunk-COB56ESI.mjs";
23
24
  import {
24
25
  assertCompilerPortableDependencies,
25
26
  assertReleaseEnvironmentPortableDependencies,
26
27
  consola,
27
28
  resolveProjectContext
28
- } from "./chunk-JH22JNYD.mjs";
29
- import "./chunk-HJFQDSTU.mjs";
29
+ } from "./chunk-UIJ2NDG6.mjs";
30
+ import {
31
+ updateProjectState
32
+ } from "./chunk-3IJBOLGT.mjs";
33
+ import "./chunk-W2MDP5ZN.mjs";
30
34
  import {
31
35
  getLocalDiff
32
- } from "./chunk-EIQWDQWJ.mjs";
36
+ } from "./chunk-UWJIZML3.mjs";
37
+ import "./chunk-TAEQKBJB.mjs";
33
38
  import {
34
39
  assertCliStaticScaffoldComplete
35
- } from "./chunk-CJEEA6NJ.mjs";
36
- import "./chunk-2GBBP27W.mjs";
37
- import {
38
- updateProjectState
39
- } from "./chunk-4WD3YU2E.mjs";
40
- import "./chunk-SYPLYRGB.mjs";
41
- import "./chunk-2QMNAVV4.mjs";
42
- import "./chunk-6UUJEYDV.mjs";
43
- import "./chunk-2E5P5NWG.mjs";
44
- import "./chunk-MINCYHXN.mjs";
45
- import "./chunk-U6OJN7XS.mjs";
46
- import "./chunk-54TAYXUD.mjs";
47
- import "./chunk-LM3OZLZG.mjs";
48
- import "./chunk-RBDDIIPM.mjs";
49
- import "./chunk-SHUMAVAP.mjs";
50
- import "./chunk-XYDL7GY6.mjs";
40
+ } from "./chunk-VLOIZDR6.mjs";
41
+ import "./chunk-F2DIOJJZ.mjs";
42
+ import "./chunk-KK47X7RV.mjs";
43
+ import "./chunk-6XRC5PWB.mjs";
44
+ import "./chunk-JZTH3EMV.mjs";
45
+ import "./chunk-QBAF7EYR.mjs";
46
+ import "./chunk-NAK77WXW.mjs";
47
+ import "./chunk-IAYRNVUC.mjs";
48
+ import "./chunk-ZEELHSY3.mjs";
49
+ import "./chunk-M7UVBANQ.mjs";
50
+ import "./chunk-H6XDQJ3N.mjs";
51
51
 
52
52
  // src/commands/compile.ts
53
- import { defineCommand } from "citty";
54
53
  function formatDiagnosticsSummary(diagnostics) {
55
54
  const firstMessage = diagnostics?.find(
56
55
  (diagnostic) => diagnostic.message
@@ -311,3 +310,4 @@ var compile_default = defineCommand({
311
310
  export {
312
311
  compile_default as default
313
312
  };
313
+ //# sourceMappingURL=compile-WZ7X6I2A.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/commands/compile.ts"],"sourcesContent":["import type { CompiledResult } from \"@dreamboard-games/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 {\n assertCompilerPortableDependencies,\n assertReleaseEnvironmentPortableDependencies,\n} from \"../services/project/dependency-portability.js\";\nimport { runLocalTypecheck } from \"../services/project/local-typecheck.js\";\nimport {\n findProjectCompiledResultsForRevision,\n queueProjectRevisionCompileSdk,\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\";\nimport { resolveRemoteProject } from \"../services/project/remote-project.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 revisionDigest: string;\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 revisionDigest: options.revisionDigest,\n authoringStateId: options.authoringStateId ?? options.revisionDigest,\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, config } =\n await resolveProjectContext(parsedArgs);\n let nextProjectConfig = projectConfig;\n await assertReleaseEnvironmentPortableDependencies({\n projectRoot,\n projectConfig: nextProjectConfig,\n environment: config.environment,\n });\n await assertCompilerPortableDependencies({\n projectRoot,\n projectConfig: nextProjectConfig,\n });\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 remoteProject = await resolveRemoteProject({\n projectRoot,\n projectConfig: nextProjectConfig,\n config,\n });\n nextProjectConfig = remoteProject.projectConfig;\n\n const localAuthoring = getProjectAuthoringState(nextProjectConfig);\n const pendingSync = getProjectPendingAuthoringSync(nextProjectConfig);\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 const localRevisionDigest =\n localAuthoring.revisionDigest ?? nextProjectConfig.remoteHeadDigest;\n if (!localRevisionDigest) {\n throw new Error(\n \"This workspace does not know its authored revision yet. Run 'dreamboard sync' first.\",\n );\n }\n\n const remoteRevisionDigest = remoteProject.project.head?.revisionDigest;\n if (!remoteRevisionDigest) {\n throw new Error(\"Remote has no authored project revision to compile yet.\");\n }\n if (remoteRevisionDigest !== localRevisionDigest) {\n throw new Error(\n `Remote project head is ${remoteRevisionDigest} but this workspace is based on ${localRevisionDigest}. 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 findProjectCompiledResultsForRevision({\n projectId: nextProjectConfig.projectId,\n revisionDigest: localRevisionDigest,\n })\n ).find((result) => result.success);\n if (existingCompiledResult) {\n nextProjectConfig = setLatestCompileAttempt(nextProjectConfig, {\n resultId: existingCompiledResult.id,\n jobId: undefined,\n revisionDigest: localRevisionDigest,\n authoringStateId:\n existingCompiledResult.authoringStateId ?? localRevisionDigest,\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 queueProjectRevisionCompileSdk({\n projectId: nextProjectConfig.projectId,\n revisionDigest: localRevisionDigest,\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 projectId: nextProjectConfig.projectId,\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: nextProjectConfig,\n revisionDigest: localRevisionDigest,\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 nextProjectConfig = setLatestCompileAttempt(nextProjectConfig, {\n resultId: compiledResult.id,\n jobId: compileJobId,\n revisionDigest: localRevisionDigest,\n authoringStateId: compiledResult.authoringStateId ?? localRevisionDigest,\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 revision ${localRevisionDigest}.`,\n );\n },\n});\n"],"mappings":"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","names":[]}
@@ -4,14 +4,15 @@ import {
4
4
  getGlobalConfigPath,
5
5
  loadGlobalConfig,
6
6
  saveGlobalConfig
7
- } from "./chunk-HJFQDSTU.mjs";
8
- import "./chunk-MINCYHXN.mjs";
9
- import "./chunk-LM3OZLZG.mjs";
10
- import "./chunk-SHUMAVAP.mjs";
11
- import "./chunk-XYDL7GY6.mjs";
7
+ } from "./chunk-W2MDP5ZN.mjs";
8
+ import "./chunk-TAEQKBJB.mjs";
9
+ import "./chunk-IAYRNVUC.mjs";
10
+ import "./chunk-M7UVBANQ.mjs";
11
+ import "./chunk-H6XDQJ3N.mjs";
12
12
  export {
13
13
  getGlobalAuthPath,
14
14
  getGlobalConfigPath,
15
15
  loadGlobalConfig,
16
16
  saveGlobalConfig
17
17
  };
18
+ //# sourceMappingURL=global-config-XHL7BCKN.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import "./chunk-XYDL7GY6.mjs";
2
+ import "./chunk-H6XDQJ3N.mjs";
3
3
 
4
4
  // src/config/keychain-backend.ts
5
5
  var KEYCHAIN_SERVICE = "dreamboard-cli";
@@ -132,3 +132,4 @@ export {
132
132
  _setKeyringModuleForTests,
133
133
  tryKeychainBackend
134
134
  };
135
+ //# sourceMappingURL=keychain-backend-A3MRWLPF.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/config/keychain-backend.ts"],"sourcesContent":["/**\n * OS keychain-backed `CredentialBackend` built on top of `@napi-rs/keyring`.\n *\n * Keychain is an *opt-in* storage backend, enabled by setting\n * `credentialBackend: \"keychain\"` in `~/.dreamboard/config.json` (see\n * `credential-store.ts` for the resolver). When enabled, it gives us:\n * - A refresh token encrypted at rest by the OS (Keychain on macOS,\n * Credential Vault on Windows, Secret Service on Linux).\n * - Protection against other processes running as the same user tailing\n * `~/.dreamboard/auth.json` to scrape the token.\n *\n * It is not the default because on macOS the first keychain write\n * triggers a login-password prompt, and macOS re-prompts whenever the\n * executing Node binary's code signature changes (e.g. after an\n * `nvm`/`volta` upgrade). The zero-prompt file backend is a better\n * out-of-the-box experience for CLI users.\n *\n * This module is loaded optionally: `@napi-rs/keyring` is declared as an\n * `optionalDependencies` entry so environments where the native binary is\n * unavailable (e.g. Alpine containers, Linux without libsecret, some CI\n * images) still get a working CLI via the file backend fallback.\n *\n * One-time migration: when a user opts into the keychain and `auth.json`\n * still has tokens, `credential-store.ts` copies them into the keychain\n * and deletes the file. This is the only path that intentionally mutates\n * both backends.\n */\n\nimport type {\n CredentialBackend,\n Credentials,\n StoredSessionSnapshot,\n} from \"./credential-store.js\";\n\n/** Keychain service id. Shared across all Dreamboard CLI builds. */\nconst KEYCHAIN_SERVICE = \"dreamboard-cli\";\n/**\n * Keychain account id. The `user@host` shape is conventional but we keep\n * it fixed for now because the CLI only cares about \"the session for this\n * OS user\", not per-process sessions.\n */\nconst KEYCHAIN_ACCOUNT = \"session\";\n\ntype EntryInstance = {\n setPassword(value: string): void;\n getPassword(): string | null | undefined;\n deletePassword(): boolean;\n};\n\ntype KeyringModule = {\n Entry: new (service: string, account: string) => EntryInstance;\n};\n\nlet cachedModule: KeyringModule | null | undefined;\n\nasync function loadKeyringModule(): Promise<KeyringModule | null> {\n if (cachedModule !== undefined) return cachedModule;\n try {\n // `@napi-rs/keyring` is an optional dependency. If the native binary is\n // missing on this platform the dynamic import throws; we swallow that\n // and fall back to the file backend.\n const mod = (await import(\"@napi-rs/keyring\")) as unknown as KeyringModule;\n cachedModule = mod;\n } catch {\n cachedModule = null;\n }\n return cachedModule;\n}\n\nfunction keychainProbe(entry: EntryInstance): boolean {\n // Some platforms have the module installed but no accessible keyring\n // (e.g. headless Linux without DBus). Touch getPassword to verify we\n // can talk to the service without side effects.\n try {\n entry.getPassword();\n return true;\n } catch {\n return false;\n }\n}\n\ntype KeychainPayload = {\n accessToken?: string;\n refreshToken?: string;\n tokenExpiresAt?: string;\n clerkOAuthIssuer?: string;\n clerkOAuthClientId?: string;\n clerkOAuthTokenUrl?: string;\n environment?: string;\n};\n\nfunction parsePayload(\n raw: string | null | undefined,\n): StoredSessionSnapshot | null {\n if (raw === null || raw === undefined) return null;\n const trimmed = raw.trim();\n if (trimmed.length === 0) return null;\n try {\n const parsed = JSON.parse(trimmed) as KeychainPayload;\n if (!parsed.accessToken && !parsed.refreshToken) return null;\n return {\n accessToken: parsed.accessToken || undefined,\n refreshToken: parsed.refreshToken || undefined,\n tokenExpiresAt: parsed.tokenExpiresAt || undefined,\n clerkOAuthIssuer: parsed.clerkOAuthIssuer || undefined,\n clerkOAuthClientId: parsed.clerkOAuthClientId || undefined,\n clerkOAuthTokenUrl: parsed.clerkOAuthTokenUrl || undefined,\n environment: parsed.environment || undefined,\n };\n } catch {\n return null;\n }\n}\n\nfunction writeFull(entry: EntryInstance, creds: Credentials): void {\n if (!creds.accessToken || !creds.refreshToken) {\n throw new Error(\n \"Refusing to persist credentials with an empty accessToken or refreshToken.\",\n );\n }\n const payload: KeychainPayload = {\n accessToken: creds.accessToken,\n refreshToken: creds.refreshToken,\n tokenExpiresAt: creds.tokenExpiresAt,\n clerkOAuthIssuer: creds.clerkOAuthIssuer,\n clerkOAuthClientId: creds.clerkOAuthClientId,\n clerkOAuthTokenUrl: creds.clerkOAuthTokenUrl,\n environment: creds.environment,\n };\n entry.setPassword(JSON.stringify(payload));\n}\n\nfunction writeAccessOnly(entry: EntryInstance, accessToken: string): void {\n if (!accessToken) {\n throw new Error(\"Refusing to persist an empty access token.\");\n }\n const payload: KeychainPayload = { accessToken };\n entry.setPassword(JSON.stringify(payload));\n}\n\nfunction clear(entry: EntryInstance): void {\n try {\n entry.deletePassword();\n } catch {\n // keyring-rs throws when the entry does not exist. That is fine -\n // `clearCredentials` contracts as idempotent.\n }\n}\n\nexport type KeychainAvailability =\n | { available: true; backend: CredentialBackend }\n | { available: false; reason: string };\n\n/**\n * Attempt to construct a keychain-backed `CredentialBackend`. Returns an\n * `available: false` result (with a reason) if the native module, the\n * OS keyring, or the probe fails.\n */\nexport async function tryKeychainBackend(): Promise<KeychainAvailability> {\n const mod = await loadKeyringModule();\n if (!mod) {\n return {\n available: false,\n reason: \"@napi-rs/keyring is not installed for this platform\",\n };\n }\n\n let entry: EntryInstance;\n try {\n entry = new mod.Entry(KEYCHAIN_SERVICE, KEYCHAIN_ACCOUNT);\n } catch (err) {\n return {\n available: false,\n reason: `Failed to construct keyring entry: ${String((err as Error).message ?? err)}`,\n };\n }\n\n if (!keychainProbe(entry)) {\n return {\n available: false,\n reason: \"OS keyring is not accessible from this process\",\n };\n }\n\n const backend: CredentialBackend = {\n name: \"keychain\",\n async read() {\n try {\n return parsePayload(entry.getPassword());\n } catch (err) {\n const message = String((err as Error).message ?? err);\n // Transient keychain access errors (e.g. Touch ID prompt\n // cancelled) should not surface as \"session wiped\". Treat the\n // unreadable state as \"no session\" so the caller can fall back\n // to prompting for login.\n if (/no matching entry|not found/i.test(message)) {\n return null;\n }\n throw err;\n }\n },\n async writeFull(creds) {\n writeFull(entry, creds);\n },\n async writeAccessOnly(accessToken) {\n writeAccessOnly(entry, accessToken);\n },\n async clear() {\n clear(entry);\n },\n };\n return { available: true, backend };\n}\n\n/**\n * Test-only escape hatch so unit tests can install a fake keyring module\n * without going through the dynamic import cache.\n */\nexport function _setKeyringModuleForTests(mod: KeyringModule | null): void {\n cachedModule = mod;\n}\n\nexport function _resetKeyringModuleForTests(): void {\n cachedModule = undefined;\n}\n"],"mappings":"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","names":[]}
@@ -14,19 +14,17 @@ import {
14
14
  writeSnapshot,
15
15
  writeSnapshotFromFiles,
16
16
  writeSourceFiles
17
- } from "./chunk-EIQWDQWJ.mjs";
17
+ } from "./chunk-UWJIZML3.mjs";
18
+ import "./chunk-TAEQKBJB.mjs";
18
19
  import {
19
20
  computeManifestHash
20
- } from "./chunk-SYPLYRGB.mjs";
21
- import "./chunk-2QMNAVV4.mjs";
22
- import "./chunk-6UUJEYDV.mjs";
23
- import "./chunk-2E5P5NWG.mjs";
24
- import "./chunk-MINCYHXN.mjs";
25
- import "./chunk-U6OJN7XS.mjs";
26
- import "./chunk-54TAYXUD.mjs";
27
- import "./chunk-LM3OZLZG.mjs";
28
- import "./chunk-SHUMAVAP.mjs";
29
- import "./chunk-XYDL7GY6.mjs";
21
+ } from "./chunk-6XRC5PWB.mjs";
22
+ import "./chunk-JZTH3EMV.mjs";
23
+ import "./chunk-QBAF7EYR.mjs";
24
+ import "./chunk-NAK77WXW.mjs";
25
+ import "./chunk-IAYRNVUC.mjs";
26
+ import "./chunk-M7UVBANQ.mjs";
27
+ import "./chunk-H6XDQJ3N.mjs";
30
28
  export {
31
29
  collectLocalFiles,
32
30
  computeManifestHash,
@@ -44,3 +42,4 @@ export {
44
42
  writeSnapshotFromFiles,
45
43
  writeSourceFiles
46
44
  };
45
+ //# sourceMappingURL=local-files-ZW52HSVT.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ runLocalTypecheck
4
+ } from "./chunk-POBFNXD4.mjs";
5
+ import "./chunk-M7UVBANQ.mjs";
6
+ import "./chunk-H6XDQJ3N.mjs";
7
+ export {
8
+ runLocalTypecheck
9
+ };
10
+ //# sourceMappingURL=local-typecheck-3JXL2NMG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -2,38 +2,37 @@
2
2
  import {
3
3
  updateProjectAuthoringState,
4
4
  updateProjectLocalMaintainerRegistry
5
- } from "./chunk-MRCUP5SW.mjs";
5
+ } from "./chunk-YE7UAO3T.mjs";
6
+ import {
7
+ updateProjectState
8
+ } from "./chunk-3IJBOLGT.mjs";
6
9
  import {
7
10
  writeManifest,
8
11
  writeRule,
9
12
  writeSnapshot
10
- } from "./chunk-EIQWDQWJ.mjs";
13
+ } from "./chunk-UWJIZML3.mjs";
14
+ import "./chunk-TAEQKBJB.mjs";
11
15
  import {
12
16
  scaffoldStaticWorkspace
13
- } from "./chunk-CJEEA6NJ.mjs";
14
- import "./chunk-2GBBP27W.mjs";
15
- import {
16
- updateProjectState
17
- } from "./chunk-4WD3YU2E.mjs";
18
- import "./chunk-SYPLYRGB.mjs";
19
- import "./chunk-2QMNAVV4.mjs";
20
- import "./chunk-6UUJEYDV.mjs";
21
- import "./chunk-2E5P5NWG.mjs";
22
- import "./chunk-MINCYHXN.mjs";
17
+ } from "./chunk-VLOIZDR6.mjs";
18
+ import "./chunk-F2DIOJJZ.mjs";
19
+ import "./chunk-KK47X7RV.mjs";
20
+ import "./chunk-6XRC5PWB.mjs";
21
+ import "./chunk-JZTH3EMV.mjs";
22
+ import "./chunk-QBAF7EYR.mjs";
23
+ import "./chunk-NAK77WXW.mjs";
23
24
  import {
24
25
  applyWorkspaceCodegen
25
- } from "./chunk-CFU5EWIC.mjs";
26
- import "./chunk-U6OJN7XS.mjs";
27
- import "./chunk-54TAYXUD.mjs";
26
+ } from "./chunk-G42BGGG2.mjs";
28
27
  import {
29
28
  ensureDir
30
- } from "./chunk-LM3OZLZG.mjs";
29
+ } from "./chunk-IAYRNVUC.mjs";
31
30
  import {
32
31
  installWorkspaceDependencies
33
- } from "./chunk-7653FPGJ.mjs";
34
- import "./chunk-RBDDIIPM.mjs";
35
- import "./chunk-SHUMAVAP.mjs";
36
- import "./chunk-XYDL7GY6.mjs";
32
+ } from "./chunk-RHI6S4SU.mjs";
33
+ import "./chunk-ZEELHSY3.mjs";
34
+ import "./chunk-M7UVBANQ.mjs";
35
+ import "./chunk-H6XDQJ3N.mjs";
37
36
 
38
37
  // src/services/project/materialize-workspace.ts
39
38
  import path from "path";
@@ -88,3 +87,4 @@ function baseProjectConfig(input) {
88
87
  export {
89
88
  materializeWorkspaceProject
90
89
  };
90
+ //# sourceMappingURL=materialize-workspace-BKZLLFI4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/project/materialize-workspace.ts"],"sourcesContent":["import path from \"node:path\";\nimport type { GameTopologyManifest } from \"@dreamboard-games/sdk/types\";\nimport type {\n LocalMaintainerRegistryConfig,\n ProjectConfig,\n} from \"../../types.js\";\nimport { ensureDir } from \"../../utils/fs.js\";\nimport { writeManifest, writeRule, writeSnapshot } from \"./local-files.js\";\nimport { scaffoldStaticWorkspace } from \"./static-scaffold.js\";\nimport { applyWorkspaceCodegen } from \"./workspace-codegen.js\";\nimport { installWorkspaceDependencies } from \"./workspace-dependencies.js\";\nimport {\n updateProjectAuthoringState,\n updateProjectLocalMaintainerRegistry,\n} from \"./project-state.js\";\nimport { updateProjectState } from \"../../config/project-config.js\";\n\nexport type MaterializeWorkspaceProjectInput = {\n targetDir: string;\n projectId?: string;\n slug: string;\n gameId: string;\n deploymentId?: string;\n ownerScopeId?: string;\n bindingKey?: string;\n remoteHeadDigest?: string;\n apiBaseUrl: string;\n webBaseUrl: string;\n manifest: GameTopologyManifest;\n ruleText: string;\n ruleId?: string;\n manifestId?: string;\n manifestContentHash?: string;\n localMaintainerRegistry?: LocalMaintainerRegistryConfig | null;\n installDependencies?: boolean;\n agentManaged?: boolean;\n workspacePrepared?: boolean;\n allowCreateGame?: boolean;\n jobId?: string;\n packageManifest?: Record<string, unknown>;\n environmentManifest?: Record<string, unknown>;\n};\n\nexport async function materializeWorkspaceProject(\n input: MaterializeWorkspaceProjectInput,\n): Promise<ProjectConfig> {\n const targetDir = path.resolve(input.targetDir);\n await ensureDir(targetDir);\n await writeManifest(targetDir, input.manifest);\n await writeRule(targetDir, input.ruleText);\n\n await scaffoldStaticWorkspace(targetDir, \"new\", {\n localMaintainerRegistry: input.localMaintainerRegistry,\n });\n await applyWorkspaceCodegen({\n projectRoot: targetDir,\n manifest: input.manifest,\n });\n if (input.installDependencies ?? true) {\n await installWorkspaceDependencies(targetDir);\n }\n\n const authoringConfig =\n input.ruleId && input.manifestId && input.manifestContentHash\n ? updateProjectAuthoringState(baseProjectConfig(input), {\n ruleId: input.ruleId,\n manifestId: input.manifestId,\n manifestContentHash: input.manifestContentHash,\n })\n : baseProjectConfig(input);\n const projectConfig = updateProjectLocalMaintainerRegistry(\n authoringConfig,\n input.localMaintainerRegistry ?? undefined,\n );\n await updateProjectState(targetDir, projectConfig);\n await writeSnapshot(targetDir);\n return projectConfig;\n}\n\nfunction baseProjectConfig(\n input: MaterializeWorkspaceProjectInput,\n): ProjectConfig {\n return {\n schemaVersion: 2,\n projectId: input.projectId ?? input.gameId,\n gameId: input.gameId,\n deploymentId: input.deploymentId ?? \"legacy\",\n ownerScopeId: input.ownerScopeId ?? \"default\",\n bindingKey: input.bindingKey,\n remoteHeadDigest: input.remoteHeadDigest,\n slug: input.slug,\n jobId: input.jobId,\n agentManaged: input.agentManaged,\n workspacePrepared: input.workspacePrepared,\n allowCreateGame: input.allowCreateGame,\n apiBaseUrl: input.apiBaseUrl,\n webBaseUrl: input.webBaseUrl,\n packageManifest: input.packageManifest,\n environmentManifest: input.environmentManifest,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,UAAU;AA2CjB,eAAsB,4BACpB,OACwB;AACxB,QAAM,YAAY,KAAK,QAAQ,MAAM,SAAS;AAC9C,QAAM,UAAU,SAAS;AACzB,QAAM,cAAc,WAAW,MAAM,QAAQ;AAC7C,QAAM,UAAU,WAAW,MAAM,QAAQ;AAEzC,QAAM,wBAAwB,WAAW,OAAO;AAAA,IAC9C,yBAAyB,MAAM;AAAA,EACjC,CAAC;AACD,QAAM,sBAAsB;AAAA,IAC1B,aAAa;AAAA,IACb,UAAU,MAAM;AAAA,EAClB,CAAC;AACD,MAAI,MAAM,uBAAuB,MAAM;AACrC,UAAM,6BAA6B,SAAS;AAAA,EAC9C;AAEA,QAAM,kBACJ,MAAM,UAAU,MAAM,cAAc,MAAM,sBACtC,4BAA4B,kBAAkB,KAAK,GAAG;AAAA,IACpD,QAAQ,MAAM;AAAA,IACd,YAAY,MAAM;AAAA,IAClB,qBAAqB,MAAM;AAAA,EAC7B,CAAC,IACD,kBAAkB,KAAK;AAC7B,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,2BAA2B;AAAA,EACnC;AACA,QAAM,mBAAmB,WAAW,aAAa;AACjD,QAAM,cAAc,SAAS;AAC7B,SAAO;AACT;AAEA,SAAS,kBACP,OACe;AACf,SAAO;AAAA,IACL,eAAe;AAAA,IACf,WAAW,MAAM,aAAa,MAAM;AAAA,IACpC,QAAQ,MAAM;AAAA,IACd,cAAc,MAAM,gBAAgB;AAAA,IACpC,cAAc,MAAM,gBAAgB;AAAA,IACpC,YAAY,MAAM;AAAA,IAClB,kBAAkB,MAAM;AAAA,IACxB,MAAM,MAAM;AAAA,IACZ,OAAO,MAAM;AAAA,IACb,cAAc,MAAM;AAAA,IACpB,mBAAmB,MAAM;AAAA,IACzB,iBAAiB,MAAM;AAAA,IACvB,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,IAClB,iBAAiB,MAAM;AAAA,IACvB,qBAAqB,MAAM;AAAA,EAC7B;AACF;","names":[]}
@@ -13,8 +13,8 @@ import {
13
13
  updateProjectAuthoringState,
14
14
  updateProjectCompileState,
15
15
  updateProjectLocalMaintainerRegistry
16
- } from "./chunk-MRCUP5SW.mjs";
17
- import "./chunk-XYDL7GY6.mjs";
16
+ } from "./chunk-YE7UAO3T.mjs";
17
+ import "./chunk-H6XDQJ3N.mjs";
18
18
  export {
19
19
  clearProjectCompileState,
20
20
  clearProjectPendingAuthoringSync,
@@ -30,3 +30,4 @@ export {
30
30
  updateProjectCompileState,
31
31
  updateProjectLocalMaintainerRegistry
32
32
  };
33
+ //# sourceMappingURL=project-state-XKUSCFSV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import "./chunk-XYDL7GY6.mjs";
2
+ import "./chunk-H6XDQJ3N.mjs";
3
3
 
4
4
  // ../../node_modules/.pnpm/consola@3.4.2/node_modules/consola/dist/chunks/prompt.mjs
5
5
  import "util";
@@ -753,3 +753,4 @@ export {
753
753
  kCancel,
754
754
  prompt
755
755
  };
756
+ //# sourceMappingURL=prompt-VKHMCQT6.mjs.map