@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,125 @@
1
+ /**
2
+ * One-line JSON for a copy-paste example, derived from the pretty-printed
3
+ * literal so the two can never disagree.
4
+ */
5
+ export declare function compact(example: string): string;
6
+ /** Indent every line of a multi-line block by two spaces (help-text layout). */
7
+ export declare function indent(block: string): string;
8
+ export declare const packageExample: string;
9
+ export declare const capabilityExample: string;
10
+ export declare const settingsExample: string;
11
+ export declare const settingsUpdateExample: string;
12
+ export declare const engineExample: string;
13
+ export declare const userInterfaceExample: string;
14
+ export declare const setupExample: string;
15
+ export declare const setupUpdateExample: string;
16
+ export declare const scenarioEditorExample: string;
17
+ export declare const scenarioEditorUpdateExample: string;
18
+ export declare const packageUpdateExample: string;
19
+ export declare const capabilityUpdateExample: string;
20
+ export declare const engineUpdateExample: string;
21
+ export declare const userInterfaceUpdateExample: string;
22
+ export declare const tickControllerExample: string;
23
+ export declare const tickControllerUpdateExample: string;
24
+ export declare const hookExample: string;
25
+ export declare const hookUpdateExample: string;
26
+ export declare const validatorExample: string;
27
+ export declare const validatorUpdateExample: string;
28
+ export declare const endpointExample: string;
29
+ export declare const endpointUpdateExample: string;
30
+ export declare const sessionUserInterfaceExample: string;
31
+ export declare const sessionUserInterfaceUpdateExample: string;
32
+ export declare const waitingRoomUserInterfaceExample: string;
33
+ export declare const waitingRoomUserInterfaceUpdateExample: string;
34
+ export declare const presentationExample: string;
35
+ export declare const presentationUpdateExample: string;
36
+ export declare const scenarioExample: string;
37
+ export declare const scenarioUpdateExample: string;
38
+ export declare const facilitatorGuideExample: string;
39
+ export declare const facilitatorGuideUpdateExample: string;
40
+ /**
41
+ * The one example per resource type and command, looked up by type.
42
+ *
43
+ * Three families of example used to be written separately: the `--help` text
44
+ * (wired to these literals by #448), the `Expected format` block a `new` or
45
+ * `update` prints when it cannot parse its input, and the expected shape a
46
+ * schema-validation failure prints. Only the first was ever checked, so the
47
+ * other two rotted where an author is already stuck — thirteen of them still
48
+ * showed the dotted identifiers the CLI has rejected since #433. All three now
49
+ * render from here (#473).
50
+ */
51
+ export declare const RESOURCE_EXAMPLES: {
52
+ readonly package: {
53
+ readonly new: string;
54
+ readonly update: string;
55
+ };
56
+ readonly capability: {
57
+ readonly new: string;
58
+ readonly update: string;
59
+ };
60
+ readonly settings: {
61
+ readonly new: string;
62
+ readonly update: string;
63
+ };
64
+ readonly engine: {
65
+ readonly new: string;
66
+ readonly update: string;
67
+ };
68
+ readonly ui: {
69
+ readonly new: string;
70
+ readonly update: string;
71
+ };
72
+ readonly setup: {
73
+ readonly new: string;
74
+ readonly update: string;
75
+ };
76
+ readonly scenario_editor: {
77
+ readonly new: string;
78
+ readonly update: string;
79
+ };
80
+ readonly tick_controller: {
81
+ readonly new: string;
82
+ readonly update: string;
83
+ };
84
+ readonly session: {
85
+ readonly new: string;
86
+ readonly update: string;
87
+ };
88
+ readonly waiting_room: {
89
+ readonly new: string;
90
+ readonly update: string;
91
+ };
92
+ readonly presentation: {
93
+ readonly new: string;
94
+ readonly update: string;
95
+ };
96
+ readonly scenario: {
97
+ readonly new: string;
98
+ readonly update: string;
99
+ };
100
+ readonly guide: {
101
+ readonly new: string;
102
+ readonly update: string;
103
+ };
104
+ readonly hook: {
105
+ readonly new: string;
106
+ readonly update: string;
107
+ };
108
+ readonly validator: {
109
+ readonly new: string;
110
+ readonly update: string;
111
+ };
112
+ readonly endpoint: {
113
+ readonly new: string;
114
+ readonly update: string;
115
+ };
116
+ };
117
+ /** A resource type with a documented example. */
118
+ export type ExampledResourceType = keyof typeof RESOURCE_EXAMPLES;
119
+ /**
120
+ * The example for a type and command.
121
+ *
122
+ * Every caller reaches an example this way, so a type registered without one is
123
+ * a compile error rather than a message that quietly says nothing.
124
+ */
125
+ export declare function resourceExample(type: ExampledResourceType, command: 'new' | 'update'): string;
@@ -0,0 +1,67 @@
1
+ /**
2
+ * The side effects a host channel delegates to its embedder.
3
+ *
4
+ * The channel owns the §12 protocol: the handshake, the initial batch,
5
+ * correlation, framing, and teardown. It owns none of the work those messages
6
+ * ask for, because that work is where the SDK dev server and a production
7
+ * platform genuinely differ — one calls into an in-process executor, the other
8
+ * into an HTTP API. Everything an embedder must supply is here, and it is the
9
+ * only place the two implementations diverge.
10
+ *
11
+ * Every method may throw. The channel catches, frames the failure as the
12
+ * protocol's `ok: false` response for that request, and keeps the port open: a
13
+ * failing endpoint must not take the surface down with it.
14
+ */
15
+ import type { PastStateEntry, PastStateQuery, Participant } from '@seriousgaming/sdk';
16
+ /** Who is asking. Supplied to every adapter call so it can authorise. */
17
+ export interface RequestOrigin {
18
+ /** Identifier of the UI bundle mounted in this frame. */
19
+ uiIdentifier: string;
20
+ /** The team whose surface this is, where the surface belongs to one. */
21
+ teamId?: string;
22
+ /** The participant this render is identified as, absent for an observer. */
23
+ participantId?: string;
24
+ }
25
+ export interface HostAdapter {
26
+ /**
27
+ * Invoke a server-side endpoint (§6.12).
28
+ *
29
+ * The adapter is responsible for the `endpoints` allowlist, request and
30
+ * response schema validation, and execution. The channel only correlates.
31
+ * Resolve with the response; on failure throw an `EndpointError` carrying
32
+ * the call's `EndpointFailure`, which the channel sends as it stands. Any
33
+ * other throw reaches the surface as `{ kind: 'error' }` with nothing
34
+ * applied.
35
+ */
36
+ callEndpoint?(request: {
37
+ endpointIdentifier: string;
38
+ request: unknown;
39
+ }, origin: RequestOrigin): Promise<unknown>;
40
+ /**
41
+ * Store an uploaded file and return its `blob:<id>` reference (§16.2).
42
+ *
43
+ * The lifecycle bucket is the host's to assign from the surface kind; the
44
+ * guest has no say in it.
45
+ */
46
+ uploadBlob?(file: {
47
+ data: ArrayBuffer;
48
+ name: string;
49
+ mimeType: string;
50
+ }, origin: RequestOrigin): Promise<string>;
51
+ /**
52
+ * Answer a read-only history query (§12.5).
53
+ *
54
+ * The adapter resolves `query.teams` and bounds `capabilityIds` server-side.
55
+ * An unreachable tick or team is an absent row, not a fault, so the normal
56
+ * answer to a query that reaches nothing is an empty array.
57
+ */
58
+ getPastState?(query: PastStateQuery, origin: RequestOrigin): Promise<PastStateEntry[]>;
59
+ /**
60
+ * Every team's current roster, flattened (§12.5).
61
+ *
62
+ * Gated by the bundle's `crossTeamParticipants` declaration, which the
63
+ * adapter checks: an undeclared surface is answered with an empty array
64
+ * rather than an error.
65
+ */
66
+ getAllTeamsParticipants?(origin: RequestOrigin): Promise<Participant[]>;
67
+ }
@@ -0,0 +1,222 @@
1
+ /**
2
+ * The host half of the §12 host ↔ iframe protocol, with no framework in it.
3
+ *
4
+ * The guest half of this channel is `useHostChannel` and the wrapper components
5
+ * in `@seriousgaming/sdk/ui`. The two halves hold their own
6
+ * definitions of the wire protocol, and `protocol.parity.test.ts` refuses to
7
+ * compile when they disagree, so neither end can change alone.
8
+ *
9
+ * It owns the lifecycle and nothing else:
10
+ *
11
+ * - the window-level `ready` / `init` handshake, origin-pinned per §12.2
12
+ * - a bounded handshake, so a frame that has navigated itself away is detected
13
+ * rather than left spinning (§16.6)
14
+ * - the required initial batch per surface kind (§12.6)
15
+ * - reconnection: close the old port, fresh channel, re-send the batch (§12.7)
16
+ * - correlation and framing for every request in both directions
17
+ * - diffing, so an unchanged slice is not re-pushed
18
+ *
19
+ * Everything those messages actually *do* is the embedder's, through
20
+ * {@link HostAdapter}. That split is what lets one implementation serve both
21
+ * the SDK dev server and a production runtime.
22
+ *
23
+ * Platform-facing: exported from `@seriousgaming/sdk-tools/host` so the dev
24
+ * server and the Serious Gaming platform can share one implementation; the
25
+ * shape may change in a minor release.
26
+ */
27
+ import type { HostAdapter, RequestOrigin } from './adapter.js';
28
+ import { type SurfaceKind } from './surfaces.js';
29
+ /** Any host → guest port message. Narrowed by the surface's own union. */
30
+ export interface HostMessage {
31
+ type: string;
32
+ [key: string]: unknown;
33
+ }
34
+ /** Any guest → host port message. */
35
+ export interface GuestMessage {
36
+ type: string;
37
+ [key: string]: unknown;
38
+ }
39
+ /**
40
+ * The bits of `window` the channel touches.
41
+ *
42
+ * Injected rather than reached for, so the whole handshake is exercisable in a
43
+ * unit test with two fake windows and a real `MessageChannel`, which is what
44
+ * moves this off Playwright.
45
+ */
46
+ export interface WindowLike {
47
+ addEventListener(type: 'message', listener: (event: MessageEvent) => void): void;
48
+ removeEventListener(type: 'message', listener: (event: MessageEvent) => void): void;
49
+ }
50
+ /** The bit of an iframe element the channel touches. */
51
+ export interface FrameLike {
52
+ readonly contentWindow: {
53
+ postMessage(message: unknown, targetOrigin: string, transfer?: Transferable[]): void;
54
+ } | null;
55
+ /**
56
+ * The element's `load` event, fired for every document the frame loads.
57
+ * A frame without it is bounded on its first load only.
58
+ */
59
+ addEventListener?(type: 'load', listener: () => void): void;
60
+ removeEventListener?(type: 'load', listener: () => void): void;
61
+ }
62
+ /** Why a channel tore itself down. */
63
+ export type TeardownReason =
64
+ /** No `ready` arrived within the handshake bound (§16.6). */
65
+ 'handshake-timeout'
66
+ /** `dispose()` was called. */
67
+ | 'disposed';
68
+ export interface HostChannelOptions {
69
+ /** The frame this channel is bound to. */
70
+ iframe: FrameLike;
71
+ /** Which surface the frame is rendering (§12.6). */
72
+ surface: SurfaceKind;
73
+ /** Identifier of the UI bundle mounted in the frame, for adapter calls. */
74
+ uiIdentifier: string;
75
+ /**
76
+ * Origin the frame is served from. Used as `targetOrigin` on `init`, and
77
+ * matched against the incoming `ready` (§12.2).
78
+ */
79
+ iframeOrigin: string;
80
+ /**
81
+ * The run's storage key, sent on every `init` (§12.2): opaque, the same for
82
+ * every surface of one run and for its whole life, different for every
83
+ * other run, the walkthrough beside it included, and never anything the
84
+ * host would accept as naming the session.
85
+ */
86
+ sessionKey: string;
87
+ /** Window to listen for the `ready` handshake on. Defaults to `window`. */
88
+ window?: WindowLike;
89
+ /** Side effects. A channel with no adapter answers every request as failed. */
90
+ adapter?: HostAdapter;
91
+ /** Identity carried into adapter calls. */
92
+ origin?: Omit<RequestOrigin, 'uiIdentifier'>;
93
+ /** An observer render receives no `setParticipant` (§13.3). */
94
+ observer?: boolean;
95
+ /**
96
+ * How long to wait for `ready` before treating the frame as gone. A frame
97
+ * that has navigated itself to a third-party page never handshakes, and
98
+ * neither the sandbox attribute nor CSP prevents that, so this bound is the
99
+ * only way to detect it (§16.6). Defaults to 10 seconds.
100
+ */
101
+ handshakeTimeoutMs?: number;
102
+ /** Guest messages the channel does not answer itself. */
103
+ onMessage?(message: GuestMessage): void;
104
+ /** Called each time the handshake completes, reconnections included. */
105
+ onConnect?(): void;
106
+ /** Called when the channel gives up on the frame. */
107
+ onTeardown?(reason: TeardownReason): void;
108
+ /** Where diagnostics go. Defaults to `console`. */
109
+ logger?: Pick<Console, 'warn' | 'error'>;
110
+ }
111
+ export declare class HostChannel {
112
+ private readonly options;
113
+ private readonly host;
114
+ private readonly logger;
115
+ private port;
116
+ private readyListener;
117
+ private loadListener;
118
+ private handshakeTimer;
119
+ private disposed;
120
+ /**
121
+ * Last payload sent per message type, serialised.
122
+ *
123
+ * `setState` compares against this so an unchanged slice is not re-pushed.
124
+ * At a large cohort the session payload is the thing that grows, and
125
+ * re-sending a whole snapshot because one team's tick moved is the cost
126
+ * §12.4.2 warns about.
127
+ */
128
+ private lastSent;
129
+ /**
130
+ * The last value of each state message, in the order the types were first
131
+ * sent, replayed whole on every reconnect (§12.7 step 3).
132
+ *
133
+ * A reloading frame has seen nothing, and the embedder has no reason to
134
+ * push again: its state has not changed, only the frame under it. Without
135
+ * this the guest re-handshakes into silence and blocks its first paint for
136
+ * good, which is what a surface fixed after a crash used to do (#564).
137
+ *
138
+ * Only the state slices are kept. A one-shot the host sent once, such as a
139
+ * validator's refusal or an asset-auth request, belongs to the moment it
140
+ * happened, and replaying it would show the new frame a rejection of a
141
+ * submission it never made.
142
+ */
143
+ private sticky;
144
+ /** One-shot messages queued until the handshake completes, flushed in order. */
145
+ private outbound;
146
+ /** In-flight host → guest requests, keyed by `requestId`. */
147
+ private pending;
148
+ private requestCounter;
149
+ constructor(options: HostChannelOptions);
150
+ /** True once the guest has handshaked and the port is open. */
151
+ get connected(): boolean;
152
+ /**
153
+ * Push one message, queueing it until the handshake completes.
154
+ *
155
+ * Queueing rather than dropping is what lets an embedder build the initial
156
+ * batch as soon as it mounts the frame, without racing the guest's `ready`.
157
+ */
158
+ send(message: HostMessage): void;
159
+ /**
160
+ * Push a state slice: delivered now if the guest is listening, and kept so
161
+ * a frame that reloads is told the same thing again.
162
+ */
163
+ private sendState;
164
+ /**
165
+ * Push a message only when its payload differs from the last one sent of
166
+ * that type. Returns true when it went out.
167
+ */
168
+ sendIfChanged(message: HostMessage): boolean;
169
+ /**
170
+ * Send the initial batch (§12.6), verifying it carries every message the
171
+ * surface blocks its first paint on.
172
+ *
173
+ * The guest enforces the same list for itself by simply not painting. That
174
+ * failure mode is a frame stuck on its loading state with nothing to say
175
+ * why, which is a bad afternoon; failing here names the missing message.
176
+ */
177
+ sendInitialBatch(messages: readonly HostMessage[]): void;
178
+ /**
179
+ * Send a request the guest answers, resolving when it does.
180
+ *
181
+ * Only `refreshAssetAuth` uses this today (§16.4): the host hands the frame
182
+ * a token and the frame reports back whether redeeming it worked.
183
+ */
184
+ request(message: {
185
+ type: string;
186
+ } & Record<string, unknown>, timeoutMs?: number): Promise<void>;
187
+ dispose(): void;
188
+ private listenForReady;
189
+ /**
190
+ * Bound every document the frame loads, not only the first.
191
+ *
192
+ * A frame that connected and then replaced its own document leaves the
193
+ * host holding a port nobody answers, so `connected` alone proves nothing.
194
+ * A document's `ready` may land either side of its `load`, so a live port
195
+ * is pinged as well: a `pong` shows the document that handshaked is still
196
+ * the one in the frame, and a fresh `ready` shows a reload.
197
+ */
198
+ private listenForLoads;
199
+ private armHandshakeTimer;
200
+ /**
201
+ * Open a fresh port and hand the guest its end.
202
+ *
203
+ * Runs on every `ready`, not only the first: a reload or HMR re-announces,
204
+ * and §12.7 requires the old port closed, a new channel created, and the
205
+ * whole initial batch re-sent rather than the live port re-identified.
206
+ */
207
+ private connect;
208
+ private closePort;
209
+ private clearHandshakeTimer;
210
+ private rejectPending;
211
+ private receive;
212
+ /**
213
+ * Run one guest request against the adapter and frame the answer.
214
+ *
215
+ * A throwing adapter becomes an `ok: false` response on the same
216
+ * `requestId`, never an unhandled rejection and never a dropped request:
217
+ * the guest's promise has to settle either way or the surface waits forever.
218
+ */
219
+ private answer;
220
+ /** Route one request to its adapter method and shape the success payload. */
221
+ private dispatch;
222
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The host half of the host ↔ iframe protocol (§12).
3
+ *
4
+ * Reachable as `@seriousgaming/sdk-tools/host`.
5
+ *
6
+ * Platform-facing. Game authors never write a host and never import from
7
+ * here; this exists so the dev server and the Serious Gaming platform share one
8
+ * implementation of §12 instead of transcribing the same 900 lines of prose
9
+ * twice. It carries the channel, the surface table, the adapter an embedder
10
+ * supplies, and the host's definition of the wire messages. The guest half is
11
+ * the UI wrappers in `@seriousgaming/sdk/ui`. The shapes
12
+ * may change in a minor release.
13
+ */
14
+ export { HostChannel } from './host-channel.js';
15
+ export type { FrameLike, GuestMessage, HostChannelOptions, HostMessage, TeardownReason, WindowLike, } from './host-channel.js';
16
+ export type { HostAdapter, RequestOrigin } from './adapter.js';
17
+ export { isPlayerSurface, requiredMessagesFor, SURFACES, type SurfaceDescriptor, type SurfaceKind, } from './surfaces.js';
18
+ export { UI_PROTOCOL_VERSION } from './protocol.js';
19
+ export type { AssetUrls, HostSettingsEditorPortMessage, HostPortMessage, HostPresentationPortMessage, HostSessionPortMessage, HostWindowMessage, IFrameSettingsEditorPortMessage, IFrameMessage, IFramePortMessage, IFramePresentationPortMessage, IFrameSessionPortMessage, } from './protocol.js';
20
+ export { contrastTextFor, THEME_COLOR_ROLES, withContrastText, type ModeColoursInput, type ThemeInput, } from './theme.js';