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

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 +38 -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 +27404 -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 +16920 -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 +218 -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 +241 -0
  69. package/dist/docs/cli-and-dev-server.md +217 -0
  70. package/dist/docs/cli-error-codes.md +156 -0
  71. package/dist/docs/cli-reference.md +2489 -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 +577 -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 +339 -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 +123 -3
@@ -0,0 +1,218 @@
1
+ /**
2
+ * TeamStateStore - single owner of the dev server's per-session team state.
3
+ *
4
+ * The dev server juggles seven interdependent structures: the session tick, the
5
+ * per-team contexts, per-team tick counters, per-team stable indexes, per-team
6
+ * undo histories, the session-wide undo history, and the executor's own context.
7
+ * The load-bearing invariant is that the executor's context always mirrors team
8
+ * 0 (`executor.context === teamContexts[0]`); before this class that was
9
+ * hand-maintained at half a dozen call sites, and the stable-index↔array-position
10
+ * translation existed in as many variants.
11
+ *
12
+ * Everything the dev server needs to read or mutate that state now goes through
13
+ * one object. Mutators that touch team contexts keep the executor in step
14
+ * internally, and {@link withTeamContext} encapsulates the swap-run-restore
15
+ * dance a per-team operation performs, so callers never re-sync by hand.
16
+ */
17
+ import type { PastStateEntry } from '@seriousgaming/sdk';
18
+ import type { GameContext } from '../execution/types';
19
+ import { HistoryManager, type ContextSnapshot } from './history';
20
+ /** One team's committed state at a single past tick, before display names. */
21
+ interface PastTickView {
22
+ tick: number;
23
+ context: Record<string, unknown>;
24
+ recordedAt: number;
25
+ complete: boolean;
26
+ }
27
+ /**
28
+ * The slice of the executor the store keeps in lockstep with team 0. The real
29
+ * {@link GameExecutor} satisfies it; tests can supply a stub.
30
+ */
31
+ export interface ExecutorContextSync {
32
+ getContext(): GameContext;
33
+ setContext(context: GameContext): void;
34
+ /** Capabilities kept out of the tick's history (§7.6); none when absent. */
35
+ getSessionLifetimeCapabilityIds?(): string[];
36
+ /**
37
+ * Defaults of capabilities added while the session ran, composed under
38
+ * every board that lacks them; none when absent.
39
+ */
40
+ getAddedCapabilityDefaults?(): Map<string, Record<string, unknown>>;
41
+ }
42
+ export declare class TeamStateStore {
43
+ private readonly executor;
44
+ private currentTick;
45
+ private teamCount;
46
+ private independentMode;
47
+ private teamContexts;
48
+ private teamTicks;
49
+ /**
50
+ * Whether each team's tick controller has signalled completion. Completion
51
+ * is per-team because independent teams keep their own tick controller
52
+ * state (SPECIFICATION.md §9.4a); a lockstep or single-team session simply
53
+ * moves every entry together, so the session-wide notion collapses to
54
+ * {@link isSessionComplete}.
55
+ */
56
+ private teamComplete;
57
+ /**
58
+ * Stable team index for each array position, kept sorted ascending so every
59
+ * surfaced teams array is ordered by index. Indexes are assigned at team
60
+ * creation and never reassigned: a removal leaves a gap in the sequence, a
61
+ * later add takes the lowest unused index. Team ids are `team-${index + 1}`
62
+ * and never renumber.
63
+ */
64
+ private teamIndexes;
65
+ private teamHistories;
66
+ private readonly sessionHistory;
67
+ constructor(executor: ExecutorContextSync);
68
+ getCurrentTick(): number;
69
+ setCurrentTick(tick: number): void;
70
+ getTeamCount(): number;
71
+ setTeamCount(count: number): void;
72
+ getIsIndependentMode(): boolean;
73
+ setIsIndependentMode(independent: boolean): void;
74
+ /** The live team-context array. Callers treat it as read-only. */
75
+ getTeamContexts(): GameContext[];
76
+ /**
77
+ * Replace every team context, keeping the executor in step with team 0.
78
+ *
79
+ * The one place a board is built, so it is where a capability added while
80
+ * the session ran is seeded: every write, undo and reset reaches the
81
+ * boards through here, including an undo to a snapshot recorded before
82
+ * the capability existed (#640).
83
+ */
84
+ setTeamContexts(contexts: GameContext[]): void;
85
+ /** Replace a single team's context, keeping the executor in step. */
86
+ setTeamContext(position: number, context: GameContext): void;
87
+ /**
88
+ * Run a per-team operation with the executor's context swapped to the team
89
+ * at `position`, write the result back, then restore the executor to team
90
+ * 0. This is the one place the swap-run-restore dance lives, so a per-team
91
+ * tick or hook dispatch never leaks a non-team-0 context into the executor.
92
+ */
93
+ withTeamContext(position: number, run: () => Promise<GameContext>): Promise<GameContext>;
94
+ /**
95
+ * Run a read-only per-team operation with the executor swapped to the team
96
+ * at `position`, then restore team 0. Unlike {@link withTeamContext} the
97
+ * result is not a context, so nothing is written back. Used to evaluate a
98
+ * team's tick controller against that team's own state.
99
+ */
100
+ readWithTeamContext<T>(position: number, run: () => Promise<T>): Promise<T>;
101
+ private withoutSessionLifetime;
102
+ private syncExecutorToTeamZero;
103
+ getTeamTicks(): number[];
104
+ setTeamTick(position: number, tick: number): void;
105
+ setTeamTicks(ticks: number[]): void;
106
+ /** The furthest-advanced team tick, or 0 when there are no teams. */
107
+ maxTeamTick(): number;
108
+ getTeamComplete(): boolean[];
109
+ setTeamComplete(position: number, complete: boolean): void;
110
+ setTeamCompletes(flags: boolean[]): void;
111
+ /** Whether the team at array position `position` has completed. */
112
+ isTeamComplete(position: number): boolean;
113
+ /** Move every team's flag together: a lockstep or single-team completion. */
114
+ setAllTeamsComplete(complete: boolean): void;
115
+ /**
116
+ * Whether the whole session is done, which is true only once every team
117
+ * is. A game that is complete for one team of several is not complete: the
118
+ * others still tick.
119
+ */
120
+ isSessionComplete(): boolean;
121
+ /**
122
+ * Whether each team can tick no more, which is what `complete` reports
123
+ * (§9.0, §20.1): it signalled completion (§11.1) or played the tick limit
124
+ * (§9.6). The stored flags stay the signal alone, because undo and past
125
+ * state read the signal, not the limit.
126
+ */
127
+ teamsFinished(limit: number | null): boolean[];
128
+ /** Whether no team can tick again: every team is finished. */
129
+ isSessionFinished(limit: number | null): boolean;
130
+ getTeamIndexes(): number[];
131
+ setTeamIndexes(indexes: number[]): void;
132
+ /** Stable index for the team at array position `position`. */
133
+ teamIndexAt(position: number): number;
134
+ /** Team id for the team at array position `position`. */
135
+ teamIdAt(position: number): string;
136
+ /** Array position of the team with stable index `index`, or -1. */
137
+ positionOf(index: number): number;
138
+ /** The lowest stable index not currently in use (refills removal gaps). */
139
+ lowestUnusedTeamIndex(): number;
140
+ /**
141
+ * The stable indexes, falling back to array position when the index array
142
+ * is out of step with the team count (older snapshots, pre-init state).
143
+ */
144
+ resolvedTeamIndexes(): number[];
145
+ /** The session-wide undo history, which a shared-state undo rewinds. */
146
+ getSessionHistory(): HistoryManager;
147
+ getTeamHistory(position: number): HistoryManager;
148
+ getTeamHistories(): HistoryManager[];
149
+ setTeamHistories(histories: HistoryManager[]): void;
150
+ /** Undoable state of each team's history, in position order. */
151
+ teamCanUndo(): boolean[];
152
+ /**
153
+ * Push a session-history snapshot. Stamps the current stable indexes
154
+ * alongside team contexts so a later restore can map positions back.
155
+ */
156
+ historyPush(context: GameContext, tick: number, teamContexts?: GameContext[]): void;
157
+ historyUndo(): ContextSnapshot | null;
158
+ historyClear(): void;
159
+ /**
160
+ * Record the round every team just closed into its own history.
161
+ *
162
+ * Takes the pre-`Run` contexts rather than reading live state, because by
163
+ * the time a lockstep tick calls this the store already holds the engine's
164
+ * result: the boards to record are the ones the tick was handed.
165
+ *
166
+ * Every team or none. A session-history push that grows only some team
167
+ * histories breaks the lockstep a session-wide undo relies on, since that
168
+ * undoes every team once (#285).
169
+ */
170
+ pushAllTeamHistories(contexts: GameContext[], tick: number): void;
171
+ /** Step every team's history back one round, for a session-wide undo. */
172
+ undoAllTeamHistories(): void;
173
+ /**
174
+ * Compose a committed past tick's team view, the basis every `getPastState`
175
+ * row is built from (§19.2). Reads snapshot history only, never live state,
176
+ * and returns `null` for every tick that is not a reviewable closed round so
177
+ * the callback's null rule collapses to one place:
178
+ *
179
+ * - a negative, non-integer, or out-of-range tick;
180
+ * - a tick the team has not reached, its current head included: a team at
181
+ * tick `N` recorded rounds up to `N - 1` and holds the rest live;
182
+ * - an undone or reset tick, which the history's cursor excludes;
183
+ * - an unknown or removed `teamIndex`, at any team count.
184
+ *
185
+ * The snapshot's own `context` already carries the shared store as it stood
186
+ * at that tick (facilitator shared writes land in the team contexts as they
187
+ * are made, and a snapshot is taken at the close of the round), so the
188
+ * point-in-time view needs no re-composition with the current store.
189
+ */
190
+ pastTickView(tick: number, teamIndex?: number): PastTickView | null;
191
+ /**
192
+ * Compose committed past state for the UI `getPastState` callback: one row
193
+ * per (tick, team) the query reaches, ascending by tick then by team index.
194
+ *
195
+ * Built on {@link pastTickView} per tick per team rather than by walking
196
+ * the snapshot array, so every null rule the single reader encodes — not
197
+ * yet reached, undone, reset, out of range — is inherited here rather than
198
+ * reimplemented. Teams in an independent session are at different ticks,
199
+ * which is reason enough: one range is a different set of rounds per team.
200
+ *
201
+ * Unreachable (tick, team) pairs are omitted rather than collapsing the
202
+ * call, so the result is dense and an empty array means the query reaches
203
+ * nothing reviewable. `toTick` is effectively clamped to the last
204
+ * reviewable tick, because anything a team has not closed is skipped.
205
+ *
206
+ * Each entry carries the team's `index` and its display name as it reads
207
+ * now, from `nameOf`: the store holds no names, which are the session's
208
+ * (a rename included). `teamIndexes` is already resolved by the caller,
209
+ * which is the only layer that knows whether the asking surface has an own
210
+ * team.
211
+ */
212
+ getPastStateView(range: {
213
+ fromTick: number;
214
+ toTick?: number;
215
+ capabilityIds?: string[];
216
+ }, teamIndexes: number[], nameOf: (index: number) => string): PastStateEntry[];
217
+ }
218
+ export {};
@@ -0,0 +1,75 @@
1
+ /**
2
+ * One automatic tick schedule (§11.2–§11.4).
3
+ *
4
+ * A session holds one per team in independent mode and one for the cohort
5
+ * otherwise. Everything here is bookkeeping over a {@link Clock}: the session
6
+ * decides when to ask the tick controller, and this decides when that answer
7
+ * says the next tick is due.
8
+ */
9
+ import type { TickControllerResult, TimerState } from '@seriousgaming/sdk';
10
+ import type { Clock } from './clock';
11
+ export declare const IDLE_TIMER: TimerState;
12
+ /** When a result says the next tick is due, and whether that had to be clamped. */
13
+ export interface Schedule {
14
+ delayMs: number;
15
+ /** The display interval: the result's own when valid, the clamped one otherwise. */
16
+ intervalMs: number;
17
+ usedNextTickAt: boolean;
18
+ /** Why the result could not be honoured as returned, or null. */
19
+ clamped: string | null;
20
+ }
21
+ /**
22
+ * Where a tick controller result puts the next tick (§11.2, §11.8, §11.9).
23
+ *
24
+ * An out-of-range or malformed result is clamped to the nearest bound and the
25
+ * reason returned, never honoured and never turned into a disabled timer. A
26
+ * `nextTickAt` already past is due now, which the floor does not apply to
27
+ * (§11.3).
28
+ */
29
+ export declare function scheduleFor(result: TickControllerResult, now: number): Schedule;
30
+ export type ResumeOutcome = 'resumed' | 're-evaluate' | 'idle';
31
+ export declare class TickTimer {
32
+ private readonly clock;
33
+ private readonly fire;
34
+ private pending;
35
+ private dueAt;
36
+ private intervalMs;
37
+ private enabled;
38
+ private paused;
39
+ private usedNextTickAt;
40
+ private pausedAt;
41
+ private remainingMs;
42
+ private pausedMs;
43
+ private scheduleStartedAt;
44
+ private extendedMs;
45
+ /** The answer the current schedule was built from, to tell a re-evaluation that changed nothing. */
46
+ private answer;
47
+ constructor(clock: Clock, fire: () => void);
48
+ /**
49
+ * Apply a tick controller's answer (§11.1). A disabled timer, a completed
50
+ * game or a spent tick limit schedules nothing. Returns the clamp reason
51
+ * when the result had to be clamped, for the caller to report.
52
+ *
53
+ * A re-evaluation (§11.1a) that returns the answer the schedule was built
54
+ * from keeps that schedule, extension and paused remainder included;
55
+ * only a tick, or a different answer, starts a new window.
56
+ */
57
+ apply(result: TickControllerResult | null, canTick: boolean, reevaluation?: boolean): string | null;
58
+ pause(): void;
59
+ /**
60
+ * Resume (§11.4). Interval mode continues from the time that was left;
61
+ * scheduled mode tells the caller to re-evaluate, because the target may
62
+ * have passed during the pause and the missed tick is not fired.
63
+ */
64
+ resume(): ResumeOutcome;
65
+ /**
66
+ * Move the scheduled tick by `ms` (§12.5): only this window, clamped at
67
+ * now, and never bounded by §11.8. Returns why it was refused, or null.
68
+ */
69
+ extend(ms: number): string | null;
70
+ /** Stop everything, as when the team is removed or the session stops. */
71
+ cancel(): void;
72
+ state(): TimerState;
73
+ private arm;
74
+ private cancelPending;
75
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Every `blob:` reference in an endpoint's response, resolved to a URL (§6.12).
3
+ *
4
+ * A game surface turns a reference into something it can fetch with
5
+ * `getAssetUrl`. A caller outside the game has no such callback, so a report an
6
+ * endpoint wrote with `writeBlob` reached it as an id it could do nothing with.
7
+ * The transport answering the call is the one that knows where blobs are
8
+ * served, so it resolves them here rather than in the session.
9
+ */
10
+ export declare function blobLinks(response: unknown, urlFor: (blobId: string) => string): Record<string, string>;