@dreamboard-games/sdk 0.2.0

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 (369) hide show
  1. package/LICENSE.md +96 -0
  2. package/README.md +12 -0
  3. package/dist/HandView-ncJIVLhN.d.ts +193 -0
  4. package/dist/ResourceCounter-CTREyF73.d.ts +102 -0
  5. package/dist/ThemeProvider-fy0_QzgO.d.ts +99 -0
  6. package/dist/bundle-TIZcw8LB.d.ts +281 -0
  7. package/dist/cards-Sl3b40Mv.d.ts +13 -0
  8. package/dist/chunk-7YAHLYBR.js +481 -0
  9. package/dist/chunk-7YAHLYBR.js.map +1 -0
  10. package/dist/chunk-FDNZTDD6.js +8085 -0
  11. package/dist/chunk-FDNZTDD6.js.map +1 -0
  12. package/dist/chunk-GKKBPPSW.js +598 -0
  13. package/dist/chunk-GKKBPPSW.js.map +1 -0
  14. package/dist/chunk-I46YJSOD.js +1 -0
  15. package/dist/chunk-I46YJSOD.js.map +1 -0
  16. package/dist/chunk-KAELH4KC.js +104 -0
  17. package/dist/chunk-KAELH4KC.js.map +1 -0
  18. package/dist/chunk-PZ5AY32C.js +10 -0
  19. package/dist/chunk-PZ5AY32C.js.map +1 -0
  20. package/dist/chunk-T3ZKNUZ7.js +1 -0
  21. package/dist/chunk-T3ZKNUZ7.js.map +1 -0
  22. package/dist/chunk-T52J5RMF.js +1 -0
  23. package/dist/chunk-T52J5RMF.js.map +1 -0
  24. package/dist/chunk-TDSWKVZ4.js +5401 -0
  25. package/dist/chunk-TDSWKVZ4.js.map +1 -0
  26. package/dist/chunk-U5C6BONG.js +34 -0
  27. package/dist/chunk-U5C6BONG.js.map +1 -0
  28. package/dist/chunk-VDXOF4FW.js +69 -0
  29. package/dist/chunk-VDXOF4FW.js.map +1 -0
  30. package/dist/chunk-VFTAA4WO.js +115 -0
  31. package/dist/chunk-VFTAA4WO.js.map +1 -0
  32. package/dist/chunk-WN74KVNY.js +17 -0
  33. package/dist/chunk-WN74KVNY.js.map +1 -0
  34. package/dist/chunk-WYPQ3GG5.js +10990 -0
  35. package/dist/chunk-WYPQ3GG5.js.map +1 -0
  36. package/dist/components-D5ZRE2Hl.d.ts +1451 -0
  37. package/dist/generated/runtime/primitives.d.ts +12 -0
  38. package/dist/generated/runtime/primitives.js +180 -0
  39. package/dist/generated/runtime/primitives.js.map +1 -0
  40. package/dist/generated/runtime-api.d.ts +3 -0
  41. package/dist/generated/runtime-api.js +2 -0
  42. package/dist/generated/runtime-api.js.map +1 -0
  43. package/dist/generated/runtime.d.ts +14 -0
  44. package/dist/generated/runtime.js +18 -0
  45. package/dist/generated/runtime.js.map +1 -0
  46. package/dist/generated/workspace-contract.d.ts +14 -0
  47. package/dist/generated/workspace-contract.js +14 -0
  48. package/dist/generated/workspace-contract.js.map +1 -0
  49. package/dist/hex-board-view-D_07hO6O.d.ts +933 -0
  50. package/dist/hex-color-MhOyuY-o.d.ts +8 -0
  51. package/dist/index-BwqPQtBu.d.ts +1433 -0
  52. package/dist/index.d.ts +1 -0
  53. package/dist/index.js +12 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/infrastructure/reducer-bundle-abi.d.ts +1083 -0
  56. package/dist/infrastructure/reducer-bundle-abi.js +14 -0
  57. package/dist/infrastructure/reducer-bundle-abi.js.map +1 -0
  58. package/dist/infrastructure/workspace-codegen.d.ts +53 -0
  59. package/dist/infrastructure/workspace-codegen.js +44 -0
  60. package/dist/infrastructure/workspace-codegen.js.map +1 -0
  61. package/dist/manifest-contract-BNHVGFtU.d.ts +9 -0
  62. package/dist/package-set.d.ts +13 -0
  63. package/dist/package-set.js +12 -0
  64. package/dist/package-set.js.map +1 -0
  65. package/dist/primitive-props-DpKs-GCr.d.ts +11 -0
  66. package/dist/reducer.d.ts +3786 -0
  67. package/dist/reducer.js +8131 -0
  68. package/dist/reducer.js.map +1 -0
  69. package/dist/runtime/primitives.d.ts +226 -0
  70. package/dist/runtime/primitives.js +180 -0
  71. package/dist/runtime/primitives.js.map +1 -0
  72. package/dist/runtime/types/runtime-api.d.ts +1 -0
  73. package/dist/runtime/types/runtime-api.js +2 -0
  74. package/dist/runtime/types/runtime-api.js.map +1 -0
  75. package/dist/runtime/workspace-contract.d.ts +172 -0
  76. package/dist/runtime/workspace-contract.js +14 -0
  77. package/dist/runtime/workspace-contract.js.map +1 -0
  78. package/dist/runtime-api-3dshj6kK.d.ts +101 -0
  79. package/dist/runtime-api-DWxvTr-O.d.ts +379 -0
  80. package/dist/runtime.d.ts +58 -0
  81. package/dist/runtime.js +13 -0
  82. package/dist/runtime.js.map +1 -0
  83. package/dist/slots-1GPGihk8.d.ts +8 -0
  84. package/dist/testing.d.ts +149 -0
  85. package/dist/testing.js +513 -0
  86. package/dist/testing.js.map +1 -0
  87. package/dist/types.d.ts +496 -0
  88. package/dist/types.js +28 -0
  89. package/dist/types.js.map +1 -0
  90. package/dist/ui/components.d.ts +16 -0
  91. package/dist/ui/components.js +192 -0
  92. package/dist/ui/components.js.map +1 -0
  93. package/dist/ui/defaults.d.ts +19 -0
  94. package/dist/ui/defaults.js +104 -0
  95. package/dist/ui/defaults.js.map +1 -0
  96. package/dist/ui/plugin-styles.css +250 -0
  97. package/dist/ui/types/player-state.d.ts +365 -0
  98. package/dist/ui/types/player-state.js +1 -0
  99. package/dist/ui/types/player-state.js.map +1 -0
  100. package/dist/ui-contract-iQfTtUSL.d.ts +1161 -0
  101. package/dist/ui.d.ts +320 -0
  102. package/dist/ui.js +253 -0
  103. package/dist/ui.js.map +1 -0
  104. package/package.json +199 -0
  105. package/src/generated/reducer-contract/builders.ts +90 -0
  106. package/src/generated/reducer-contract/version.ts +9 -0
  107. package/src/generated/reducer-contract/wire.ts +100 -0
  108. package/src/generated/reducer-contract/zod.ts +101 -0
  109. package/src/generated/runtime/primitives.ts +2 -0
  110. package/src/generated/runtime-api.ts +5 -0
  111. package/src/generated/runtime.ts +35 -0
  112. package/src/generated/workspace-contract.ts +2 -0
  113. package/src/index.ts +7 -0
  114. package/src/infrastructure/reducer-bundle-abi.ts +8 -0
  115. package/src/infrastructure/reducer-contract/bundle.ts +37 -0
  116. package/src/infrastructure/workspace-codegen/hex-geometry.ts +69 -0
  117. package/src/infrastructure/workspace-codegen/index.ts +64 -0
  118. package/src/infrastructure/workspace-codegen/manifest-contract.ts +6632 -0
  119. package/src/infrastructure/workspace-codegen/manifest-validation.ts +795 -0
  120. package/src/infrastructure/workspace-codegen/ownership.ts +131 -0
  121. package/src/infrastructure/workspace-codegen/preset-card-sets.ts +169 -0
  122. package/src/infrastructure/workspace-codegen/seeds.ts +1705 -0
  123. package/src/infrastructure/workspace-codegen.ts +1 -0
  124. package/src/package-set.ts +19 -0
  125. package/src/reducer/authoring/contract.ts +157 -0
  126. package/src/reducer/authoring/effect.ts +224 -0
  127. package/src/reducer/authoring/game.ts +23 -0
  128. package/src/reducer/authoring/interaction.ts +98 -0
  129. package/src/reducer/authoring/phase.ts +300 -0
  130. package/src/reducer/authoring/types.ts +70 -0
  131. package/src/reducer/authoring/validation.ts +382 -0
  132. package/src/reducer/authoring/view-stage.ts +68 -0
  133. package/src/reducer/authoring.ts +29 -0
  134. package/src/reducer/bundle/ingress-bundle.ts +491 -0
  135. package/src/reducer/bundle/trusted/engine-instruction-resolver.ts +254 -0
  136. package/src/reducer/bundle/trusted/flow-instruction-resolver.ts +73 -0
  137. package/src/reducer/bundle/trusted/instruction-runner.ts +414 -0
  138. package/src/reducer/bundle/trusted/interaction-authorization.ts +137 -0
  139. package/src/reducer/bundle/trusted/interaction-collectors.ts +859 -0
  140. package/src/reducer/bundle/trusted/interaction-decision.ts +747 -0
  141. package/src/reducer/bundle/trusted/interaction-resolver.ts +95 -0
  142. package/src/reducer/bundle/trusted/interaction-types.ts +171 -0
  143. package/src/reducer/bundle/trusted/lifecycle-runner.ts +427 -0
  144. package/src/reducer/bundle/trusted/projection-builder.ts +356 -0
  145. package/src/reducer/bundle/trusted/projection-context.ts +39 -0
  146. package/src/reducer/bundle/trusted/rng-sampler.ts +150 -0
  147. package/src/reducer/bundle/trusted/runtime-registry.ts +120 -0
  148. package/src/reducer/bundle/trusted/runtime-scope.ts +336 -0
  149. package/src/reducer/bundle/trusted/simultaneous-player.ts +97 -0
  150. package/src/reducer/bundle/trusted/stage-resolver.ts +87 -0
  151. package/src/reducer/bundle/trusted/static-projection.ts +116 -0
  152. package/src/reducer/bundle/trusted/trusted-runtime-args.ts +97 -0
  153. package/src/reducer/bundle/trusted/trusted-runtime-result.ts +39 -0
  154. package/src/reducer/bundle/trusted/trusted-setup-profiles.ts +43 -0
  155. package/src/reducer/bundle/trusted/trusted-state-codec.ts +48 -0
  156. package/src/reducer/bundle/trusted-bundle.ts +97 -0
  157. package/src/reducer/bundle/types.ts +171 -0
  158. package/src/reducer/bundle.ts +2 -0
  159. package/src/reducer/client-param-schemas.ts +57 -0
  160. package/src/reducer/compose.ts +34 -0
  161. package/src/reducer/core/runtime-input.ts +30 -0
  162. package/src/reducer/core/runtime-instruction.ts +59 -0
  163. package/src/reducer/core/types.ts +62 -0
  164. package/src/reducer/definition-index.ts +277 -0
  165. package/src/reducer/derived.ts +106 -0
  166. package/src/reducer/effects.ts +92 -0
  167. package/src/reducer/engine/runtime-instruction-engine.ts +155 -0
  168. package/src/reducer/ingress/decode-runtime-input.ts +7 -0
  169. package/src/reducer/ingress/decode-session-state.ts +9 -0
  170. package/src/reducer/ingress/encode-session-state.ts +6 -0
  171. package/src/reducer/ingress/input-codec.ts +18 -0
  172. package/src/reducer/ingress/phase-schemas.ts +62 -0
  173. package/src/reducer/ingress/raw-types.ts +107 -0
  174. package/src/reducer/ingress/runtime-codec.ts +14 -0
  175. package/src/reducer/ingress/runtime-payload.ts +13 -0
  176. package/src/reducer/ingress/session-codec.ts +392 -0
  177. package/src/reducer/ingress/types.ts +6 -0
  178. package/src/reducer/inputs/boardInput.ts +217 -0
  179. package/src/reducer/inputs/boardTarget.ts +190 -0
  180. package/src/reducer/inputs/cardInput.ts +86 -0
  181. package/src/reducer/inputs/cardTarget.ts +101 -0
  182. package/src/reducer/inputs/choiceTarget.ts +104 -0
  183. package/src/reducer/inputs/defineInputs.ts +71 -0
  184. package/src/reducer/inputs/formInput.ts +809 -0
  185. package/src/reducer/inputs/many.ts +120 -0
  186. package/src/reducer/inputs/promptInput.ts +87 -0
  187. package/src/reducer/inputs/rngInput.ts +58 -0
  188. package/src/reducer/inputs/targetRule.ts +123 -0
  189. package/src/reducer/inputs.ts +41 -0
  190. package/src/reducer/model/definition.ts +1072 -0
  191. package/src/reducer/model/extract.ts +745 -0
  192. package/src/reducer/model/manifest.ts +570 -0
  193. package/src/reducer/model/queries.ts +641 -0
  194. package/src/reducer/model/runtime.ts +264 -0
  195. package/src/reducer/model/spec.ts +1386 -0
  196. package/src/reducer/model/table.ts +260 -0
  197. package/src/reducer/model.ts +7 -0
  198. package/src/reducer/ops.ts +1034 -0
  199. package/src/reducer/parse-utils.ts +28 -0
  200. package/src/reducer/per-player.ts +422 -0
  201. package/src/reducer/rng.ts +69 -0
  202. package/src/reducer/schema-helpers.ts +185 -0
  203. package/src/reducer/setup-bootstrap-helpers.ts +171 -0
  204. package/src/reducer/setup-bootstrap.ts +481 -0
  205. package/src/reducer/table-ops.ts +2671 -0
  206. package/src/reducer/table-queries.ts +372 -0
  207. package/src/reducer/transaction.ts +120 -0
  208. package/src/reducer.ts +314 -0
  209. package/src/runtime/primitives.ts +1 -0
  210. package/src/runtime/types/runtime-api.ts +1 -0
  211. package/src/runtime/workspace-contract.ts +32 -0
  212. package/src/runtime-internal/components/InteractionForm.tsx +1309 -0
  213. package/src/runtime-internal/components/PluginRuntime.tsx +103 -0
  214. package/src/runtime-internal/components/board/target-layer.ts +70 -0
  215. package/src/runtime-internal/context/ClientParamSchemaContext.tsx +44 -0
  216. package/src/runtime-internal/context/InteractionDraftContext.tsx +279 -0
  217. package/src/runtime-internal/context/PluginSessionContext.tsx +47 -0
  218. package/src/runtime-internal/context/PluginStateContext.tsx +262 -0
  219. package/src/runtime-internal/context/RuntimeContext.tsx +96 -0
  220. package/src/runtime-internal/defaults/components.tsx +409 -0
  221. package/src/runtime-internal/defaults/index.ts +11 -0
  222. package/src/runtime-internal/errors/ValidationError.ts +29 -0
  223. package/src/runtime-internal/hooks/useActivePlayers.ts +33 -0
  224. package/src/runtime-internal/hooks/useBoardInteractions.ts +665 -0
  225. package/src/runtime-internal/hooks/useGameSelector.ts +105 -0
  226. package/src/runtime-internal/hooks/useGameView.ts +9 -0
  227. package/src/runtime-internal/hooks/useInteractionByKey.ts +354 -0
  228. package/src/runtime-internal/hooks/useInteractionHandle.ts +438 -0
  229. package/src/runtime-internal/hooks/useIsMyTurn.ts +20 -0
  230. package/src/runtime-internal/hooks/useLobby.ts +76 -0
  231. package/src/runtime-internal/hooks/useMe.ts +48 -0
  232. package/src/runtime-internal/hooks/usePlayerInfo.ts +28 -0
  233. package/src/runtime-internal/hooks/usePlayerTurnOrder.ts +23 -0
  234. package/src/runtime-internal/hooks/usePluginRuntime.ts +147 -0
  235. package/src/runtime-internal/hooks/useSeatInbox.ts +61 -0
  236. package/src/runtime-internal/hooks/useSimultaneousPhase.ts +10 -0
  237. package/src/runtime-internal/index.ts +42 -0
  238. package/src/runtime-internal/internal.ts +43 -0
  239. package/src/runtime-internal/plugin-styles.css +250 -0
  240. package/src/runtime-internal/primitives/board.tsx +459 -0
  241. package/src/runtime-internal/primitives/dialog-lifecycle.ts +58 -0
  242. package/src/runtime-internal/primitives/dice.tsx +79 -0
  243. package/src/runtime-internal/primitives/game-ui-provider.tsx +35 -0
  244. package/src/runtime-internal/primitives/game.tsx +387 -0
  245. package/src/runtime-internal/primitives/hand-intent-adapter.ts +147 -0
  246. package/src/runtime-internal/primitives/hand-surface.tsx +594 -0
  247. package/src/runtime-internal/primitives/index.ts +196 -0
  248. package/src/runtime-internal/primitives/interaction-form-binding.tsx +56 -0
  249. package/src/runtime-internal/primitives/interaction-submit.ts +90 -0
  250. package/src/runtime-internal/primitives/interaction.tsx +987 -0
  251. package/src/runtime-internal/primitives/phase.tsx +43 -0
  252. package/src/runtime-internal/primitives/player-roster.tsx +302 -0
  253. package/src/runtime-internal/primitives/primitive-props.tsx +101 -0
  254. package/src/runtime-internal/primitives/prompt.tsx +255 -0
  255. package/src/runtime-internal/primitives/ui.tsx +60 -0
  256. package/src/runtime-internal/primitives/zone.tsx +791 -0
  257. package/src/runtime-internal/reducer.ts +30 -0
  258. package/src/runtime-internal/runtime/createPluginRuntimeAPI.ts +605 -0
  259. package/src/runtime-internal/types/plugin-state.ts +508 -0
  260. package/src/runtime-internal/types/reducer-state.ts +24 -0
  261. package/src/runtime-internal/types/runtime-api.ts +114 -0
  262. package/src/runtime-internal/ui-contract.ts +519 -0
  263. package/src/runtime-internal/utils/card-intent-adapter.ts +546 -0
  264. package/src/runtime-internal/utils/interaction-inputs.ts +492 -0
  265. package/src/runtime-internal/utils/interaction-labels.ts +23 -0
  266. package/src/runtime-internal/utils/interaction-router.ts +273 -0
  267. package/src/runtime-internal/utils/interaction-status.ts +74 -0
  268. package/src/runtime-internal/workspace-contract.ts +1170 -0
  269. package/src/runtime.ts +34 -0
  270. package/src/testing/create-expect-api.ts +352 -0
  271. package/src/testing/create-test-runtime.ts +381 -0
  272. package/src/testing/definitions.ts +127 -0
  273. package/src/testing/index.ts +3 -0
  274. package/src/testing.ts +1 -0
  275. package/src/type-stubs/manifest-contract.d.ts +42 -0
  276. package/src/type-stubs/manifest-contract.js +72 -0
  277. package/src/type-stubs/ui-contract.d.ts +5 -0
  278. package/src/type-stubs/ui-contract.js +1 -0
  279. package/src/types/authoring-card-properties.type-test.ts +266 -0
  280. package/src/types/authoring.ts +1282 -0
  281. package/src/types/cards.ts +19 -0
  282. package/src/types/contracts.ts +1550 -0
  283. package/src/types/generated-helpers.ts +35 -0
  284. package/src/types/index.ts +147 -0
  285. package/src/types/slots.ts +11 -0
  286. package/src/types.ts +1 -0
  287. package/src/ui/components/ActionButton.tsx +97 -0
  288. package/src/ui/components/ActionPanel.tsx +315 -0
  289. package/src/ui/components/Card.tsx +378 -0
  290. package/src/ui/components/CardDragSurface.tsx +1076 -0
  291. package/src/ui/components/ChromeSuppressionContext.tsx +70 -0
  292. package/src/ui/components/CostDisplay.tsx +145 -0
  293. package/src/ui/components/DiceRoller.tsx +581 -0
  294. package/src/ui/components/Drawer.tsx +180 -0
  295. package/src/ui/components/ErrorBoundary.tsx +275 -0
  296. package/src/ui/components/GameEndDisplay.tsx +398 -0
  297. package/src/ui/components/GameSkeleton.tsx +260 -0
  298. package/src/ui/components/Hand.tsx +468 -0
  299. package/src/ui/components/HandDock.tsx +299 -0
  300. package/src/ui/components/HandView.tsx +441 -0
  301. package/src/ui/components/MobileHandTray.tsx +381 -0
  302. package/src/ui/components/MoreActions.tsx +143 -0
  303. package/src/ui/components/PhaseIndicator.tsx +341 -0
  304. package/src/ui/components/PlayArea.tsx +146 -0
  305. package/src/ui/components/PrimaryActionButton.tsx +336 -0
  306. package/src/ui/components/PrimaryButton.tsx +45 -0
  307. package/src/ui/components/ResourceCounter.tsx +270 -0
  308. package/src/ui/components/StagingZone.tsx +134 -0
  309. package/src/ui/components/ThemedButton.tsx +113 -0
  310. package/src/ui/components/Toast.tsx +264 -0
  311. package/src/ui/components/board/HexGrid.tsx +1294 -0
  312. package/src/ui/components/board/NetworkGraph.tsx +476 -0
  313. package/src/ui/components/board/SlotSystem.tsx +388 -0
  314. package/src/ui/components/board/SquareGrid.tsx +1165 -0
  315. package/src/ui/components/board/TrackBoard.tsx +496 -0
  316. package/src/ui/components/board/ZoneMap.tsx +448 -0
  317. package/src/ui/components/board/hex-board-view.ts +123 -0
  318. package/src/ui/components/board/index.ts +142 -0
  319. package/src/ui/components/board/interaction-accessibility.ts +21 -0
  320. package/src/ui/components/board/target-layer.ts +66 -0
  321. package/src/ui/components/card-render-content.type-test.ts +27 -0
  322. package/src/ui/components/hand-layout-math.ts +163 -0
  323. package/src/ui/components/hand-pointer-engine.ts +413 -0
  324. package/src/ui/components/index.ts +245 -0
  325. package/src/ui/components.ts +1 -0
  326. package/src/ui/defaults/components.tsx +106 -0
  327. package/src/ui/defaults/index.ts +8 -0
  328. package/src/ui/defaults.ts +1 -0
  329. package/src/ui/errors/ValidationError.ts +29 -0
  330. package/src/ui/helpers/cards.ts +19 -0
  331. package/src/ui/helpers/track-board.ts +211 -0
  332. package/src/ui/hooks/useBoardTopology.ts +316 -0
  333. package/src/ui/hooks/useCards.ts +10 -0
  334. package/src/ui/hooks/useHandCardPointer.ts +381 -0
  335. package/src/ui/hooks/useHandLayout.ts +378 -0
  336. package/src/ui/hooks/useHandPresentation.ts +121 -0
  337. package/src/ui/hooks/useHexBoard.ts +74 -0
  338. package/src/ui/hooks/useHexGrid.ts +185 -0
  339. package/src/ui/hooks/useIsMobile.ts +35 -0
  340. package/src/ui/hooks/usePanZoom.ts +278 -0
  341. package/src/ui/hooks/useSquareBoard.ts +124 -0
  342. package/src/ui/hooks/useSquareGrid.ts +328 -0
  343. package/src/ui/index.ts +98 -0
  344. package/src/ui/internal/ui/alert.tsx +51 -0
  345. package/src/ui/internal/ui/button.tsx +58 -0
  346. package/src/ui/internal/ui/dialog.tsx +134 -0
  347. package/src/ui/internal/ui/input.tsx +21 -0
  348. package/src/ui/internal/ui/label.tsx +21 -0
  349. package/src/ui/internal/ui/select.tsx +129 -0
  350. package/src/ui/internal/ui/tooltip.tsx +54 -0
  351. package/src/ui/internal/ui/utils.ts +5 -0
  352. package/src/ui/plugin-styles.css +250 -0
  353. package/src/ui/primitives/dialog-lifecycle.ts +58 -0
  354. package/src/ui/primitives/dice.tsx +79 -0
  355. package/src/ui/primitives/primitive-props.tsx +101 -0
  356. package/src/ui/theme/ThemeProvider.tsx +252 -0
  357. package/src/ui/theme/board.ts +61 -0
  358. package/src/ui/theme/css-vars.ts +105 -0
  359. package/src/ui/theme/derive.ts +240 -0
  360. package/src/ui/theme/index.ts +61 -0
  361. package/src/ui/theme/presets/arcade.ts +261 -0
  362. package/src/ui/theme/presets/studio.ts +261 -0
  363. package/src/ui/theme/presets/tabletop.ts +266 -0
  364. package/src/ui/theme/tokens.ts +392 -0
  365. package/src/ui/types/hex-color.ts +20 -0
  366. package/src/ui/types/player-state.ts +463 -0
  367. package/src/ui/types/tiled-board.ts +785 -0
  368. package/src/ui/types/visual-state.ts +137 -0
  369. package/src/ui.ts +1 -0
@@ -0,0 +1,97 @@
1
+ import { createDerivedResolver } from "../../derived";
2
+ import type { DerivedResolver } from "../../derived";
3
+ import { createReducerFx } from "../../effects";
4
+ import { createStateQueries } from "../../table-queries";
5
+ import type {
6
+ ActionContext,
7
+ BaseGameStateOfContract,
8
+ ManifestContractOf,
9
+ PlayerIdOfState,
10
+ RandomHelpers,
11
+ ReducerGameContractLike,
12
+ TableQueriesOfState,
13
+ } from "../../model";
14
+ import type { TrustedRuntimeHelpers, TrustedState } from "./runtime-scope";
15
+
16
+ export function fxForState<Contract extends ReducerGameContractLike>(
17
+ state: TrustedState<Contract>,
18
+ ) {
19
+ return createReducerFx<TrustedState<Contract>>(state);
20
+ }
21
+
22
+ export function buildContext<Contract extends ReducerGameContractLike>(
23
+ state: TrustedState<Contract>,
24
+ manifest: ManifestContractOf<Contract>,
25
+ ): ActionContext<
26
+ BaseGameStateOfContract<Contract>,
27
+ ManifestContractOf<Contract>
28
+ > {
29
+ type DomainState = BaseGameStateOfContract<Contract>;
30
+ type PlayerId = PlayerIdOfState<DomainState>;
31
+ type Manifest = ManifestContractOf<Contract>;
32
+ return {
33
+ currentPhase: state.flow.currentPhase as ActionContext<
34
+ DomainState,
35
+ Manifest
36
+ >["currentPhase"],
37
+ manifest,
38
+ playerOrder: [...state.table.playerOrder] as PlayerId[],
39
+ activePlayers: [...state.flow.activePlayers] as PlayerId[],
40
+ runtime: publicRuntime(state.runtime),
41
+ setup: (state.runtime.setup
42
+ ? {
43
+ profileId: state.runtime.setup.profileId,
44
+ optionValues: {
45
+ ...state.runtime.setup.optionValues,
46
+ },
47
+ }
48
+ : null) as ActionContext<DomainState, Manifest>["setup"],
49
+ };
50
+ }
51
+
52
+ function publicRuntime<Runtime extends { rng?: unknown }>(
53
+ runtime: Runtime,
54
+ ): Omit<Runtime, "rng"> {
55
+ const { rng: _rng, ...rest } = runtime;
56
+ return rest;
57
+ }
58
+
59
+ const DISABLED_RANDOM_HELPERS: RandomHelpers = {
60
+ subset() {
61
+ throw new Error(
62
+ "random helpers are only available in reducer mutation callbacks.",
63
+ );
64
+ },
65
+ };
66
+
67
+ export function buildRuntimeArgs<
68
+ Contract extends ReducerGameContractLike,
69
+ Extra extends object,
70
+ >(
71
+ state: TrustedState<Contract>,
72
+ manifest: ManifestContractOf<Contract>,
73
+ helpers: TrustedRuntimeHelpers<Contract>,
74
+ toDomainState: (
75
+ state: TrustedState<Contract>,
76
+ ) => BaseGameStateOfContract<Contract>,
77
+ extra: Extra,
78
+ options: {
79
+ q?: TableQueriesOfState<BaseGameStateOfContract<Contract>>;
80
+ derived?: DerivedResolver;
81
+ fx?: ReturnType<typeof createReducerFx<TrustedState<Contract>>>;
82
+ random?: RandomHelpers;
83
+ } = {},
84
+ ) {
85
+ const domainState = toDomainState(state);
86
+ const q = options.q ?? createStateQueries(domainState);
87
+ return {
88
+ ...buildContext(state, manifest),
89
+ ...helpers,
90
+ fx: options.fx ?? fxForState(state),
91
+ q,
92
+ derived: options.derived ?? createDerivedResolver(domainState, { q }),
93
+ runtime: publicRuntime(state.runtime),
94
+ random: options.random ?? DISABLED_RANDOM_HELPERS,
95
+ ...extra,
96
+ };
97
+ }
@@ -0,0 +1,39 @@
1
+ import type { RuntimeInstructionForState } from "../../core/runtime-instruction";
2
+ import type { ReducerReject, ReducerResult } from "../../model";
3
+
4
+ export function acceptResult<State>(
5
+ state: State,
6
+ instructions: Array<RuntimeInstructionForState<State>> = [],
7
+ ) {
8
+ return {
9
+ type: "accept" as const,
10
+ state,
11
+ instructions,
12
+ };
13
+ }
14
+
15
+ export function rejectResult(
16
+ errorCode: string,
17
+ message?: string,
18
+ ): ReducerReject {
19
+ return {
20
+ type: "reject",
21
+ errorCode,
22
+ message,
23
+ };
24
+ }
25
+
26
+ export function normalizeResult<State>(
27
+ result: ReducerResult<State> | void,
28
+ fallbackState: State,
29
+ ): ReducerResult<State> {
30
+ if (result === undefined || result === null) {
31
+ return acceptResult(fallbackState);
32
+ }
33
+ return result;
34
+ }
35
+
36
+ export const runtimeResultHelpers = {
37
+ accept: acceptResult,
38
+ reject: rejectResult,
39
+ };
@@ -0,0 +1,43 @@
1
+ import type {
2
+ PhaseMapOf,
3
+ ReducerGameContractLike,
4
+ ReducerGameDefinition,
5
+ ViewMapOf,
6
+ } from "../../model";
7
+
8
+ export function resolveTrustedSetupProfiles<
9
+ Contract extends ReducerGameContractLike,
10
+ Definitions extends PhaseMapOf<Contract>,
11
+ Views extends ViewMapOf<Contract>,
12
+ >(definition: ReducerGameDefinition<Contract, Definitions, Views>) {
13
+ const manifestSetupProfilesById =
14
+ definition.contract.manifest.setupProfilesById;
15
+ const manifestSetupProfileIds = Object.keys(manifestSetupProfilesById).sort();
16
+ const reducerSetupProfiles = definition.setupProfiles ?? {};
17
+ const reducerSetupProfileIds = Object.keys(reducerSetupProfiles).sort();
18
+ if (
19
+ manifestSetupProfileIds.length !== reducerSetupProfileIds.length ||
20
+ manifestSetupProfileIds.some(
21
+ (profileId, index) => reducerSetupProfileIds[index] !== profileId,
22
+ )
23
+ ) {
24
+ throw new Error(
25
+ `Reducer setupProfiles must exactly match manifest setupProfiles. Manifest=[${manifestSetupProfileIds.join(", ")}], reducer=[${reducerSetupProfileIds.join(", ")}].`,
26
+ );
27
+ }
28
+ return {
29
+ manifestSetupProfilesById,
30
+ reducerSetupProfiles,
31
+ };
32
+ }
33
+
34
+ export function resolveDefaultInitialPhase<PhaseName extends string>(
35
+ explicitInitialPhase: PhaseName | undefined,
36
+ phaseEntries: ReadonlyArray<readonly [PhaseName, unknown]>,
37
+ ): PhaseName {
38
+ const defaultInitialPhase = explicitInitialPhase ?? phaseEntries[0]?.[0];
39
+ if (!defaultInitialPhase) {
40
+ throw new Error("Reducer-native games must define at least one phase.");
41
+ }
42
+ return defaultInitialPhase;
43
+ }
@@ -0,0 +1,48 @@
1
+ export function toDomainState<State extends { runtime: unknown }, DomainState>(
2
+ state: State,
3
+ ): DomainState {
4
+ const { runtime: _runtime, ...domain } = state;
5
+ attachPhaseAccessor(domain);
6
+ return domain as DomainState;
7
+ }
8
+
9
+ export function toCombinedState<
10
+ SessionState extends { domain: unknown; runtime: unknown },
11
+ State,
12
+ >(session: SessionState): State {
13
+ const combined = {
14
+ ...(session.domain as object),
15
+ runtime: session.runtime,
16
+ };
17
+ attachPhaseAccessor(combined);
18
+ return combined as State;
19
+ }
20
+
21
+ export function toSessionState<
22
+ State extends { runtime: unknown },
23
+ DomainState,
24
+ SessionState,
25
+ >(state: State, toDomain: (state: State) => DomainState): SessionState {
26
+ return {
27
+ domain: toDomain(state),
28
+ runtime: state.runtime,
29
+ } as SessionState;
30
+ }
31
+
32
+ function attachPhaseAccessor(state: unknown): void {
33
+ if (!state || typeof state !== "object") return;
34
+ const candidate = state as {
35
+ flow?: { currentPhase?: unknown };
36
+ phase?: unknown;
37
+ };
38
+ const phase = candidate.phase;
39
+ if (!phase || typeof phase !== "object") return;
40
+ const descriptor = Object.getOwnPropertyDescriptor(phase, "get");
41
+ if (descriptor && typeof descriptor.value === "function") return;
42
+ Object.defineProperty(phase, "get", {
43
+ enumerable: false,
44
+ configurable: true,
45
+ value: (phaseName: string) =>
46
+ candidate.flow?.currentPhase === phaseName ? phase : null,
47
+ });
48
+ }
@@ -0,0 +1,97 @@
1
+ import type { TrustedReducerBundle } from "./types";
2
+ import type {
3
+ PhaseMapOf,
4
+ ReducerGameContractLike,
5
+ ReducerGameDefinition,
6
+ ViewMapOf,
7
+ } from "../model";
8
+ import { createTrustedInstructionRunner } from "./trusted/instruction-runner";
9
+ import { createInteractionResolver } from "./trusted/interaction-resolver";
10
+ import { createLifecycleRunner } from "./trusted/lifecycle-runner";
11
+ import { createProjectionBuilder } from "./trusted/projection-builder";
12
+ import { createTrustedRuntimeScope } from "./trusted/runtime-scope";
13
+ import { createStaticProjectionBuilder } from "./trusted/static-projection";
14
+
15
+ export function createTrustedReducerBundle<
16
+ Contract extends ReducerGameContractLike,
17
+ Definitions extends PhaseMapOf<Contract>,
18
+ Views extends ViewMapOf<Contract>,
19
+ >(
20
+ definition: ReducerGameDefinition<Contract, Definitions, Views>,
21
+ ): TrustedReducerBundle<Contract, Definitions, Views> {
22
+ const scope = createTrustedRuntimeScope(definition);
23
+ const interactions = createInteractionResolver(scope);
24
+ const lifecycle = createLifecycleRunner(scope, interactions);
25
+ const instructions = createTrustedInstructionRunner(
26
+ scope,
27
+ interactions,
28
+ lifecycle,
29
+ );
30
+ const staticProjection = createStaticProjectionBuilder(scope);
31
+ const projection = createProjectionBuilder(scope, interactions);
32
+
33
+ return {
34
+ async initialize(input) {
35
+ return lifecycle.initializeSession(input, instructions.drainInstructions);
36
+ },
37
+ async initializePhase({ state, to }) {
38
+ const initialized = lifecycle.initializePhaseResult(
39
+ scope.toCombinedState(state),
40
+ to,
41
+ );
42
+ return scope.toSessionState(
43
+ instructions.drainInstructions(
44
+ initialized.state,
45
+ initialized.instructions,
46
+ ),
47
+ );
48
+ },
49
+ async validateInput({ state, input }) {
50
+ return interactions.validateClientInput(
51
+ scope.toCombinedState(state),
52
+ input,
53
+ );
54
+ },
55
+ async reduce({ state, input }) {
56
+ const combinedState = scope.toCombinedState(state);
57
+ const reject = interactions.validateOrReject(combinedState, input);
58
+ if (reject) {
59
+ return reject;
60
+ }
61
+ const result = instructions.reduceOnce(combinedState, input);
62
+ if (result.type === "reject") {
63
+ return result;
64
+ }
65
+ return {
66
+ type: "accept" as const,
67
+ state: scope.toSessionState(result.state),
68
+ instructions: result.instructions ?? [],
69
+ };
70
+ },
71
+ async dispatch({ state, input }) {
72
+ const combinedState = scope.toCombinedState(state);
73
+ const reject = interactions.validateOrReject(combinedState, input);
74
+ if (reject) {
75
+ return reject;
76
+ }
77
+ const result = instructions.dispatch(combinedState, input);
78
+ if (result.type === "reject") {
79
+ return result;
80
+ }
81
+ return {
82
+ type: "accept" as const,
83
+ state: scope.toSessionState(result.state),
84
+ trace: result.trace,
85
+ };
86
+ },
87
+ projectStatic() {
88
+ return staticProjection.projectStatic();
89
+ },
90
+ projectSeatsDynamic(input) {
91
+ return projection.projectSeatsDynamic(input);
92
+ },
93
+ projectSeatViewDynamic(input) {
94
+ return projection.projectSeatViewDynamic(input);
95
+ },
96
+ };
97
+ }
@@ -0,0 +1,171 @@
1
+ import type { DispatchTraceEntry, TrustedRuntimeInput } from "../core/types";
2
+ import type {
3
+ BaseGameStateOfContract,
4
+ BaseGameSessionOfContract,
5
+ ManifestContractOf,
6
+ PhaseMapOf,
7
+ PhaseNamesOfDefinition,
8
+ PlayerIdOfState,
9
+ ReducerGameContractLike,
10
+ ReducerGameDefinition,
11
+ ReducerReject,
12
+ ReducerValidationResult,
13
+ RuntimeSetupSelectionInput,
14
+ ViewMapOf,
15
+ } from "../model";
16
+ import type { RuntimeInstructionForState } from "../core/runtime-instruction";
17
+ import type { ReducerBundleContract } from "../../infrastructure/reducer-contract/bundle.js";
18
+
19
+ type TrustedSessionState<Contract extends ReducerGameContractLike> =
20
+ BaseGameSessionOfContract<Contract>;
21
+
22
+ type TrustedCombinedState<
23
+ Contract extends ReducerGameContractLike,
24
+ Definitions extends PhaseMapOf<Contract>,
25
+ > = BaseGameStateOfContract<Contract> & {
26
+ runtime: TrustedSessionState<Contract>["runtime"];
27
+ };
28
+
29
+ type TrustedPlayerId<
30
+ Contract extends ReducerGameContractLike,
31
+ _Definitions extends PhaseMapOf<Contract>,
32
+ > = PlayerIdOfState<BaseGameStateOfContract<Contract>>;
33
+
34
+ export type TrustedReducerBundle<
35
+ Contract extends ReducerGameContractLike,
36
+ Definitions extends PhaseMapOf<Contract>,
37
+ Views extends ViewMapOf<Contract>,
38
+ > = {
39
+ initialize(input: {
40
+ table: BaseGameStateOfContract<Contract>["table"];
41
+ playerIds: TrustedPlayerId<Contract, Definitions>[];
42
+ rngSeed?: number | null;
43
+ setup?: RuntimeSetupSelectionInput<ManifestContractOf<Contract>> | null;
44
+ }): Promise<TrustedSessionState<Contract>>;
45
+ initializePhase(input: {
46
+ state: TrustedSessionState<Contract>;
47
+ to: PhaseNamesOfDefinition<
48
+ ReducerGameDefinition<Contract, Definitions, Views>
49
+ >;
50
+ }): Promise<TrustedSessionState<Contract>>;
51
+ validateInput(input: {
52
+ state: TrustedSessionState<Contract>;
53
+ input: TrustedRuntimeInput<TrustedPlayerId<Contract, Definitions>>;
54
+ }): Promise<ReducerValidationResult>;
55
+ reduce(input: {
56
+ state: TrustedSessionState<Contract>;
57
+ input: TrustedRuntimeInput<TrustedPlayerId<Contract, Definitions>>;
58
+ }): Promise<
59
+ | ReducerReject
60
+ | {
61
+ type: "accept";
62
+ state: TrustedSessionState<Contract>;
63
+ instructions: RuntimeInstructionForState<
64
+ TrustedCombinedState<Contract, Definitions>
65
+ >[];
66
+ }
67
+ >;
68
+ dispatch(input: {
69
+ state: TrustedSessionState<Contract>;
70
+ input: TrustedRuntimeInput<TrustedPlayerId<Contract, Definitions>>;
71
+ }): Promise<
72
+ | ReducerReject
73
+ | {
74
+ type: "accept";
75
+ state: TrustedSessionState<Contract>;
76
+ trace: DispatchTraceEntry<
77
+ TrustedCombinedState<Contract, Definitions>,
78
+ TrustedPlayerId<Contract, Definitions>
79
+ >[];
80
+ }
81
+ >;
82
+ projectStatic(): {
83
+ view: unknown;
84
+ hash: string;
85
+ manifestVersion: string;
86
+ } | null;
87
+ projectSeatsDynamic(input: {
88
+ state: TrustedSessionState<Contract>;
89
+ playerIds: TrustedPlayerId<Contract, Definitions>[];
90
+ viewId?: string;
91
+ projectionMode?: "full" | "actionsOnly";
92
+ }): {
93
+ currentStage: string | null;
94
+ stageSeats: string[];
95
+ simultaneousPhase: {
96
+ phaseName: string;
97
+ interactionId: string;
98
+ actorIds: string[];
99
+ sealedPlayerIds: string[];
100
+ pendingPlayerIds: string[];
101
+ } | null;
102
+ seats: Record<
103
+ string,
104
+ {
105
+ view?: unknown;
106
+ availableInteractionRefs: unknown;
107
+ zones?: unknown;
108
+ }
109
+ >;
110
+ interactionsByRef: Record<string, unknown>;
111
+ };
112
+ projectSeatViewDynamic(input: {
113
+ state: TrustedSessionState<Contract>;
114
+ playerId: TrustedPlayerId<Contract, Definitions>;
115
+ viewId?: string;
116
+ }): unknown;
117
+ };
118
+
119
+ export type ReducerBundle = ReducerBundleContract & {
120
+ createInProcessRuntime(): {
121
+ initialize(input: {
122
+ table: unknown;
123
+ playerIds: string[];
124
+ rngSeed?: number | null;
125
+ setup?: unknown;
126
+ }): Promise<void>;
127
+ hydrate(input: { state: unknown }): void;
128
+ dispatch(input: {
129
+ input: unknown;
130
+ }): Promise<
131
+ | { kind: "accept" }
132
+ | { kind: "accept"; state: unknown; trace: unknown[] }
133
+ | { kind: "reject"; errorCode: string; message?: string }
134
+ >;
135
+ projectSeatViewDynamic(input: {
136
+ playerId: unknown;
137
+ viewId?: string;
138
+ }): unknown;
139
+ projectSeatsDynamic(input: {
140
+ playerIds: unknown[];
141
+ viewId?: string;
142
+ projectionMode?: "full" | "actionsOnly";
143
+ }): {
144
+ currentStage: string | null;
145
+ stageSeats: string[];
146
+ simultaneousPhase: {
147
+ phaseName: string;
148
+ interactionId: string;
149
+ actorIds: string[];
150
+ sealedPlayerIds: string[];
151
+ pendingPlayerIds: string[];
152
+ } | null;
153
+ seats: Record<
154
+ string,
155
+ {
156
+ view?: unknown;
157
+ availableInteractionRefs: unknown;
158
+ zones?: unknown;
159
+ }
160
+ >;
161
+ interactionsByRef: Record<string, unknown>;
162
+ };
163
+ snapshot(): unknown;
164
+ unsafeState(): unknown;
165
+ };
166
+ projectSeatViewDynamic(input: {
167
+ state: unknown;
168
+ playerId: unknown;
169
+ viewId?: string;
170
+ }): unknown;
171
+ };
@@ -0,0 +1,2 @@
1
+ export { createReducerBundle } from "./bundle/ingress-bundle";
2
+ export type { ReducerBundle } from "./bundle/types";
@@ -0,0 +1,57 @@
1
+ import { z } from "zod";
2
+ import { collectReducerDefinitionIndex } from "./definition-index";
3
+ import type {
4
+ InputCollector,
5
+ PhaseMapOf,
6
+ ReducerGameContractLike,
7
+ ReducerGameDefinition,
8
+ ViewMapOf,
9
+ } from "./model";
10
+
11
+ export type ClientParamSchema = {
12
+ safeParse: (value: unknown) =>
13
+ | { success: true; data: Record<string, unknown> }
14
+ | {
15
+ success: false;
16
+ error: { issues: Array<{ path: PropertyKey[]; message: string }> };
17
+ };
18
+ };
19
+
20
+ export type ClientParamSchemasByPhase = Readonly<
21
+ Record<string, Readonly<Record<string, ClientParamSchema>>>
22
+ >;
23
+
24
+ function schemaForCollectors(
25
+ collectors: Record<string, InputCollector>,
26
+ ): ClientParamSchema {
27
+ const shape: Record<string, z.ZodTypeAny> = {};
28
+ for (const [key, collector] of Object.entries(collectors)) {
29
+ if (collector.kind === "rng") continue;
30
+ const schema = collector.schema as z.ZodTypeAny;
31
+ shape[key] =
32
+ "defaultValue" in collector
33
+ ? schema.default(collector.defaultValue)
34
+ : schema;
35
+ }
36
+ return z.object(shape) as unknown as ClientParamSchema;
37
+ }
38
+
39
+ export function createClientParamSchemasByPhase<
40
+ Contract extends ReducerGameContractLike,
41
+ Definitions extends PhaseMapOf<Contract>,
42
+ Views extends ViewMapOf<Contract>,
43
+ >(
44
+ definition: ReducerGameDefinition<Contract, Definitions, Views>,
45
+ ): ClientParamSchemasByPhase {
46
+ const index = collectReducerDefinitionIndex(definition);
47
+ const out: Record<string, Record<string, ClientParamSchema>> = {};
48
+ for (const phaseIndex of index.phasesByName.values()) {
49
+ const phaseSchemas: Record<string, ClientParamSchema> = {};
50
+ for (const [id, interaction] of phaseIndex.interactions) {
51
+ phaseSchemas[id] =
52
+ interaction.paramsSchema ?? schemaForCollectors(interaction.inputs);
53
+ }
54
+ out[String(phaseIndex.phaseName)] = phaseSchemas;
55
+ }
56
+ return out;
57
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * State composition primitives.
3
+ *
4
+ * `pipe` threads a seed state through a sequence of `State -> State`
5
+ * transformations, left to right. It is the preferred way to compose curried
6
+ * writers (the `ops.*` namespace) in reducers:
7
+ *
8
+ * return accept(
9
+ * pipe(state,
10
+ * ops.spendPlayerResources({ playerId, resources: cost }),
11
+ * ops.placePieceOnVertex({ boardId, vertexId, pieceId, ownerId: playerId }),
12
+ * ),
13
+ * );
14
+ */
15
+ /**
16
+ * A state-preserving transformation.
17
+ *
18
+ * `Op<State>` is polymorphic in the exact input subtype — given a state `S`
19
+ * that extends `State`, it returns the same `S`. This lets curried writers
20
+ * from `ops.*` and author-written helpers thread through phase-scoped `pipe`
21
+ * calls without losing the narrowed phase state type.
22
+ */
23
+ export type Op<State> = <S extends State>(state: S) => S;
24
+
25
+ export function pipe<State>(
26
+ state: State,
27
+ ...ops: ReadonlyArray<Op<NoInfer<State>>>
28
+ ): State {
29
+ let result = state;
30
+ for (const op of ops) {
31
+ result = op(result);
32
+ }
33
+ return result;
34
+ }
@@ -0,0 +1,30 @@
1
+ import type { RuntimePayload } from "../model";
2
+
3
+ export type TrustedInteractionInput<PlayerId extends string> = {
4
+ // Canonical single-kind player-originated input. `interactionId` addresses
5
+ // either an ordinary action or an addressed prompt; the trusted bundle
6
+ // disambiguates from the interaction spec.
7
+ kind: "interaction";
8
+ playerId: PlayerId;
9
+ interactionId: string;
10
+ params: RuntimePayload;
11
+ };
12
+
13
+ export type TrustedContinuationInput = {
14
+ // Engine-internal input produced by resolved runtime instructions
15
+ // (e.g. after fx.rollDie) to route a typed continuation back through reduce.
16
+ // External clients never send this kind.
17
+ kind: "continuation";
18
+ continuationId: string;
19
+ resumeData: RuntimePayload;
20
+ source: "effect";
21
+ effectKind: "rollDie" | "shuffleSharedZone" | "shufflePlayerZone";
22
+ response: RuntimePayload;
23
+ };
24
+
25
+ export type TrustedRuntimeInput<PlayerId extends string> =
26
+ | TrustedInteractionInput<PlayerId>
27
+ | TrustedContinuationInput;
28
+
29
+ export type DecodedReducerInput<PlayerId extends string> =
30
+ TrustedRuntimeInput<PlayerId>;
@@ -0,0 +1,59 @@
1
+ import type {
2
+ DeckIdOfState,
3
+ PhaseNameOfState,
4
+ PlayerIdOfState,
5
+ PlayerZoneIdOfState,
6
+ } from "../model/extract";
7
+ import type { AnyContinuationToken } from "../model/runtime";
8
+
9
+ export type FlowInstruction<PhaseName extends string> = {
10
+ kind: "flow.transition";
11
+ to: PhaseName;
12
+ };
13
+
14
+ export type EngineRollDieInstruction = {
15
+ kind: "engine.rollDie";
16
+ dieId: string;
17
+ continuation?: AnyContinuationToken;
18
+ };
19
+
20
+ export type EngineShuffleSharedZoneInstruction<DeckId extends string> = {
21
+ kind: "engine.shuffleSharedZone";
22
+ zoneId: DeckId;
23
+ continuation?: AnyContinuationToken;
24
+ };
25
+
26
+ export type EngineShufflePlayerZoneInstruction<
27
+ PlayerZoneId extends string,
28
+ PlayerId extends string,
29
+ > = {
30
+ kind: "engine.shufflePlayerZone";
31
+ zoneId: PlayerZoneId;
32
+ playerId: PlayerId;
33
+ continuation?: AnyContinuationToken;
34
+ };
35
+
36
+ export type EngineInstruction<
37
+ DeckId extends string,
38
+ PlayerZoneId extends string = string,
39
+ PlayerId extends string = string,
40
+ > =
41
+ | EngineRollDieInstruction
42
+ | EngineShuffleSharedZoneInstruction<DeckId>
43
+ | EngineShufflePlayerZoneInstruction<PlayerZoneId, PlayerId>;
44
+
45
+ export type RuntimeInstruction<
46
+ PhaseName extends string,
47
+ DeckId extends string,
48
+ PlayerZoneId extends string = string,
49
+ PlayerId extends string = string,
50
+ > =
51
+ | FlowInstruction<PhaseName>
52
+ | EngineInstruction<DeckId, PlayerZoneId, PlayerId>;
53
+
54
+ export type RuntimeInstructionForState<State> = RuntimeInstruction<
55
+ PhaseNameOfState<State>,
56
+ DeckIdOfState<State>,
57
+ PlayerZoneIdOfState<State>,
58
+ PlayerIdOfState<State>
59
+ >;