@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,59 @@
1
+ /**
2
+ * A dev server for a test runner, started in-process and isolated (#640).
3
+ *
4
+ * The same server `sdk dev --isolated` runs: no lock file, so it starts beside
5
+ * the developer's own and no CLI command finds it by accident; configuration
6
+ * from the package alone; uploads in a temporary directory removed at stop.
7
+ * For Playwright's `globalSetup`, a recording script, or anything else that
8
+ * would otherwise spawn `sdk dev`, wait for a port and parse its output.
9
+ */
10
+ import type { SignatureCallbacks } from '@seriousgaming/sdk';
11
+ import type { Clock } from '../core/clock';
12
+ import type { ParticipantCounts } from '../core/session';
13
+ export interface DevServerOptions {
14
+ /** The package to serve: the directory holding `seriousgaming.sdk.json`. */
15
+ packagePath: string;
16
+ /** Where to look for a port, stepping up past any in use. Any free port by default. */
17
+ port?: number;
18
+ /** Teams to start with. The manifest's bounds still apply. */
19
+ teams?: number;
20
+ /** Participants each team is seeded with: one count for all, or one per team. */
21
+ participants?: ParticipantCounts;
22
+ /** Scenario to activate; `null` opts out of the game's default. */
23
+ scenarioId?: string | null;
24
+ locale?: string;
25
+ /** A clock the test moves, such as a {@link FakeClock}, for timed ticks. */
26
+ clock?: Clock;
27
+ /** Replace callbacks logic receives, such as `generateText`. */
28
+ callbacks?: Partial<SignatureCallbacks>;
29
+ /** Re-initialise on every edit that applies only at initialisation. */
30
+ reinitOnChange?: boolean;
31
+ }
32
+ export interface DevServer {
33
+ /** The console and API, such as `http://localhost:53712`. */
34
+ url: string;
35
+ /** Where game surfaces and the files they read are served from. */
36
+ assetUrl: string;
37
+ /** Stop the server and remove its temporary files. */
38
+ stop(): Promise<void>;
39
+ }
40
+ /**
41
+ * Start an isolated dev server for the package and resolve once it answers.
42
+ *
43
+ * Platform credentials come from the environment and the package's `.env`, as
44
+ * `sdk dev` reads them. Always call `stop()`: the server holds ports and a
45
+ * file watcher open until it is told to let go.
46
+ *
47
+ * @example
48
+ * ```ts
49
+ * // playwright.global-setup.ts
50
+ * import { startDevServer } from '@seriousgaming/sdk-tools/client';
51
+ *
52
+ * export default async function globalSetup() {
53
+ * const server = await startDevServer({ packagePath: process.cwd() });
54
+ * process.env.BASE_URL = server.url;
55
+ * return () => server.stop();
56
+ * }
57
+ * ```
58
+ */
59
+ export declare function startDevServer(options: DevServerOptions): Promise<DevServer>;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Programmatic API for testing a game in-process.
3
+ *
4
+ * `createTestSession` runs the session the dev server runs (hooks, validators,
5
+ * endpoints, participants, undo, per-team ticks and timers) with no server
6
+ * around it. `startDevServer` runs the server too, isolated from any dev
7
+ * server already running for the package, for browser tests and recordings.
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { createTestSession } from '@seriousgaming/sdk-tools/client';
12
+ * import { fileURLToPath } from 'url';
13
+ *
14
+ * const session = await createTestSession({
15
+ * packagePath: fileURLToPath(new URL('../..', import.meta.url)),
16
+ * });
17
+ *
18
+ * await session.send({ type: 'tick' });
19
+ * ```
20
+ */
21
+ export type { SignatureCallbacks } from '@seriousgaming/sdk';
22
+ export { createTestSession, type ContextPatch, type DeletePath, type SetDataOptions, type SetSharedDataOptions, type TestSession, type TestSessionOptions, type TestSessionState, type TestSessionTeam, type UntypedContext, } from './test-session';
23
+ export { startDevServer, type DevServer, type DevServerOptions } from './dev-server';
24
+ export { createStubServices, stubGenerateText, type TestServices } from './stub-services';
25
+ export { FakeClock, type Clock } from '../core/clock';
26
+ export type { Command, MutationCommand, QueryCommand, QueryResult } from '../core/protocol';
27
+ export type { ParticipantCounts } from '../core/session';
28
+ export type { MutationResult, StateProjection } from '@seriousgaming/sdk/projection';
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The service callbacks a test session offers by default: deterministic,
3
+ * offline stand-ins for the platform's.
4
+ *
5
+ * A test that reaches the platform fails without a network, without a key and
6
+ * in a sandbox, and passes or fails on what a model happened to say. These
7
+ * answer from the request alone, so the same request always gets the same
8
+ * answer and a test can assert on it.
9
+ *
10
+ * The stubs themselves are the SDK's (`@seriousgaming/sdk/testing`), which a
11
+ * unit test calling logic directly uses too, so both answer alike. Only the
12
+ * speech clip differs in where it goes: here, into the session's blob store.
13
+ */
14
+ import type { SignatureCallbacks } from '@seriousgaming/sdk';
15
+ import { stubGenerateText } from '@seriousgaming/sdk/testing';
16
+ export { stubGenerateText };
17
+ /** Where a test session's service callbacks go (`TestSessionOptions.services`). */
18
+ export type TestServices = 'stub' | 'platform';
19
+ /**
20
+ * The stubbed service callbacks: `generateText`, `generateSpeech` and
21
+ * `extractText`. Blob storage stays real, because it is local.
22
+ *
23
+ * - `generateText` answers `[stub <hash>] <excerpt>`: an eight-digit hex hash
24
+ * of the whole request, then the first 60 characters of its prompt (the
25
+ * `prompt`, or the last `user` message's text) with whitespace collapsed,
26
+ * ending in `...` when it was cut. A request with a `jsonSchema` is
27
+ * answered with JSON that satisfies it.
28
+ * - `generateSpeech` stores 100ms of silence as a WAV blob and returns its
29
+ * `blob:` reference, so `readAsset` resolves it like real audio.
30
+ * - `extractText` answers `[stub] text of <reference>`, without reading the file.
31
+ */
32
+ export declare function createStubServices(packagePath: string): Required<Pick<SignatureCallbacks, 'generateText' | 'generateSpeech' | 'extractText'>>;
@@ -0,0 +1,195 @@
1
+ /**
2
+ * A session to test against, in this process.
3
+ *
4
+ * A game is more than its engine. Hooks fire when somebody joins, validators
5
+ * refuse a decision, endpoints answer a surface, a timer ticks the round,
6
+ * independent teams tick one at a time, and undo puts a round back. None of
7
+ * that is reachable by calling `Init` and `Run`.
8
+ *
9
+ * This is the session `sdk dev` runs, with no server around it. Every command
10
+ * the console, the CLI or a surface can send, it can send, and it answers the
11
+ * same way.
12
+ */
13
+ import type { SignatureCallbacks } from '@seriousgaming/sdk';
14
+ import type { MutationResult, ProjectedTeam, StateProjection } from '@seriousgaming/sdk/projection';
15
+ import type { Clock } from '../core/clock';
16
+ import type { Command, MutationCommand, QueryCommand, QueryResult } from '../core/protocol';
17
+ import { type ParticipantCounts } from '../core/session';
18
+ import { type TestServices } from './stub-services';
19
+ export interface TestSessionOptions {
20
+ /** Absolute path to the package, where `seriousgaming.sdk.json` lives. */
21
+ packagePath: string;
22
+ /** Teams to start with. The game's bounds still apply. */
23
+ teams?: number;
24
+ /**
25
+ * Participants to seed each team with: one count, or one per team.
26
+ * Defaults to one each, or the game's `perTeam.minParticipants`. Zero is
27
+ * allowed.
28
+ */
29
+ participants?: ParticipantCounts;
30
+ /**
31
+ * A scenario to start on. Omit for the game's default scenario, or pass
32
+ * `null` to run on the settings defaults.
33
+ */
34
+ scenarioId?: string | null;
35
+ locale?: string;
36
+ /**
37
+ * Replace callbacks logic receives. Anything not named keeps its default:
38
+ * a stub, or the platform's with `services: 'platform'`.
39
+ */
40
+ callbacks?: Partial<SignatureCallbacks>;
41
+ /**
42
+ * Where the service callbacks (`generateText`, `generateSpeech`,
43
+ * `extractText`) go. `'stub'`, the default, answers deterministically and
44
+ * offline (see `createStubServices`), so a test needs no network and no
45
+ * key. `'platform'` sends them to the Serious Gaming platform, with
46
+ * `platform` or the environment's credentials.
47
+ */
48
+ services?: TestServices;
49
+ /**
50
+ * The clock timers run on. Pass a `FakeClock` and move it with
51
+ * `advanceClock` to test automatic ticking without waiting.
52
+ */
53
+ clock?: Clock;
54
+ /**
55
+ * Press Play on a game with a configuration step (§8.3). Default `true`;
56
+ * pass `false` to test the step itself.
57
+ */
58
+ play?: boolean;
59
+ /** Serious Gaming platform access, used with `services: 'platform'`. */
60
+ platform?: {
61
+ apiKey?: string;
62
+ apiHost?: string;
63
+ };
64
+ }
65
+ /** A capability context as the projection carries it, before a game's types narrow it. */
66
+ export type UntypedContext = Record<string, Record<string, unknown>>;
67
+ /** One team as {@link TestSession.state} reports it, its context typed. */
68
+ export interface TestSessionTeam<Context = UntypedContext> extends Omit<ProjectedTeam, 'context'> {
69
+ /** The composed view: the team's own context plus the shared store (§7.5). */
70
+ context: Context;
71
+ }
72
+ /** The session's observable state, with each team's context and the shared store typed. */
73
+ export type TestSessionState<Context = UntypedContext, Shared = UntypedContext> = Omit<StateProjection, 'teams' | 'shared'> & {
74
+ teams: TestSessionTeam<Context>[];
75
+ shared: Shared;
76
+ };
77
+ /**
78
+ * A write to some of a context's capabilities, each merged one level deep as
79
+ * a surface's `setData` is (§9.5): name the variables that change.
80
+ */
81
+ export type ContextPatch<Context> = {
82
+ [K in keyof Context]?: Partial<Context[K]>;
83
+ };
84
+ /** A path to remove, as a surface's `deletes` names one (§9.5). */
85
+ export type DeletePath = string | string[];
86
+ export interface SetDataOptions {
87
+ /** Paths to remove once the patch has merged. */
88
+ deletes?: DeletePath[];
89
+ /**
90
+ * Who writes. `'participant'`, the default, writes as a player surface
91
+ * does: as the team's first participant (or `participantId`), held to the
92
+ * surface's `writes` and put to the validators. `'system'` writes as the
93
+ * CLI does, trusted, ungated and unchecked: for arranging a board a test
94
+ * then plays on.
95
+ */
96
+ as?: 'participant' | 'system';
97
+ /** The participant to write as. Defaults to the team's first. */
98
+ participantId?: string;
99
+ /** The player surface the participant writes through. Defaults to `ui`. */
100
+ ui?: string;
101
+ }
102
+ export interface SetSharedDataOptions {
103
+ deletes?: DeletePath[];
104
+ /**
105
+ * The session surface the facilitator writes through, which holds the
106
+ * write to that surface's `writes`. Omit to write as the CLI does,
107
+ * trusted and unchecked.
108
+ */
109
+ ui?: string;
110
+ }
111
+ /**
112
+ * A session to test against.
113
+ *
114
+ * `Context` and `Shared` type what {@link state}, {@link team} and
115
+ * {@link shared} return, and what {@link setData} and {@link setSharedData}
116
+ * accept. Pass the engine's generated `Context` and `SharedContext`; nothing
117
+ * checks them against the running package, any more than a cast would.
118
+ */
119
+ export interface TestSession<Context = UntypedContext, Shared = UntypedContext> {
120
+ /**
121
+ * Run a command, exactly as the dev server would: a mutation settles as
122
+ * `{ ok: true }` or `{ ok: false, outcome }`, and a read answers with its
123
+ * result. A refusal is an answer, not a throw.
124
+ */
125
+ send(command: MutationCommand): Promise<MutationResult>;
126
+ send(command: QueryCommand): Promise<QueryResult>;
127
+ send(command: Command): Promise<MutationResult | QueryResult>;
128
+ /** The whole session now: teams, contexts, rosters, the store, the timer. */
129
+ state(): TestSessionState<Context, Shared>;
130
+ /**
131
+ * One team now, by its stable index (§5.6), not its array position. Throws
132
+ * when no team has that index.
133
+ */
134
+ team(index: number): TestSessionTeam<Context>;
135
+ /**
136
+ * The shared store now (§7.5), under `context` as a session surface's
137
+ * `sessionData.shared` carries it, so an assertion reads the same in a
138
+ * test and in the surface. The context is empty outside shared-state mode.
139
+ */
140
+ readonly shared: {
141
+ readonly context: Shared;
142
+ };
143
+ /**
144
+ * Tick as the facilitator does: never gated by a validator. `team` ticks
145
+ * that one team in independent mode; omit it to tick every team.
146
+ */
147
+ tick(options?: {
148
+ team?: number;
149
+ }): Promise<MutationResult>;
150
+ /**
151
+ * Ask for the next tick as a participant's surface does, so the
152
+ * validators' `RequestTick` gates judge it. Asks as the team's first
153
+ * participant unless `participantId` is given.
154
+ */
155
+ requestTick(team: number, options?: {
156
+ participantId?: string;
157
+ }): Promise<MutationResult>;
158
+ /**
159
+ * Write to one team's context, by stable index. As a participant through
160
+ * `ui` unless `as: 'system'` (see {@link SetDataOptions}).
161
+ */
162
+ setData(team: number, patch: ContextPatch<Context>, options?: SetDataOptions): Promise<MutationResult>;
163
+ /** Write to the shared store, as the facilitator does. */
164
+ setSharedData(patch: ContextPatch<Shared>, options?: SetSharedDataOptions): Promise<MutationResult>;
165
+ /**
166
+ * Resolves once everything queued has run, including a tick a timer set
167
+ * off. `advanceClock` already waits; this is for a timer moved by hand.
168
+ */
169
+ settled(): Promise<void>;
170
+ /** Stop the session's timers. Call it in `afterEach`. */
171
+ close(): Promise<void>;
172
+ }
173
+ /**
174
+ * Start a session on a package.
175
+ *
176
+ * Nothing is read from or written to `.seriousgaming-sdk/` but blobs, so a
177
+ * test does not depend on what somebody last ran `sdk configure` with. Service
178
+ * callbacks are stubbed unless `services: 'platform'` is passed, so a test
179
+ * runs offline.
180
+ *
181
+ * Pass the engine's generated `Context` and `SharedContext` to type what it
182
+ * reads back and what it writes.
183
+ *
184
+ * @example
185
+ * ```ts
186
+ * import type { Context, SharedContext } from '../../engine/types';
187
+ *
188
+ * const session = await createTestSession<Context, SharedContext>({ packagePath, teams: 2 });
189
+ * expect((await session.setData(0, { price: { Price: 12 } })).ok).toBe(true);
190
+ * expect((await session.tick()).ok).toBe(true);
191
+ * expect(session.team(0).context.sales.Sales).toBeGreaterThan(0);
192
+ * await session.close();
193
+ * ```
194
+ */
195
+ export declare function createTestSession<Context = UntypedContext, Shared = UntypedContext>(options: TestSessionOptions): Promise<TestSession<Context, Shared>>;