@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,172 @@
1
+ /**
2
+ * Turning one session projection into what each surface is owed.
3
+ *
4
+ * §12.3 and §12.6 say which messages a surface receives and which it blocks its
5
+ * first paint on. The old dev UI expressed that as four preview components with
6
+ * a copy of the batch each; here it is one pure function per surface kind,
7
+ * fed by the projection, and unit-testable without a browser.
8
+ *
9
+ * Projection is applied here, not in the surface: §7.4 requires a context to be
10
+ * narrowed to a surface's declared `reads` ∪ `writes` before it crosses the
11
+ * boundary, and a host that sends everything and lets the guest ignore the rest
12
+ * has not projected at all.
13
+ */
14
+ import type { HostOverlay } from '@seriousgaming/sdk';
15
+ import type { StateProjection } from '@seriousgaming/sdk/projection';
16
+ import type { CrossTeamData, SessionData, TeamConfiguration, TeamLinks, WalkthroughLink } from '@seriousgaming/sdk/ui';
17
+ import type { ViewerRole } from '../../core/protocol';
18
+ import type { HostMessage } from '../../host';
19
+ import type { MountableSurface } from '../surfaces';
20
+ /** Who is looking, and at what. */
21
+ export interface Viewer {
22
+ /** Stable index of the team whose surface this is, where there is one. */
23
+ teamIndex?: number;
24
+ /** The participant this render is identified as; absent for an observer. */
25
+ participantId?: string;
26
+ /** §13.3: an observer receives no `setParticipant`. */
27
+ observer?: boolean;
28
+ /**
29
+ * What the console holds this render as, where it holds it as anything
30
+ * (§13.3). Absent for a surface with no viewer behind it at all, such as
31
+ * the session console, the setup UI or the scenario editor.
32
+ *
33
+ * Not derivable from `participantId`, which is the point: the session has
34
+ * to be able to tell a participant the console could not name from a
35
+ * caller that legitimately names nobody (#566).
36
+ */
37
+ role?: ViewerRole;
38
+ /**
39
+ * The scenario a scenario editor is open on (§6.5), whose draft it edits.
40
+ * Absent for an editor opened on no scenario, and for every other surface.
41
+ */
42
+ scenario?: string;
43
+ }
44
+ export interface BatchOptions {
45
+ surface: MountableSurface;
46
+ state: StateProjection;
47
+ viewer: Viewer;
48
+ /**
49
+ * Resolved colour scheme, and the preference behind it. Omitted by the
50
+ * server, which cannot know a viewer's scheme: the page adds
51
+ * {@link themeMessages} of its own.
52
+ */
53
+ theme?: Theme;
54
+ /** Absolute origin of the console, which every link a surface is handed names. */
55
+ origin: string;
56
+ /** Absolute origin bundles and their assets are served from, where it differs. */
57
+ assetOrigin?: string;
58
+ /** The game's own name, which a session surface renders as the session's. */
59
+ gameName: string;
60
+ /** Whether the package ships a facilitator guide, which is one overlay. */
61
+ hasGuide?: boolean;
62
+ /** Whether a tick is running over this viewer's team (§12.4.4). */
63
+ roundProcessing?: boolean;
64
+ /**
65
+ * Show a presentation as if there were no session (§6.15): what it looks
66
+ * like in a game's library, or exported before the day.
67
+ */
68
+ sessionless?: boolean;
69
+ /** The active scenario's name in the session locale, for a presentation. */
70
+ scenarioName?: string | null;
71
+ }
72
+ /**
73
+ * Narrow a context to what a surface declared (§7.4).
74
+ *
75
+ * Anything undeclared is omitted rather than nulled: the guest's generated
76
+ * `Context` type does not have the property, so a surface reading one is a
77
+ * compile error rather than a runtime `null` it has to handle.
78
+ */
79
+ export declare function projectContext(context: Record<string, Record<string, unknown>>, surface: MountableSurface): Record<string, Record<string, unknown>>;
80
+ /**
81
+ * The settings a surface is sent: exactly the settings resources it declared
82
+ * (§8), resolved, on the same terms as capabilities (§7.4). For the setup UI
83
+ * and the scenario editor, the ones they edit.
84
+ */
85
+ export declare function settingsFor(state: StateProjection, surface: MountableSurface, { withoutSession }?: {
86
+ withoutSession?: boolean;
87
+ }): Record<string, Record<string, unknown>>;
88
+ /**
89
+ * The settings the scenario editor is sent: its draft of the scenario it is
90
+ * open on (§6.5), never the session's. Nothing until that draft is open,
91
+ * since a frame seeded from the session's settings would show, and save, the
92
+ * wrong values.
93
+ */
94
+ export declare function draftSettingsFor(state: StateProjection, surface: MountableSurface, viewer: Viewer): Record<string, Record<string, unknown>>;
95
+ /**
96
+ * The `sessionKey` a surface is sent on `init` (§12.2).
97
+ *
98
+ * The run's own key, except for a surface shown outside any run: the scenario
99
+ * editor, which edits a scenario rather than a session (§6.5), and a
100
+ * presentation shown with no session (§6.15.1). Those get a key no run has,
101
+ * so nothing they store meets anything a session's surfaces store.
102
+ */
103
+ export declare function sessionKeyFor(state: StateProjection, surface: Pick<MountableSurface, 'kind'>, { sessionless }?: {
104
+ sessionless?: boolean;
105
+ }): string;
106
+ /** A viewer's colour scheme, as the page resolved it. */
107
+ export interface Theme {
108
+ mode: 'light' | 'dark';
109
+ preference: 'light' | 'dark' | 'system';
110
+ palette: unknown;
111
+ }
112
+ /** The two messages only the viewer's own page can compose. */
113
+ export declare function themeMessages(theme: Theme): HostMessage[];
114
+ /**
115
+ * The `setAssetUrls` payload (§12.3). Every prefix is absolute and ends in `/`.
116
+ *
117
+ * On the asset origin, beside the bundles, so a frame reads them as its own
118
+ * origin under `connect-src 'self'` and never needs the console's.
119
+ */
120
+ export declare function assetUrls(assetOrigin: string): Record<string, string>;
121
+ /**
122
+ * The whole initial batch for one surface.
123
+ *
124
+ * Ordered with the blocking messages first, so a guest that paints the moment
125
+ * its required set completes does so before the optional tail arrives.
126
+ */
127
+ export declare function buildBatch(options: BatchOptions): HostMessage[];
128
+ /**
129
+ * Every team's value of the capabilities a game UI reads across teams
130
+ * (§12.4.1), filtered here rather than in the frame: its own team's entry
131
+ * carries its whole declared set, every other team's only `crossTeamReads`.
132
+ */
133
+ export declare function crossTeamData(state: StateProjection, surface: MountableSurface, ownTeamIndex: number | undefined): CrossTeamData;
134
+ /**
135
+ * Where to open the walkthrough run (§5.7).
136
+ *
137
+ * A host route rather than a run, so it is the same before the run exists and
138
+ * after (§12.3), and the same from inside the walkthrough: a session has one,
139
+ * and that is where it opens.
140
+ */
141
+ export declare function walkthroughLink(origin: string): WalkthroughLink;
142
+ /**
143
+ * The host-owned overlays a session surface may open (§6.4).
144
+ *
145
+ * Both of these are the console's own pages rather than anything the game
146
+ * mounts, which is what makes them the host's to offer: a facilitator on a
147
+ * surface that owns the whole canvas can reach the guide and the team sheets
148
+ * without leaving it. A guide is offered only when the package ships one — a
149
+ * control for an overlay the host does not have is a control that cannot work.
150
+ */
151
+ export declare function availableOverlays(hasGuide?: boolean): HostOverlay[];
152
+ /**
153
+ * One join and observe URL per team, for the facilitator surface.
154
+ *
155
+ * The join URL is a route that resolves: it asks which participant you are, or
156
+ * opens straight into the surface when the team holds one. There is no PIN and
157
+ * no account here, so a link is the whole of joining — which is also why there
158
+ * is no `fallbackJoinUrl`: one origin, one form of the link.
159
+ */
160
+ export declare function teamLinks(state: StateProjection, origin: string): TeamLinks[];
161
+ /** The mode and the **effective** bounds a surface gates its controls on (§5.4). */
162
+ export declare function teamConfiguration(state: StateProjection): TeamConfiguration;
163
+ /**
164
+ * `SessionData`: the shared store once, and every team's own state **keyed by
165
+ * teamId**.
166
+ *
167
+ * A map, not an array. The wrapper indexes it by id, so an array renders as a
168
+ * session with no teams in it. A team's context omits the shared capabilities,
169
+ * which the projection composes into every team's view: they are in `shared`,
170
+ * once, rather than repeated per team.
171
+ */
172
+ export declare function sessionData(state: StateProjection, surface: MountableSurface): SessionData;
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Turning what a surface asks for into a session command, on the viewer's
3
+ * behalf rather than on the surface's word.
4
+ *
5
+ * Shared by the operator console, which runs it in the browser, and by the
6
+ * server's per-viewer feed, which runs it on a page's raw frame messages so
7
+ * that who is asking is decided by the host and never by the page (§13.2).
8
+ */
9
+ import type { Command, QueryCommand, ViewerRole } from '../../core/protocol';
10
+ import type { MountableSurface } from '../surfaces';
11
+ import type { Viewer } from './batch';
12
+ /** The team a command addresses, where the viewer is on one. */
13
+ export declare function teamScope(viewer: Viewer): {
14
+ teamIndex?: number;
15
+ };
16
+ /** Who is asking, where the viewer resolved to somebody. */
17
+ export declare function actorOf(viewer: Viewer): {
18
+ participantId?: string;
19
+ teamId?: string;
20
+ };
21
+ /**
22
+ * What the console holds this render as (§13.3).
23
+ *
24
+ * Kept apart from {@link actorOf} rather than folded into it, for two reasons:
25
+ * `renameOwnTeam` takes the actor and has no viewer role to take, and the
26
+ * session needs the role most precisely when the actor is empty, which is the
27
+ * case it could not otherwise tell from a legitimately anonymous write (#566).
28
+ */
29
+ export declare function roleOf(viewer: Viewer): {
30
+ viewerRole?: ViewerRole;
31
+ };
32
+ /** Everything a command carries about who sent it. */
33
+ export declare function viewerFields(viewer: Viewer): {
34
+ teamIndex?: number;
35
+ participantId?: string;
36
+ teamId?: string;
37
+ viewerRole?: ViewerRole;
38
+ };
39
+ /**
40
+ * A message this surface may send, carrying something the host must decide
41
+ * for itself: a `teamId` on a session-wide or self-addressed command (§12.5).
42
+ * Refused rather than stripped, so the surface learns it named something it
43
+ * may not.
44
+ */
45
+ export interface FrameRefusal {
46
+ refused: string;
47
+ }
48
+ export declare function isFrameRefusal(value: unknown): value is FrameRefusal;
49
+ /**
50
+ * Turn a guest message the channel does not own into a session command.
51
+ *
52
+ * The channel answers requests (endpoints, blobs, history); what reaches here
53
+ * is everything a surface asks the *session* to do, which is one mapping table
54
+ * rather than the switch-of-switches the old host grew.
55
+ *
56
+ * Returns `null` for a message this host does not act on, or one this kind of
57
+ * surface may not send, so the caller can tell 'nothing to do' from 'done'.
58
+ */
59
+ export declare function commandFor(message: {
60
+ type: string;
61
+ [key: string]: unknown;
62
+ }, surface: MountableSurface, viewer: Viewer): Command | FrameRefusal | null;
63
+ /**
64
+ * Turn a guest read into a session query, carrying the viewer's identity and
65
+ * the surface's own identifier, never the page's.
66
+ *
67
+ * `uiIdentifier` is what bounds the answer: the session projects a surface's
68
+ * history onto what it declared and gates the cross-team roster on
69
+ * `crossTeamParticipants` (§12.5), so a caller that could name another surface
70
+ * could read what that surface may.
71
+ */
72
+ export declare function queryFor(message: {
73
+ type: string;
74
+ [key: string]: unknown;
75
+ }, surface: MountableSurface, viewer: Viewer): QueryCommand | null;
@@ -0,0 +1,58 @@
1
+ import type { RunKind } from '@seriousgaming/sdk';
2
+ /**
3
+ * Which surface a URL names.
4
+ *
5
+ * Every surface is directly addressable and guessable. The old dev UI resolved
6
+ * a default participant server-side and redirected `/play/2` to
7
+ * `/play/2/participant/<id>`; here the URL says what it means and nothing
8
+ * redirects, so an agent can open `/team/2/player/1` without asking what the
9
+ * link is.
10
+ *
11
+ * `?bare` drops the dev chrome entirely, which is what you screenshot, what you
12
+ * hand somebody, and what a browser test drives: a visual change to the chrome
13
+ * then cannot fail a game test.
14
+ *
15
+ * `/team/2/join` is the one route that resolves rather than names: it is what a
16
+ * facilitator hands out, and it asks which participant you are — or, when the
17
+ * team holds one, simply opens as them.
18
+ *
19
+ * `/walkthrough` names the walkthrough run's play surface (§5.7). It takes no
20
+ * team or participant because a walkthrough holds one of each, so there is
21
+ * nothing to choose: it is the view you put on the projector while you talk the
22
+ * room through the game.
23
+ *
24
+ * `/presentation` is the facilitator's deck (§6.15), and `?preview` shows it as
25
+ * it looks with no session: in a library, or exported before the day.
26
+ */
27
+ export type RouteKind = 'console' | 'player' | 'observer' | 'join' | 'waiting-room' | 'setup' | 'scenario-editor' | 'guide' | 'print' | 'presentation';
28
+ export interface Route {
29
+ kind: RouteKind;
30
+ /**
31
+ * Which run the surface belongs to (§5.7). The session unless the URL says
32
+ * `/walkthrough`, which is what every existing link means.
33
+ */
34
+ run: RunKind;
35
+ /** Stable team index, where the route names a team. */
36
+ teamIndex?: number;
37
+ /** Participant position within the team, 1-based in the URL. */
38
+ participant?: number;
39
+ /**
40
+ * Which scenario the scenario editor is editing.
41
+ *
42
+ * The editor has no standalone entry: it is always opened *on* a scenario,
43
+ * from the dev drawer's Scenario tab. Without one there is nothing for it
44
+ * to save into, and an editor that cannot save is a screen that wastes the
45
+ * work somebody does on it.
46
+ */
47
+ scenario?: string;
48
+ /** No dev chrome: exactly what a participant sees. */
49
+ bare: boolean;
50
+ /** Show a presentation as if there were no session (§6.15). */
51
+ preview?: boolean;
52
+ }
53
+ export declare function parseRoute(pathname: string, search: string): Route;
54
+ /** The URL for a route, so the console links rather than constructs by hand. */
55
+ export declare function routeHref(route: Omit<Route, 'bare' | 'run'> & {
56
+ bare?: boolean;
57
+ run?: RunKind;
58
+ }): string;
@@ -0,0 +1,78 @@
1
+ /**
2
+ * What one viewer's page shows, decided by the host.
3
+ *
4
+ * A `?bare` page is somebody's device: a participant who followed a join link,
5
+ * an observer, a facilitator's session surface on a projector. §7.4 requires a
6
+ * runtime serving such a device to project before the payload leaves it, so
7
+ * everything the page needs is resolved here, on the server, and the page is
8
+ * sent only the answer: which surface to mount, and the messages it is owed.
9
+ * The operator console, which renders its own inspector in the same document
10
+ * as the frame, keeps the whole projection and resolves the same rules itself.
11
+ */
12
+ import type { StateProjection } from '@seriousgaming/sdk/projection';
13
+ import type { HostMessage, SurfaceKind } from '../../host';
14
+ import type { MountableSurface } from '../surfaces';
15
+ import { type Viewer } from './batch';
16
+ import { type Route, type RouteKind } from './route';
17
+ /** Which bundle a route mounts. */
18
+ export declare const SURFACE_FOR: Partial<Record<RouteKind, SurfaceKind>>;
19
+ /** Whether a route is served as a viewer page, with a server-built feed. */
20
+ export declare function isViewRoute(route: Route): boolean;
21
+ /** A team as its join page shows it: its name and who is on it, nothing else. */
22
+ export interface JoinTeam {
23
+ index: number;
24
+ name: string;
25
+ participants: Array<{
26
+ id: string;
27
+ name: string;
28
+ }>;
29
+ }
30
+ export type ViewPage = {
31
+ status: 'surface';
32
+ surface: MountableSurface;
33
+ viewer: Viewer;
34
+ inSetup: boolean;
35
+ /** What the frame is sent on `init` (§12.2). */
36
+ sessionKey: string;
37
+ }
38
+ /** A participant's page while the facilitator is still configuring. */
39
+ | {
40
+ status: 'configuring';
41
+ }
42
+ /** The setup surface, after the session has started. */
43
+ | {
44
+ status: 'closed';
45
+ configurable: boolean;
46
+ } | {
47
+ status: 'join';
48
+ team: JoinTeam | null;
49
+ } | {
50
+ status: 'redirect';
51
+ href: string;
52
+ } | {
53
+ status: 'no-such-team';
54
+ teamIndex: number;
55
+ } | {
56
+ status: 'no-such-participant';
57
+ teamIndex: number;
58
+ slot: number;
59
+ held: number;
60
+ } | {
61
+ status: 'missing-surface';
62
+ kind: SurfaceKind;
63
+ };
64
+ /**
65
+ * Resolve a viewer page, by the rules the operator console applies: the
66
+ * configuration step first (§8.3), the waiting-room hold (§6.14.1), and a
67
+ * refusal for a URL that names somebody who is not there (§13.2).
68
+ */
69
+ export declare function resolveView(state: StateProjection, route: Route, surfaces: MountableSurface[]): ViewPage;
70
+ export interface ViewMessageOptions {
71
+ origin: string;
72
+ assetOrigin: string;
73
+ gameName: string;
74
+ hasGuide: boolean;
75
+ roundProcessing: boolean;
76
+ }
77
+ /** Every message a viewer page's surface is owed, less the theme the page adds. */
78
+ export declare function viewMessages(page: ViewPage, state: StateProjection, options: ViewMessageOptions): HostMessage[];
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Who a route says is looking, resolved against the roster.
3
+ *
4
+ * Addressing identity in the URL (§13.2) means a URL can name somebody who is
5
+ * not there. `/team/1/player/3` on a team holding two used to resolve to no
6
+ * participant and mount anyway: the surface rendered, and because its writes
7
+ * then named nobody, the session took them as system-trusted and applied them
8
+ * unvalidated (#566).
9
+ *
10
+ * So resolution has three outcomes, not two. A slot the roster does not hold
11
+ * is its own answer, and the console refuses the surface rather than mounting
12
+ * an identity-free one. `role` carries the other half: it says what the
13
+ * console holds a render as, independently of whether it managed to name
14
+ * anybody, which is what lets the session tell a participant it cannot
15
+ * attribute from a caller that legitimately has no identity (§13.3).
16
+ */
17
+ import type { StateProjection } from '@seriousgaming/sdk/projection';
18
+ import type { Viewer } from './batch';
19
+ import type { Route } from './route';
20
+ export type ViewerResolution = {
21
+ kind: 'viewer';
22
+ viewer: Viewer;
23
+ } | {
24
+ kind: 'no-such-team';
25
+ teamIndex: number;
26
+ } | {
27
+ kind: 'no-such-participant';
28
+ teamIndex: number;
29
+ slot: number;
30
+ held: number;
31
+ };
32
+ export declare function resolveViewer(state: StateProjection, route: Route): ViewerResolution;
@@ -0,0 +1,9 @@
1
+ import { ResolvedPackageManifest } from '@seriousgaming/sdk';
2
+ /**
3
+ * Load a package and everything it declares.
4
+ *
5
+ * A package's resources are its own, and it declares them by having them: each
6
+ * kind is read from its conventional directory beside the manifest (#431).
7
+ * There is no cross-package resource reuse and no list to fall out of step.
8
+ */
9
+ export declare function loadConfig(configPath: string): Promise<ResolvedPackageManifest>;
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Rewrite Windows separators to forward slashes.
3
+ *
4
+ * A resource identifier is reverse-DNS and a resource directory name is
5
+ * machine-composed from it, so neither can legitimately contain a backslash
6
+ * and there is nothing here to preserve on a POSIX host.
7
+ */
8
+ export declare function toPosixPath(value: string): string;
9
+ /**
10
+ * Compose the `rootDirectory` a resource carries into the runtime manifest,
11
+ * from the path its bundle file was found at and the `rootDirectory` the bundle
12
+ * declares.
13
+ *
14
+ * A manifest `rootDirectory` is a POSIX-relative path: the platform joins it
15
+ * with forward slashes to address the resource over HTTP, and the resulting
16
+ * address maps 1-1 onto an object-storage key. `path.join` would normalise to
17
+ * the host separator instead, which put a backslash into every manifest built
18
+ * on Windows (#503), so the composition is done in POSIX terms on every
19
+ * platform and never through the ambient `path`.
20
+ */
21
+ export declare function resolveManifestRootDirectory(resourcePath: string, declaredRootDirectory: string): string;
@@ -0,0 +1,90 @@
1
+ /**
2
+ * What a package no longer authors, and what to do instead.
3
+ *
4
+ * Every schema object is closed, so anything here would fail schema validation
5
+ * anyway, as an unknown property that says nothing about what replaced it. The
6
+ * loader checks this table first, so an author upgrading a package hears where
7
+ * each field went. Anything not listed gets the schema's own error, whose hint
8
+ * points at the upgrading guide.
9
+ *
10
+ * The constants are shared with the guard on `new` and `update` input, so the
11
+ * two say the same thing.
12
+ */
13
+ import { type ResourceType } from '../templating/resource-metadata.js';
14
+ /** The refusal for an authored `configurationSchema` on any bundle (#597). */
15
+ export declare const REMOVED_CONFIGURATION_SCHEMA: string;
16
+ /** The refusal for the game-level `configuration` block (#597). */
17
+ export declare const REMOVED_GAME_CONFIGURATION: string;
18
+ /** The refusal for a scenario still carrying `configuration` (#634). */
19
+ export declare const RENAMED_SCENARIO_CONFIGURATION: string;
20
+ /**
21
+ * The refusal for `uses` on a user interface (#635). A UI reaches a service
22
+ * only through an endpoint, so the field was refused or ignored for every
23
+ * value it could hold.
24
+ */
25
+ export declare const REMOVED_UI_USES: string;
26
+ /** The refusal for demo mode's `demo` block, on the manifest or a scenario (#635). */
27
+ export declare const REMOVED_DEMO: string;
28
+ /**
29
+ * The refusal for the manifest's `configurationSurfaces` map (#637). The two
30
+ * surfaces it wired are slots of their own now, so a bundle is wired by where
31
+ * it sits rather than by a name in the manifest.
32
+ */
33
+ export declare const REMOVED_CONFIGURATION_SURFACES: string;
34
+ /** The refusal for the manifest's `ticks`, renamed so it has one name everywhere (#671). */
35
+ export declare const RENAMED_MANIFEST_TICKS: string;
36
+ /**
37
+ * The refusal for a scenario's game-level fields (#671). They are the built-in
38
+ * `game` settings now, which a scenario overrides under `settings.game` like
39
+ * any other settings resource.
40
+ */
41
+ export declare function movedScenarioGameField(key: 'ticks' | 'teams' | 'waitingRoom', value: unknown): string;
42
+ /** The hint on a schema error the table does not explain. */
43
+ export declare const UPGRADING_HINT = "If this package was written for an earlier SDK, `seriousgaming-sdk docs view guides/upgrading.md` says what changed.";
44
+ /**
45
+ * Where a removed thing sat: the manifest, a directory beside it (`package`),
46
+ * every resource bundle, or the bundles of the types listed.
47
+ */
48
+ export type RemovedSite = 'manifest' | 'package' | 'every bundle' | readonly ResourceType[];
49
+ export interface RemovedField {
50
+ where: RemovedSite;
51
+ /**
52
+ * The path to it inside the file, `*` standing for each entry of an array.
53
+ * For a `package` row, the directory's name.
54
+ */
55
+ path: readonly string[];
56
+ /** The release that removed it. */
57
+ since: string;
58
+ /**
59
+ * What is wrong, then what to do. Without a `hint`, the first sentence is
60
+ * the diagnostic's message and the rest its hint.
61
+ */
62
+ message: string | ((value: unknown) => string);
63
+ /** The hint, where it is not the message's own second half. */
64
+ hint?: string;
65
+ /** Refuse only a value this accepts; by default, any value at all. */
66
+ when?: (value: unknown) => boolean;
67
+ }
68
+ /** One refusal found, with where it was found. */
69
+ export interface RemovedFieldMatch {
70
+ field: RemovedField;
71
+ /** The path to the value, array positions resolved. */
72
+ pointer: Array<string | number>;
73
+ /** The whole explanation: what is wrong, then what to do. */
74
+ explanation: string;
75
+ /** The same, split for a diagnostic. */
76
+ message: string;
77
+ hint?: string;
78
+ }
79
+ /**
80
+ * Everything a package no longer authors, in the order it is reported: the
81
+ * manifest and the layout first, then each bundle.
82
+ */
83
+ export declare const REMOVED_FIELDS: readonly RemovedField[];
84
+ /**
85
+ * What the manifest and the layout beside it still carry, in table order.
86
+ * `directoryExists` answers for a directory named relative to the package.
87
+ */
88
+ export declare function removedFromPackage(manifest: unknown, directoryExists: (directory: string) => boolean): RemovedFieldMatch[];
89
+ /** What one bundle of `type` still carries, in table order. */
90
+ export declare function removedFromBundle(type: ResourceType, bundle: unknown): RemovedFieldMatch[];