@seriousgaming/sdk-tools 0.0.0-stage → 1.0.0-alpha.1

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 (391) hide show
  1. package/LICENSE +93 -0
  2. package/README.md +36 -2
  3. package/dist/bundling/logic-exports.d.ts +34 -0
  4. package/dist/bundling/node-builtins.d.ts +21 -0
  5. package/dist/bundling/transpiler.d.ts +7 -0
  6. package/dist/cli.js +27368 -0
  7. package/dist/client/dev-server.d.ts +59 -0
  8. package/dist/client/index.d.ts +28 -0
  9. package/dist/client/stub-services.d.ts +32 -0
  10. package/dist/client/test-session.d.ts +195 -0
  11. package/dist/client.js +16884 -0
  12. package/dist/core/asset-reference-translator.d.ts +46 -0
  13. package/dist/core/clock.d.ts +57 -0
  14. package/dist/core/faults.d.ts +65 -0
  15. package/dist/core/game-settings.d.ts +65 -0
  16. package/dist/core/history.d.ts +89 -0
  17. package/dist/core/listen-with-fallback.d.ts +30 -0
  18. package/dist/core/mutation-queue.d.ts +61 -0
  19. package/dist/core/package-scenario.d.ts +89 -0
  20. package/dist/core/participant-registry.d.ts +109 -0
  21. package/dist/core/pending-changes.d.ts +14 -0
  22. package/dist/core/protocol.d.ts +83 -0
  23. package/dist/core/scenario-drafts.d.ts +32 -0
  24. package/dist/core/session-endpoints.d.ts +108 -0
  25. package/dist/core/session-gates.d.ts +75 -0
  26. package/dist/core/session-host.d.ts +94 -0
  27. package/dist/core/session-refusals.d.ts +56 -0
  28. package/dist/core/session-rewind.d.ts +32 -0
  29. package/dist/core/session-roster.d.ts +128 -0
  30. package/dist/core/session-surfaces.d.ts +32 -0
  31. package/dist/core/session-ticks.d.ts +18 -0
  32. package/dist/core/session-timers.d.ts +84 -0
  33. package/dist/core/session-writes.d.ts +40 -0
  34. package/dist/core/session.d.ts +385 -0
  35. package/dist/core/settings-locks.d.ts +22 -0
  36. package/dist/core/team-names.d.ts +52 -0
  37. package/dist/core/team-state-store.d.ts +209 -0
  38. package/dist/core/tick-timer.d.ts +75 -0
  39. package/dist/dev/blob-links.d.ts +10 -0
  40. package/dist/dev/console/assets/index-DgFglsnA.js +204 -0
  41. package/dist/dev/console/index.html +12 -0
  42. package/dist/dev/console-path.d.ts +19 -0
  43. package/dist/dev/lockfile.d.ts +124 -0
  44. package/dist/dev/package-watcher.d.ts +21 -0
  45. package/dist/dev/routes.d.ts +67 -0
  46. package/dist/dev/shell.d.ts +260 -0
  47. package/dist/dev/surfaces.d.ts +41 -0
  48. package/dist/dev/tools-identity.d.ts +23 -0
  49. package/dist/dev/view/batch.d.ts +172 -0
  50. package/dist/dev/view/commands.d.ts +75 -0
  51. package/dist/dev/view/route.d.ts +58 -0
  52. package/dist/dev/view/view.d.ts +78 -0
  53. package/dist/dev/view/viewer.d.ts +32 -0
  54. package/dist/discovery/config.d.ts +9 -0
  55. package/dist/discovery/manifest-paths.d.ts +21 -0
  56. package/dist/discovery/removed-fields.d.ts +90 -0
  57. package/dist/docs/api/deck.md +386 -0
  58. package/dist/docs/api/index.md +67 -0
  59. package/dist/docs/api/sdk-commands.md +286 -0
  60. package/dist/docs/api/sdk-e2e.md +433 -0
  61. package/dist/docs/api/sdk-projection.md +207 -0
  62. package/dist/docs/api/sdk-testing.md +214 -0
  63. package/dist/docs/api/sdk-tools-client.md +560 -0
  64. package/dist/docs/api/sdk-ui-testing.md +231 -0
  65. package/dist/docs/api/sdk-ui.md +1269 -0
  66. package/dist/docs/api/sdk.md +2140 -0
  67. package/dist/docs/changelog-0.x.md +1156 -0
  68. package/dist/docs/changelog.md +236 -0
  69. package/dist/docs/cli-and-dev-server.md +217 -0
  70. package/dist/docs/cli-error-codes.md +154 -0
  71. package/dist/docs/cli-reference.md +2488 -0
  72. package/dist/docs/cli-simulation-testing.md +222 -0
  73. package/dist/docs/concepts/index.md +46 -0
  74. package/dist/docs/concepts/terminology.md +322 -0
  75. package/dist/docs/environment-variables.md +102 -0
  76. package/dist/docs/getting-started.md +145 -0
  77. package/dist/docs/guides/ai-facilitation.md +220 -0
  78. package/dist/docs/guides/capabilities.md +460 -0
  79. package/dist/docs/guides/endpoints.md +335 -0
  80. package/dist/docs/guides/engine-testing.md +477 -0
  81. package/dist/docs/guides/engine.md +527 -0
  82. package/dist/docs/guides/file-handling.md +405 -0
  83. package/dist/docs/guides/games.md +176 -0
  84. package/dist/docs/guides/global-settings.md +94 -0
  85. package/dist/docs/guides/guide.md +123 -0
  86. package/dist/docs/guides/hooks.md +183 -0
  87. package/dist/docs/guides/index.md +51 -0
  88. package/dist/docs/guides/internationalization.md +288 -0
  89. package/dist/docs/guides/llm-integration.md +635 -0
  90. package/dist/docs/guides/multi-team-games.md +586 -0
  91. package/dist/docs/guides/patterns.md +391 -0
  92. package/dist/docs/guides/presentation.md +196 -0
  93. package/dist/docs/guides/production-constraints.md +130 -0
  94. package/dist/docs/guides/scenario-editor.md +143 -0
  95. package/dist/docs/guides/scenarios.md +515 -0
  96. package/dist/docs/guides/session.md +972 -0
  97. package/dist/docs/guides/settings.md +458 -0
  98. package/dist/docs/guides/setup.md +193 -0
  99. package/dist/docs/guides/speech-generation.md +233 -0
  100. package/dist/docs/guides/starter-game.md +164 -0
  101. package/dist/docs/guides/testing.md +575 -0
  102. package/dist/docs/guides/tick-controller.md +569 -0
  103. package/dist/docs/guides/type-safety.md +516 -0
  104. package/dist/docs/guides/ui.md +1389 -0
  105. package/dist/docs/guides/upgrading.md +636 -0
  106. package/dist/docs/guides/validators.md +217 -0
  107. package/dist/docs/guides/waiting-room.md +244 -0
  108. package/dist/docs/index.md +41 -0
  109. package/dist/docs/recipes/act-on-the-session-from-an-endpoint.md +95 -0
  110. package/dist/docs/recipes/adapt-a-game-for-walkthroughs.md +133 -0
  111. package/dist/docs/recipes/adapt-ui-for-observers.md +74 -0
  112. package/dist/docs/recipes/call-endpoint-from-ui.md +109 -0
  113. package/dist/docs/recipes/check-a-package-from-a-script.md +117 -0
  114. package/dist/docs/recipes/create-capability.md +66 -0
  115. package/dist/docs/recipes/create-endpoint.md +127 -0
  116. package/dist/docs/recipes/create-engine.md +111 -0
  117. package/dist/docs/recipes/create-game.md +70 -0
  118. package/dist/docs/recipes/create-guide.md +75 -0
  119. package/dist/docs/recipes/create-hook.md +80 -0
  120. package/dist/docs/recipes/create-presentation.md +142 -0
  121. package/dist/docs/recipes/create-scenario-editor.md +102 -0
  122. package/dist/docs/recipes/create-scenario.md +98 -0
  123. package/dist/docs/recipes/create-session-ui.md +116 -0
  124. package/dist/docs/recipes/create-settings.md +88 -0
  125. package/dist/docs/recipes/create-setup.md +115 -0
  126. package/dist/docs/recipes/create-tick-controller.md +65 -0
  127. package/dist/docs/recipes/create-user-interface.md +96 -0
  128. package/dist/docs/recipes/create-validator.md +67 -0
  129. package/dist/docs/recipes/create-waiting-room-ui.md +109 -0
  130. package/dist/docs/recipes/declare-api-uses.md +67 -0
  131. package/dist/docs/recipes/design-state-for-concurrent-writes.md +96 -0
  132. package/dist/docs/recipes/distribute-package.md +80 -0
  133. package/dist/docs/recipes/e2e-testing.md +116 -0
  134. package/dist/docs/recipes/end-game-on-condition.md +154 -0
  135. package/dist/docs/recipes/fix-duplicate-packages.md +101 -0
  136. package/dist/docs/recipes/index.md +86 -0
  137. package/dist/docs/recipes/make-an-endpoint-external.md +101 -0
  138. package/dist/docs/recipes/negotiate-across-teams.md +164 -0
  139. package/dist/docs/recipes/observe-other-teams-state.md +119 -0
  140. package/dist/docs/recipes/publish-a-package.md +139 -0
  141. package/dist/docs/recipes/remember-a-viewers-choice.md +55 -0
  142. package/dist/docs/recipes/review-a-past-day.md +73 -0
  143. package/dist/docs/recipes/share-assets-across-scenarios.md +120 -0
  144. package/dist/docs/recipes/share-logic-between-engine-and-ui.md +130 -0
  145. package/dist/docs/recipes/show-all-teams-participants.md +109 -0
  146. package/dist/docs/recipes/start-from-an-empty-package.md +169 -0
  147. package/dist/docs/recipes/take-a-file-in-an-endpoint.md +82 -0
  148. package/dist/docs/recipes/test-a-multi-role-game.md +51 -0
  149. package/dist/docs/recipes/test-user-interface.md +95 -0
  150. package/dist/docs/recipes/test-with-engine.md +115 -0
  151. package/dist/docs/recipes/upload-and-display-files.md +148 -0
  152. package/dist/docs/recipes/use-request-play.md +65 -0
  153. package/dist/docs/recipes/use-request-tick.md +75 -0
  154. package/dist/docs/troubleshooting.md +816 -0
  155. package/dist/execution/blob-inputs.d.ts +57 -0
  156. package/dist/execution/bundle-reload.d.ts +42 -0
  157. package/dist/execution/config-resolver.d.ts +127 -0
  158. package/dist/execution/configuration-builder.d.ts +66 -0
  159. package/dist/execution/context-composition.d.ts +161 -0
  160. package/dist/execution/endpoint-actions.d.ts +9 -0
  161. package/dist/execution/endpoint-payloads.d.ts +32 -0
  162. package/dist/execution/endpoint-runner.d.ts +129 -0
  163. package/dist/execution/engine-state.d.ts +40 -0
  164. package/dist/execution/executor-callbacks.d.ts +56 -0
  165. package/dist/execution/executor.d.ts +436 -0
  166. package/dist/execution/gates.d.ts +45 -0
  167. package/dist/execution/hook-chain.d.ts +25 -0
  168. package/dist/execution/logic-calls.d.ts +190 -0
  169. package/dist/execution/logic-failure.d.ts +84 -0
  170. package/dist/execution/logic-loader.d.ts +54 -0
  171. package/dist/execution/logic-result.d.ts +76 -0
  172. package/dist/execution/tick-controller-call.d.ts +32 -0
  173. package/dist/execution/types.d.ts +48 -0
  174. package/dist/generation/ts-type.d.ts +39 -0
  175. package/dist/guide/locale.d.ts +12 -0
  176. package/dist/guide/video-registry.d.ts +42 -0
  177. package/dist/help-examples.d.ts +125 -0
  178. package/dist/host/adapter.d.ts +67 -0
  179. package/dist/host/host-channel.d.ts +222 -0
  180. package/dist/host/index.d.ts +20 -0
  181. package/dist/host/protocol.d.ts +783 -0
  182. package/dist/host/surfaces.d.ts +42 -0
  183. package/dist/host/theme.d.ts +55 -0
  184. package/dist/host.js +583 -0
  185. package/dist/prompts/index.d.ts +7 -0
  186. package/dist/prompts/schema-builder.d.ts +29 -0
  187. package/dist/prompts/types.d.ts +108 -0
  188. package/dist/prompts/validators.d.ts +32 -0
  189. package/dist/runtime/capability-scope.d.ts +6 -0
  190. package/dist/runtime/context-merge.d.ts +29 -0
  191. package/dist/runtime/context-projection.d.ts +41 -0
  192. package/dist/runtime/guarded-callbacks.d.ts +15 -0
  193. package/dist/runtime/index.d.ts +27 -0
  194. package/dist/runtime/manifest-version.d.ts +55 -0
  195. package/dist/runtime/tick-validation.d.ts +25 -0
  196. package/dist/runtime.js +346 -0
  197. package/dist/schema.json +1546 -0
  198. package/dist/server/vite-plugin.d.ts +46 -0
  199. package/dist/services/tts/client.d.ts +51 -0
  200. package/dist/services/tts/elevenlabs.d.ts +24 -0
  201. package/dist/services/tts/types.d.ts +44 -0
  202. package/dist/storage/asset-resolver.d.ts +49 -0
  203. package/dist/storage/blob-store.d.ts +41 -0
  204. package/dist/templates/endpoint/logic.test.ts.liquid +61 -0
  205. package/dist/templates/endpoint/logic.ts.liquid +25 -0
  206. package/dist/templates/engine/init.json.liquid +7 -0
  207. package/dist/templates/engine/logic-aggregate.test.ts.liquid +90 -0
  208. package/dist/templates/engine/logic-aggregate.ts.liquid +46 -0
  209. package/dist/templates/engine/logic.test.ts.liquid +61 -0
  210. package/dist/templates/engine/logic.ts.liquid +32 -0
  211. package/dist/templates/engine/run.json.liquid +7 -0
  212. package/dist/templates/guide/01-at-a-glance.md.liquid +19 -0
  213. package/dist/templates/guide/02-preparation.md.liquid +18 -0
  214. package/dist/templates/guide/03-running-the-session.md.liquid +37 -0
  215. package/dist/templates/hook/logic.test.ts.liquid +46 -0
  216. package/dist/templates/hook/logic.ts.liquid +12 -0
  217. package/dist/templates/package/CLAUDE.md.template +338 -0
  218. package/dist/templates/package/DESIGN.md.liquid +144 -0
  219. package/dist/templates/package/README.md.liquid +143 -0
  220. package/dist/templates/package/claude/rules/workflow-create-capability.md +26 -0
  221. package/dist/templates/package/claude/rules/workflow-create-endpoint.md +35 -0
  222. package/dist/templates/package/claude/rules/workflow-create-engine.md +35 -0
  223. package/dist/templates/package/claude/rules/workflow-create-guide.md +40 -0
  224. package/dist/templates/package/claude/rules/workflow-create-presentation.md +37 -0
  225. package/dist/templates/package/claude/rules/workflow-create-user-interface.md +31 -0
  226. package/dist/templates/package/claude/rules/workflow-publish-package.md +54 -0
  227. package/dist/templates/package/claude/rules/workflow-test-engine-or-ui.md +30 -0
  228. package/dist/templates/package/claude/rules/workflow-update-sdk-version.md +43 -0
  229. package/dist/templates/package/claude/settings.json.template +16 -0
  230. package/dist/templates/package/gitignore.template +15 -0
  231. package/dist/templates/package/global-setup.ts.template +21 -0
  232. package/dist/templates/package/globals.d.ts.template +2 -0
  233. package/dist/templates/package/oxfmtrc.json.template +14 -0
  234. package/dist/templates/package/oxlintrc.json.template +238 -0
  235. package/dist/templates/package/package.json.liquid +65 -0
  236. package/dist/templates/package/playwright.config.ts.liquid +19 -0
  237. package/dist/templates/package/pnpm-workspace.yaml.template +27 -0
  238. package/dist/templates/package/test-setup.ts.liquid +7 -0
  239. package/dist/templates/package/tsconfig.json.liquid +15 -0
  240. package/dist/templates/package/vite.config.ts.liquid +19 -0
  241. package/dist/templates/package/vitest.config.ts.liquid +25 -0
  242. package/dist/templates/package/vitest.engine.config.ts.liquid +12 -0
  243. package/dist/templates/presentation/index.html.liquid +20 -0
  244. package/dist/templates/presentation/src/App.tsx.liquid +49 -0
  245. package/dist/templates/presentation/src/Slides.tsx.liquid +81 -0
  246. package/dist/templates/presentation/src/i18n.ts.liquid +54 -0
  247. package/dist/templates/presentation/src/main.tsx.liquid +14 -0
  248. package/dist/templates/scenario_editor/src/App.test.tsx.liquid +30 -0
  249. package/dist/templates/scenario_editor/src/App.tsx.liquid +95 -0
  250. package/dist/templates/scenario_editor/src/i18n.ts.liquid +44 -0
  251. package/dist/templates/session/src/App.test.tsx.liquid +60 -0
  252. package/dist/templates/session/src/App.tsx.liquid +128 -0
  253. package/dist/templates/session/src/i18n.ts.liquid +53 -0
  254. package/dist/templates/session/src/main.tsx.liquid +48 -0
  255. package/dist/templates/session/src/theme.ts.liquid +46 -0
  256. package/dist/templates/settings-editor/index.html.liquid +12 -0
  257. package/dist/templates/settings-editor/src/main.tsx.liquid +48 -0
  258. package/dist/templates/settings-editor/src/theme.ts.liquid +24 -0
  259. package/dist/templates/setup/src/App.test.tsx.liquid +39 -0
  260. package/dist/templates/setup/src/App.tsx.liquid +102 -0
  261. package/dist/templates/setup/src/i18n.ts.liquid +47 -0
  262. package/dist/templates/starter-game/capabilities/briefing/capability.sdk.json +18 -0
  263. package/dist/templates/starter-game/capabilities/plan/capability.sdk.json +17 -0
  264. package/dist/templates/starter-game/capabilities/results/capability.sdk.json +61 -0
  265. package/dist/templates/starter-game/capabilities/roles/capability.sdk.json +17 -0
  266. package/dist/templates/starter-game/capabilities/weather/capability.sdk.json +23 -0
  267. package/dist/templates/starter-game/engine/defaults.ts +81 -0
  268. package/dist/templates/starter-game/engine/engine.sdk.json +12 -0
  269. package/dist/templates/starter-game/engine/logic.test.ts +221 -0
  270. package/dist/templates/starter-game/engine/logic.ts +149 -0
  271. package/dist/templates/starter-game/engine/test-helpers.ts +74 -0
  272. package/dist/templates/starter-game/engine/types.ts +139 -0
  273. package/dist/templates/starter-game/guide/content/en/01-at-a-glance.md +51 -0
  274. package/dist/templates/starter-game/guide/content/en/02-preparation.md +35 -0
  275. package/dist/templates/starter-game/guide/content/en/03-running-the-day.md +58 -0
  276. package/dist/templates/starter-game/guide/guide.sdk.json +10 -0
  277. package/dist/templates/starter-game/guide/guide.test.ts +108 -0
  278. package/dist/templates/starter-game/hooks/assignproducts/defaults.ts +37 -0
  279. package/dist/templates/starter-game/hooks/assignproducts/hook.sdk.json +13 -0
  280. package/dist/templates/starter-game/hooks/assignproducts/logic/logic.test.ts +77 -0
  281. package/dist/templates/starter-game/hooks/assignproducts/logic/logic.ts +47 -0
  282. package/dist/templates/starter-game/hooks/assignproducts/types.ts +55 -0
  283. package/dist/templates/starter-game/package.json +68 -0
  284. package/dist/templates/starter-game/playwright.config.ts +19 -0
  285. package/dist/templates/starter-game/scenarios/heatwave/scenario.sdk.json +20 -0
  286. package/dist/templates/starter-game/scenarios/ordinary_week/scenario.sdk.json +12 -0
  287. package/dist/templates/starter-game/seriousgaming.sdk.json +23 -0
  288. package/dist/templates/starter-game/session/defaults.ts +80 -0
  289. package/dist/templates/starter-game/session/index.html +12 -0
  290. package/dist/templates/starter-game/session/session.sdk.json +11 -0
  291. package/dist/templates/starter-game/session/src/App.test.tsx +307 -0
  292. package/dist/templates/starter-game/session/src/App.tsx +309 -0
  293. package/dist/templates/starter-game/session/src/Section.tsx +37 -0
  294. package/dist/templates/starter-game/session/src/TeamDoor.tsx +96 -0
  295. package/dist/templates/starter-game/session/src/format.ts +8 -0
  296. package/dist/templates/starter-game/session/src/i18n.ts +51 -0
  297. package/dist/templates/starter-game/session/src/main.tsx +48 -0
  298. package/dist/templates/starter-game/session/src/theme.ts +45 -0
  299. package/dist/templates/starter-game/session/types.ts +135 -0
  300. package/dist/templates/starter-game/settings/engine/settings.sdk.json +50 -0
  301. package/dist/templates/starter-game/settings/menu/settings.sdk.json +78 -0
  302. package/dist/templates/starter-game/settings/session/settings.sdk.json +23 -0
  303. package/dist/templates/starter-game/settings/ui/settings.sdk.json +25 -0
  304. package/dist/templates/starter-game/test-setup.ts +7 -0
  305. package/dist/templates/starter-game/testing/e2e/game.spec.ts +139 -0
  306. package/dist/templates/starter-game/testing/e2e/global-setup.ts +21 -0
  307. package/dist/templates/starter-game/testing/engine/game.engine.test.ts +171 -0
  308. package/dist/templates/starter-game/tsconfig.json +19 -0
  309. package/dist/templates/starter-game/ui/defaults.ts +60 -0
  310. package/dist/templates/starter-game/ui/index.html +12 -0
  311. package/dist/templates/starter-game/ui/src/App.test.tsx +138 -0
  312. package/dist/templates/starter-game/ui/src/App.tsx +175 -0
  313. package/dist/templates/starter-game/ui/src/DayBar.test.tsx +78 -0
  314. package/dist/templates/starter-game/ui/src/DayBar.tsx +72 -0
  315. package/dist/templates/starter-game/ui/src/HistoryPanel.test.tsx +74 -0
  316. package/dist/templates/starter-game/ui/src/HistoryPanel.tsx +120 -0
  317. package/dist/templates/starter-game/ui/src/MakeRow.tsx +129 -0
  318. package/dist/templates/starter-game/ui/src/Section.tsx +37 -0
  319. package/dist/templates/starter-game/ui/src/ThemeToggle.tsx +49 -0
  320. package/dist/templates/starter-game/ui/src/TodayPanel.test.tsx +179 -0
  321. package/dist/templates/starter-game/ui/src/TodayPanel.tsx +92 -0
  322. package/dist/templates/starter-game/ui/src/YesterdayPanel.tsx +142 -0
  323. package/dist/templates/starter-game/ui/src/format.ts +12 -0
  324. package/dist/templates/starter-game/ui/src/i18n.ts +95 -0
  325. package/dist/templates/starter-game/ui/src/main.tsx +48 -0
  326. package/dist/templates/starter-game/ui/src/menu.ts +18 -0
  327. package/dist/templates/starter-game/ui/src/test-helpers.ts +58 -0
  328. package/dist/templates/starter-game/ui/src/theme.ts +45 -0
  329. package/dist/templates/starter-game/ui/src/writes.ts +43 -0
  330. package/dist/templates/starter-game/ui/types.ts +137 -0
  331. package/dist/templates/starter-game/ui/ui.sdk.json +11 -0
  332. package/dist/templates/starter-game/validators/capacity/defaults.ts +37 -0
  333. package/dist/templates/starter-game/validators/capacity/logic/logic.test.ts +96 -0
  334. package/dist/templates/starter-game/validators/capacity/logic/logic.ts +45 -0
  335. package/dist/templates/starter-game/validators/capacity/types.ts +55 -0
  336. package/dist/templates/starter-game/validators/capacity/validator.sdk.json +11 -0
  337. package/dist/templates/starter-game/vite.config.ts +19 -0
  338. package/dist/templates/starter-game/vitest.config.ts +15 -0
  339. package/dist/templates/starter-game/vitest.engine.config.ts +19 -0
  340. package/dist/templates/starter-game/waiting_room/defaults.ts +40 -0
  341. package/dist/templates/starter-game/waiting_room/index.html +12 -0
  342. package/dist/templates/starter-game/waiting_room/src/App.test.tsx +102 -0
  343. package/dist/templates/starter-game/waiting_room/src/App.tsx +194 -0
  344. package/dist/templates/starter-game/waiting_room/src/i18n.ts +33 -0
  345. package/dist/templates/starter-game/waiting_room/src/main.tsx +48 -0
  346. package/dist/templates/starter-game/waiting_room/src/theme.ts +45 -0
  347. package/dist/templates/starter-game/waiting_room/types.ts +59 -0
  348. package/dist/templates/starter-game/waiting_room/waiting_room.sdk.json +10 -0
  349. package/dist/templates/tick-controller/logic.ts.liquid +8 -0
  350. package/dist/templates/ui/index.html.liquid +12 -0
  351. package/dist/templates/ui/src/App.test.tsx.liquid +41 -0
  352. package/dist/templates/ui/src/App.tsx.liquid +103 -0
  353. package/dist/templates/ui/src/i18n.ts.liquid +47 -0
  354. package/dist/templates/ui/src/main.tsx.liquid +48 -0
  355. package/dist/templates/ui/src/theme.ts.liquid +46 -0
  356. package/dist/templates/validator/logic.test.ts.liquid +42 -0
  357. package/dist/templates/validator/logic.ts.liquid +21 -0
  358. package/dist/templates/waiting-room/index.html.liquid +12 -0
  359. package/dist/templates/waiting-room/src/App.test.tsx.liquid +57 -0
  360. package/dist/templates/waiting-room/src/App.tsx.liquid +118 -0
  361. package/dist/templates/waiting-room/src/i18n.ts.liquid +44 -0
  362. package/dist/templates/waiting-room/src/main.tsx.liquid +48 -0
  363. package/dist/templates/waiting-room/src/theme.ts.liquid +46 -0
  364. package/dist/templating/resource-metadata.d.ts +131 -0
  365. package/dist/types.d.ts +14 -0
  366. package/dist/utils/atomic-write.d.ts +40 -0
  367. package/dist/utils/cli-error.d.ts +64 -0
  368. package/dist/utils/document-parser-client.d.ts +20 -0
  369. package/dist/utils/env-loader.d.ts +40 -0
  370. package/dist/utils/error-codes.d.ts +335 -0
  371. package/dist/utils/errors.d.ts +19 -0
  372. package/dist/utils/global-settings.d.ts +65 -0
  373. package/dist/utils/llm-client.d.ts +34 -0
  374. package/dist/utils/logger.d.ts +36 -0
  375. package/dist/utils/output.d.ts +109 -0
  376. package/dist/utils/platform.d.ts +14 -0
  377. package/dist/utils/prompt.d.ts +36 -0
  378. package/dist/utils/real-path.d.ts +6 -0
  379. package/dist/utils/schema-properties.d.ts +35 -0
  380. package/dist/validation/ajv.d.ts +17 -0
  381. package/dist/validation/facilitator-guide-validator.d.ts +27 -0
  382. package/dist/validation/findings.d.ts +40 -0
  383. package/dist/validation/game-constraints.d.ts +10 -0
  384. package/dist/validation/game-validator.d.ts +34 -0
  385. package/dist/validation/package-validation.d.ts +41 -0
  386. package/dist/validation/package-validator.d.ts +19 -0
  387. package/dist/validation/resource-validator.d.ts +79 -0
  388. package/dist/validation/schema-defaults-validator.d.ts +29 -0
  389. package/dist/validation/schema-validation.d.ts +115 -0
  390. package/dist/validation/semver.d.ts +9 -0
  391. package/package.json +122 -3
@@ -0,0 +1,1269 @@
1
+ <!-- Generated by `pnpm docs:generate` from the exports of `@seriousgaming/sdk/ui`. Edit those, not this file. -->
2
+
3
+ # `@seriousgaming/sdk/ui`
4
+
5
+ Every export of `@seriousgaming/sdk/ui`, with the declaration it is published with. Anything tagged `@internal` is left out: it ships in the declarations, but is not part of the supported API and may change without a major release. For how the pieces fit together, see the [API reference](./index.md) and the guides it links to.
6
+
7
+ ## Functions
8
+
9
+ ### localisedReferences
10
+
11
+ The references `useAsset` tries, most specific first: the locale as a directory immediately before the file name, then its language alone, then the reference as given. `asset:documents/intro.md` in `fr-CA` tries `asset:documents/fr-CA/intro.md`, `asset:documents/fr/intro.md` and `asset:documents/intro.md`.
12
+
13
+ ```ts
14
+ function localisedReferences(reference: string, locale: string | false): string[];
15
+ ```
16
+
17
+ ### PresentationWrapper
18
+
19
+ Wrap a presentation bundle. Read-only: there is nothing here to write with, and the host would refuse it if there were.
20
+
21
+ ```ts
22
+ function PresentationWrapper(props: PresentationWrapperProps): import('react').JSX.Element;
23
+ ```
24
+
25
+ ### SessionUserInterfaceWrapper
26
+
27
+ ```ts
28
+ function SessionUserInterfaceWrapper(
29
+ props: SessionUserInterfaceWrapperProps
30
+ ): import('react').JSX.Element;
31
+ ```
32
+
33
+ ### SettingsEditorWrapper
34
+
35
+ The wrapper for both settings editors, the `setup` slot and the `scenario_editor` slot. Each slot is its own bundle, so a screen knows which it is without being told: the host sends the same batch to both.
36
+
37
+ ```ts
38
+ function SettingsEditorWrapper(props: SettingsEditorWrapperProps): import('react').JSX.Element;
39
+ ```
40
+
41
+ ### useAsset
42
+
43
+ Fetch an asset and read its body, preferring a copy in the surface's locale.
44
+
45
+ ```ts
46
+ function useAsset<T = unknown>(
47
+ reference: string | null | undefined,
48
+ options: UseAssetOptions<'json'>
49
+ ): AssetState<T>;
50
+ function useAsset(
51
+ reference: string | null | undefined,
52
+ options: UseAssetOptions<'text'>
53
+ ): AssetState<string>;
54
+ function useAsset(
55
+ reference: string | null | undefined,
56
+ options: UseAssetOptions<'blob'>
57
+ ): AssetState<Blob>;
58
+ ```
59
+
60
+ ### useAssetUrl
61
+
62
+ The URL an `asset:`, `shared:` or `blob:` reference resolves to, for an `<img>`, `<video>` or link.
63
+
64
+ ```ts
65
+ function useAssetUrl(reference: string | null | undefined): string | undefined;
66
+ ```
67
+
68
+ ### useMutationReporter
69
+
70
+ Runs a fallible mutation (`setData`, `requestTick`, and the rest) so that a failure reaches the participant instead of vanishing.
71
+
72
+ ```ts
73
+ function useMutationReporter(): MutationReporter;
74
+ ```
75
+
76
+ ### usePastState
77
+
78
+ Read committed past state (`getPastState`) and keep it in step with the query.
79
+
80
+ ```ts
81
+ function usePastState<T = Record<string, unknown>>(
82
+ query: PastStateQuery<T> | null | undefined
83
+ ): PastStateResult<T>;
84
+ ```
85
+
86
+ ### usePresentation
87
+
88
+ Everything a presentation can see: the session (or `null`), its settings, the host's theme, and the locale.
89
+
90
+ ```ts
91
+ function usePresentation<
92
+ TSettings = Record<string, Record<string, unknown>>,
93
+ TTeamContext = Record<string, unknown>,
94
+ TSharedContext = Record<string, unknown>,
95
+ >(): PresentationValue<TSettings, TTeamContext, TSharedContext>;
96
+ ```
97
+
98
+ ### UserInterfaceWrapper
99
+
100
+ ```ts
101
+ function UserInterfaceWrapper(props: UserInterfaceWrapperProps): import('react').JSX.Element;
102
+ ```
103
+
104
+ ### useRunKind
105
+
106
+ Hook returning whether this surface belongs to the game being played or to a walkthrough beside it.
107
+
108
+ ```ts
109
+ const useRunKind: () => RunKind;
110
+ ```
111
+
112
+ ### useSessionUserInterfaceCallbacks
113
+
114
+ ```ts
115
+ const useSessionUserInterfaceCallbacks: () => SessionUserInterfaceCallbacks;
116
+ ```
117
+
118
+ ### useSessionUserInterfaceData
119
+
120
+ The session's data and the session surface's `setData`.
121
+
122
+ ```ts
123
+ function useSessionUserInterfaceData<
124
+ T extends SessionData<object, object> = SessionData,
125
+ A = unknown,
126
+ S extends Record<string, unknown> = Record<string, unknown>,
127
+ W extends Record<string, unknown> = Record<string, unknown>,
128
+ >(): SessionUserInterfaceDataContextValue<T, A, S, W>;
129
+ ```
130
+
131
+ ### useSessionUserInterfaceHookFailures
132
+
133
+ Subscribe to hook chains that threw anywhere in the session.
134
+
135
+ ```ts
136
+ const useSessionUserInterfaceHookFailures: () => SessionUserInterfaceHookFailuresValue;
137
+ ```
138
+
139
+ ### useSessionUserInterfaceHostOverlays
140
+
141
+ Hook listing the host overlays this host offers for this session.
142
+
143
+ ```ts
144
+ const useSessionUserInterfaceHostOverlays: () => HostOverlay[];
145
+ ```
146
+
147
+ ### useSessionUserInterfaceLocale
148
+
149
+ Hook to access the current locale in a manage session user interface component.
150
+
151
+ ```ts
152
+ const useSessionUserInterfaceLocale: () => SessionUserInterfaceLocale;
153
+ ```
154
+
155
+ ### useSessionUserInterfaceMeta
156
+
157
+ Hook to access the session's identity and lifecycle state.
158
+
159
+ ```ts
160
+ const useSessionUserInterfaceMeta: () => SessionMeta;
161
+ ```
162
+
163
+ ### useSessionUserInterfaceParticipants
164
+
165
+ Hook to access all participants across all teams in the session.
166
+
167
+ ```ts
168
+ const useSessionUserInterfaceParticipants: () => Participant[];
169
+ ```
170
+
171
+ ### useSessionUserInterfaceTeamConfiguration
172
+
173
+ Hook to access the session's interaction mode and team bounds.
174
+
175
+ ```ts
176
+ const useSessionUserInterfaceTeamConfiguration: () => TeamConfiguration;
177
+ ```
178
+
179
+ ### useSessionUserInterfaceTeamLinks
180
+
181
+ Hook to access each team's join and observe links.
182
+
183
+ ```ts
184
+ const useSessionUserInterfaceTeamLinks: () => TeamLinks[];
185
+ ```
186
+
187
+ ### useSessionUserInterfaceTeams
188
+
189
+ Hook to access the session's teams, sorted by stable index.
190
+
191
+ ```ts
192
+ const useSessionUserInterfaceTeams: () => TeamInfo[];
193
+ ```
194
+
195
+ ### useSessionUserInterfaceTheme
196
+
197
+ ```ts
198
+ const useSessionUserInterfaceTheme: () => SessionUserInterfaceTheme;
199
+ ```
200
+
201
+ ### useSessionUserInterfaceThemePreference
202
+
203
+ ```ts
204
+ const useSessionUserInterfaceThemePreference: () => ThemePreference;
205
+ ```
206
+
207
+ ### useSessionUserInterfaceWalkthroughLink
208
+
209
+ Hook returning where to open the walkthrough, or `null` until the host has said.
210
+
211
+ ```ts
212
+ const useSessionUserInterfaceWalkthroughLink: () => WalkthroughLink | null;
213
+ ```
214
+
215
+ ### useSettingsEditor
216
+
217
+ The settings a `setup` or `scenario_editor` slot edits, and the way to change them. Pass the generated `Settings` type from the slot's `types.ts`.
218
+
219
+ ```ts
220
+ function useSettingsEditor<T>(): SettingsEditorValue<T>;
221
+ ```
222
+
223
+ ### useSettingsEditorCallbacks
224
+
225
+ ```ts
226
+ const useSettingsEditorCallbacks: () => SettingsEditorCallbacks;
227
+ ```
228
+
229
+ ### useSettingsEditorLocale
230
+
231
+ Hook to access the current locale in a settings editor (the `setup` or `scenario_editor` slot). The host picks it from the game's supported locales.
232
+
233
+ ```ts
234
+ const useSettingsEditorLocale: () => SettingsEditorLocale;
235
+ ```
236
+
237
+ ### useSettingsEditorTheme
238
+
239
+ ```ts
240
+ const useSettingsEditorTheme: () => SettingsEditorTheme;
241
+ ```
242
+
243
+ ### useSettingsEditorThemePreference
244
+
245
+ ```ts
246
+ const useSettingsEditorThemePreference: () => ThemePreference;
247
+ ```
248
+
249
+ ### useUserInterfaceCallbacks
250
+
251
+ ```ts
252
+ const useUserInterfaceCallbacks: () => UserInterfaceCallbacks;
253
+ ```
254
+
255
+ ### useUserInterfaceCrossTeamData
256
+
257
+ Observe every team's live cross-team state, including the calling team's own. Entries update as teams change their pending state, without waiting for a tick.
258
+
259
+ ```ts
260
+ function useUserInterfaceCrossTeamData<T = Record<string, unknown>>(): TeamStateEntry<T>[];
261
+ ```
262
+
263
+ ### useUserInterfaceData
264
+
265
+ ```ts
266
+ function useUserInterfaceData<T, A>(): UserInterfaceDataContextValue<T, A>;
267
+ ```
268
+
269
+ ### useUserInterfaceLocale
270
+
271
+ Hook to access the current locale in a user interface component. The locale is provided by the dev server based on the game's supported locales.
272
+
273
+ ```ts
274
+ const useUserInterfaceLocale: () => UserInterfaceLocale;
275
+ ```
276
+
277
+ ### useUserInterfaceOwnTeam
278
+
279
+ Hook returning the team whose surface this user interface is rendering.
280
+
281
+ ```ts
282
+ const useUserInterfaceOwnTeam: () => TeamInfo | null;
283
+ ```
284
+
285
+ ### useUserInterfaceOwnTeamJoinLink
286
+
287
+ Hook returning how to join this surface's own team.
288
+
289
+ ```ts
290
+ const useUserInterfaceOwnTeamJoinLink: () => OwnTeamJoinLink | null;
291
+ ```
292
+
293
+ ### useUserInterfaceParticipant
294
+
295
+ Hook to access the current participant in a user interface component. The participant is provided by the platform and contains information about the person currently viewing this UI.
296
+
297
+ ```ts
298
+ const useUserInterfaceParticipant: () => Participant | null;
299
+ ```
300
+
301
+ ### useUserInterfaceParticipants
302
+
303
+ Hook to access the list of participants currently known for this team.
304
+
305
+ ```ts
306
+ const useUserInterfaceParticipants: () => Participant[];
307
+ ```
308
+
309
+ ### useUserInterfaceTeams
310
+
311
+ Hook to access basic metadata about all teams in the session.
312
+
313
+ ```ts
314
+ const useUserInterfaceTeams: () => TeamInfo[];
315
+ ```
316
+
317
+ ### useUserInterfaceTheme
318
+
319
+ ```ts
320
+ const useUserInterfaceTheme: () => UserInterfaceTheme;
321
+ ```
322
+
323
+ ### useUserInterfaceThemePreference
324
+
325
+ ```ts
326
+ const useUserInterfaceThemePreference: () => ThemePreference;
327
+ ```
328
+
329
+ ### useUserInterfaceTimer
330
+
331
+ Hook to access the host's automatic tick timer state from inside a user interface component. Always returns a value — when `enabled` is false, no countdown should be displayed.
332
+
333
+ ```ts
334
+ const useUserInterfaceTimer: () => TimerState;
335
+ ```
336
+
337
+ ### useUserInterfaceValidationRejections
338
+
339
+ Subscribe to validator rejections from the host. Rejections are surfaced when a UI-submitted mutation (via `setData`) violates one or more validators declared in the game. They are delivered as a single batch per submission; the runtime collects every failing validator's verdict and returns them together.
340
+
341
+ ```ts
342
+ const useUserInterfaceValidationRejections: () => UserInterfaceValidationContextValue;
343
+ ```
344
+
345
+ ### useUserInterfaceViewerRole
346
+
347
+ Hook returning whether the current viewer is a `'participant'` or an `'observer'`. Use it to adapt a player or shell UI for observation — for example to show a debrief overlay, reveal otherwise-hidden state, or gate a genuinely read-only view. When it returns `'observer'`, `./UserInterfaceParticipantContext.useUserInterfaceParticipant` returns `null`.
348
+
349
+ ```ts
350
+ const useUserInterfaceViewerRole: () => ViewerRole;
351
+ ```
352
+
353
+ ### useViewerStorage
354
+
355
+ State that this browser remembers for this viewer, like `useState` but kept across a reload.
356
+
357
+ ```ts
358
+ function useViewerStorage<T>(
359
+ key: string,
360
+ initial: T | (() => T)
361
+ ): [T, (value: T | ((previous: T) => T)) => void];
362
+ ```
363
+
364
+ ## Classes
365
+
366
+ ### EndpointError
367
+
368
+ Error a surface's endpoint call (`callbacks.endpoints.<id>(request)`) rejects with. Inspect `outcome` (or the shorthand `kind`) for why, and `applied` for what had already changed.
369
+
370
+ ```ts
371
+ class EndpointError extends Error {
372
+ readonly outcome: EndpointFailureOutcome;
373
+ readonly applied: EffectStep[];
374
+ readonly failedStep?: EffectStep;
375
+ constructor(failure: EndpointFailure);
376
+ get kind(): EndpointFailureOutcome['kind'];
377
+ get failure(): EndpointFailure;
378
+ }
379
+ ```
380
+
381
+ ### MutationError
382
+
383
+ Error a fallible mutation promise rejects with. Inspect `outcome` (or the shorthand `kind`) to branch on the failure reason.
384
+
385
+ ```ts
386
+ class MutationError extends Error {
387
+ readonly outcome: MutationOutcome;
388
+ constructor(outcome: MutationOutcome);
389
+ get kind(): MutationOutcome['kind'];
390
+ }
391
+ ```
392
+
393
+ ### TickSnapshotError
394
+
395
+ Error a `getPastState` call rejects with on a genuine read fault.
396
+
397
+ ```ts
398
+ class TickSnapshotError extends Error {
399
+ constructor(message: string);
400
+ }
401
+ ```
402
+
403
+ ## Constants
404
+
405
+ ### AssetContext
406
+
407
+ Provided by every surface wrapper. Exported for the test helpers, which provide it without a host; game code reads it through `useAssetUrl` and `useAsset`.
408
+
409
+ ```ts
410
+ const AssetContext: import('react').Context<AssetScope | undefined>;
411
+ ```
412
+
413
+ ### CrossTeamDataContext
414
+
415
+ ```ts
416
+ const CrossTeamDataContext: import('react').Context<CrossTeamData | undefined>;
417
+ ```
418
+
419
+ ### PastStateContext
420
+
421
+ Provided by the wrappers whose surfaces can read past state: the player, session and presentation wrappers. Exported for the test helpers, which provide it without a host; game code reads it through `usePastState`.
422
+
423
+ ```ts
424
+ const PastStateContext: import('react').Context<PastStateReader | undefined>;
425
+ ```
426
+
427
+ ### PresentationContext
428
+
429
+ ```ts
430
+ const PresentationContext: import('react').Context<
431
+ PresentationValue<unknown, unknown, unknown> | undefined
432
+ >;
433
+ ```
434
+
435
+ ### SessionUserInterfaceCallbacksContext
436
+
437
+ ```ts
438
+ const SessionUserInterfaceCallbacksContext: import('react').Context<
439
+ SessionUserInterfaceCallbacks | undefined
440
+ >;
441
+ ```
442
+
443
+ ### SessionUserInterfaceDataContext
444
+
445
+ ```ts
446
+ const SessionUserInterfaceDataContext: import('react').Context<
447
+ | SessionUserInterfaceDataContextValue<
448
+ SessionData<object, object>,
449
+ unknown,
450
+ Record<string, unknown>,
451
+ Record<string, unknown>
452
+ >
453
+ | undefined
454
+ >;
455
+ ```
456
+
457
+ ### SessionUserInterfaceHookFailuresContext
458
+
459
+ ```ts
460
+ const SessionUserInterfaceHookFailuresContext: import('react').Context<
461
+ SessionUserInterfaceHookFailuresValue | undefined
462
+ >;
463
+ ```
464
+
465
+ ### SessionUserInterfaceHostOverlaysContext
466
+
467
+ ```ts
468
+ const SessionUserInterfaceHostOverlaysContext: import('react').Context<HostOverlay[]>;
469
+ ```
470
+
471
+ ### SessionUserInterfaceLocaleContext
472
+
473
+ ```ts
474
+ const SessionUserInterfaceLocaleContext: import('react').Context<
475
+ SessionUserInterfaceLocale | undefined
476
+ >;
477
+ ```
478
+
479
+ ### SessionUserInterfaceMetaContext
480
+
481
+ ```ts
482
+ const SessionUserInterfaceMetaContext: import('react').Context<SessionMeta | undefined>;
483
+ ```
484
+
485
+ ### SessionUserInterfaceParticipantsContext
486
+
487
+ ```ts
488
+ const SessionUserInterfaceParticipantsContext: import('react').Context<Participant[] | undefined>;
489
+ ```
490
+
491
+ ### SessionUserInterfaceTeamConfigurationContext
492
+
493
+ ```ts
494
+ const SessionUserInterfaceTeamConfigurationContext: import('react').Context<TeamConfiguration>;
495
+ ```
496
+
497
+ ### SessionUserInterfaceTeamLinksContext
498
+
499
+ ```ts
500
+ const SessionUserInterfaceTeamLinksContext: import('react').Context<TeamLinks[]>;
501
+ ```
502
+
503
+ ### SessionUserInterfaceTeamsContext
504
+
505
+ ```ts
506
+ const SessionUserInterfaceTeamsContext: import('react').Context<TeamInfo[]>;
507
+ ```
508
+
509
+ ### SessionUserInterfaceThemeContext
510
+
511
+ ```ts
512
+ const SessionUserInterfaceThemeContext: import('react').Context<
513
+ SessionUserInterfaceTheme | undefined
514
+ >;
515
+ ```
516
+
517
+ ### SessionUserInterfaceThemePreferenceContext
518
+
519
+ ```ts
520
+ const SessionUserInterfaceThemePreferenceContext: import('react').Context<
521
+ ThemePreference | undefined
522
+ >;
523
+ ```
524
+
525
+ ### SessionUserInterfaceWalkthroughLinkContext
526
+
527
+ ```ts
528
+ const SessionUserInterfaceWalkthroughLinkContext: import('react').Context<WalkthroughLink | null>;
529
+ ```
530
+
531
+ ### SettingsEditorCallbacksContext
532
+
533
+ ```ts
534
+ const SettingsEditorCallbacksContext: import('react').Context<SettingsEditorCallbacks | undefined>;
535
+ ```
536
+
537
+ ### SettingsEditorContext
538
+
539
+ ```ts
540
+ const SettingsEditorContext: import('react').Context<SettingsEditorValue<unknown> | undefined>;
541
+ ```
542
+
543
+ ### SettingsEditorLocaleContext
544
+
545
+ ```ts
546
+ const SettingsEditorLocaleContext: import('react').Context<SettingsEditorLocale | undefined>;
547
+ ```
548
+
549
+ ### SettingsEditorThemeContext
550
+
551
+ ```ts
552
+ const SettingsEditorThemeContext: import('react').Context<SettingsEditorTheme | undefined>;
553
+ ```
554
+
555
+ ### SettingsEditorThemePreferenceContext
556
+
557
+ ```ts
558
+ const SettingsEditorThemePreferenceContext: import('react').Context<ThemePreference | undefined>;
559
+ ```
560
+
561
+ ### UserInterfaceCallbacksContext
562
+
563
+ ```ts
564
+ const UserInterfaceCallbacksContext: import('react').Context<UserInterfaceCallbacks | undefined>;
565
+ ```
566
+
567
+ ### UserInterfaceDataContext
568
+
569
+ ```ts
570
+ const UserInterfaceDataContext: import('react').Context<
571
+ UserInterfaceDataContextValue<unknown, unknown> | undefined
572
+ >;
573
+ ```
574
+
575
+ ### UserInterfaceLocaleContext
576
+
577
+ ```ts
578
+ const UserInterfaceLocaleContext: import('react').Context<UserInterfaceLocale | undefined>;
579
+ ```
580
+
581
+ ### UserInterfaceOwnTeamContext
582
+
583
+ ```ts
584
+ const UserInterfaceOwnTeamContext: import('react').Context<TeamInfo | null>;
585
+ ```
586
+
587
+ ### UserInterfaceOwnTeamJoinLinkContext
588
+
589
+ ```ts
590
+ const UserInterfaceOwnTeamJoinLinkContext: import('react').Context<OwnTeamJoinLink | null>;
591
+ ```
592
+
593
+ ### UserInterfaceParticipantContext
594
+
595
+ ```ts
596
+ const UserInterfaceParticipantContext: import('react').Context<Participant | null | undefined>;
597
+ ```
598
+
599
+ ### UserInterfaceParticipantsContext
600
+
601
+ ```ts
602
+ const UserInterfaceParticipantsContext: import('react').Context<Participant[]>;
603
+ ```
604
+
605
+ ### UserInterfaceRunKindContext
606
+
607
+ ```ts
608
+ const UserInterfaceRunKindContext: import('react').Context<RunKind>;
609
+ ```
610
+
611
+ ### UserInterfaceTeamsContext
612
+
613
+ ```ts
614
+ const UserInterfaceTeamsContext: import('react').Context<TeamInfo[]>;
615
+ ```
616
+
617
+ ### UserInterfaceThemeContext
618
+
619
+ ```ts
620
+ const UserInterfaceThemeContext: import('react').Context<UserInterfaceTheme | undefined>;
621
+ ```
622
+
623
+ ### UserInterfaceThemePreferenceContext
624
+
625
+ ```ts
626
+ const UserInterfaceThemePreferenceContext: import('react').Context<ThemePreference | undefined>;
627
+ ```
628
+
629
+ ### UserInterfaceTimerContext
630
+
631
+ ```ts
632
+ const UserInterfaceTimerContext: import('react').Context<TimerState>;
633
+ ```
634
+
635
+ ### UserInterfaceValidationContext
636
+
637
+ ```ts
638
+ const UserInterfaceValidationContext: import('react').Context<
639
+ UserInterfaceValidationContextValue | undefined
640
+ >;
641
+ ```
642
+
643
+ ### UserInterfaceViewerRoleContext
644
+
645
+ ```ts
646
+ const UserInterfaceViewerRoleContext: import('react').Context<ViewerRole>;
647
+ ```
648
+
649
+ ### ViewerStorageContext
650
+
651
+ Provided by every surface wrapper. Exported for the test helpers, which provide it without a host; game code reads it through `useViewerStorage`.
652
+
653
+ ```ts
654
+ const ViewerStorageContext: import('react').Context<ViewerStorageScope | undefined>;
655
+ ```
656
+
657
+ ## Interfaces
658
+
659
+ ### AssetScope
660
+
661
+ What a wrapper tells `useAssetUrl` and `useAsset` about its surface.
662
+
663
+ ```ts
664
+ interface AssetScope {
665
+ getAssetUrl: ((reference: string) => string) | undefined;
666
+ locale: string | undefined;
667
+ }
668
+ ```
669
+
670
+ ### AssetState
671
+
672
+ ```ts
673
+ interface AssetState<T> {
674
+ data: T | undefined;
675
+ error: Error | undefined;
676
+ loading: boolean;
677
+ }
678
+ ```
679
+
680
+ ### EndpointFailure
681
+
682
+ A failed endpoint call, itemised so a caller can tell 'nothing happened' from 'the writes landed, then an action failed'.
683
+
684
+ ```ts
685
+ interface EndpointFailure {
686
+ outcome: EndpointFailureOutcome;
687
+ applied: EffectStep[];
688
+ failedStep?: EffectStep;
689
+ }
690
+ ```
691
+
692
+ ### Participant
693
+
694
+ A participant the platform tracks for some team in the session.
695
+
696
+ ```ts
697
+ interface Participant {
698
+ id: string;
699
+ name: string;
700
+ index: number;
701
+ connected: boolean;
702
+ teamId: string;
703
+ }
704
+ ```
705
+
706
+ ### PastStateEntry
707
+
708
+ ```ts
709
+ interface PastStateEntry<T = Record<string, unknown>> extends TeamStateEntry<T> {
710
+ tick: number;
711
+ recordedAt: number;
712
+ complete: boolean;
713
+ }
714
+ ```
715
+
716
+ ### PastStateQuery
717
+
718
+ What to read from the past.
719
+
720
+ ```ts
721
+ interface PastStateQuery<T = Record<string, unknown>> {
722
+ fromTick: number;
723
+ toTick?: number;
724
+ teams?: 'own' | 'all' | string;
725
+ capabilityIds?: (keyof T & string)[];
726
+ }
727
+ ```
728
+
729
+ ### PastStateResult
730
+
731
+ ```ts
732
+ interface PastStateResult<T> {
733
+ entries: PastStateEntry<T>[];
734
+ error: Error | undefined;
735
+ loading: boolean;
736
+ refetch: () => void;
737
+ }
738
+ ```
739
+
740
+ ### PresentationGame
741
+
742
+ The game a presentation belongs to, as the active scenario resolves it. Known with or without a session.
743
+
744
+ ```ts
745
+ interface PresentationGame {
746
+ name: string;
747
+ maxTicks: number | null;
748
+ mode: SessionMode;
749
+ scenarioName: string | null;
750
+ }
751
+ ```
752
+
753
+ ### PresentationSession
754
+
755
+ The session a presentation is shown during: the shared store and every team, narrowed to what the presentation `reads`.
756
+
757
+ ```ts
758
+ interface PresentationSession<
759
+ TTeamContext = Record<string, unknown>,
760
+ TSharedContext = Record<string, unknown>,
761
+ > {
762
+ id: string;
763
+ name: string;
764
+ completedTicks: number;
765
+ data: SessionData<TTeamContext, TSharedContext>;
766
+ teams: TeamInfo[];
767
+ }
768
+ ```
769
+
770
+ ### PresentationValue
771
+
772
+ ```ts
773
+ interface PresentationValue<TSettings, TTeamContext, TSharedContext> {
774
+ game: PresentationGame;
775
+ session: PresentationSession<TTeamContext, TSharedContext> | null;
776
+ settings: TSettings;
777
+ theme: SessionUserInterfaceTheme;
778
+ locale: UserInterfaceLocale;
779
+ getPastState: <T = Record<string, unknown>>(
780
+ query: PastStateQuery<T>
781
+ ) => Promise<PastStateEntry<T>[]>;
782
+ getAssetUrl: (reference: string) => string;
783
+ }
784
+ ```
785
+
786
+ ### SessionHookFailure
787
+
788
+ A hook chain that threw, reported to the session surface after the fact.
789
+
790
+ ```ts
791
+ interface SessionHookFailure {
792
+ signal: HookSignal;
793
+ teamId: string;
794
+ message: string;
795
+ }
796
+ ```
797
+
798
+ ### SessionUserInterfaceHookFailuresValue
799
+
800
+ Value exposed to consumers of `useSessionUserInterfaceHookFailures`.
801
+
802
+ ```ts
803
+ interface SessionUserInterfaceHookFailuresValue {
804
+ failures: SessionHookFailure[];
805
+ clearFailures: () => void;
806
+ }
807
+ ```
808
+
809
+ ### TeamInfo
810
+
811
+ Who a team is: the fields every team entry in the SDK carries.
812
+
813
+ ```ts
814
+ interface TeamInfo {
815
+ teamId: string;
816
+ index: number;
817
+ name: string;
818
+ }
819
+ ```
820
+
821
+ ### TeamStateEntry
822
+
823
+ One team's state at one committed past tick, as returned by `getPastState`.
824
+
825
+ ```ts
826
+ interface TeamStateEntry<T = Record<string, unknown>> extends TeamInfo {
827
+ context: T;
828
+ }
829
+ ```
830
+
831
+ ### TimerState
832
+
833
+ The host's automatic tick timer, as every reader sees it.
834
+
835
+ ```ts
836
+ interface TimerState {
837
+ enabled: boolean;
838
+ paused: boolean;
839
+ nextTickAt: number | null;
840
+ intervalMs: number | null;
841
+ pausedAt: number | null;
842
+ pausedMs: number;
843
+ extendedMs: number;
844
+ scheduleStartedAt: number | null;
845
+ }
846
+ ```
847
+
848
+ ### UseAssetOptions
849
+
850
+ ```ts
851
+ interface UseAssetOptions<F extends AssetFormat = AssetFormat> {
852
+ as: F;
853
+ locale?: string | false;
854
+ }
855
+ ```
856
+
857
+ ### UserInterfaceValidationContextValue
858
+
859
+ Value exposed to consumers of `useUserInterfaceValidationRejections`.
860
+
861
+ ```ts
862
+ interface UserInterfaceValidationContextValue {
863
+ rejections: ValidationRejection[];
864
+ clearRejections: () => void;
865
+ }
866
+ ```
867
+
868
+ ### ViewerStorageScope
869
+
870
+ What a wrapper tells `useViewerStorage` about where it is.
871
+
872
+ ```ts
873
+ interface ViewerStorageScope {
874
+ sessionKey: string | undefined;
875
+ surface: ViewerStorageSurface;
876
+ viewer: string;
877
+ }
878
+ ```
879
+
880
+ ## Types
881
+
882
+ ### AssetFormat
883
+
884
+ How `useAsset` reads the response body.
885
+
886
+ ```ts
887
+ type AssetFormat = 'json' | 'text' | 'blob';
888
+ ```
889
+
890
+ ### ContextDeletePath
891
+
892
+ Where to remove a key, as a path from the root of the context.
893
+
894
+ ```ts
895
+ type ContextDeletePath = string | readonly string[];
896
+ ```
897
+
898
+ ### ContextUpdate
899
+
900
+ A partial update accepted by `setData` and merged with `deepMergeContext`. Mirrors the merge semantics at the type level: object values may be given partially (they merge), while arrays and scalars must be given whole (they replace).
901
+
902
+ ```ts
903
+ type ContextUpdate<T> = {
904
+ [K in keyof T]?: T[K] extends ReadonlyArray<unknown>
905
+ ? T[K]
906
+ : T[K] extends Record<string, unknown>
907
+ ? ContextUpdate<T[K]>
908
+ : T[K];
909
+ };
910
+ ```
911
+
912
+ ### CrossTeamData
913
+
914
+ Every team's live cross-team state, one entry per team, sorted by stable team index and including the calling team's own.
915
+
916
+ ```ts
917
+ type CrossTeamData = TeamStateEntry[];
918
+ ```
919
+
920
+ ### EffectStep
921
+
922
+ One effect of an endpoint's result, in the order the runtime applies them: the endpoint's own `capabilities`, then each team's patch under `teams`, then each action by its position in `actions`.
923
+
924
+ ```ts
925
+ type EffectStep =
926
+ | {
927
+ kind: 'capabilities';
928
+ }
929
+ | {
930
+ kind: 'teams';
931
+ teamId: string;
932
+ }
933
+ | {
934
+ kind: 'action';
935
+ index: number;
936
+ type: EndpointActionType;
937
+ };
938
+ ```
939
+
940
+ ### EndpointFailureOutcome
941
+
942
+ Why an endpoint call failed.
943
+
944
+ ```ts
945
+ type EndpointFailureOutcome =
946
+ | MutationOutcome
947
+ | {
948
+ kind: 'invalid-request';
949
+ message: string;
950
+ }
951
+ | {
952
+ kind: 'handler-error';
953
+ message: string;
954
+ }
955
+ | {
956
+ kind: 'invalid-response';
957
+ message: string;
958
+ };
959
+ ```
960
+
961
+ ### HostOverlay
962
+
963
+ A host-rendered overlay a session surface may ask the host to open.
964
+
965
+ ```ts
966
+ type HostOverlay = 'facilitator-guide' | 'print-sheets';
967
+ ```
968
+
969
+ ### MutationFailure
970
+
971
+ A mutation that failed in a way the participant needs to know about.
972
+
973
+ ```ts
974
+ type MutationFailure = {
975
+ outcome: MutationOutcome;
976
+ action?: string;
977
+ retry?: () => Promise<boolean>;
978
+ };
979
+ ```
980
+
981
+ ### MutationOutcome
982
+
983
+ The reason a mutation failed.
984
+
985
+ ```ts
986
+ type MutationOutcome =
987
+ | {
988
+ kind: 'conflict';
989
+ message?: string;
990
+ }
991
+ | {
992
+ kind: 'superseded';
993
+ message: string;
994
+ committedAtTick?: number;
995
+ }
996
+ | {
997
+ kind: 'validation-rejected';
998
+ rejections: ValidationRejection[];
999
+ message?: string;
1000
+ }
1001
+ | {
1002
+ kind: 'denied';
1003
+ message: string;
1004
+ }
1005
+ | {
1006
+ kind: 'tick-failed';
1007
+ message: string;
1008
+ }
1009
+ | {
1010
+ kind: 'error';
1011
+ message: string;
1012
+ };
1013
+ ```
1014
+
1015
+ ### MutationReporter
1016
+
1017
+ ```ts
1018
+ type MutationReporter = {
1019
+ run: (mutate: () => Promise<unknown>, action?: string) => Promise<boolean>;
1020
+ pending: boolean;
1021
+ late: MutationCommit | null;
1022
+ failure: MutationFailure | null;
1023
+ dismiss: () => void;
1024
+ };
1025
+ ```
1026
+
1027
+ ### OwnTeamJoinLink
1028
+
1029
+ How to join _this_ surface's team.
1030
+
1031
+ ```ts
1032
+ type OwnTeamJoinLink = {
1033
+ joinUrl: string;
1034
+ fallbackJoinUrl?: string;
1035
+ };
1036
+ ```
1037
+
1038
+ ### PastStateReader
1039
+
1040
+ The surface's `getPastState` callback, as `usePastState` calls it.
1041
+
1042
+ ```ts
1043
+ type PastStateReader = <T = Record<string, unknown>>(
1044
+ query: PastStateQuery<T>
1045
+ ) => Promise<PastStateEntry<T>[]>;
1046
+ ```
1047
+
1048
+ ### RunKind
1049
+
1050
+ Which kind of run a function is executing in.
1051
+
1052
+ ```ts
1053
+ type RunKind = 'session' | 'walkthrough';
1054
+ ```
1055
+
1056
+ ### SessionData
1057
+
1058
+ Everything a session surface is shown of the session's state.
1059
+
1060
+ ```ts
1061
+ type SessionData<
1062
+ TTeamContext = Record<string, unknown>,
1063
+ TSharedContext = Record<string, unknown>,
1064
+ > = {
1065
+ shared: SharedState<TSharedContext>;
1066
+ teams: Record<string, TeamState<TTeamContext>>;
1067
+ };
1068
+ ```
1069
+
1070
+ ### SessionMeta
1071
+
1072
+ The session's identity and lifecycle state, pushed on connect and again whenever any of it changes.
1073
+
1074
+ ```ts
1075
+ type SessionMeta = {
1076
+ sessionId: string;
1077
+ name: string;
1078
+ readOnly: boolean;
1079
+ waitingRoomOpen: boolean;
1080
+ joinPin: string | null;
1081
+ };
1082
+ ```
1083
+
1084
+ ### SessionUserInterfaceLocale
1085
+
1086
+ ```ts
1087
+ type SessionUserInterfaceLocale = {
1088
+ locale: string;
1089
+ };
1090
+ ```
1091
+
1092
+ ### SessionUserInterfaceModeColors
1093
+
1094
+ ```ts
1095
+ type SessionUserInterfaceModeColors = SurfaceModeColors;
1096
+ ```
1097
+
1098
+ ### SessionUserInterfaceTheme
1099
+
1100
+ ```ts
1101
+ type SessionUserInterfaceTheme = {
1102
+ mode: 'dark' | 'light';
1103
+ dark: SessionUserInterfaceModeColors;
1104
+ light: SessionUserInterfaceModeColors;
1105
+ };
1106
+ ```
1107
+
1108
+ ### SetDataOptions
1109
+
1110
+ What a write can do beyond merging fields.
1111
+
1112
+ ```ts
1113
+ type SetDataOptions = {
1114
+ deletes?: ContextDeletePath[];
1115
+ };
1116
+ ```
1117
+
1118
+ ### SettingsEditorLocale
1119
+
1120
+ ```ts
1121
+ type SettingsEditorLocale = {
1122
+ locale: string;
1123
+ };
1124
+ ```
1125
+
1126
+ ### SettingsEditorModeColors
1127
+
1128
+ ```ts
1129
+ type SettingsEditorModeColors = SurfaceModeColors;
1130
+ ```
1131
+
1132
+ ### SettingsEditorTheme
1133
+
1134
+ ```ts
1135
+ type SettingsEditorTheme = {
1136
+ mode: 'dark' | 'light';
1137
+ dark: SettingsEditorModeColors;
1138
+ light: SettingsEditorModeColors;
1139
+ };
1140
+ ```
1141
+
1142
+ ### SettingsEditorValue
1143
+
1144
+ What a settings editor edits: the `setup` slot and the `scenario_editor` slot share it.
1145
+
1146
+ ```ts
1147
+ type SettingsEditorValue<T> = {
1148
+ settings: T;
1149
+ updateSettings: (update: Partial<T>) => Promise<void>;
1150
+ configures: string[];
1151
+ };
1152
+ ```
1153
+
1154
+ ### SharedState
1155
+
1156
+ ```ts
1157
+ type SharedState<TSharedContext = Record<string, unknown>> = {
1158
+ context: TSharedContext;
1159
+ revision: number;
1160
+ };
1161
+ ```
1162
+
1163
+ ### TeamConfiguration
1164
+
1165
+ How teams work in this session: the interaction mode, and the bounds the host will hold the surface to.
1166
+
1167
+ ```ts
1168
+ type TeamConfiguration = {
1169
+ mode: SessionMode;
1170
+ min?: number;
1171
+ max: number;
1172
+ perTeam?: {
1173
+ minParticipants?: number;
1174
+ maxParticipants?: number;
1175
+ };
1176
+ };
1177
+ ```
1178
+
1179
+ ### TeamLinks
1180
+
1181
+ A team's facilitator-only links: how participants join it, and how to watch it without joining.
1182
+
1183
+ ```ts
1184
+ type TeamLinks = {
1185
+ teamId: string;
1186
+ joinUrl: string;
1187
+ fallbackJoinUrl?: string;
1188
+ observeUrl: string;
1189
+ };
1190
+ ```
1191
+
1192
+ ### TeamState
1193
+
1194
+ Session-level data context for session user interfaces.
1195
+
1196
+ ```ts
1197
+ type TeamState<TTeamContext = Record<string, unknown>> = {
1198
+ context: TTeamContext;
1199
+ completedTicks: number;
1200
+ timer: TimerState;
1201
+ revision: number;
1202
+ };
1203
+ ```
1204
+
1205
+ ### ThemeColorRole
1206
+
1207
+ The palette roles a theme sends, each a colour a surface may paint with.
1208
+
1209
+ ```ts
1210
+ type ThemeColorRole = 'primary' | 'secondary' | 'success' | 'error' | 'warning' | 'info';
1211
+ ```
1212
+
1213
+ ### ThemeContrastText
1214
+
1215
+ One text colour per palette role, for text drawn on that role's colour.
1216
+
1217
+ ```ts
1218
+ type ThemeContrastText = Record<ThemeColorRole, string>;
1219
+ ```
1220
+
1221
+ ### UserInterfaceLocale
1222
+
1223
+ ```ts
1224
+ type UserInterfaceLocale = {
1225
+ locale: string;
1226
+ };
1227
+ ```
1228
+
1229
+ ### UserInterfaceModeColors
1230
+
1231
+ ```ts
1232
+ type UserInterfaceModeColors = SurfaceModeColors;
1233
+ ```
1234
+
1235
+ ### UserInterfaceTheme
1236
+
1237
+ ```ts
1238
+ type UserInterfaceTheme = {
1239
+ mode: 'dark' | 'light';
1240
+ dark: UserInterfaceModeColors;
1241
+ light: UserInterfaceModeColors;
1242
+ };
1243
+ ```
1244
+
1245
+ ### ViewerRole
1246
+
1247
+ Which viewer a player surface is being rendered for.
1248
+
1249
+ ```ts
1250
+ type ViewerRole = 'participant' | 'observer';
1251
+ ```
1252
+
1253
+ ### ViewerStorageSurface
1254
+
1255
+ Which surface a wrapper renders, as far as storage is concerned.
1256
+
1257
+ ```ts
1258
+ type ViewerStorageSurface = 'player' | 'session' | 'settings-editor' | 'presentation';
1259
+ ```
1260
+
1261
+ ### WalkthroughLink
1262
+
1263
+ Where to open the walkthrough run.
1264
+
1265
+ ```ts
1266
+ type WalkthroughLink = {
1267
+ url: string;
1268
+ };
1269
+ ```