@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.
- package/LICENSE +93 -0
- package/README.md +38 -2
- package/dist/bundling/logic-exports.d.ts +34 -0
- package/dist/bundling/node-builtins.d.ts +21 -0
- package/dist/bundling/transpiler.d.ts +7 -0
- package/dist/cli.js +27404 -0
- package/dist/client/dev-server.d.ts +59 -0
- package/dist/client/index.d.ts +28 -0
- package/dist/client/stub-services.d.ts +32 -0
- package/dist/client/test-session.d.ts +195 -0
- package/dist/client.js +16920 -0
- package/dist/core/asset-reference-translator.d.ts +46 -0
- package/dist/core/clock.d.ts +57 -0
- package/dist/core/faults.d.ts +65 -0
- package/dist/core/game-settings.d.ts +65 -0
- package/dist/core/history.d.ts +89 -0
- package/dist/core/listen-with-fallback.d.ts +30 -0
- package/dist/core/mutation-queue.d.ts +61 -0
- package/dist/core/package-scenario.d.ts +89 -0
- package/dist/core/participant-registry.d.ts +109 -0
- package/dist/core/pending-changes.d.ts +14 -0
- package/dist/core/protocol.d.ts +83 -0
- package/dist/core/scenario-drafts.d.ts +32 -0
- package/dist/core/session-endpoints.d.ts +108 -0
- package/dist/core/session-gates.d.ts +75 -0
- package/dist/core/session-host.d.ts +94 -0
- package/dist/core/session-refusals.d.ts +56 -0
- package/dist/core/session-rewind.d.ts +32 -0
- package/dist/core/session-roster.d.ts +128 -0
- package/dist/core/session-surfaces.d.ts +32 -0
- package/dist/core/session-ticks.d.ts +18 -0
- package/dist/core/session-timers.d.ts +84 -0
- package/dist/core/session-writes.d.ts +40 -0
- package/dist/core/session.d.ts +385 -0
- package/dist/core/settings-locks.d.ts +22 -0
- package/dist/core/team-names.d.ts +52 -0
- package/dist/core/team-state-store.d.ts +218 -0
- package/dist/core/tick-timer.d.ts +75 -0
- package/dist/dev/blob-links.d.ts +10 -0
- package/dist/dev/console/assets/index-DgFglsnA.js +204 -0
- package/dist/dev/console/index.html +12 -0
- package/dist/dev/console-path.d.ts +19 -0
- package/dist/dev/lockfile.d.ts +124 -0
- package/dist/dev/package-watcher.d.ts +21 -0
- package/dist/dev/routes.d.ts +67 -0
- package/dist/dev/shell.d.ts +260 -0
- package/dist/dev/surfaces.d.ts +41 -0
- package/dist/dev/tools-identity.d.ts +23 -0
- package/dist/dev/view/batch.d.ts +172 -0
- package/dist/dev/view/commands.d.ts +75 -0
- package/dist/dev/view/route.d.ts +58 -0
- package/dist/dev/view/view.d.ts +78 -0
- package/dist/dev/view/viewer.d.ts +32 -0
- package/dist/discovery/config.d.ts +9 -0
- package/dist/discovery/manifest-paths.d.ts +21 -0
- package/dist/discovery/removed-fields.d.ts +90 -0
- package/dist/docs/api/deck.md +386 -0
- package/dist/docs/api/index.md +67 -0
- package/dist/docs/api/sdk-commands.md +286 -0
- package/dist/docs/api/sdk-e2e.md +433 -0
- package/dist/docs/api/sdk-projection.md +207 -0
- package/dist/docs/api/sdk-testing.md +214 -0
- package/dist/docs/api/sdk-tools-client.md +560 -0
- package/dist/docs/api/sdk-ui-testing.md +231 -0
- package/dist/docs/api/sdk-ui.md +1269 -0
- package/dist/docs/api/sdk.md +2140 -0
- package/dist/docs/changelog-0.x.md +1156 -0
- package/dist/docs/changelog.md +241 -0
- package/dist/docs/cli-and-dev-server.md +217 -0
- package/dist/docs/cli-error-codes.md +156 -0
- package/dist/docs/cli-reference.md +2489 -0
- package/dist/docs/cli-simulation-testing.md +222 -0
- package/dist/docs/concepts/index.md +46 -0
- package/dist/docs/concepts/terminology.md +322 -0
- package/dist/docs/environment-variables.md +102 -0
- package/dist/docs/getting-started.md +145 -0
- package/dist/docs/guides/ai-facilitation.md +220 -0
- package/dist/docs/guides/capabilities.md +460 -0
- package/dist/docs/guides/endpoints.md +335 -0
- package/dist/docs/guides/engine-testing.md +477 -0
- package/dist/docs/guides/engine.md +527 -0
- package/dist/docs/guides/file-handling.md +405 -0
- package/dist/docs/guides/games.md +176 -0
- package/dist/docs/guides/global-settings.md +94 -0
- package/dist/docs/guides/guide.md +123 -0
- package/dist/docs/guides/hooks.md +183 -0
- package/dist/docs/guides/index.md +51 -0
- package/dist/docs/guides/internationalization.md +288 -0
- package/dist/docs/guides/llm-integration.md +635 -0
- package/dist/docs/guides/multi-team-games.md +586 -0
- package/dist/docs/guides/patterns.md +391 -0
- package/dist/docs/guides/presentation.md +196 -0
- package/dist/docs/guides/production-constraints.md +130 -0
- package/dist/docs/guides/scenario-editor.md +143 -0
- package/dist/docs/guides/scenarios.md +515 -0
- package/dist/docs/guides/session.md +972 -0
- package/dist/docs/guides/settings.md +458 -0
- package/dist/docs/guides/setup.md +193 -0
- package/dist/docs/guides/speech-generation.md +233 -0
- package/dist/docs/guides/starter-game.md +164 -0
- package/dist/docs/guides/testing.md +577 -0
- package/dist/docs/guides/tick-controller.md +569 -0
- package/dist/docs/guides/type-safety.md +516 -0
- package/dist/docs/guides/ui.md +1389 -0
- package/dist/docs/guides/upgrading.md +636 -0
- package/dist/docs/guides/validators.md +217 -0
- package/dist/docs/guides/waiting-room.md +244 -0
- package/dist/docs/index.md +41 -0
- package/dist/docs/recipes/act-on-the-session-from-an-endpoint.md +95 -0
- package/dist/docs/recipes/adapt-a-game-for-walkthroughs.md +133 -0
- package/dist/docs/recipes/adapt-ui-for-observers.md +74 -0
- package/dist/docs/recipes/call-endpoint-from-ui.md +109 -0
- package/dist/docs/recipes/check-a-package-from-a-script.md +117 -0
- package/dist/docs/recipes/create-capability.md +66 -0
- package/dist/docs/recipes/create-endpoint.md +127 -0
- package/dist/docs/recipes/create-engine.md +111 -0
- package/dist/docs/recipes/create-game.md +70 -0
- package/dist/docs/recipes/create-guide.md +75 -0
- package/dist/docs/recipes/create-hook.md +80 -0
- package/dist/docs/recipes/create-presentation.md +142 -0
- package/dist/docs/recipes/create-scenario-editor.md +102 -0
- package/dist/docs/recipes/create-scenario.md +98 -0
- package/dist/docs/recipes/create-session-ui.md +116 -0
- package/dist/docs/recipes/create-settings.md +88 -0
- package/dist/docs/recipes/create-setup.md +115 -0
- package/dist/docs/recipes/create-tick-controller.md +65 -0
- package/dist/docs/recipes/create-user-interface.md +96 -0
- package/dist/docs/recipes/create-validator.md +67 -0
- package/dist/docs/recipes/create-waiting-room-ui.md +109 -0
- package/dist/docs/recipes/declare-api-uses.md +67 -0
- package/dist/docs/recipes/design-state-for-concurrent-writes.md +96 -0
- package/dist/docs/recipes/distribute-package.md +80 -0
- package/dist/docs/recipes/e2e-testing.md +116 -0
- package/dist/docs/recipes/end-game-on-condition.md +154 -0
- package/dist/docs/recipes/fix-duplicate-packages.md +101 -0
- package/dist/docs/recipes/index.md +86 -0
- package/dist/docs/recipes/make-an-endpoint-external.md +101 -0
- package/dist/docs/recipes/negotiate-across-teams.md +164 -0
- package/dist/docs/recipes/observe-other-teams-state.md +119 -0
- package/dist/docs/recipes/publish-a-package.md +139 -0
- package/dist/docs/recipes/remember-a-viewers-choice.md +55 -0
- package/dist/docs/recipes/review-a-past-day.md +73 -0
- package/dist/docs/recipes/share-assets-across-scenarios.md +120 -0
- package/dist/docs/recipes/share-logic-between-engine-and-ui.md +130 -0
- package/dist/docs/recipes/show-all-teams-participants.md +109 -0
- package/dist/docs/recipes/start-from-an-empty-package.md +169 -0
- package/dist/docs/recipes/take-a-file-in-an-endpoint.md +82 -0
- package/dist/docs/recipes/test-a-multi-role-game.md +51 -0
- package/dist/docs/recipes/test-user-interface.md +95 -0
- package/dist/docs/recipes/test-with-engine.md +115 -0
- package/dist/docs/recipes/upload-and-display-files.md +148 -0
- package/dist/docs/recipes/use-request-play.md +65 -0
- package/dist/docs/recipes/use-request-tick.md +75 -0
- package/dist/docs/troubleshooting.md +816 -0
- package/dist/execution/blob-inputs.d.ts +57 -0
- package/dist/execution/bundle-reload.d.ts +42 -0
- package/dist/execution/config-resolver.d.ts +127 -0
- package/dist/execution/configuration-builder.d.ts +66 -0
- package/dist/execution/context-composition.d.ts +161 -0
- package/dist/execution/endpoint-actions.d.ts +9 -0
- package/dist/execution/endpoint-payloads.d.ts +32 -0
- package/dist/execution/endpoint-runner.d.ts +129 -0
- package/dist/execution/engine-state.d.ts +40 -0
- package/dist/execution/executor-callbacks.d.ts +56 -0
- package/dist/execution/executor.d.ts +436 -0
- package/dist/execution/gates.d.ts +45 -0
- package/dist/execution/hook-chain.d.ts +25 -0
- package/dist/execution/logic-calls.d.ts +190 -0
- package/dist/execution/logic-failure.d.ts +84 -0
- package/dist/execution/logic-loader.d.ts +54 -0
- package/dist/execution/logic-result.d.ts +76 -0
- package/dist/execution/tick-controller-call.d.ts +32 -0
- package/dist/execution/types.d.ts +48 -0
- package/dist/generation/ts-type.d.ts +39 -0
- package/dist/guide/locale.d.ts +12 -0
- package/dist/guide/video-registry.d.ts +42 -0
- package/dist/help-examples.d.ts +125 -0
- package/dist/host/adapter.d.ts +67 -0
- package/dist/host/host-channel.d.ts +222 -0
- package/dist/host/index.d.ts +20 -0
- package/dist/host/protocol.d.ts +783 -0
- package/dist/host/surfaces.d.ts +42 -0
- package/dist/host/theme.d.ts +55 -0
- package/dist/host.js +583 -0
- package/dist/prompts/index.d.ts +7 -0
- package/dist/prompts/schema-builder.d.ts +29 -0
- package/dist/prompts/types.d.ts +108 -0
- package/dist/prompts/validators.d.ts +32 -0
- package/dist/runtime/capability-scope.d.ts +6 -0
- package/dist/runtime/context-merge.d.ts +29 -0
- package/dist/runtime/context-projection.d.ts +41 -0
- package/dist/runtime/guarded-callbacks.d.ts +15 -0
- package/dist/runtime/index.d.ts +27 -0
- package/dist/runtime/manifest-version.d.ts +55 -0
- package/dist/runtime/tick-validation.d.ts +25 -0
- package/dist/runtime.js +346 -0
- package/dist/schema.json +1546 -0
- package/dist/server/vite-plugin.d.ts +46 -0
- package/dist/services/tts/client.d.ts +51 -0
- package/dist/services/tts/elevenlabs.d.ts +24 -0
- package/dist/services/tts/types.d.ts +44 -0
- package/dist/storage/asset-resolver.d.ts +49 -0
- package/dist/storage/blob-store.d.ts +41 -0
- package/dist/templates/endpoint/logic.test.ts.liquid +61 -0
- package/dist/templates/endpoint/logic.ts.liquid +25 -0
- package/dist/templates/engine/init.json.liquid +7 -0
- package/dist/templates/engine/logic-aggregate.test.ts.liquid +90 -0
- package/dist/templates/engine/logic-aggregate.ts.liquid +46 -0
- package/dist/templates/engine/logic.test.ts.liquid +61 -0
- package/dist/templates/engine/logic.ts.liquid +32 -0
- package/dist/templates/engine/run.json.liquid +7 -0
- package/dist/templates/guide/01-at-a-glance.md.liquid +19 -0
- package/dist/templates/guide/02-preparation.md.liquid +18 -0
- package/dist/templates/guide/03-running-the-session.md.liquid +37 -0
- package/dist/templates/hook/logic.test.ts.liquid +46 -0
- package/dist/templates/hook/logic.ts.liquid +12 -0
- package/dist/templates/package/CLAUDE.md.template +338 -0
- package/dist/templates/package/DESIGN.md.liquid +144 -0
- package/dist/templates/package/README.md.liquid +143 -0
- package/dist/templates/package/claude/rules/workflow-create-capability.md +26 -0
- package/dist/templates/package/claude/rules/workflow-create-endpoint.md +35 -0
- package/dist/templates/package/claude/rules/workflow-create-engine.md +35 -0
- package/dist/templates/package/claude/rules/workflow-create-guide.md +40 -0
- package/dist/templates/package/claude/rules/workflow-create-presentation.md +37 -0
- package/dist/templates/package/claude/rules/workflow-create-user-interface.md +31 -0
- package/dist/templates/package/claude/rules/workflow-publish-package.md +54 -0
- package/dist/templates/package/claude/rules/workflow-test-engine-or-ui.md +30 -0
- package/dist/templates/package/claude/rules/workflow-update-sdk-version.md +43 -0
- package/dist/templates/package/claude/settings.json.template +16 -0
- package/dist/templates/package/gitignore.template +15 -0
- package/dist/templates/package/global-setup.ts.template +21 -0
- package/dist/templates/package/globals.d.ts.template +2 -0
- package/dist/templates/package/oxfmtrc.json.template +14 -0
- package/dist/templates/package/oxlintrc.json.template +238 -0
- package/dist/templates/package/package.json.liquid +65 -0
- package/dist/templates/package/playwright.config.ts.liquid +19 -0
- package/dist/templates/package/pnpm-workspace.yaml.template +27 -0
- package/dist/templates/package/test-setup.ts.liquid +7 -0
- package/dist/templates/package/tsconfig.json.liquid +15 -0
- package/dist/templates/package/vite.config.ts.liquid +19 -0
- package/dist/templates/package/vitest.config.ts.liquid +25 -0
- package/dist/templates/package/vitest.engine.config.ts.liquid +12 -0
- package/dist/templates/presentation/index.html.liquid +20 -0
- package/dist/templates/presentation/src/App.tsx.liquid +49 -0
- package/dist/templates/presentation/src/Slides.tsx.liquid +81 -0
- package/dist/templates/presentation/src/i18n.ts.liquid +54 -0
- package/dist/templates/presentation/src/main.tsx.liquid +14 -0
- package/dist/templates/scenario_editor/src/App.test.tsx.liquid +30 -0
- package/dist/templates/scenario_editor/src/App.tsx.liquid +95 -0
- package/dist/templates/scenario_editor/src/i18n.ts.liquid +44 -0
- package/dist/templates/session/src/App.test.tsx.liquid +60 -0
- package/dist/templates/session/src/App.tsx.liquid +128 -0
- package/dist/templates/session/src/i18n.ts.liquid +53 -0
- package/dist/templates/session/src/main.tsx.liquid +48 -0
- package/dist/templates/session/src/theme.ts.liquid +46 -0
- package/dist/templates/settings-editor/index.html.liquid +12 -0
- package/dist/templates/settings-editor/src/main.tsx.liquid +48 -0
- package/dist/templates/settings-editor/src/theme.ts.liquid +24 -0
- package/dist/templates/setup/src/App.test.tsx.liquid +39 -0
- package/dist/templates/setup/src/App.tsx.liquid +102 -0
- package/dist/templates/setup/src/i18n.ts.liquid +47 -0
- package/dist/templates/starter-game/capabilities/briefing/capability.sdk.json +18 -0
- package/dist/templates/starter-game/capabilities/plan/capability.sdk.json +17 -0
- package/dist/templates/starter-game/capabilities/results/capability.sdk.json +61 -0
- package/dist/templates/starter-game/capabilities/roles/capability.sdk.json +17 -0
- package/dist/templates/starter-game/capabilities/weather/capability.sdk.json +23 -0
- package/dist/templates/starter-game/engine/defaults.ts +81 -0
- package/dist/templates/starter-game/engine/engine.sdk.json +12 -0
- package/dist/templates/starter-game/engine/logic.test.ts +221 -0
- package/dist/templates/starter-game/engine/logic.ts +149 -0
- package/dist/templates/starter-game/engine/test-helpers.ts +74 -0
- package/dist/templates/starter-game/engine/types.ts +139 -0
- package/dist/templates/starter-game/guide/content/en/01-at-a-glance.md +51 -0
- package/dist/templates/starter-game/guide/content/en/02-preparation.md +35 -0
- package/dist/templates/starter-game/guide/content/en/03-running-the-day.md +58 -0
- package/dist/templates/starter-game/guide/guide.sdk.json +10 -0
- package/dist/templates/starter-game/guide/guide.test.ts +108 -0
- package/dist/templates/starter-game/hooks/assignproducts/defaults.ts +37 -0
- package/dist/templates/starter-game/hooks/assignproducts/hook.sdk.json +13 -0
- package/dist/templates/starter-game/hooks/assignproducts/logic/logic.test.ts +77 -0
- package/dist/templates/starter-game/hooks/assignproducts/logic/logic.ts +47 -0
- package/dist/templates/starter-game/hooks/assignproducts/types.ts +55 -0
- package/dist/templates/starter-game/package.json +68 -0
- package/dist/templates/starter-game/playwright.config.ts +19 -0
- package/dist/templates/starter-game/scenarios/heatwave/scenario.sdk.json +20 -0
- package/dist/templates/starter-game/scenarios/ordinary_week/scenario.sdk.json +12 -0
- package/dist/templates/starter-game/seriousgaming.sdk.json +23 -0
- package/dist/templates/starter-game/session/defaults.ts +80 -0
- package/dist/templates/starter-game/session/index.html +12 -0
- package/dist/templates/starter-game/session/session.sdk.json +11 -0
- package/dist/templates/starter-game/session/src/App.test.tsx +307 -0
- package/dist/templates/starter-game/session/src/App.tsx +309 -0
- package/dist/templates/starter-game/session/src/Section.tsx +37 -0
- package/dist/templates/starter-game/session/src/TeamDoor.tsx +96 -0
- package/dist/templates/starter-game/session/src/format.ts +8 -0
- package/dist/templates/starter-game/session/src/i18n.ts +51 -0
- package/dist/templates/starter-game/session/src/main.tsx +48 -0
- package/dist/templates/starter-game/session/src/theme.ts +45 -0
- package/dist/templates/starter-game/session/types.ts +135 -0
- package/dist/templates/starter-game/settings/engine/settings.sdk.json +50 -0
- package/dist/templates/starter-game/settings/menu/settings.sdk.json +78 -0
- package/dist/templates/starter-game/settings/session/settings.sdk.json +23 -0
- package/dist/templates/starter-game/settings/ui/settings.sdk.json +25 -0
- package/dist/templates/starter-game/test-setup.ts +7 -0
- package/dist/templates/starter-game/testing/e2e/game.spec.ts +139 -0
- package/dist/templates/starter-game/testing/e2e/global-setup.ts +21 -0
- package/dist/templates/starter-game/testing/engine/game.engine.test.ts +171 -0
- package/dist/templates/starter-game/tsconfig.json +19 -0
- package/dist/templates/starter-game/ui/defaults.ts +60 -0
- package/dist/templates/starter-game/ui/index.html +12 -0
- package/dist/templates/starter-game/ui/src/App.test.tsx +138 -0
- package/dist/templates/starter-game/ui/src/App.tsx +175 -0
- package/dist/templates/starter-game/ui/src/DayBar.test.tsx +78 -0
- package/dist/templates/starter-game/ui/src/DayBar.tsx +72 -0
- package/dist/templates/starter-game/ui/src/HistoryPanel.test.tsx +74 -0
- package/dist/templates/starter-game/ui/src/HistoryPanel.tsx +120 -0
- package/dist/templates/starter-game/ui/src/MakeRow.tsx +129 -0
- package/dist/templates/starter-game/ui/src/Section.tsx +37 -0
- package/dist/templates/starter-game/ui/src/ThemeToggle.tsx +49 -0
- package/dist/templates/starter-game/ui/src/TodayPanel.test.tsx +179 -0
- package/dist/templates/starter-game/ui/src/TodayPanel.tsx +92 -0
- package/dist/templates/starter-game/ui/src/YesterdayPanel.tsx +142 -0
- package/dist/templates/starter-game/ui/src/format.ts +12 -0
- package/dist/templates/starter-game/ui/src/i18n.ts +95 -0
- package/dist/templates/starter-game/ui/src/main.tsx +48 -0
- package/dist/templates/starter-game/ui/src/menu.ts +18 -0
- package/dist/templates/starter-game/ui/src/test-helpers.ts +58 -0
- package/dist/templates/starter-game/ui/src/theme.ts +45 -0
- package/dist/templates/starter-game/ui/src/writes.ts +43 -0
- package/dist/templates/starter-game/ui/types.ts +137 -0
- package/dist/templates/starter-game/ui/ui.sdk.json +11 -0
- package/dist/templates/starter-game/validators/capacity/defaults.ts +37 -0
- package/dist/templates/starter-game/validators/capacity/logic/logic.test.ts +96 -0
- package/dist/templates/starter-game/validators/capacity/logic/logic.ts +45 -0
- package/dist/templates/starter-game/validators/capacity/types.ts +55 -0
- package/dist/templates/starter-game/validators/capacity/validator.sdk.json +11 -0
- package/dist/templates/starter-game/vite.config.ts +19 -0
- package/dist/templates/starter-game/vitest.config.ts +15 -0
- package/dist/templates/starter-game/vitest.engine.config.ts +19 -0
- package/dist/templates/starter-game/waiting_room/defaults.ts +40 -0
- package/dist/templates/starter-game/waiting_room/index.html +12 -0
- package/dist/templates/starter-game/waiting_room/src/App.test.tsx +102 -0
- package/dist/templates/starter-game/waiting_room/src/App.tsx +194 -0
- package/dist/templates/starter-game/waiting_room/src/i18n.ts +33 -0
- package/dist/templates/starter-game/waiting_room/src/main.tsx +48 -0
- package/dist/templates/starter-game/waiting_room/src/theme.ts +45 -0
- package/dist/templates/starter-game/waiting_room/types.ts +59 -0
- package/dist/templates/starter-game/waiting_room/waiting_room.sdk.json +10 -0
- package/dist/templates/tick-controller/logic.ts.liquid +8 -0
- package/dist/templates/ui/index.html.liquid +12 -0
- package/dist/templates/ui/src/App.test.tsx.liquid +41 -0
- package/dist/templates/ui/src/App.tsx.liquid +103 -0
- package/dist/templates/ui/src/i18n.ts.liquid +47 -0
- package/dist/templates/ui/src/main.tsx.liquid +48 -0
- package/dist/templates/ui/src/theme.ts.liquid +46 -0
- package/dist/templates/validator/logic.test.ts.liquid +42 -0
- package/dist/templates/validator/logic.ts.liquid +21 -0
- package/dist/templates/waiting-room/index.html.liquid +12 -0
- package/dist/templates/waiting-room/src/App.test.tsx.liquid +57 -0
- package/dist/templates/waiting-room/src/App.tsx.liquid +118 -0
- package/dist/templates/waiting-room/src/i18n.ts.liquid +44 -0
- package/dist/templates/waiting-room/src/main.tsx.liquid +48 -0
- package/dist/templates/waiting-room/src/theme.ts.liquid +46 -0
- package/dist/templating/resource-metadata.d.ts +131 -0
- package/dist/types.d.ts +14 -0
- package/dist/utils/atomic-write.d.ts +40 -0
- package/dist/utils/cli-error.d.ts +64 -0
- package/dist/utils/document-parser-client.d.ts +20 -0
- package/dist/utils/env-loader.d.ts +40 -0
- package/dist/utils/error-codes.d.ts +339 -0
- package/dist/utils/errors.d.ts +19 -0
- package/dist/utils/global-settings.d.ts +65 -0
- package/dist/utils/llm-client.d.ts +34 -0
- package/dist/utils/logger.d.ts +36 -0
- package/dist/utils/output.d.ts +109 -0
- package/dist/utils/platform.d.ts +14 -0
- package/dist/utils/prompt.d.ts +36 -0
- package/dist/utils/real-path.d.ts +6 -0
- package/dist/utils/schema-properties.d.ts +35 -0
- package/dist/validation/ajv.d.ts +17 -0
- package/dist/validation/facilitator-guide-validator.d.ts +27 -0
- package/dist/validation/findings.d.ts +40 -0
- package/dist/validation/game-constraints.d.ts +10 -0
- package/dist/validation/game-validator.d.ts +34 -0
- package/dist/validation/package-validation.d.ts +41 -0
- package/dist/validation/package-validator.d.ts +19 -0
- package/dist/validation/resource-validator.d.ts +79 -0
- package/dist/validation/schema-defaults-validator.d.ts +29 -0
- package/dist/validation/schema-validation.d.ts +115 -0
- package/dist/validation/semver.d.ts +9 -0
- 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[];
|