@my-swu/simulator-client 0.1.5 → 0.1.7

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 (116) hide show
  1. package/README.md +29 -0
  2. package/dist/client.js +6 -1
  3. package/dist/connection/url.d.ts +2 -0
  4. package/dist/connection/url.js +4 -0
  5. package/dist/generated/index.d.ts +4 -0
  6. package/dist/generated/schemas.d.ts +1 -1
  7. package/dist/generated/schemas.js +2412 -1434
  8. package/dist/generated/types/admin-match-debug-bundle.d.ts +1 -1
  9. package/dist/generated/types/admin-match-list-response.d.ts +1 -1
  10. package/dist/generated/types/admin-match-replay-response.d.ts +1 -1
  11. package/dist/generated/types/client-message.d.ts +1 -1
  12. package/dist/generated/types/common.d.ts +524 -260
  13. package/dist/generated/types/create-limited-event-request.d.ts +1 -1
  14. package/dist/generated/types/format-event-response.d.ts +1 -1
  15. package/dist/generated/types/game-command.d.ts +1 -1
  16. package/dist/generated/types/game-event.d.ts +1 -1
  17. package/dist/generated/types/game-state.d.ts +1 -1
  18. package/dist/generated/types/get-match-response.d.ts +1 -1
  19. package/dist/generated/types/leave-limited-event-request.d.ts +1 -0
  20. package/dist/generated/types/leave-limited-event-request.js +2 -0
  21. package/dist/generated/types/limited-event-server-message.d.ts +1 -0
  22. package/dist/generated/types/limited-event-server-message.js +2 -0
  23. package/dist/generated/types/list-active-ai-matches-response.d.ts +1 -1
  24. package/dist/generated/types/lobby-access-response.d.ts +1 -1
  25. package/dist/generated/types/lobby-chat-response.d.ts +1 -1
  26. package/dist/generated/types/lobby-response.d.ts +1 -1
  27. package/dist/generated/types/lobby-server-message.d.ts +1 -1
  28. package/dist/generated/types/match-access-recovery-response.d.ts +1 -1
  29. package/dist/generated/types/match-access-response.d.ts +1 -1
  30. package/dist/generated/types/match-history-replay-response.d.ts +1 -1
  31. package/dist/generated/types/match-recovery-response.d.ts +1 -1
  32. package/dist/generated/types/match-spectator-access-response.d.ts +1 -1
  33. package/dist/generated/types/rematch-match-response.d.ts +1 -1
  34. package/dist/generated/types/restore-history-response.d.ts +1 -1
  35. package/dist/generated/types/restore-match-save-response.d.ts +1 -1
  36. package/dist/generated/types/server-message.d.ts +1 -1
  37. package/dist/generated/types/shared-match-history-replay-response.d.ts +1 -1
  38. package/dist/generated/types/submit-ai-game-feedback-request.d.ts +1 -0
  39. package/dist/generated/types/submit-ai-game-feedback-request.js +2 -0
  40. package/dist/generated/types/submit-ai-game-feedback-response.d.ts +1 -0
  41. package/dist/generated/types/submit-ai-game-feedback-response.js +2 -0
  42. package/dist/generated/types/submit-match-deck-response.d.ts +1 -1
  43. package/dist/generated/types/tournament-room-access-response.d.ts +1 -1
  44. package/dist/generated/types/tournament-room-server-message.d.ts +1 -1
  45. package/dist/generated/types/undo-match-response.d.ts +1 -1
  46. package/dist/generated/types/update-lobby-settings-request.d.ts +1 -1
  47. package/dist/generated/version.d.ts +1 -1
  48. package/dist/generated/version.js +1 -1
  49. package/dist/http/request.d.ts +2 -0
  50. package/dist/http/request.js +9 -1
  51. package/dist/i18n/card-print-catalog.d.ts +9 -0
  52. package/dist/i18n/card-print-catalog.js +260 -0
  53. package/dist/i18n/catalog.d.ts +8 -0
  54. package/dist/i18n/catalog.js +195 -0
  55. package/dist/i18n/diagnostics.d.ts +6 -0
  56. package/dist/i18n/diagnostics.js +19 -0
  57. package/dist/i18n/fallback.d.ts +3 -0
  58. package/dist/i18n/fallback.js +40 -0
  59. package/dist/i18n/format.d.ts +8 -0
  60. package/dist/i18n/format.js +29 -0
  61. package/dist/i18n/generated/message-types.d.ts +91 -0
  62. package/dist/i18n/generated/message-types.js +3 -0
  63. package/dist/i18n/icu.d.ts +12 -0
  64. package/dist/i18n/icu.js +75 -0
  65. package/dist/i18n/index.d.ts +9 -0
  66. package/dist/i18n/index.js +5 -0
  67. package/dist/i18n/locale.d.ts +9 -0
  68. package/dist/i18n/locale.js +19 -0
  69. package/dist/i18n/types.d.ts +151 -0
  70. package/dist/i18n/types.js +1 -0
  71. package/dist/index.d.ts +5 -4
  72. package/dist/internal/authenticated-socket-session.d.ts +2 -0
  73. package/dist/internal/authenticated-socket-session.js +3 -1
  74. package/dist/local/client.js +7 -2
  75. package/dist/local/server/http-router.js +18 -0
  76. package/dist/resources/admin.d.ts +8 -0
  77. package/dist/resources/admin.js +2 -0
  78. package/dist/resources/limited-event-session.d.ts +10 -0
  79. package/dist/resources/limited-event-session.js +35 -0
  80. package/dist/resources/limited-event-types.d.ts +34 -1
  81. package/dist/resources/limited-events.d.ts +8 -1
  82. package/dist/resources/limited-events.js +18 -1
  83. package/dist/resources/lobbies.d.ts +1 -1
  84. package/dist/resources/lobbies.js +1 -1
  85. package/dist/resources/lobby-types.d.ts +15 -2
  86. package/dist/resources/match-history.d.ts +8 -1
  87. package/dist/resources/match-history.js +10 -0
  88. package/dist/resources/tournament-rooms.d.ts +1 -1
  89. package/dist/resources/tournament-rooms.js +1 -1
  90. package/dist/types.d.ts +1 -1
  91. package/dist/validators.d.ts +5 -1
  92. package/i18n/cards/de.json +121 -0
  93. package/i18n/cards/en.json +121 -0
  94. package/i18n/cards/es.json +121 -0
  95. package/i18n/cards/fr.json +121 -0
  96. package/i18n/cards/it.json +121 -0
  97. package/i18n/cards/manifest.json +2715 -0
  98. package/i18n/de.json +11 -0
  99. package/i18n/en.json +11 -0
  100. package/i18n/es.json +11 -0
  101. package/i18n/fr.json +11 -0
  102. package/i18n/it.json +11 -0
  103. package/i18n/messages.schema.json +28 -0
  104. package/package.json +12 -2
  105. package/schema/common.schema.json +1684 -1005
  106. package/schema/create-limited-event-request.schema.json +11 -0
  107. package/schema/game-event.schema.json +76 -0
  108. package/schema/game-state.schema.json +8 -0
  109. package/schema/leave-limited-event-request.schema.json +15 -0
  110. package/schema/limited-event-server-message.schema.json +63 -0
  111. package/schema/manifest.json +5 -1
  112. package/schema/match-save-payload.schema.json +1 -1
  113. package/schema/route-manifest.json +54 -0
  114. package/schema/submit-ai-game-feedback-request.schema.json +36 -0
  115. package/schema/submit-ai-game-feedback-response.schema.json +19 -0
  116. package/schema/update-lobby-settings-request.schema.json +67 -0
@@ -82,6 +82,8 @@ export const schemaNames = [
82
82
  'limited-event-response',
83
83
  'limited-event-command-request',
84
84
  'join-limited-event-request',
85
+ 'leave-limited-event-request',
86
+ 'limited-event-server-message',
85
87
  'match-access-response',
86
88
  'abandon-match-request',
87
89
  'abandon-match-response',
@@ -114,6 +116,8 @@ export const schemaNames = [
114
116
  'match-history-entry',
115
117
  'match-history-replay-request',
116
118
  'match-history-replay-response',
119
+ 'submit-ai-game-feedback-request',
120
+ 'submit-ai-game-feedback-response',
117
121
  'create-match-history-replay-share-request',
118
122
  'create-match-history-replay-share-response',
119
123
  'shared-match-history-replay-response',
@@ -231,6 +235,32 @@ export const sdkSchemaCommon = {
231
235
  "seat"
232
236
  ]
233
237
  },
238
+ {
239
+ "description": "One physical leader slot; legacy `Leader` continues to identify slot zero.",
240
+ "type": "object",
241
+ "properties": {
242
+ "leaderIndex": {
243
+ "description": "Zero-based position in that player's leader list.",
244
+ "type": "integer",
245
+ "format": "uint8",
246
+ "maximum": 255,
247
+ "minimum": 0
248
+ },
249
+ "seat": {
250
+ "description": "Player who owns the leader slot.",
251
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/Seat"
252
+ },
253
+ "type": {
254
+ "type": "string",
255
+ "const": "leaderByIndex"
256
+ }
257
+ },
258
+ "required": [
259
+ "type",
260
+ "seat",
261
+ "leaderIndex"
262
+ ]
263
+ },
234
264
  {
235
265
  "type": "object",
236
266
  "properties": {
@@ -266,7 +296,7 @@ export const sdkSchemaCommon = {
266
296
  ]
267
297
  },
268
298
  "AbilityWindow": {
269
- "description": "Trigger window for a parsed ability. Identifies WHEN the ability\nfires; the WHAT is carried by `TriggeredEffect`.",
299
+ "description": "Trigger window for a parsed ability. Identifies WHEN the ability\nfires; the WHAT is carried by `TriggeredEffect`.\n\nThis type is on the public SDK schema — it reaches `GameState` through\n`PendingAbilityView.window` and `GameEvent` — but only ever server to\nclient: no `GameCommand` carries one, so a consumer reads it and never\nconstructs it. The two variants that carry a [`crate::effect::UnitFilter`]\nare therefore exported opaquely, the way `MatchSavePayload::state` is: the\nvariant discriminant stays on the wire so a UI can still switch on the\nwindow, while the engine filter behind it does not pin ~60 internal fields\nand their whole reference closure into the SDK type surface.",
270
300
  "oneOf": [
271
301
  {
272
302
  "type": "string",
@@ -333,12 +363,10 @@ export const sdkSchemaCommon = {
333
363
  "const": "WhenFriendlyUnitDealtDamageAndSurvives"
334
364
  },
335
365
  {
336
- "description": "Fires when a friendly Unit matching the typed filter takes combat damage\nand remains in play.",
366
+ "description": "Fires when a friendly Unit matching the typed filter takes combat damage\nand remains in play.\n\nOpaque to the public schema — see the type doc.",
337
367
  "type": "object",
338
368
  "properties": {
339
- "WhenFriendlyUnitDealtCombatDamageAndSurvives": {
340
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/UnitFilter"
341
- }
369
+ "WhenFriendlyUnitDealtCombatDamageAndSurvives": true
342
370
  },
343
371
  "additionalProperties": false,
344
372
  "required": [
@@ -413,12 +441,10 @@ export const sdkSchemaCommon = {
413
441
  "const": "WhenThisUnitWouldBeCaptured"
414
442
  },
415
443
  {
416
- "description": "Fires when a Unit matching the typed filter is defeated.",
444
+ "description": "Fires when a Unit matching the typed filter is defeated.\n\nOpaque to the public schema — see the type doc.",
417
445
  "type": "object",
418
446
  "properties": {
419
- "WhenUnitDefeated": {
420
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/UnitFilter"
421
- }
447
+ "WhenUnitDefeated": true
422
448
  },
423
449
  "additionalProperties": false,
424
450
  "required": [
@@ -498,6 +524,7 @@ export const sdkSchemaCommon = {
498
524
  "ActionAbilitySource": {
499
525
  "oneOf": [
500
526
  {
527
+ "description": "Legacy primary-leader action source.\n\nKept for wire compatibility with saved commands and older clients.",
501
528
  "type": "object",
502
529
  "properties": {
503
530
  "type": {
@@ -509,6 +536,27 @@ export const sdkSchemaCommon = {
509
536
  "type"
510
537
  ]
511
538
  },
539
+ {
540
+ "description": "One non-primary undeployed leader's printed action.\n\nTwin Suns players can have multiple leader cards. The primary source\nremains `Leader` for backwards compatibility, while every extra slot\ncarries its stable zero-based placement index.",
541
+ "type": "object",
542
+ "properties": {
543
+ "leaderIndex": {
544
+ "description": "Non-primary leader slots start at one; slot zero uses legacy `Leader`.",
545
+ "type": "integer",
546
+ "format": "uint8",
547
+ "maximum": 255,
548
+ "minimum": 1
549
+ },
550
+ "type": {
551
+ "type": "string",
552
+ "const": "leaderByIndex"
553
+ }
554
+ },
555
+ "required": [
556
+ "type",
557
+ "leaderIndex"
558
+ ]
559
+ },
512
560
  {
513
561
  "type": "object",
514
562
  "properties": {
@@ -611,6 +659,16 @@ export const sdkSchemaCommon = {
611
659
  "label": {
612
660
  "type": "string"
613
661
  },
662
+ "modeChoice": {
663
+ "anyOf": [
664
+ {
665
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/ModeChoiceView"
666
+ },
667
+ {
668
+ "type": "null"
669
+ }
670
+ ]
671
+ },
614
672
  "source": {
615
673
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/ActionAbilitySource"
616
674
  },
@@ -619,6 +677,17 @@ export const sdkSchemaCommon = {
619
677
  "items": {
620
678
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TargetSelectionGroup"
621
679
  }
680
+ },
681
+ "text": {
682
+ "description": "Exact public Action or Epic Action declaration when migrated.",
683
+ "anyOf": [
684
+ {
685
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
686
+ },
687
+ {
688
+ "type": "null"
689
+ }
690
+ ]
622
691
  }
623
692
  },
624
693
  "required": [
@@ -1138,6 +1207,17 @@ export const sdkSchemaCommon = {
1138
1207
  "items": {
1139
1208
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTargetView"
1140
1209
  }
1210
+ },
1211
+ "text": {
1212
+ "description": "Reviewed card-text and shared-message provenance when this public row\nwas created by a resolving instruction. Absence means this registry\ndoes not retain a display declaration, never that text was inferred.",
1213
+ "anyOf": [
1214
+ {
1215
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
1216
+ },
1217
+ {
1218
+ "type": "null"
1219
+ }
1220
+ ]
1141
1221
  }
1142
1222
  },
1143
1223
  "required": [
@@ -1151,6 +1231,13 @@ export const sdkSchemaCommon = {
1151
1231
  "description": "Compact durable match data safe for an administrator list view.",
1152
1232
  "type": "object",
1153
1233
  "properties": {
1234
+ "aiFeedback": {
1235
+ "description": "Feedback collected for individual completed AI games in this match.",
1236
+ "type": "array",
1237
+ "items": {
1238
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/AiGameFeedback"
1239
+ }
1240
+ },
1154
1241
  "completedAtMs": {
1155
1242
  "type": [
1156
1243
  "integer",
@@ -1208,7 +1295,8 @@ export const sdkSchemaCommon = {
1208
1295
  "series",
1209
1296
  "createdAtMs",
1210
1297
  "updatedAtMs",
1211
- "replayAvailable"
1298
+ "replayAvailable",
1299
+ "aiFeedback"
1212
1300
  ]
1213
1301
  },
1214
1302
  "AiDecisionDiagnostic": {
@@ -1414,6 +1502,46 @@ export const sdkSchemaCommon = {
1414
1502
  }
1415
1503
  ]
1416
1504
  },
1505
+ "AiGameFeedback": {
1506
+ "description": "One immutable player assessment of an AI opponent for a completed game.",
1507
+ "type": "object",
1508
+ "properties": {
1509
+ "comments": {
1510
+ "type": [
1511
+ "string",
1512
+ "null"
1513
+ ]
1514
+ },
1515
+ "gameNumber": {
1516
+ "type": "integer",
1517
+ "format": "uint8",
1518
+ "maximum": 255,
1519
+ "minimum": 0
1520
+ },
1521
+ "rating": {
1522
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/AiGameFeedbackRating"
1523
+ },
1524
+ "submittedAtMs": {
1525
+ "type": "integer",
1526
+ "format": "uint64",
1527
+ "minimum": 0
1528
+ }
1529
+ },
1530
+ "required": [
1531
+ "gameNumber",
1532
+ "rating",
1533
+ "submittedAtMs"
1534
+ ]
1535
+ },
1536
+ "AiGameFeedbackRating": {
1537
+ "description": "Rating submitted by a player after completing one Solo-versus-AI game.",
1538
+ "type": "string",
1539
+ "enum": [
1540
+ "poorly",
1541
+ "okay",
1542
+ "good"
1543
+ ]
1544
+ },
1417
1545
  "AiOpponentConfig": {
1418
1546
  "description": "Explicit AI seat configuration.",
1419
1547
  "type": "object",
@@ -2105,6 +2233,32 @@ export const sdkSchemaCommon = {
2105
2233
  "title"
2106
2234
  ]
2107
2235
  },
2236
+ "CardTextRef": {
2237
+ "type": "object",
2238
+ "properties": {
2239
+ "cardId": {
2240
+ "description": "Canonical card identity that owns this reviewed printed slot.",
2241
+ "type": "integer",
2242
+ "format": "uint32",
2243
+ "minimum": 0
2244
+ },
2245
+ "contractFingerprint": {
2246
+ "description": "Full semantic-contract fingerprint pinning this reference to reviewed text.",
2247
+ "type": "string",
2248
+ "pattern": "^[0-9A-Fa-f]{64}$"
2249
+ },
2250
+ "slot": {
2251
+ "description": "Durable reviewed slot identifier within the canonical card contract.",
2252
+ "type": "string",
2253
+ "minLength": 1
2254
+ }
2255
+ },
2256
+ "required": [
2257
+ "cardId",
2258
+ "slot",
2259
+ "contractFingerprint"
2260
+ ]
2261
+ },
2108
2262
  "CardType": {
2109
2263
  "description": "Canonical card families from production card data.",
2110
2264
  "type": "string",
@@ -2830,6 +2984,17 @@ export const sdkSchemaCommon = {
2830
2984
  ],
2831
2985
  "format": "uint32",
2832
2986
  "minimum": 0
2987
+ },
2988
+ "text": {
2989
+ "description": "Reviewed text retained by the delayed follow-up when it was created.",
2990
+ "anyOf": [
2991
+ {
2992
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
2993
+ },
2994
+ {
2995
+ "type": "null"
2996
+ }
2997
+ ]
2833
2998
  }
2834
2999
  },
2835
3000
  "required": [
@@ -2980,6 +3145,17 @@ export const sdkSchemaCommon = {
2980
3145
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTargetView"
2981
3146
  }
2982
3147
  },
3148
+ "text": {
3149
+ "description": "Reviewed card-text and shared-message provenance for this public row.",
3150
+ "anyOf": [
3151
+ {
3152
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
3153
+ },
3154
+ {
3155
+ "type": "null"
3156
+ }
3157
+ ]
3158
+ },
2983
3159
  "timing": {
2984
3160
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/DelayedEffectTimingView"
2985
3161
  }
@@ -3134,6 +3310,44 @@ export const sdkSchemaCommon = {
3134
3310
  "advantage"
3135
3311
  ]
3136
3312
  },
3313
+ "DraftLobbyTimerSettings": {
3314
+ "description": "Draft pick schedule. Vectors are ordered by remaining choices: leader\nvalues cover 2 through 8, pack values cover 2 through 14.",
3315
+ "type": "object",
3316
+ "properties": {
3317
+ "leaderPickSeconds": {
3318
+ "description": "Leader-pick duration in seconds for 2 through 8 leaders remaining.",
3319
+ "type": "array",
3320
+ "items": {
3321
+ "type": "integer",
3322
+ "format": "uint16",
3323
+ "maximum": 65535,
3324
+ "minimum": 0
3325
+ }
3326
+ },
3327
+ "packPickSeconds": {
3328
+ "description": "Pack-pick duration in seconds for 2 through 14 cards remaining.",
3329
+ "type": "array",
3330
+ "items": {
3331
+ "type": "integer",
3332
+ "format": "uint16",
3333
+ "maximum": 65535,
3334
+ "minimum": 0
3335
+ }
3336
+ },
3337
+ "reviewSeconds": {
3338
+ "description": "Review duration between booster packs in seconds.",
3339
+ "type": "integer",
3340
+ "format": "uint16",
3341
+ "maximum": 65535,
3342
+ "minimum": 0
3343
+ }
3344
+ },
3345
+ "required": [
3346
+ "leaderPickSeconds",
3347
+ "packPickSeconds",
3348
+ "reviewSeconds"
3349
+ ]
3350
+ },
3137
3351
  "DraftRoundConfig": {
3138
3352
  "description": "One configured booster round for a chaos draft.",
3139
3353
  "type": "object",
@@ -3147,32 +3361,6 @@ export const sdkSchemaCommon = {
3147
3361
  "setCode"
3148
3362
  ]
3149
3363
  },
3150
- "DynamicPowerLimit": {
3151
- "description": "Typed game-state source for a dynamic Unit power ceiling.",
3152
- "oneOf": [
3153
- {
3154
- "description": "Number of upgrades attached across units with this controller relation.",
3155
- "type": "object",
3156
- "properties": {
3157
- "UpgradesOnUnits": {
3158
- "type": "object",
3159
- "properties": {
3160
- "relation": {
3161
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/RelationFilter"
3162
- }
3163
- },
3164
- "required": [
3165
- "relation"
3166
- ]
3167
- }
3168
- },
3169
- "additionalProperties": false,
3170
- "required": [
3171
- "UpgradesOnUnits"
3172
- ]
3173
- }
3174
- ]
3175
- },
3176
3364
  "EffectCardScopeView": {
3177
3365
  "description": "Public card subset affected by a play or cost modifier.",
3178
3366
  "oneOf": [
@@ -3308,6 +3496,16 @@ export const sdkSchemaCommon = {
3308
3496
  },
3309
3497
  "stepId": {
3310
3498
  "type": "string"
3499
+ },
3500
+ "text": {
3501
+ "anyOf": [
3502
+ {
3503
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
3504
+ },
3505
+ {
3506
+ "type": "null"
3507
+ }
3508
+ ]
3311
3509
  }
3312
3510
  },
3313
3511
  "required": [
@@ -3340,6 +3538,16 @@ export const sdkSchemaCommon = {
3340
3538
  },
3341
3539
  "stepId": {
3342
3540
  "type": "string"
3541
+ },
3542
+ "text": {
3543
+ "anyOf": [
3544
+ {
3545
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
3546
+ },
3547
+ {
3548
+ "type": "null"
3549
+ }
3550
+ ]
3343
3551
  }
3344
3552
  },
3345
3553
  "required": [
@@ -3363,6 +3571,20 @@ export const sdkSchemaCommon = {
3363
3571
  "label": {
3364
3572
  "type": "string"
3365
3573
  },
3574
+ "modeTextReferences": {
3575
+ "description": "Exact reviewed Mode wrappers for every selected executable option.",
3576
+ "type": "array",
3577
+ "items": {
3578
+ "anyOf": [
3579
+ {
3580
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/CardTextRef"
3581
+ },
3582
+ {
3583
+ "type": "null"
3584
+ }
3585
+ ]
3586
+ }
3587
+ },
3366
3588
  "selected": {
3367
3589
  "type": "array",
3368
3590
  "items": {
@@ -3373,6 +3595,16 @@ export const sdkSchemaCommon = {
3373
3595
  },
3374
3596
  "stepId": {
3375
3597
  "type": "string"
3598
+ },
3599
+ "text": {
3600
+ "anyOf": [
3601
+ {
3602
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
3603
+ },
3604
+ {
3605
+ "type": "null"
3606
+ }
3607
+ ]
3376
3608
  }
3377
3609
  },
3378
3610
  "required": [
@@ -3406,6 +3638,16 @@ export const sdkSchemaCommon = {
3406
3638
  },
3407
3639
  "stepId": {
3408
3640
  "type": "string"
3641
+ },
3642
+ "text": {
3643
+ "anyOf": [
3644
+ {
3645
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
3646
+ },
3647
+ {
3648
+ "type": "null"
3649
+ }
3650
+ ]
3409
3651
  }
3410
3652
  },
3411
3653
  "required": [
@@ -3434,6 +3676,16 @@ export const sdkSchemaCommon = {
3434
3676
  },
3435
3677
  "stepId": {
3436
3678
  "type": "string"
3679
+ },
3680
+ "text": {
3681
+ "anyOf": [
3682
+ {
3683
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
3684
+ },
3685
+ {
3686
+ "type": "null"
3687
+ }
3688
+ ]
3437
3689
  }
3438
3690
  },
3439
3691
  "required": [
@@ -3462,6 +3714,16 @@ export const sdkSchemaCommon = {
3462
3714
  },
3463
3715
  "stepId": {
3464
3716
  "type": "string"
3717
+ },
3718
+ "text": {
3719
+ "anyOf": [
3720
+ {
3721
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
3722
+ },
3723
+ {
3724
+ "type": "null"
3725
+ }
3726
+ ]
3465
3727
  }
3466
3728
  },
3467
3729
  "required": [
@@ -3495,6 +3757,16 @@ export const sdkSchemaCommon = {
3495
3757
  },
3496
3758
  "target": {
3497
3759
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/AttackTarget"
3760
+ },
3761
+ "text": {
3762
+ "anyOf": [
3763
+ {
3764
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
3765
+ },
3766
+ {
3767
+ "type": "null"
3768
+ }
3769
+ ]
3498
3770
  }
3499
3771
  },
3500
3772
  "required": [
@@ -3527,6 +3799,16 @@ export const sdkSchemaCommon = {
3527
3799
  },
3528
3800
  "stepId": {
3529
3801
  "type": "string"
3802
+ },
3803
+ "text": {
3804
+ "anyOf": [
3805
+ {
3806
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
3807
+ },
3808
+ {
3809
+ "type": "null"
3810
+ }
3811
+ ]
3530
3812
  }
3531
3813
  },
3532
3814
  "required": [
@@ -3563,11 +3845,22 @@ export const sdkSchemaCommon = {
3563
3845
  "description": "Printed label of originating effect, retained for descendants.",
3564
3846
  "type": "string"
3565
3847
  },
3566
- "sourceCardId": {
3567
- "type": "integer",
3568
- "format": "uint32",
3569
- "minimum": 0
3570
- },
3848
+ "originText": {
3849
+ "description": "Exact reviewed text owner for the originating command.",
3850
+ "anyOf": [
3851
+ {
3852
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
3853
+ },
3854
+ {
3855
+ "type": "null"
3856
+ }
3857
+ ]
3858
+ },
3859
+ "sourceCardId": {
3860
+ "type": "integer",
3861
+ "format": "uint32",
3862
+ "minimum": 0
3863
+ },
3571
3864
  "steps": {
3572
3865
  "type": "array",
3573
3866
  "items": {
@@ -3723,6 +4016,30 @@ export const sdkSchemaCommon = {
3723
4016
  "seat"
3724
4017
  ]
3725
4018
  },
4019
+ {
4020
+ "description": "Exact physical leader slot affected by this effect.",
4021
+ "type": "object",
4022
+ "properties": {
4023
+ "leaderIndex": {
4024
+ "type": "integer",
4025
+ "format": "uint8",
4026
+ "maximum": 255,
4027
+ "minimum": 0
4028
+ },
4029
+ "seat": {
4030
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/Seat"
4031
+ },
4032
+ "type": {
4033
+ "type": "string",
4034
+ "const": "leaderByIndex"
4035
+ }
4036
+ },
4037
+ "required": [
4038
+ "type",
4039
+ "seat",
4040
+ "leaderIndex"
4041
+ ]
4042
+ },
3726
4043
  {
3727
4044
  "type": "object",
3728
4045
  "properties": {
@@ -3776,6 +4093,48 @@ export const sdkSchemaCommon = {
3776
4093
  }
3777
4094
  ]
3778
4095
  },
4096
+ "EffectTextRefsView": {
4097
+ "description": "Locale-neutral reviewed text that owns visible effect work.\n\nClients resolve these catalog references in their selected locale. Empty\nfields mean runtime work came from an unmigrated declaration; they never\nauthorize reconstructing English from a label. Explicit system messages\nremain present in `shared_messages` instead of being mistaken for absence.",
4098
+ "type": "object",
4099
+ "properties": {
4100
+ "ability": {
4101
+ "description": "Printed ability that created this resolution.",
4102
+ "anyOf": [
4103
+ {
4104
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/CardTextRef"
4105
+ },
4106
+ {
4107
+ "type": "null"
4108
+ }
4109
+ ]
4110
+ },
4111
+ "effects": {
4112
+ "description": "Nested printed effects enclosing this visible work, outermost first.",
4113
+ "type": "array",
4114
+ "items": {
4115
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/CardTextRef"
4116
+ }
4117
+ },
4118
+ "selectedMode": {
4119
+ "description": "Printed mode selected before the current continuation, if any.",
4120
+ "anyOf": [
4121
+ {
4122
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/CardTextRef"
4123
+ },
4124
+ {
4125
+ "type": "null"
4126
+ }
4127
+ ]
4128
+ },
4129
+ "sharedMessages": {
4130
+ "description": "Finite SDK messages explicitly declared for this outcome.",
4131
+ "type": "array",
4132
+ "items": {
4133
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/SimulatorMessage"
4134
+ }
4135
+ }
4136
+ }
4137
+ },
3779
4138
  "ErrorPayload": {
3780
4139
  "type": "object",
3781
4140
  "properties": {
@@ -3808,6 +4167,51 @@ export const sdkSchemaCommon = {
3808
4167
  "message"
3809
4168
  ]
3810
4169
  },
4170
+ "EventPlayInputProvenance": {
4171
+ "description": "Reviewed printed ownership for inputs accepted by one event-play command.\n\nTarget groups retain their native ownership/order. Mode references stay\nposition-aligned with submitted mode indexes, including legacy `None`\nentries, so sparse bindings never shift a selected option's identity.",
4172
+ "type": "object",
4173
+ "properties": {
4174
+ "modeTextReferences": {
4175
+ "description": "One explicit Mode reference per submitted mode index, in command order.",
4176
+ "type": "array",
4177
+ "items": {
4178
+ "anyOf": [
4179
+ {
4180
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/CardTextRef"
4181
+ },
4182
+ {
4183
+ "type": "null"
4184
+ }
4185
+ ]
4186
+ }
4187
+ },
4188
+ "targetInputs": {
4189
+ "description": "One compact ownership record per submitted target or capture pair, in\ncommand order.\n\nThis intentionally excludes target candidates and the selected target\nitself. Event history needs printed ownership, while candidate lists can\nreveal hidden resources and live board information.",
4190
+ "type": "array",
4191
+ "items": {
4192
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EventPlayTargetInputProvenance"
4193
+ }
4194
+ }
4195
+ }
4196
+ },
4197
+ "EventPlayTargetInputProvenance": {
4198
+ "description": "Printed ownership for one submitted event target.",
4199
+ "type": "object",
4200
+ "properties": {
4201
+ "purpose": {
4202
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TargetGroupPurpose"
4203
+ },
4204
+ "textReferences": {
4205
+ "type": "array",
4206
+ "items": {
4207
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/CardTextRef"
4208
+ }
4209
+ }
4210
+ },
4211
+ "required": [
4212
+ "purpose"
4213
+ ]
4214
+ },
3811
4215
  "ExploitOptionsView": {
3812
4216
  "type": "object",
3813
4217
  "properties": {
@@ -5436,11 +5840,33 @@ export const sdkSchemaCommon = {
5436
5840
  "format": "uint32",
5437
5841
  "minimum": 0
5438
5842
  },
5843
+ "inputProvenance": {
5844
+ "description": "Exact reviewed owners for inputs supplied while playing this event.\n\nThis is emitted only for migrated declarations. It captures the\nplay command before later event clauses can replace the active\nprompt, which lets draft/history consumers retain the source input\nrather than borrowing a descendant's text.",
5845
+ "anyOf": [
5846
+ {
5847
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EventPlayInputProvenance"
5848
+ },
5849
+ {
5850
+ "type": "null"
5851
+ }
5852
+ ]
5853
+ },
5439
5854
  "playedWithSmuggle": {
5440
5855
  "type": "boolean"
5441
5856
  },
5442
5857
  "seat": {
5443
5858
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/Seat"
5859
+ },
5860
+ "text": {
5861
+ "description": "Exact printed event declaration exposed when this public event was played.",
5862
+ "anyOf": [
5863
+ {
5864
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
5865
+ },
5866
+ {
5867
+ "type": "null"
5868
+ }
5869
+ ]
5444
5870
  }
5445
5871
  },
5446
5872
  "required": [
@@ -5907,6 +6333,38 @@ export const sdkSchemaCommon = {
5907
6333
  "cardsRevealed"
5908
6334
  ]
5909
6335
  },
6336
+ {
6337
+ "description": "Public cards explicitly selected from a discard pile during ability resolution.",
6338
+ "type": "object",
6339
+ "properties": {
6340
+ "cardsChosenFromDiscard": {
6341
+ "type": "object",
6342
+ "properties": {
6343
+ "cardIds": {
6344
+ "description": "Printed card identities in command order; duplicates represent distinct copies.",
6345
+ "type": "array",
6346
+ "items": {
6347
+ "type": "integer",
6348
+ "format": "uint32",
6349
+ "minimum": 0
6350
+ }
6351
+ },
6352
+ "seat": {
6353
+ "description": "Player who made the selection, which may differ from the discard-pile owner.",
6354
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/Seat"
6355
+ }
6356
+ },
6357
+ "required": [
6358
+ "seat",
6359
+ "cardIds"
6360
+ ]
6361
+ }
6362
+ },
6363
+ "additionalProperties": false,
6364
+ "required": [
6365
+ "cardsChosenFromDiscard"
6366
+ ]
6367
+ },
5910
6368
  {
5911
6369
  "type": "object",
5912
6370
  "properties": {
@@ -6099,6 +6557,17 @@ export const sdkSchemaCommon = {
6099
6557
  "items": {
6100
6558
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/AbilityTarget"
6101
6559
  }
6560
+ },
6561
+ "text": {
6562
+ "description": "Exact public Action or Epic Action declaration that was used.",
6563
+ "anyOf": [
6564
+ {
6565
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
6566
+ },
6567
+ {
6568
+ "type": "null"
6569
+ }
6570
+ ]
6102
6571
  }
6103
6572
  },
6104
6573
  "required": [
@@ -6138,6 +6607,17 @@ export const sdkSchemaCommon = {
6138
6607
  "format": "uint64",
6139
6608
  "minimum": 0
6140
6609
  },
6610
+ "text": {
6611
+ "description": "Exact public trigger declaration and currently resolved effect.",
6612
+ "anyOf": [
6613
+ {
6614
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
6615
+ },
6616
+ {
6617
+ "type": "null"
6618
+ }
6619
+ ]
6620
+ },
6141
6621
  "window": {
6142
6622
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/AbilityWindow"
6143
6623
  }
@@ -7388,6 +7868,14 @@ export const sdkSchemaCommon = {
7388
7868
  "type": "boolean",
7389
7869
  "default": false
7390
7870
  },
7871
+ "playgroundActionAbilities": {
7872
+ "description": "Host-only Playground ability projection. Empty for normal matches and\nwhile a resolution owns the command boundary.",
7873
+ "type": "array",
7874
+ "default": [],
7875
+ "items": {
7876
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/PlaygroundActionAbilityView"
7877
+ }
7878
+ },
7391
7879
  "playgroundDeckCardIds": {
7392
7880
  "description": "Printed cards supplied by every configured Playground deck.",
7393
7881
  "type": "array",
@@ -7876,11 +8364,32 @@ export const sdkSchemaCommon = {
7876
8364
  "label": {
7877
8365
  "type": "string"
7878
8366
  },
8367
+ "modeChoice": {
8368
+ "anyOf": [
8369
+ {
8370
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/ModeChoiceView"
8371
+ },
8372
+ {
8373
+ "type": "null"
8374
+ }
8375
+ ]
8376
+ },
7879
8377
  "targetGroups": {
7880
8378
  "type": "array",
7881
8379
  "items": {
7882
8380
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TargetSelectionGroup"
7883
8381
  }
8382
+ },
8383
+ "text": {
8384
+ "description": "Reviewed declaration text for a migrated leader action.",
8385
+ "anyOf": [
8386
+ {
8387
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
8388
+ },
8389
+ {
8390
+ "type": "null"
8391
+ }
8392
+ ]
7884
8393
  }
7885
8394
  },
7886
8395
  "required": [
@@ -8660,6 +9169,38 @@ export const sdkSchemaCommon = {
8660
9169
  "draftedCardCount"
8661
9170
  ]
8662
9171
  },
9172
+ "LimitedLobbyTimerSettings": {
9173
+ "description": "Limited-event timing controls owned by a lobby host.",
9174
+ "type": "object",
9175
+ "properties": {
9176
+ "deckBuildingSeconds": {
9177
+ "description": "Deck construction duration in seconds.",
9178
+ "type": "integer",
9179
+ "format": "uint16",
9180
+ "maximum": 65535,
9181
+ "minimum": 0
9182
+ },
9183
+ "deckBuildingTimerEnabled": {
9184
+ "description": "Enables informational deck construction deadline displays.",
9185
+ "type": "boolean"
9186
+ },
9187
+ "draft": {
9188
+ "description": "Draft-only pick and review schedule. Sealed lobbies omit it.",
9189
+ "anyOf": [
9190
+ {
9191
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/DraftLobbyTimerSettings"
9192
+ },
9193
+ {
9194
+ "type": "null"
9195
+ }
9196
+ ]
9197
+ }
9198
+ },
9199
+ "required": [
9200
+ "deckBuildingTimerEnabled",
9201
+ "deckBuildingSeconds"
9202
+ ]
9203
+ },
8663
9204
  "LimitedPackCardView": {
8664
9205
  "description": "One generated pack card plus collation metadata.",
8665
9206
  "type": "object",
@@ -8967,6 +9508,30 @@ export const sdkSchemaCommon = {
8967
9508
  }
8968
9509
  }
8969
9510
  },
9511
+ "LobbyGameTimerSettings": {
9512
+ "description": "Per-game clock values shared by constructed and Limited lobbies.",
9513
+ "type": "object",
9514
+ "properties": {
9515
+ "reserveSeconds": {
9516
+ "description": "Seconds of reserve time granted to each player.",
9517
+ "type": "integer",
9518
+ "format": "uint16",
9519
+ "maximum": 65535,
9520
+ "minimum": 0
9521
+ },
9522
+ "turnSeconds": {
9523
+ "description": "Seconds allocated to each normal turn before reserve is used.",
9524
+ "type": "integer",
9525
+ "format": "uint16",
9526
+ "maximum": 65535,
9527
+ "minimum": 0
9528
+ }
9529
+ },
9530
+ "required": [
9531
+ "turnSeconds",
9532
+ "reserveSeconds"
9533
+ ]
9534
+ },
8970
9535
  "LobbyKickedPayload": {
8971
9536
  "type": "object",
8972
9537
  "properties": {
@@ -9376,6 +9941,17 @@ export const sdkSchemaCommon = {
9376
9941
  "status": {
9377
9942
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LobbyStatus"
9378
9943
  },
9944
+ "timerSettings": {
9945
+ "description": "Host-selected timer schedule for this lobby. Missing values identify\nrecords created before configurable timers were introduced.",
9946
+ "anyOf": [
9947
+ {
9948
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LobbyTimerSettings"
9949
+ },
9950
+ {
9951
+ "type": "null"
9952
+ }
9953
+ ]
9954
+ },
9379
9955
  "visibility": {
9380
9956
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LobbyVisibility"
9381
9957
  }
@@ -9497,6 +10073,30 @@ export const sdkSchemaCommon = {
9497
10073
  "closed"
9498
10074
  ]
9499
10075
  },
10076
+ "LobbyTimerSettings": {
10077
+ "description": "Host-selected timing rules for a lobby and its started event or match.",
10078
+ "type": "object",
10079
+ "properties": {
10080
+ "game": {
10081
+ "description": "Per-turn and reserve-bank settings for the final game.",
10082
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LobbyGameTimerSettings"
10083
+ },
10084
+ "limited": {
10085
+ "description": "Limited-only draft and deck-construction settings.",
10086
+ "anyOf": [
10087
+ {
10088
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LimitedLobbyTimerSettings"
10089
+ },
10090
+ {
10091
+ "type": "null"
10092
+ }
10093
+ ]
10094
+ }
10095
+ },
10096
+ "required": [
10097
+ "game"
10098
+ ]
10099
+ },
9500
10100
  "LobbyVisibility": {
9501
10101
  "type": "string",
9502
10102
  "enum": [
@@ -10131,7 +10731,7 @@ export const sdkSchemaCommon = {
10131
10731
  "description": "The serialized engine state. Catalog `Arc`s are skip-default here\nand grafted on by the restore path before the state goes live.\n\nOpaque to the public schema — SDK consumers should treat this as an\nimplementation-defined object that round-trips byte-for-byte. Pinning\nevery engine sub-struct into the schema would couple the SDK type\nsurface to the entire engine, which we explicitly do not want."
10132
10732
  },
10133
10733
  "version": {
10134
- "description": "Wire-format version. Always [`MATCH_SAVE_VERSION`] for newly minted\npayloads; restore rejects mismatches.",
10734
+ "description": "Wire-format version. Always [`MATCH_SAVE_VERSION`] for newly minted\npayloads; restore accepts every [`SUPPORTED_SAVE_VERSIONS`] entry and\nrejects anything else.",
10135
10735
  "type": "integer",
10136
10736
  "format": "uint8",
10137
10737
  "maximum": 255,
@@ -10597,6 +11197,17 @@ export const sdkSchemaCommon = {
10597
11197
  "type": "integer",
10598
11198
  "format": "uint32",
10599
11199
  "minimum": 0
11200
+ },
11201
+ "text": {
11202
+ "description": "Reviewed printed text owning this chooser payload.",
11203
+ "anyOf": [
11204
+ {
11205
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
11206
+ },
11207
+ {
11208
+ "type": "null"
11209
+ }
11210
+ ]
10600
11211
  }
10601
11212
  },
10602
11213
  "required": [
@@ -10677,6 +11288,17 @@ export const sdkSchemaCommon = {
10677
11288
  "type": "integer",
10678
11289
  "format": "uint32",
10679
11290
  "minimum": 0
11291
+ },
11292
+ "text": {
11293
+ "description": "Reviewed printed text owning this chooser payload.",
11294
+ "anyOf": [
11295
+ {
11296
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
11297
+ },
11298
+ {
11299
+ "type": "null"
11300
+ }
11301
+ ]
10680
11302
  }
10681
11303
  },
10682
11304
  "required": [
@@ -10782,9 +11404,20 @@ export const sdkSchemaCommon = {
10782
11404
  "type": "integer",
10783
11405
  "format": "uint32",
10784
11406
  "minimum": 0
10785
- }
10786
- },
10787
- "required": [
11407
+ },
11408
+ "text": {
11409
+ "description": "Reviewed printed text owning this private chooser payload.",
11410
+ "anyOf": [
11411
+ {
11412
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
11413
+ },
11414
+ {
11415
+ "type": "null"
11416
+ }
11417
+ ]
11418
+ }
11419
+ },
11420
+ "required": [
10788
11421
  "abilityId",
10789
11422
  "sourceCardId",
10790
11423
  "label",
@@ -10896,6 +11529,20 @@ export const sdkSchemaCommon = {
10896
11529
  "type": "string"
10897
11530
  }
10898
11531
  },
11532
+ "optionTextReferences": {
11533
+ "description": "Reviewed printed text for each matching mode option.\n\nIndex aligns with `option_labels`; `None` denotes an engine/system\noption rather than inferred prose.",
11534
+ "type": "array",
11535
+ "items": {
11536
+ "anyOf": [
11537
+ {
11538
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/CardTextRef"
11539
+ },
11540
+ {
11541
+ "type": "null"
11542
+ }
11543
+ ]
11544
+ }
11545
+ },
10899
11546
  "promptProvenance": {
10900
11547
  "description": "Parent/stage identity and interaction policy inherited from resolution.",
10901
11548
  "anyOf": [
@@ -10911,6 +11558,17 @@ export const sdkSchemaCommon = {
10911
11558
  "type": "integer",
10912
11559
  "format": "uint32",
10913
11560
  "minimum": 0
11561
+ },
11562
+ "text": {
11563
+ "description": "Reviewed printed text owning this chooser payload.",
11564
+ "anyOf": [
11565
+ {
11566
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
11567
+ },
11568
+ {
11569
+ "type": "null"
11570
+ }
11571
+ ]
10914
11572
  }
10915
11573
  },
10916
11574
  "required": [
@@ -10961,6 +11619,17 @@ export const sdkSchemaCommon = {
10961
11619
  "type": "integer",
10962
11620
  "format": "uint32",
10963
11621
  "minimum": 0
11622
+ },
11623
+ "text": {
11624
+ "description": "Reviewed printed text owning this chooser payload.",
11625
+ "anyOf": [
11626
+ {
11627
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
11628
+ },
11629
+ {
11630
+ "type": "null"
11631
+ }
11632
+ ]
10964
11633
  }
10965
11634
  },
10966
11635
  "required": [
@@ -10986,6 +11655,17 @@ export const sdkSchemaCommon = {
10986
11655
  "type": "integer",
10987
11656
  "format": "uint32",
10988
11657
  "minimum": 0
11658
+ },
11659
+ "text": {
11660
+ "description": "Reviewed text retained by the queued ability when its producer made it\npublic. The order prompt does not infer ownership from source cards.",
11661
+ "anyOf": [
11662
+ {
11663
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
11664
+ },
11665
+ {
11666
+ "type": "null"
11667
+ }
11668
+ ]
10989
11669
  }
10990
11670
  },
10991
11671
  "required": [
@@ -11137,6 +11817,17 @@ export const sdkSchemaCommon = {
11137
11817
  "description": "Complete target-selection contract for this pending ability.\n\nGroups retain ordering, bounds, and structural purpose together.",
11138
11818
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TargetSelectionPlanView"
11139
11819
  },
11820
+ "text": {
11821
+ "description": "Reviewed printed ability, selected mode, and current effect ownership.",
11822
+ "anyOf": [
11823
+ {
11824
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
11825
+ },
11826
+ {
11827
+ "type": "null"
11828
+ }
11829
+ ]
11830
+ },
11140
11831
  "window": {
11141
11832
  "description": "Trigger window this ability was collected in.\n\nPart of the ability's stable identity: with `source_card_id`,\n`source_unit_id`, `clause_id`, and `family` it addresses one queued\nability without depending on queue position.",
11142
11833
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/AbilityWindow"
@@ -11330,6 +12021,17 @@ export const sdkSchemaCommon = {
11330
12021
  "format": "uint32",
11331
12022
  "minimum": 0
11332
12023
  },
12024
+ "text": {
12025
+ "description": "Reviewed printed text owning this chooser payload.",
12026
+ "anyOf": [
12027
+ {
12028
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
12029
+ },
12030
+ {
12031
+ "type": "null"
12032
+ }
12033
+ ]
12034
+ },
11333
12035
  "title": {
11334
12036
  "type": "string"
11335
12037
  },
@@ -11538,60 +12240,171 @@ export const sdkSchemaCommon = {
11538
12240
  "left"
11539
12241
  ]
11540
12242
  },
11541
- "PlayerTargetPattern": {
11542
- "oneOf": [
11543
- {
11544
- "type": "string",
11545
- "enum": [
11546
- "SelfPlayer",
11547
- "EachPlayer",
11548
- "OpponentPlayer",
11549
- "ChosenOpponent",
11550
- "ChosenPlayer",
11551
- "DefendingPlayer",
11552
- "RememberedPlayer",
11553
- "RememberedUnitController",
11554
- "OtherThanRememberedPlayer"
12243
+ "PlaygroundActionAbilityView": {
12244
+ "description": "Playground-only action ability that may be executed without normal action\ntiming, usage, condition, or cost gates.",
12245
+ "type": "object",
12246
+ "properties": {
12247
+ "label": {
12248
+ "type": "string"
12249
+ },
12250
+ "modeChoice": {
12251
+ "anyOf": [
12252
+ {
12253
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/ModeChoiceView"
12254
+ },
12255
+ {
12256
+ "type": "null"
12257
+ }
11555
12258
  ]
11556
12259
  },
11557
- {
11558
- "description": "Every opponent independently. Unlike `OpponentPlayer`, this never\ncollapses a multiplayer instruction into one opponent.",
11559
- "type": "string",
11560
- "const": "EachOpponent"
12260
+ "seat": {
12261
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/Seat"
11561
12262
  },
11562
- {
11563
- "description": "Every opponent whose base the source player damaged during this phase.",
11564
- "type": "string",
11565
- "const": "EachOpponentWhoseBaseDamagedBySourceThisPhase"
12263
+ "source": {
12264
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/ActionAbilitySource"
11566
12265
  },
11567
- {
11568
- "description": "Controller of the target selected by a preceding effect.",
11569
- "type": "string",
11570
- "const": "RememberedTargetController"
12266
+ "targetGroups": {
12267
+ "type": "array",
12268
+ "items": {
12269
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TargetSelectionGroup"
12270
+ }
11571
12271
  },
12272
+ "text": {
12273
+ "description": "Exact public Action or Epic Action declaration when migrated.",
12274
+ "anyOf": [
12275
+ {
12276
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
12277
+ },
12278
+ {
12279
+ "type": "null"
12280
+ }
12281
+ ]
12282
+ }
12283
+ },
12284
+ "required": [
12285
+ "seat",
12286
+ "source",
12287
+ "label",
12288
+ "targetGroups"
12289
+ ]
12290
+ },
12291
+ "PlaygroundCardStateChange": {
12292
+ "description": "One in-play card whose Playground-editable state may be set exactly.\n\nEvery field is a target value rather than a delta, so a client that shows\ncurrent counts can submit what the board should look like instead of\nreconstructing the sequence of adjustments that gets there. Anything the\nengine derives — keywords, clone identity, controller, arena, card text —\nstays out of this patch and remains read-only.",
12293
+ "oneOf": [
11572
12294
  {
11573
- "description": "Player at one relative multiplayer seat from the remembered player.",
12295
+ "description": "Forces unit state directly, bypassing normal gameplay restrictions.\n\nAbsent fields are left untouched; at least one must be present.",
11574
12296
  "type": "object",
11575
12297
  "properties": {
11576
- "RelativeToRememberedPlayer": {
11577
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/SeatDirection"
12298
+ "advantageTokens": {
12299
+ "type": [
12300
+ "integer",
12301
+ "null"
12302
+ ],
12303
+ "format": "uint8",
12304
+ "maximum": 255,
12305
+ "minimum": 0
12306
+ },
12307
+ "damage": {
12308
+ "type": [
12309
+ "integer",
12310
+ "null"
12311
+ ],
12312
+ "format": "int16",
12313
+ "maximum": 32767,
12314
+ "minimum": -32768
12315
+ },
12316
+ "experienceTokens": {
12317
+ "type": [
12318
+ "integer",
12319
+ "null"
12320
+ ],
12321
+ "format": "uint8",
12322
+ "maximum": 255,
12323
+ "minimum": 0
12324
+ },
12325
+ "ready": {
12326
+ "description": "`true` readies the unit even while an effect forbids readying.",
12327
+ "type": [
12328
+ "boolean",
12329
+ "null"
12330
+ ]
12331
+ },
12332
+ "shieldTokens": {
12333
+ "type": [
12334
+ "integer",
12335
+ "null"
12336
+ ],
12337
+ "format": "uint8",
12338
+ "maximum": 255,
12339
+ "minimum": 0
12340
+ },
12341
+ "type": {
12342
+ "type": "string",
12343
+ "const": "unit"
12344
+ },
12345
+ "unitId": {
12346
+ "type": "integer",
12347
+ "format": "uint64",
12348
+ "minimum": 0
11578
12349
  }
11579
12350
  },
11580
- "additionalProperties": false,
11581
12351
  "required": [
11582
- "RelativeToRememberedPlayer"
12352
+ "type",
12353
+ "unitId"
11583
12354
  ]
11584
12355
  },
11585
12356
  {
11586
- "description": "Controller of the lower printed-cost Unit in a remembered pair.",
11587
- "type": "string",
11588
- "const": "ControllerOfLowerCostRememberedUnit"
12357
+ "description": "Sets exact base damage; a base carries no other editable state.",
12358
+ "type": "object",
12359
+ "properties": {
12360
+ "damage": {
12361
+ "type": "integer",
12362
+ "format": "int16",
12363
+ "maximum": 32767,
12364
+ "minimum": -32768
12365
+ },
12366
+ "seat": {
12367
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/Seat"
12368
+ },
12369
+ "type": {
12370
+ "type": "string",
12371
+ "const": "base"
12372
+ }
12373
+ },
12374
+ "required": [
12375
+ "type",
12376
+ "seat",
12377
+ "damage"
12378
+ ]
11589
12379
  }
11590
12380
  ]
11591
12381
  },
11592
12382
  "PlaygroundCommand": {
11593
12383
  "description": "Host-authorized raw scenario mutation for a Playground match.",
11594
12384
  "oneOf": [
12385
+ {
12386
+ "description": "Adds a fresh, ready physical card to a player's resource row.",
12387
+ "type": "object",
12388
+ "properties": {
12389
+ "cardId": {
12390
+ "type": "integer",
12391
+ "format": "uint32",
12392
+ "minimum": 0
12393
+ },
12394
+ "seat": {
12395
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/Seat"
12396
+ },
12397
+ "type": {
12398
+ "type": "string",
12399
+ "const": "addResource"
12400
+ }
12401
+ },
12402
+ "required": [
12403
+ "type",
12404
+ "seat",
12405
+ "cardId"
12406
+ ]
12407
+ },
11595
12408
  {
11596
12409
  "type": "object",
11597
12410
  "properties": {
@@ -11678,6 +12491,53 @@ export const sdkSchemaCommon = {
11678
12491
  "cardId"
11679
12492
  ]
11680
12493
  },
12494
+ {
12495
+ "description": "Resolves an action ability without its normal activation gates or costs.",
12496
+ "type": "object",
12497
+ "properties": {
12498
+ "modeIndices": {
12499
+ "type": "array",
12500
+ "items": {
12501
+ "type": "integer",
12502
+ "format": "uint",
12503
+ "minimum": 0
12504
+ }
12505
+ },
12506
+ "seat": {
12507
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/Seat"
12508
+ },
12509
+ "source": {
12510
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/ActionAbilitySource"
12511
+ },
12512
+ "target": {
12513
+ "anyOf": [
12514
+ {
12515
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/AbilityTarget"
12516
+ },
12517
+ {
12518
+ "type": "null"
12519
+ }
12520
+ ]
12521
+ },
12522
+ "targets": {
12523
+ "type": "array",
12524
+ "items": {
12525
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/AbilityTarget"
12526
+ }
12527
+ },
12528
+ "type": {
12529
+ "type": "string",
12530
+ "const": "executeActionAbility"
12531
+ }
12532
+ },
12533
+ "required": [
12534
+ "type",
12535
+ "seat",
12536
+ "source",
12537
+ "targets",
12538
+ "modeIndices"
12539
+ ]
12540
+ },
11681
12541
  {
11682
12542
  "type": "object",
11683
12543
  "properties": {
@@ -11701,6 +12561,23 @@ export const sdkSchemaCommon = {
11701
12561
  "amount"
11702
12562
  ]
11703
12563
  },
12564
+ {
12565
+ "description": "Sets several editable fields of one in-play card in a single atomic edit.",
12566
+ "type": "object",
12567
+ "properties": {
12568
+ "change": {
12569
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/PlaygroundCardStateChange"
12570
+ },
12571
+ "type": {
12572
+ "type": "string",
12573
+ "const": "changeCardState"
12574
+ }
12575
+ },
12576
+ "required": [
12577
+ "type",
12578
+ "change"
12579
+ ]
12580
+ },
11704
12581
  {
11705
12582
  "type": "object",
11706
12583
  "properties": {
@@ -11744,10 +12621,60 @@ export const sdkSchemaCommon = {
11744
12621
  "cardId",
11745
12622
  "captorUnitId"
11746
12623
  ]
11747
- }
11748
- ]
11749
- },
11750
- "PlaygroundDamageTarget": {
12624
+ },
12625
+ {
12626
+ "type": "object",
12627
+ "properties": {
12628
+ "cardId": {
12629
+ "type": "integer",
12630
+ "format": "uint32",
12631
+ "minimum": 0
12632
+ },
12633
+ "leaderIndex": {
12634
+ "type": "integer",
12635
+ "format": "uint",
12636
+ "minimum": 0
12637
+ },
12638
+ "seat": {
12639
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/Seat"
12640
+ },
12641
+ "type": {
12642
+ "type": "string",
12643
+ "const": "swapLeader"
12644
+ }
12645
+ },
12646
+ "required": [
12647
+ "type",
12648
+ "seat",
12649
+ "leaderIndex",
12650
+ "cardId"
12651
+ ]
12652
+ },
12653
+ {
12654
+ "type": "object",
12655
+ "properties": {
12656
+ "cardId": {
12657
+ "type": "integer",
12658
+ "format": "uint32",
12659
+ "minimum": 0
12660
+ },
12661
+ "seat": {
12662
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/Seat"
12663
+ },
12664
+ "type": {
12665
+ "type": "string",
12666
+ "const": "swapBase"
12667
+ }
12668
+ },
12669
+ "required": [
12670
+ "type",
12671
+ "seat",
12672
+ "cardId"
12673
+ ]
12674
+ }
12675
+ ]
12676
+ },
12677
+ "PlaygroundDamageTarget": {
11751
12678
  "description": "One board target whose damage counter Playground may set exactly.",
11752
12679
  "oneOf": [
11753
12680
  {
@@ -11827,14 +12754,6 @@ export const sdkSchemaCommon = {
11827
12754
  }
11828
12755
  ]
11829
12756
  },
11830
- "PresenceFilter": {
11831
- "type": "string",
11832
- "enum": [
11833
- "Any",
11834
- "Required",
11835
- "Forbidden"
11836
- ]
11837
- },
11838
12757
  "PromptProvenanceView": {
11839
12758
  "description": "Stable parent/stage identity shared by every prompt opened during an effect.",
11840
12759
  "type": "object",
@@ -12689,6 +13608,7 @@ export const sdkSchemaCommon = {
12689
13608
  ]
12690
13609
  },
12691
13610
  "RelationFilter": {
13611
+ "description": "Restricts a target by controller relation to the effect source.",
12692
13612
  "type": "string",
12693
13613
  "enum": [
12694
13614
  "Any",
@@ -12799,14 +13719,6 @@ export const sdkSchemaCommon = {
12799
13719
  "four"
12800
13720
  ]
12801
13721
  },
12802
- "SeatDirection": {
12803
- "description": "Relative multiplayer seat direction.",
12804
- "type": "string",
12805
- "enum": [
12806
- "Left",
12807
- "Right"
12808
- ]
12809
- },
12810
13722
  "SeatOfferIntent": {
12811
13723
  "description": "Per-seat stance on a two-sided post-game offer.\n\nBoth post-game offers (extending a finished single game into a series, and\nstarting a rematch) need the same three-state answer from every seat, and a\nseat that answers twice must overwrite its previous answer rather than\nstack a second one — hence one shared enum instead of a pair of booleans.",
12812
13724
  "oneOf": [
@@ -13061,21 +13973,6 @@ export const sdkSchemaCommon = {
13061
13973
  "mulliganTaken"
13062
13974
  ]
13063
13975
  },
13064
- "SelectionScope": {
13065
- "description": "How far back an `exclude_previously_selected` filter looks.",
13066
- "oneOf": [
13067
- {
13068
- "description": "Every selection recorded since the resolving effect began.\n\nThis is what printed \"another\" / \"a third\" mean: the choices are\ndistinct across the whole ability, not merely against the last one.",
13069
- "type": "string",
13070
- "const": "ThisEffect"
13071
- },
13072
- {
13073
- "description": "Only the selections recorded by the clause currently resolving.\n\nA later clause of the same effect starts a new clause id, so its choices\nmay legally repeat a target an earlier clause used.",
13074
- "type": "string",
13075
- "const": "ThisClause"
13076
- }
13077
- ]
13078
- },
13079
13976
  "SeriesEndReason": {
13080
13977
  "description": "Public reason a match series ended.",
13081
13978
  "oneOf": [
@@ -13186,245 +14083,156 @@ export const sdkSchemaCommon = {
13186
14083
  "available"
13187
14084
  ]
13188
14085
  },
13189
- "SimulatorReportResponse": {
13190
- "description": "Full sanitized support bundle returned only by the simulator admin API.",
13191
- "type": "object",
13192
- "properties": {
13193
- "bundle": true,
13194
- "bundleAvailable": {
13195
- "type": "boolean"
13196
- },
13197
- "failureKind": {
13198
- "type": "string"
13199
- },
13200
- "firstOccurredAtMs": {
13201
- "type": "integer",
13202
- "format": "uint64",
13203
- "minimum": 0
13204
- },
13205
- "matchId": {
13206
- "type": "string",
13207
- "format": "uuid"
13208
- },
13209
- "message": {
13210
- "type": "string"
14086
+ "SimulatorMessage": {
14087
+ "description": "Typed engine-origin simulator copy with a stable SDK message id.",
14088
+ "oneOf": [
14089
+ {
14090
+ "type": "object",
14091
+ "properties": {
14092
+ "kind": {
14093
+ "type": "string",
14094
+ "const": "abilityUnavailable"
14095
+ }
14096
+ },
14097
+ "required": [
14098
+ "kind"
14099
+ ]
13211
14100
  },
13212
- "occurredAtMs": {
13213
- "type": "integer",
13214
- "format": "uint64",
13215
- "minimum": 0
14101
+ {
14102
+ "type": "object",
14103
+ "properties": {
14104
+ "kind": {
14105
+ "type": "string",
14106
+ "const": "action.exhaust"
14107
+ }
14108
+ },
14109
+ "required": [
14110
+ "kind"
14111
+ ]
13216
14112
  },
13217
- "occurrenceCount": {
13218
- "type": "integer",
13219
- "format": "uint32",
13220
- "minimum": 0
14113
+ {
14114
+ "type": "object",
14115
+ "properties": {
14116
+ "count": {
14117
+ "type": "integer",
14118
+ "format": "int64",
14119
+ "maximum": 9007199254740991,
14120
+ "minimum": -9007199254740991
14121
+ },
14122
+ "kind": {
14123
+ "type": "string",
14124
+ "const": "amount.resources"
14125
+ }
14126
+ },
14127
+ "required": [
14128
+ "kind",
14129
+ "count"
14130
+ ]
13221
14131
  },
13222
- "operation": {
13223
- "type": "string"
14132
+ {
14133
+ "type": "object",
14134
+ "properties": {
14135
+ "kind": {
14136
+ "type": "string",
14137
+ "const": "choice.none"
14138
+ }
14139
+ },
14140
+ "required": [
14141
+ "kind"
14142
+ ]
13224
14143
  },
13225
- "reportId": {
13226
- "type": "string",
13227
- "format": "uuid"
14144
+ {
14145
+ "type": "object",
14146
+ "properties": {
14147
+ "kind": {
14148
+ "type": "string",
14149
+ "const": "chooseTarget"
14150
+ }
14151
+ },
14152
+ "required": [
14153
+ "kind"
14154
+ ]
13228
14155
  },
13229
- "seat": {
13230
- "anyOf": [
13231
- {
13232
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/Seat"
14156
+ {
14157
+ "type": "object",
14158
+ "properties": {
14159
+ "kind": {
14160
+ "type": "string",
14161
+ "const": "chooseTargets"
13233
14162
  },
13234
- {
13235
- "type": "null"
14163
+ "max": {
14164
+ "type": "integer",
14165
+ "format": "int64",
14166
+ "maximum": 9007199254740991,
14167
+ "minimum": -9007199254740991
14168
+ },
14169
+ "min": {
14170
+ "type": "integer",
14171
+ "format": "int64",
14172
+ "maximum": 9007199254740991,
14173
+ "minimum": -9007199254740991
13236
14174
  }
14175
+ },
14176
+ "required": [
14177
+ "kind",
14178
+ "min",
14179
+ "max"
13237
14180
  ]
13238
14181
  },
13239
- "snapshotRevision": {
13240
- "type": [
13241
- "integer",
13242
- "null"
13243
- ],
13244
- "format": "uint64",
13245
- "minimum": 0
13246
- },
13247
- "source": {
13248
- "type": "string"
13249
- }
13250
- },
13251
- "required": [
13252
- "reportId",
13253
- "firstOccurredAtMs",
13254
- "occurredAtMs",
13255
- "occurrenceCount",
13256
- "matchId",
13257
- "source",
13258
- "operation",
13259
- "failureKind",
13260
- "bundleAvailable",
13261
- "message"
13262
- ]
13263
- },
13264
- "SimulatorReportSummary": {
13265
- "description": "Metadata safe to return in administrator report lists.",
13266
- "type": "object",
13267
- "properties": {
13268
- "bundleAvailable": {
13269
- "type": "boolean"
14182
+ {
14183
+ "type": "object",
14184
+ "properties": {
14185
+ "kind": {
14186
+ "type": "string",
14187
+ "const": "controls.cancel"
14188
+ }
14189
+ },
14190
+ "required": [
14191
+ "kind"
14192
+ ]
13270
14193
  },
13271
- "failureKind": {
13272
- "type": "string"
14194
+ {
14195
+ "type": "object",
14196
+ "properties": {
14197
+ "kind": {
14198
+ "type": "string",
14199
+ "const": "controls.confirm"
14200
+ }
14201
+ },
14202
+ "required": [
14203
+ "kind"
14204
+ ]
13273
14205
  },
13274
- "firstOccurredAtMs": {
13275
- "type": "integer",
13276
- "format": "uint64",
13277
- "minimum": 0
14206
+ {
14207
+ "type": "object",
14208
+ "properties": {
14209
+ "kind": {
14210
+ "type": "string",
14211
+ "const": "controls.decline"
14212
+ }
14213
+ },
14214
+ "required": [
14215
+ "kind"
14216
+ ]
13278
14217
  },
13279
- "matchId": {
13280
- "type": "string",
13281
- "format": "uuid"
14218
+ {
14219
+ "type": "object",
14220
+ "properties": {
14221
+ "kind": {
14222
+ "type": "string",
14223
+ "const": "controls.done"
14224
+ }
14225
+ },
14226
+ "required": [
14227
+ "kind"
14228
+ ]
13282
14229
  },
13283
- "occurredAtMs": {
13284
- "type": "integer",
13285
- "format": "uint64",
13286
- "minimum": 0
13287
- },
13288
- "occurrenceCount": {
13289
- "type": "integer",
13290
- "format": "uint32",
13291
- "minimum": 0
13292
- },
13293
- "operation": {
13294
- "type": "string"
13295
- },
13296
- "reportId": {
13297
- "type": "string",
13298
- "format": "uuid"
13299
- },
13300
- "seat": {
13301
- "anyOf": [
13302
- {
13303
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/Seat"
13304
- },
13305
- {
13306
- "type": "null"
13307
- }
13308
- ]
13309
- },
13310
- "snapshotRevision": {
13311
- "type": [
13312
- "integer",
13313
- "null"
13314
- ],
13315
- "format": "uint64",
13316
- "minimum": 0
13317
- },
13318
- "source": {
13319
- "type": "string"
13320
- }
13321
- },
13322
- "required": [
13323
- "reportId",
13324
- "firstOccurredAtMs",
13325
- "occurredAtMs",
13326
- "occurrenceCount",
13327
- "matchId",
13328
- "source",
13329
- "operation",
13330
- "failureKind",
13331
- "bundleAvailable"
13332
- ]
13333
- },
13334
- "SimulatorRuntimeStats": {
13335
- "description": "Admin-visible operational counters for the simulator engine.",
13336
- "type": "object",
13337
- "properties": {
13338
- "activeLimitedEvents": {
13339
- "description": "Limited Event records still retained by the limited runtime.",
13340
- "type": "integer",
13341
- "format": "uint64",
13342
- "minimum": 0
13343
- },
13344
- "activeMatches": {
13345
- "description": "Live sessions that have not completed their series.",
13346
- "type": "integer",
13347
- "format": "uint64",
13348
- "minimum": 0
13349
- },
13350
- "retainedFinishedMatches": {
13351
- "description": "Completed sessions still retained until cleanup.",
13352
- "type": "integer",
13353
- "format": "uint64",
13354
- "minimum": 0
13355
- },
13356
- "tournamentRooms": {
13357
- "description": "Tournament room records still retained by the tournament runtime.",
13358
- "type": "integer",
13359
- "format": "uint64",
13360
- "minimum": 0
13361
- },
13362
- "waitingLobbies": {
13363
- "description": "Waiting or started lobby records still retained by the lobby runtime.",
13364
- "type": "integer",
13365
- "format": "uint64",
13366
- "minimum": 0
13367
- }
13368
- },
13369
- "required": [
13370
- "activeMatches",
13371
- "retainedFinishedMatches",
13372
- "waitingLobbies",
13373
- "activeLimitedEvents",
13374
- "tournamentRooms"
13375
- ]
13376
- },
13377
- "SmuggleActionView": {
13378
- "type": "object",
13379
- "properties": {
13380
- "kind": {
13381
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/SmuggleKind"
13382
- },
13383
- "resourceCost": {
13384
- "type": "integer",
13385
- "format": "uint",
13386
- "minimum": 0
13387
- },
13388
- "validCostTargets": {
13389
- "type": "array",
13390
- "items": {
13391
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/AbilityTarget"
13392
- }
13393
- }
13394
- },
13395
- "required": [
13396
- "kind",
13397
- "resourceCost",
13398
- "validCostTargets"
13399
- ]
13400
- },
13401
- "SmuggleKind": {
13402
- "description": "Distinguishes printed-Smuggle keyword usage from runtime-granted\nSmuggle (via card hooks). Stored in the parsed effect AST so the\nresolver can dispatch the correct play path.",
13403
- "type": "string",
13404
- "enum": [
13405
- "printed",
13406
- "granted"
13407
- ]
13408
- },
13409
- "TargetGroupPurpose": {
13410
- "description": "Structural, localization-friendly description of *what a target-selection\ngroup is for*.\n\nThe engine builds target groups positionally from typed effect variants. The\n`purpose` carries the rules-meaning of each group so a UI can render a\nlocalized per-clause label (e.g. \"Choose a unit to deal 2 damage to\") without\nregex-parsing printed card text.\n\nOne variant exists for each meaningful targeting action a triggered effect\ncan request. Useful structural parameters are carried where they are known at\ngroup-construction time (e.g. the fixed damage `amount`). Dynamic amounts\n(e.g. \"damage equal to this unit's power\") carry `None`. [`Self::Other`] is\nreserved for genuinely unclassifiable targeting and is intentionally rare.",
13411
- "oneOf": [
13412
14230
  {
13413
- "description": "Deal damage to the selected target(s). `amount` is the fixed damage when\nstatically known, `None` for dynamic/derived amounts.",
13414
14231
  "type": "object",
13415
14232
  "properties": {
13416
- "amount": {
13417
- "type": [
13418
- "integer",
13419
- "null"
13420
- ],
13421
- "format": "int16",
13422
- "maximum": 32767,
13423
- "minimum": -32768
13424
- },
13425
14233
  "kind": {
13426
14234
  "type": "string",
13427
- "const": "dealDamage"
14235
+ "const": "duration.phase"
13428
14236
  }
13429
14237
  },
13430
14238
  "required": [
@@ -13432,56 +14240,46 @@ export const sdkSchemaCommon = {
13432
14240
  ]
13433
14241
  },
13434
14242
  {
13435
- "description": "Heal damage from the selected unit(s) or base(s).",
13436
14243
  "type": "object",
13437
14244
  "properties": {
13438
- "amount": {
13439
- "type": [
13440
- "integer",
13441
- "null"
13442
- ],
13443
- "format": "int16",
13444
- "maximum": 32767,
13445
- "minimum": -32768
14245
+ "count": {
14246
+ "type": "integer",
14247
+ "format": "int64",
14248
+ "maximum": 9007199254740991,
14249
+ "minimum": -9007199254740991
13446
14250
  },
13447
14251
  "kind": {
13448
14252
  "type": "string",
13449
- "const": "heal"
14253
+ "const": "duration.rounds"
13450
14254
  }
13451
14255
  },
13452
14256
  "required": [
13453
- "kind"
14257
+ "kind",
14258
+ "count"
13454
14259
  ]
13455
14260
  },
13456
14261
  {
13457
- "description": "Give Shield token(s) to the selected unit(s).",
13458
14262
  "type": "object",
13459
14263
  "properties": {
13460
- "amount": {
13461
- "type": [
13462
- "integer",
13463
- "null"
13464
- ],
13465
- "format": "uint8",
13466
- "maximum": 255,
13467
- "minimum": 0
14264
+ "keyword": {
14265
+ "type": "string"
13468
14266
  },
13469
14267
  "kind": {
13470
14268
  "type": "string",
13471
- "const": "giveShield"
14269
+ "const": "keyword.name"
13472
14270
  }
13473
14271
  },
13474
14272
  "required": [
13475
- "kind"
14273
+ "kind",
14274
+ "keyword"
13476
14275
  ]
13477
14276
  },
13478
14277
  {
13479
- "description": "Remove Shield token(s) from the selected unit(s).",
13480
14278
  "type": "object",
13481
14279
  "properties": {
13482
14280
  "kind": {
13483
14281
  "type": "string",
13484
- "const": "removeShield"
14282
+ "const": "keyword.overwhelm"
13485
14283
  }
13486
14284
  },
13487
14285
  "required": [
@@ -13489,21 +14287,11 @@ export const sdkSchemaCommon = {
13489
14287
  ]
13490
14288
  },
13491
14289
  {
13492
- "description": "Give Experience token(s) to the selected unit(s).",
13493
14290
  "type": "object",
13494
14291
  "properties": {
13495
- "count": {
13496
- "type": [
13497
- "integer",
13498
- "null"
13499
- ],
13500
- "format": "uint8",
13501
- "maximum": 255,
13502
- "minimum": 0
13503
- },
13504
14292
  "kind": {
13505
14293
  "type": "string",
13506
- "const": "giveExperience"
14294
+ "const": "keyword.raid"
13507
14295
  }
13508
14296
  },
13509
14297
  "required": [
@@ -13511,12 +14299,11 @@ export const sdkSchemaCommon = {
13511
14299
  ]
13512
14300
  },
13513
14301
  {
13514
- "description": "Move an Experience token from one unit to another: the first group picks\nthe unit losing the token, the second group picks the unit receiving it.",
13515
14302
  "type": "object",
13516
14303
  "properties": {
13517
14304
  "kind": {
13518
14305
  "type": "string",
13519
- "const": "moveExperience"
14306
+ "const": "keyword.sentinel"
13520
14307
  }
13521
14308
  },
13522
14309
  "required": [
@@ -13524,56 +14311,27 @@ export const sdkSchemaCommon = {
13524
14311
  ]
13525
14312
  },
13526
14313
  {
13527
- "description": "Give Advantage token(s) to the selected unit(s).",
13528
14314
  "type": "object",
13529
14315
  "properties": {
13530
- "count": {
13531
- "type": [
13532
- "integer",
13533
- "null"
13534
- ],
13535
- "format": "uint8",
13536
- "maximum": 255,
13537
- "minimum": 0
13538
- },
13539
14316
  "kind": {
13540
14317
  "type": "string",
13541
- "const": "giveAdvantage"
13542
- }
13543
- },
13544
- "required": [
13545
- "kind"
13546
- ]
13547
- },
13548
- {
13549
- "description": "Create token(s) for the selected player. `count` is `None` when the\namount is dynamic (for example per match count or remembered unit cost).",
13550
- "type": "object",
13551
- "properties": {
13552
- "count": {
13553
- "type": [
13554
- "integer",
13555
- "null"
13556
- ],
13557
- "format": "uint8",
13558
- "maximum": 255,
13559
- "minimum": 0
14318
+ "const": "legacyText"
13560
14319
  },
13561
- "kind": {
13562
- "type": "string",
13563
- "const": "createToken"
14320
+ "text": {
14321
+ "type": "string"
13564
14322
  }
13565
14323
  },
13566
14324
  "required": [
13567
- "kind"
14325
+ "kind",
14326
+ "text"
13568
14327
  ]
13569
14328
  },
13570
14329
  {
13571
- "description": "Modify the selected unit(s)' power/HP (buff or debuff).",
13572
14330
  "type": "object",
13573
14331
  "properties": {
13574
14332
  "kind": {
13575
14333
  "type": "string",
13576
- "const": "modifyStats"
14334
+ "const": "targetPurpose.attachUpgrade"
13577
14335
  }
13578
14336
  },
13579
14337
  "required": [
@@ -13581,12 +14339,11 @@ export const sdkSchemaCommon = {
13581
14339
  ]
13582
14340
  },
13583
14341
  {
13584
- "description": "Defeat the selected unit(s).",
13585
14342
  "type": "object",
13586
14343
  "properties": {
13587
14344
  "kind": {
13588
14345
  "type": "string",
13589
- "const": "defeat"
14346
+ "const": "targetPurpose.chooseTarget"
13590
14347
  }
13591
14348
  },
13592
14349
  "required": [
@@ -13594,77 +14351,315 @@ export const sdkSchemaCommon = {
13594
14351
  ]
13595
14352
  },
13596
14353
  {
13597
- "description": "Defeat the selected upgrade(s).",
13598
14354
  "type": "object",
13599
14355
  "properties": {
14356
+ "amount": {
14357
+ "type": "integer",
14358
+ "format": "int64",
14359
+ "maximum": 9007199254740991,
14360
+ "minimum": -9007199254740991
14361
+ },
13600
14362
  "kind": {
13601
14363
  "type": "string",
13602
- "const": "defeatUpgrade"
14364
+ "const": "targetPurpose.dealDamage"
13603
14365
  }
13604
14366
  },
13605
14367
  "required": [
13606
- "kind"
14368
+ "kind",
14369
+ "amount"
13607
14370
  ]
13608
14371
  },
13609
14372
  {
13610
- "description": "Capture the selected unit(s).",
13611
14373
  "type": "object",
13612
14374
  "properties": {
14375
+ "amount": {
14376
+ "type": "integer",
14377
+ "format": "int64",
14378
+ "maximum": 9007199254740991,
14379
+ "minimum": -9007199254740991
14380
+ },
13613
14381
  "kind": {
13614
14382
  "type": "string",
13615
- "const": "capture"
14383
+ "const": "targetPurpose.giveShield"
13616
14384
  }
13617
14385
  },
13618
14386
  "required": [
13619
- "kind"
14387
+ "kind",
14388
+ "amount"
13620
14389
  ]
13621
14390
  },
13622
14391
  {
13623
- "description": "Rescue the selected captured card into play under its owner.",
13624
14392
  "type": "object",
13625
14393
  "properties": {
14394
+ "amount": {
14395
+ "type": "integer",
14396
+ "format": "int64",
14397
+ "maximum": 9007199254740991,
14398
+ "minimum": -9007199254740991
14399
+ },
13626
14400
  "kind": {
13627
14401
  "type": "string",
13628
- "const": "rescueCaptured"
14402
+ "const": "targetPurpose.heal"
13629
14403
  }
13630
14404
  },
13631
14405
  "required": [
13632
- "kind"
14406
+ "kind",
14407
+ "amount"
13633
14408
  ]
13634
14409
  },
13635
14410
  {
13636
- "description": "Discard the selected captured card.",
13637
14411
  "type": "object",
13638
14412
  "properties": {
13639
14413
  "kind": {
13640
14414
  "type": "string",
13641
- "const": "discardCaptured"
14415
+ "const": "timing.onceEachRound"
13642
14416
  }
13643
14417
  },
13644
14418
  "required": [
13645
14419
  "kind"
13646
14420
  ]
13647
- },
13648
- {
13649
- "description": "Play the selected captured card.",
13650
- "type": "object",
13651
- "properties": {
13652
- "kind": {
13653
- "type": "string",
13654
- "const": "playCaptured"
14421
+ }
14422
+ ]
14423
+ },
14424
+ "SimulatorReportResponse": {
14425
+ "description": "Full sanitized support bundle returned only by the simulator admin API.",
14426
+ "type": "object",
14427
+ "properties": {
14428
+ "bundle": true,
14429
+ "bundleAvailable": {
14430
+ "type": "boolean"
14431
+ },
14432
+ "failureKind": {
14433
+ "type": "string"
14434
+ },
14435
+ "firstOccurredAtMs": {
14436
+ "type": "integer",
14437
+ "format": "uint64",
14438
+ "minimum": 0
14439
+ },
14440
+ "matchId": {
14441
+ "type": "string",
14442
+ "format": "uuid"
14443
+ },
14444
+ "message": {
14445
+ "type": "string"
14446
+ },
14447
+ "occurredAtMs": {
14448
+ "type": "integer",
14449
+ "format": "uint64",
14450
+ "minimum": 0
14451
+ },
14452
+ "occurrenceCount": {
14453
+ "type": "integer",
14454
+ "format": "uint32",
14455
+ "minimum": 0
14456
+ },
14457
+ "operation": {
14458
+ "type": "string"
14459
+ },
14460
+ "reportId": {
14461
+ "type": "string",
14462
+ "format": "uuid"
14463
+ },
14464
+ "seat": {
14465
+ "anyOf": [
14466
+ {
14467
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/Seat"
14468
+ },
14469
+ {
14470
+ "type": "null"
14471
+ }
14472
+ ]
14473
+ },
14474
+ "snapshotRevision": {
14475
+ "type": [
14476
+ "integer",
14477
+ "null"
14478
+ ],
14479
+ "format": "uint64",
14480
+ "minimum": 0
14481
+ },
14482
+ "source": {
14483
+ "type": "string"
14484
+ }
14485
+ },
14486
+ "required": [
14487
+ "reportId",
14488
+ "firstOccurredAtMs",
14489
+ "occurredAtMs",
14490
+ "occurrenceCount",
14491
+ "matchId",
14492
+ "source",
14493
+ "operation",
14494
+ "failureKind",
14495
+ "bundleAvailable",
14496
+ "message"
14497
+ ]
14498
+ },
14499
+ "SimulatorReportSummary": {
14500
+ "description": "Metadata safe to return in administrator report lists.",
14501
+ "type": "object",
14502
+ "properties": {
14503
+ "bundleAvailable": {
14504
+ "type": "boolean"
14505
+ },
14506
+ "failureKind": {
14507
+ "type": "string"
14508
+ },
14509
+ "firstOccurredAtMs": {
14510
+ "type": "integer",
14511
+ "format": "uint64",
14512
+ "minimum": 0
14513
+ },
14514
+ "matchId": {
14515
+ "type": "string",
14516
+ "format": "uuid"
14517
+ },
14518
+ "occurredAtMs": {
14519
+ "type": "integer",
14520
+ "format": "uint64",
14521
+ "minimum": 0
14522
+ },
14523
+ "occurrenceCount": {
14524
+ "type": "integer",
14525
+ "format": "uint32",
14526
+ "minimum": 0
14527
+ },
14528
+ "operation": {
14529
+ "type": "string"
14530
+ },
14531
+ "reportId": {
14532
+ "type": "string",
14533
+ "format": "uuid"
14534
+ },
14535
+ "seat": {
14536
+ "anyOf": [
14537
+ {
14538
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/Seat"
14539
+ },
14540
+ {
14541
+ "type": "null"
13655
14542
  }
13656
- },
13657
- "required": [
13658
- "kind"
13659
14543
  ]
13660
14544
  },
14545
+ "snapshotRevision": {
14546
+ "type": [
14547
+ "integer",
14548
+ "null"
14549
+ ],
14550
+ "format": "uint64",
14551
+ "minimum": 0
14552
+ },
14553
+ "source": {
14554
+ "type": "string"
14555
+ }
14556
+ },
14557
+ "required": [
14558
+ "reportId",
14559
+ "firstOccurredAtMs",
14560
+ "occurredAtMs",
14561
+ "occurrenceCount",
14562
+ "matchId",
14563
+ "source",
14564
+ "operation",
14565
+ "failureKind",
14566
+ "bundleAvailable"
14567
+ ]
14568
+ },
14569
+ "SimulatorRuntimeStats": {
14570
+ "description": "Admin-visible operational counters for the simulator engine.",
14571
+ "type": "object",
14572
+ "properties": {
14573
+ "activeLimitedEvents": {
14574
+ "description": "Limited Event records still retained by the limited runtime.",
14575
+ "type": "integer",
14576
+ "format": "uint64",
14577
+ "minimum": 0
14578
+ },
14579
+ "activeMatches": {
14580
+ "description": "Live sessions that have not completed their series.",
14581
+ "type": "integer",
14582
+ "format": "uint64",
14583
+ "minimum": 0
14584
+ },
14585
+ "retainedFinishedMatches": {
14586
+ "description": "Completed sessions still retained until cleanup.",
14587
+ "type": "integer",
14588
+ "format": "uint64",
14589
+ "minimum": 0
14590
+ },
14591
+ "tournamentRooms": {
14592
+ "description": "Tournament room records still retained by the tournament runtime.",
14593
+ "type": "integer",
14594
+ "format": "uint64",
14595
+ "minimum": 0
14596
+ },
14597
+ "waitingLobbies": {
14598
+ "description": "Waiting or started lobby records still retained by the lobby runtime.",
14599
+ "type": "integer",
14600
+ "format": "uint64",
14601
+ "minimum": 0
14602
+ }
14603
+ },
14604
+ "required": [
14605
+ "activeMatches",
14606
+ "retainedFinishedMatches",
14607
+ "waitingLobbies",
14608
+ "activeLimitedEvents",
14609
+ "tournamentRooms"
14610
+ ]
14611
+ },
14612
+ "SmuggleActionView": {
14613
+ "type": "object",
14614
+ "properties": {
14615
+ "kind": {
14616
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/SmuggleKind"
14617
+ },
14618
+ "resourceCost": {
14619
+ "type": "integer",
14620
+ "format": "uint",
14621
+ "minimum": 0
14622
+ },
14623
+ "validCostTargets": {
14624
+ "type": "array",
14625
+ "items": {
14626
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/AbilityTarget"
14627
+ }
14628
+ }
14629
+ },
14630
+ "required": [
14631
+ "kind",
14632
+ "resourceCost",
14633
+ "validCostTargets"
14634
+ ]
14635
+ },
14636
+ "SmuggleKind": {
14637
+ "description": "Distinguishes printed-Smuggle keyword usage from runtime-granted\nSmuggle (via card hooks). Stored in the parsed effect AST so the\nresolver can dispatch the correct play path.",
14638
+ "type": "string",
14639
+ "enum": [
14640
+ "printed",
14641
+ "granted"
14642
+ ]
14643
+ },
14644
+ "TargetGroupPurpose": {
14645
+ "description": "Structural, localization-friendly description of *what a target-selection\ngroup is for*.\n\nThe engine builds target groups positionally from typed effect variants. The\n`purpose` carries the rules-meaning of each group so a UI can render a\nlocalized per-clause label (e.g. \"Choose a unit to deal 2 damage to\") without\nregex-parsing printed card text.\n\nOne variant exists for each meaningful targeting action a triggered effect\ncan request. Useful structural parameters are carried where they are known at\ngroup-construction time (e.g. the fixed damage `amount`). Dynamic amounts\n(e.g. \"damage equal to this unit's power\") carry `None`. [`Self::Other`] is\nreserved for genuinely unclassifiable targeting and is intentionally rare.",
14646
+ "oneOf": [
13661
14647
  {
13662
- "description": "Return the selected card/unit to its owner's hand.",
14648
+ "description": "Deal damage to the selected target(s). `amount` is the fixed damage when\nstatically known, `None` for dynamic/derived amounts.",
13663
14649
  "type": "object",
13664
14650
  "properties": {
14651
+ "amount": {
14652
+ "type": [
14653
+ "integer",
14654
+ "null"
14655
+ ],
14656
+ "format": "int16",
14657
+ "maximum": 32767,
14658
+ "minimum": -32768
14659
+ },
13665
14660
  "kind": {
13666
14661
  "type": "string",
13667
- "const": "returnToHand"
14662
+ "const": "dealDamage"
13668
14663
  }
13669
14664
  },
13670
14665
  "required": [
@@ -13672,12 +14667,21 @@ export const sdkSchemaCommon = {
13672
14667
  ]
13673
14668
  },
13674
14669
  {
13675
- "description": "Return the selected upgrade to its owner's hand.",
14670
+ "description": "Heal damage from the selected unit(s) or base(s).",
13676
14671
  "type": "object",
13677
14672
  "properties": {
14673
+ "amount": {
14674
+ "type": [
14675
+ "integer",
14676
+ "null"
14677
+ ],
14678
+ "format": "int16",
14679
+ "maximum": 32767,
14680
+ "minimum": -32768
14681
+ },
13678
14682
  "kind": {
13679
14683
  "type": "string",
13680
- "const": "returnUpgradeToHand"
14684
+ "const": "heal"
13681
14685
  }
13682
14686
  },
13683
14687
  "required": [
@@ -13685,7 +14689,238 @@ export const sdkSchemaCommon = {
13685
14689
  ]
13686
14690
  },
13687
14691
  {
13688
- "description": "Return the selected card/unit to the top or bottom of its owner's deck.",
14692
+ "description": "Give Shield token(s) to the selected unit(s).",
14693
+ "type": "object",
14694
+ "properties": {
14695
+ "amount": {
14696
+ "type": [
14697
+ "integer",
14698
+ "null"
14699
+ ],
14700
+ "format": "uint8",
14701
+ "maximum": 255,
14702
+ "minimum": 0
14703
+ },
14704
+ "kind": {
14705
+ "type": "string",
14706
+ "const": "giveShield"
14707
+ }
14708
+ },
14709
+ "required": [
14710
+ "kind"
14711
+ ]
14712
+ },
14713
+ {
14714
+ "description": "Remove Shield token(s) from the selected unit(s).",
14715
+ "type": "object",
14716
+ "properties": {
14717
+ "kind": {
14718
+ "type": "string",
14719
+ "const": "removeShield"
14720
+ }
14721
+ },
14722
+ "required": [
14723
+ "kind"
14724
+ ]
14725
+ },
14726
+ {
14727
+ "description": "Give Experience token(s) to the selected unit(s).",
14728
+ "type": "object",
14729
+ "properties": {
14730
+ "count": {
14731
+ "type": [
14732
+ "integer",
14733
+ "null"
14734
+ ],
14735
+ "format": "uint8",
14736
+ "maximum": 255,
14737
+ "minimum": 0
14738
+ },
14739
+ "kind": {
14740
+ "type": "string",
14741
+ "const": "giveExperience"
14742
+ }
14743
+ },
14744
+ "required": [
14745
+ "kind"
14746
+ ]
14747
+ },
14748
+ {
14749
+ "description": "Move an Experience token from one unit to another: the first group picks\nthe unit losing the token, the second group picks the unit receiving it.",
14750
+ "type": "object",
14751
+ "properties": {
14752
+ "kind": {
14753
+ "type": "string",
14754
+ "const": "moveExperience"
14755
+ }
14756
+ },
14757
+ "required": [
14758
+ "kind"
14759
+ ]
14760
+ },
14761
+ {
14762
+ "description": "Give Advantage token(s) to the selected unit(s).",
14763
+ "type": "object",
14764
+ "properties": {
14765
+ "count": {
14766
+ "type": [
14767
+ "integer",
14768
+ "null"
14769
+ ],
14770
+ "format": "uint8",
14771
+ "maximum": 255,
14772
+ "minimum": 0
14773
+ },
14774
+ "kind": {
14775
+ "type": "string",
14776
+ "const": "giveAdvantage"
14777
+ }
14778
+ },
14779
+ "required": [
14780
+ "kind"
14781
+ ]
14782
+ },
14783
+ {
14784
+ "description": "Create token(s) for the selected player. `count` is `None` when the\namount is dynamic (for example per match count or remembered unit cost).",
14785
+ "type": "object",
14786
+ "properties": {
14787
+ "count": {
14788
+ "type": [
14789
+ "integer",
14790
+ "null"
14791
+ ],
14792
+ "format": "uint8",
14793
+ "maximum": 255,
14794
+ "minimum": 0
14795
+ },
14796
+ "kind": {
14797
+ "type": "string",
14798
+ "const": "createToken"
14799
+ }
14800
+ },
14801
+ "required": [
14802
+ "kind"
14803
+ ]
14804
+ },
14805
+ {
14806
+ "description": "Modify the selected unit(s)' power/HP (buff or debuff).",
14807
+ "type": "object",
14808
+ "properties": {
14809
+ "kind": {
14810
+ "type": "string",
14811
+ "const": "modifyStats"
14812
+ }
14813
+ },
14814
+ "required": [
14815
+ "kind"
14816
+ ]
14817
+ },
14818
+ {
14819
+ "description": "Defeat the selected unit(s).",
14820
+ "type": "object",
14821
+ "properties": {
14822
+ "kind": {
14823
+ "type": "string",
14824
+ "const": "defeat"
14825
+ }
14826
+ },
14827
+ "required": [
14828
+ "kind"
14829
+ ]
14830
+ },
14831
+ {
14832
+ "description": "Defeat the selected upgrade(s).",
14833
+ "type": "object",
14834
+ "properties": {
14835
+ "kind": {
14836
+ "type": "string",
14837
+ "const": "defeatUpgrade"
14838
+ }
14839
+ },
14840
+ "required": [
14841
+ "kind"
14842
+ ]
14843
+ },
14844
+ {
14845
+ "description": "Capture the selected unit(s).",
14846
+ "type": "object",
14847
+ "properties": {
14848
+ "kind": {
14849
+ "type": "string",
14850
+ "const": "capture"
14851
+ }
14852
+ },
14853
+ "required": [
14854
+ "kind"
14855
+ ]
14856
+ },
14857
+ {
14858
+ "description": "Rescue the selected captured card into play under its owner.",
14859
+ "type": "object",
14860
+ "properties": {
14861
+ "kind": {
14862
+ "type": "string",
14863
+ "const": "rescueCaptured"
14864
+ }
14865
+ },
14866
+ "required": [
14867
+ "kind"
14868
+ ]
14869
+ },
14870
+ {
14871
+ "description": "Discard the selected captured card.",
14872
+ "type": "object",
14873
+ "properties": {
14874
+ "kind": {
14875
+ "type": "string",
14876
+ "const": "discardCaptured"
14877
+ }
14878
+ },
14879
+ "required": [
14880
+ "kind"
14881
+ ]
14882
+ },
14883
+ {
14884
+ "description": "Play the selected captured card.",
14885
+ "type": "object",
14886
+ "properties": {
14887
+ "kind": {
14888
+ "type": "string",
14889
+ "const": "playCaptured"
14890
+ }
14891
+ },
14892
+ "required": [
14893
+ "kind"
14894
+ ]
14895
+ },
14896
+ {
14897
+ "description": "Return the selected card/unit to its owner's hand.",
14898
+ "type": "object",
14899
+ "properties": {
14900
+ "kind": {
14901
+ "type": "string",
14902
+ "const": "returnToHand"
14903
+ }
14904
+ },
14905
+ "required": [
14906
+ "kind"
14907
+ ]
14908
+ },
14909
+ {
14910
+ "description": "Return the selected upgrade to its owner's hand.",
14911
+ "type": "object",
14912
+ "properties": {
14913
+ "kind": {
14914
+ "type": "string",
14915
+ "const": "returnUpgradeToHand"
14916
+ }
14917
+ },
14918
+ "required": [
14919
+ "kind"
14920
+ ]
14921
+ },
14922
+ {
14923
+ "description": "Return the selected card/unit to the top or bottom of its owner's deck.",
13689
14924
  "type": "object",
13690
14925
  "properties": {
13691
14926
  "kind": {
@@ -14030,1094 +15265,542 @@ export const sdkSchemaCommon = {
14030
15265
  ]
14031
15266
  }
14032
15267
  ]
14033
- },
14034
- "TargetSelectionGroup": {
14035
- "type": "object",
14036
- "properties": {
14037
- "clauseId": {
14038
- "description": "Stable, per-ability identifier for the clause this group belongs to.\n\nFor multi-group abilities the engine assigns an ascending index (0-based)\nin group order. Single-group abilities leave this `None`.",
14039
- "type": [
14040
- "integer",
14041
- "null"
14042
- ],
14043
- "format": "uint32",
14044
- "minimum": 0
14045
- },
14046
- "distinct": {
14047
- "type": "boolean"
14048
- },
14049
- "max": {
14050
- "type": "integer",
14051
- "format": "uint8",
14052
- "maximum": 255,
14053
- "minimum": 0
14054
- },
14055
- "min": {
14056
- "type": "integer",
14057
- "format": "uint8",
14058
- "maximum": 255,
14059
- "minimum": 0
14060
- },
14061
- "purpose": {
14062
- "description": "Structural purpose of this individual target group, so the UI can render\na localized per-clause label instead of parsing printed card text.\n\nPopulated from the typed effect variant that produced the group. Single-\ngroup abilities also carry a purpose. `None` only when the producing\neffect requests targets but has no classifiable structural meaning.",
14063
- "anyOf": [
14064
- {
14065
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TargetGroupPurpose"
14066
- },
14067
- {
14068
- "type": "null"
14069
- }
14070
- ]
14071
- },
14072
- "validTargets": {
14073
- "type": "array",
14074
- "items": {
14075
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/AbilityTarget"
14076
- }
14077
- }
14078
- },
14079
- "required": [
14080
- "validTargets",
14081
- "min",
14082
- "max",
14083
- "distinct"
14084
- ]
14085
- },
14086
- "TargetSelectionPlanView": {
14087
- "description": "Public target-selection contract for one prompt or pending ability.\n\nThe engine keeps resolution-only bindings internally. Clients receive only\nthe ordered groups needed to render legal targets and submit selections.",
14088
- "type": "object",
14089
- "properties": {
14090
- "groups": {
14091
- "type": "array",
14092
- "items": {
14093
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TargetSelectionGroup"
14094
- }
14095
- }
14096
- },
14097
- "required": [
14098
- "groups"
14099
- ]
14100
- },
14101
- "TournamentRoomMatchReadyPayload": {
14102
- "description": "Private match access delivered over a tournament room socket.",
14103
- "type": "object",
14104
- "properties": {
14105
- "access": {
14106
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/MatchAccessResponse"
14107
- },
14108
- "tableId": {
14109
- "type": "string",
14110
- "format": "uuid"
14111
- }
14112
- },
14113
- "required": [
14114
- "tableId",
14115
- "access"
14116
- ]
14117
- },
14118
- "TournamentRoomPlayerView": {
14119
- "description": "Public tournament player row.",
14120
- "type": "object",
14121
- "properties": {
14122
- "activeTableId": {
14123
- "type": [
14124
- "string",
14125
- "null"
14126
- ],
14127
- "format": "uuid"
14128
- },
14129
- "authenticated": {
14130
- "description": "Whether this player joined from an authenticated app session.",
14131
- "type": "boolean"
14132
- },
14133
- "avatarUrl": {
14134
- "type": [
14135
- "string",
14136
- "null"
14137
- ]
14138
- },
14139
- "connected": {
14140
- "type": "boolean"
14141
- },
14142
- "deck": {
14143
- "anyOf": [
14144
- {
14145
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LobbyDeckPreview"
14146
- },
14147
- {
14148
- "type": "null"
14149
- }
14150
- ]
14151
- },
14152
- "deckReady": {
14153
- "type": "boolean"
14154
- },
14155
- "host": {
14156
- "type": "boolean"
14157
- },
14158
- "joinedAtMs": {
14159
- "type": "integer",
14160
- "format": "uint64",
14161
- "minimum": 0
14162
- },
14163
- "name": {
14164
- "type": "string"
14165
- },
14166
- "playerId": {
14167
- "type": "string",
14168
- "format": "uuid"
14169
- },
14170
- "profileUrl": {
14171
- "type": [
14172
- "string",
14173
- "null"
14174
- ]
14175
- },
14176
- "ready": {
14177
- "type": "boolean"
14178
- }
14179
- },
14180
- "required": [
14181
- "playerId",
14182
- "name",
14183
- "authenticated",
14184
- "host",
14185
- "connected",
14186
- "ready",
14187
- "deckReady",
14188
- "joinedAtMs"
14189
- ]
14190
- },
14191
- "TournamentRoomPrivateView": {
14192
- "description": "Private tournament room state for the requester.",
14193
- "type": "object",
14194
- "properties": {
14195
- "eventAccess": {
14196
- "anyOf": [
14197
- {
14198
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LimitedEventAccessResponse"
14199
- },
14200
- {
14201
- "type": "null"
14202
- }
14203
- ]
14204
- },
14205
- "host": {
14206
- "type": "boolean"
14207
- },
14208
- "matchAccess": {
14209
- "anyOf": [
14210
- {
14211
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/MatchAccessResponse"
14212
- },
14213
- {
14214
- "type": "null"
14215
- }
14216
- ]
14217
- },
14218
- "playerId": {
14219
- "type": "string",
14220
- "format": "uuid"
14221
- }
14222
- },
14223
- "required": [
14224
- "playerId",
14225
- "host"
14226
- ]
14227
- },
14228
- "TournamentRoomSnapshot": {
14229
- "description": "Public tournament room snapshot.",
14230
- "type": "object",
14231
- "properties": {
14232
- "activity": {
14233
- "description": "Recent human-player connection activity for the tournament room.",
14234
- "type": "array",
14235
- "items": {
14236
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/RoomPlayerPresenceEvent"
14237
- }
14238
- },
14239
- "bestOfMatches": {
14240
- "type": "integer",
14241
- "format": "uint8",
14242
- "maximum": 255,
14243
- "minimum": 0
14244
- },
14245
- "chat": {
14246
- "type": "array",
14247
- "items": {
14248
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LobbyChatMessage"
14249
- }
14250
- },
14251
- "draftRounds": {
14252
- "type": "array",
14253
- "items": {
14254
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/DraftRoundConfig"
14255
- }
14256
- },
14257
- "event": {
14258
- "anyOf": [
14259
- {
14260
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LimitedEventSnapshot"
14261
- },
14262
- {
14263
- "type": "null"
14264
- }
14265
- ]
14266
- },
14267
- "eventKind": {
14268
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LimitedEventKind"
14269
- },
14270
- "hostPlayerId": {
14271
- "type": "string",
14272
- "format": "uuid"
14273
- },
14274
- "matchSeed": {
14275
- "description": "Fixed duel match seed when configured.",
14276
- "type": [
14277
- "string",
14278
- "null"
14279
- ]
14280
- },
14281
- "packSeed": {
14282
- "description": "Fixed limited pack/leader seed when configured.",
14283
- "type": [
14284
- "string",
14285
- "null"
14286
- ]
14287
- },
14288
- "players": {
14289
- "type": "array",
14290
- "items": {
14291
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TournamentRoomPlayerView"
14292
- }
14293
- },
14294
- "requiredPlayerCount": {
14295
- "type": "integer",
14296
- "format": "uint8",
14297
- "maximum": 255,
14298
- "minimum": 0
14299
- },
14300
- "roomId": {
14301
- "type": "string",
14302
- "format": "uuid"
14303
- },
14304
- "sealedPackCount": {
14305
- "type": [
14306
- "integer",
14307
- "null"
14308
- ],
14309
- "format": "uint8",
14310
- "maximum": 255,
14311
- "minimum": 0
14312
- },
14313
- "setCode": {
14314
- "type": "string"
14315
- },
14316
- "status": {
14317
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TournamentRoomStatus"
14318
- },
14319
- "tables": {
14320
- "type": "array",
14321
- "items": {
14322
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TournamentTableView"
14323
- }
14324
- },
14325
- "visibility": {
14326
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LobbyVisibility"
14327
- }
14328
- },
14329
- "required": [
14330
- "roomId",
14331
- "status",
14332
- "visibility",
14333
- "eventKind",
14334
- "setCode",
14335
- "bestOfMatches",
14336
- "draftRounds",
14337
- "hostPlayerId",
14338
- "requiredPlayerCount",
14339
- "players",
14340
- "tables",
14341
- "chat",
14342
- "activity"
14343
- ]
14344
- },
14345
- "TournamentRoomStatus": {
14346
- "description": "Public lifecycle state for one tournament room.",
14347
- "type": "string",
14348
- "enum": [
14349
- "waiting",
14350
- "eventStarted",
14351
- "deckBuilding",
14352
- "matchmaking",
14353
- "closed"
14354
- ]
14355
- },
14356
- "TournamentRoomWelcomePayload": {
14357
- "description": "Welcome payload for tournament room sockets.",
14358
- "type": "object",
14359
- "properties": {
14360
- "playerId": {
14361
- "type": "string",
14362
- "format": "uuid"
14363
- },
14364
- "roomId": {
14365
- "type": "string",
14366
- "format": "uuid"
14367
- }
14368
- },
14369
- "required": [
14370
- "roomId",
14371
- "playerId"
14372
- ]
14373
- },
14374
- "TournamentTableStatus": {
14375
- "description": "Public duel table lifecycle.",
14376
- "type": "string",
14377
- "enum": [
14378
- "open",
14379
- "active",
14380
- "closed"
14381
- ]
14382
- },
14383
- "TournamentTableView": {
14384
- "description": "Public state for one open or active duel table.",
14385
- "type": "object",
14386
- "properties": {
14387
- "createdAtMs": {
14388
- "type": "integer",
14389
- "format": "uint64",
14390
- "minimum": 0
14391
- },
14392
- "creatorPlayerId": {
14393
- "type": "string",
14394
- "format": "uuid"
14395
- },
14396
- "matchId": {
14397
- "type": [
14398
- "string",
14399
- "null"
14400
- ],
14401
- "format": "uuid"
14402
- },
14403
- "opponentPlayerId": {
14404
- "type": [
14405
- "string",
14406
- "null"
14407
- ],
14408
- "format": "uuid"
14409
- },
14410
- "returnedPlayerIds": {
14411
- "type": "array",
14412
- "items": {
14413
- "type": "string",
14414
- "format": "uuid"
14415
- }
14416
- },
14417
- "status": {
14418
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TournamentTableStatus"
14419
- },
14420
- "tableId": {
14421
- "type": "string",
14422
- "format": "uuid"
14423
- }
14424
- },
14425
- "required": [
14426
- "tableId",
14427
- "status",
14428
- "creatorPlayerId",
14429
- "returnedPlayerIds",
14430
- "createdAtMs"
14431
- ]
14432
- },
14433
- "TriggerWindowView": {
14434
- "description": "Condensed public trigger timing for granted abilities.\n\nA deliberate bucket list rather than the full parser window enum: each\nvariant needs localized copy in every client language, so only timings\ncommon on grants get their own bucket and the rest collapse to `Other`.",
14435
- "type": "string",
14436
- "enum": [
14437
- "whenPlayed",
14438
- "onAttack",
14439
- "whenDefeated",
14440
- "whenAttacked",
14441
- "whenDamaged",
14442
- "whenHealed",
14443
- "whenCaptured",
14444
- "whenReadies",
14445
- "whenAttackEnds",
14446
- "whenDealsCombatDamage",
14447
- "startOfActionPhase",
14448
- "startOfRegroup",
14449
- "other"
14450
- ]
14451
- },
14452
- "TurnPassSource": {
14453
- "type": "string",
14454
- "enum": [
14455
- "playerAction",
14456
- "automatic"
14457
- ]
14458
- },
14459
- "TwinSunsCounter": {
14460
- "description": "Shared counters that can be taken as a Twin Suns action.",
14461
- "type": "string",
14462
- "enum": [
14463
- "initiative",
14464
- "blast",
14465
- "plan"
14466
- ]
14467
- },
14468
- "TwinSunsCountersView": {
14469
- "type": "object",
14470
- "properties": {
14471
- "blast": {
14472
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/SharedCounterState"
14473
- },
14474
- "initiative": {
14475
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/SharedCounterState"
14476
- },
14477
- "plan": {
14478
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/SharedCounterState"
14479
- }
14480
- },
14481
- "required": [
14482
- "initiative",
14483
- "blast",
14484
- "plan"
14485
- ]
14486
- },
14487
- "UndoCancelReason": {
14488
- "description": "Why a pending undo request was cancelled without applying.",
14489
- "oneOf": [
14490
- {
14491
- "description": "The requester withdrew their own request.",
14492
- "type": "string",
14493
- "const": "requester"
14494
- },
14495
- {
14496
- "description": "A newer game mutation (command, ready, format event) made the request\nstale, so it was discarded automatically.",
14497
- "type": "string",
14498
- "const": "superseded"
14499
- },
14500
- {
14501
- "description": "The undo target no longer matched the match history when the final\napproval arrived.",
14502
- "type": "string",
14503
- "const": "invalidated"
14504
- }
14505
- ]
14506
- },
14507
- "UndoRequestReason": {
14508
- "description": "Why an undo needs approval from the other players.",
14509
- "oneOf": [
14510
- {
14511
- "description": "The checkpoint group being undone revealed hidden information\n(card draws, deck searches, reveals, deck discards, mulligan).",
14512
- "type": "string",
14513
- "const": "revealedHiddenInfo"
14514
- },
14515
- {
14516
- "description": "The most recent checkpoint was created by a different seat than the\nrequester, so the undo would erase another player's action.",
14517
- "type": "string",
14518
- "const": "otherPlayerActed"
14519
- }
14520
- ]
14521
- },
14522
- "UniquenessFilter": {
14523
- "type": "string",
14524
- "enum": [
14525
- "Any",
14526
- "Unique",
14527
- "NonUnique"
14528
- ]
14529
- },
14530
- "UnitAbilitySuppressionView": {
14531
- "type": "string",
14532
- "enum": [
14533
- "none",
14534
- "partial",
14535
- "full"
14536
- ]
14537
- },
14538
- "UnitCopiedCardEntry": {
14539
- "description": "Mirror of one [`UnitState::copied_card`] value on the wire.",
14540
- "type": "object",
14541
- "properties": {
14542
- "copiedCardId": {
14543
- "description": "Card id of the card that was copied — the copy *source*, not the\nphysical card on the board (which travels in `UnitState::card_id`).\nResolved against the catalog at restore time — restore fails if the id\nis not present.",
14544
- "type": "integer",
14545
- "format": "uint32",
14546
- "minimum": 0
14547
- },
14548
- "unitInstanceId": {
14549
- "description": "Instance id of the unit whose `copied_card` should be rebound.",
14550
- "type": "integer",
14551
- "format": "uint64",
14552
- "minimum": 0
14553
- }
14554
- },
14555
- "required": [
14556
- "unitInstanceId",
14557
- "copiedCardId"
14558
- ]
14559
- },
14560
- "UnitDefeatCause": {
14561
- "type": "string",
14562
- "enum": [
14563
- "other",
14564
- "damage"
14565
- ]
14566
- },
14567
- "UnitExtremum": {
14568
- "oneOf": [
14569
- {
14570
- "type": "string",
14571
- "enum": [
14572
- "LeastRemainingHp"
14573
- ]
14574
- },
14575
- {
14576
- "description": "Selects the unit(s) with the highest effective power.",
14577
- "type": "string",
14578
- "const": "MostPower"
14579
- },
14580
- {
14581
- "description": "Selects every unit tied for highest printed cost in filtered set.",
14582
- "type": "string",
14583
- "const": "HighestPrintedCost"
14584
- }
14585
- ]
14586
- },
14587
- "UnitFilter": {
14588
- "type": "object",
14589
- "properties": {
14590
- "alternatives": {
14591
- "description": "Matches when any complete alternative filter matches.\n\nThis keeps `one_of((unit_selector_a, unit_selector_b))` orthogonal\nwithout flattening distinct restrictions into one lossy filter.",
14592
- "type": "array",
14593
- "default": [],
14594
- "items": {
14595
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/UnitFilter"
14596
- }
14597
- },
14598
- "arena": {
14599
- "anyOf": [
14600
- {
14601
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/CardArena"
14602
- },
14603
- {
14604
- "type": "null"
14605
- }
14606
- ]
14607
- },
14608
- "attacked_base_this_phase": {
14609
- "type": "boolean"
14610
- },
14611
- "controller": {
14612
- "description": "Requires current control by one typed player independently from the\nbroad source-relative relation.",
14613
- "anyOf": [
14614
- {
14615
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/PlayerTargetPattern"
14616
- },
14617
- {
14618
- "type": "null"
14619
- }
14620
- ],
14621
- "default": null
14622
- },
14623
- "controller_is_another_player": {
14624
- "description": "Marks a count whose Units must all be controlled by one other player.\n\nThis is consumed by `Condition::AnotherPlayerControlsUnitsAtLeast`\nbefore the filter reaches ordinary target matching.",
14625
- "type": "boolean",
14626
- "default": false
14627
- },
14628
- "controller_is_remembered_player": {
14629
- "type": "boolean"
14630
- },
14631
- "dealt_base_damage_this_phase": {
14632
- "type": "boolean"
14633
- },
14634
- "different_arena_from_source": {
14635
- "description": "Matches a Unit in the arena opposite the resolving source Unit.",
14636
- "type": "boolean",
14637
- "default": false
14638
- },
14639
- "different_aspect_from_remembered_card": {
14640
- "type": "boolean"
14641
- },
14642
- "eligible_for_remembered_upgrade": {
14643
- "description": "Requires legal attachment for Upgrade retained by preceding choice.",
14644
- "type": "boolean",
14645
- "default": false
14646
- },
14647
- "exact_cost": {
14648
- "type": [
14649
- "integer",
14650
- "null"
14651
- ],
14652
- "format": "uint8",
14653
- "maximum": 255,
14654
- "minimum": 0
14655
- },
14656
- "exact_cost_same_as_remembered_cost": {
14657
- "description": "Only matches units whose cost equals context.remembered_unit_cost.",
14658
- "type": "boolean",
14659
- "default": false
14660
- },
14661
- "exact_power_equal_ready_resources": {
14662
- "type": "boolean"
14663
- },
14664
- "exact_remaining_hp_equal_ready_resources": {
14665
- "type": "boolean"
14666
- },
14667
- "exact_title": {
14668
- "type": [
14669
- "string",
14670
- "null"
14671
- ]
14672
- },
14673
- "exact_titles_any": {
14674
- "description": "Matches any unit whose title is in this list. When combined with\nrequired_traits_any, either a matching title or trait satisfies the\nname/trait requirement.",
14675
- "type": "array",
14676
- "items": {
14677
- "type": "string"
14678
- }
14679
- },
14680
- "exclude_attached_unit": {
14681
- "description": "Excludes Unit hosting resolving source Upgrade.",
14682
- "type": "boolean",
14683
- "default": false
14684
- },
14685
- "exclude_previous_damage_dealer": {
14686
- "description": "Excludes only the Unit that dealt the immediately preceding damage.",
14687
- "type": "boolean",
14688
- "default": false
14689
- },
14690
- "exclude_previously_selected": {
14691
- "description": "Excludes every Unit already selected earlier in the resolving effect.\n\nDistinct from `require_other`, which only knows the source Unit and the\nsingle most recent selection: a third sequential choice (\"Give a third\nfriendly unit +1/+1\") has to exclude both earlier picks.",
14692
- "anyOf": [
14693
- {
14694
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/SelectionScope"
14695
- },
14696
- {
14697
- "type": "null"
14698
- }
14699
- ],
14700
- "default": null
14701
- },
14702
- "exclude_remembered_units": {
14703
- "description": "Excludes units retained by a preceding multi-target choice.",
14704
- "type": "boolean",
14705
- "default": false
14706
- },
14707
- "excluded_aspects": {
14708
- "type": "array",
14709
- "items": {
14710
- "type": "string"
14711
- }
14712
- },
14713
- "excluded_controller": {
14714
- "description": "Excludes units currently controlled by one typed player.",
14715
- "anyOf": [
14716
- {
14717
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/PlayerTargetPattern"
14718
- },
14719
- {
14720
- "type": "null"
14721
- }
14722
- ],
14723
- "default": null
14724
- },
14725
- "excluded_titles": {
14726
- "description": "Excludes units with any listed canonical title.",
14727
- "type": "array",
14728
- "default": [],
14729
- "items": {
14730
- "type": "string"
14731
- }
14732
- },
14733
- "excluded_traits": {
14734
- "type": "array",
14735
- "items": {
14736
- "type": "string"
14737
- }
14738
- },
14739
- "exploited_to_play_source": {
14740
- "description": "Restricts iteration to Units exploited while playing resolving source card.",
14741
- "type": "boolean",
14742
- "default": false
14743
- },
14744
- "extremum": {
14745
- "anyOf": [
14746
- {
14747
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/UnitExtremum"
14748
- },
14749
- {
14750
- "type": "null"
14751
- }
14752
- ]
14753
- },
14754
- "max_cost": {
14755
- "type": [
14756
- "integer",
14757
- "null"
14758
- ],
14759
- "format": "uint8",
14760
- "maximum": 255,
14761
- "minimum": 0
14762
- },
14763
- "max_cost_less_than_combat_damage_to_base": {
14764
- "description": "Only matches units whose printed cost is strictly less than the amount of\ncombat damage dealt to a base this attack\n(`context.combat_damage_dealt_to_base`). Shin Hati ASH 51762.",
14765
- "type": "boolean",
14766
- "default": false
14767
- },
14768
- "max_cost_same_or_less_than_remembered_cost": {
14769
- "description": "Filters out units whose cost exceeds the cost stored in context.remembered_unit_cost.",
14770
- "type": "boolean"
14771
- },
14772
- "max_cost_same_or_less_than_resources_paid_to_play": {
14773
- "description": "Filters out units whose printed cost exceeds resources paid to play the\nsource card for current trigger.",
14774
- "type": "boolean",
14775
- "default": false
14776
- },
14777
- "max_cost_same_or_less_than_source": {
14778
- "type": "boolean"
14779
- },
14780
- "max_power": {
14781
- "type": [
14782
- "integer",
14783
- "null"
14784
- ],
14785
- "format": "int16",
14786
- "maximum": 32767,
14787
- "minimum": -32768
14788
- },
14789
- "max_power_dynamic": {
14790
- "description": "Dynamic alternative to a fixed `max_power`.",
14791
- "anyOf": [
14792
- {
14793
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/DynamicPowerLimit"
14794
- },
14795
- {
14796
- "type": "null"
14797
- }
14798
- ],
14799
- "default": null
14800
- },
14801
- "max_power_less_than_any_friendly": {
14802
- "description": "Only matches a unit whose power is strictly less than at least one\nfriendly unit's power (Ahsoka Tano 51727 action target restriction).",
14803
- "type": "boolean",
14804
- "default": false
14805
- },
14806
- "max_power_less_than_remembered_power": {
14807
- "description": "Only matches Units with strictly less power than remembered Unit.",
14808
- "type": "boolean",
14809
- "default": false
14810
- },
14811
- "max_power_less_than_source": {
14812
- "type": "boolean"
14813
- },
14814
- "max_power_same_or_less_than_remembered_power": {
14815
- "description": "Filters out units whose power exceeds the power stored in context.remembered_unit_power.",
14816
- "type": "boolean"
14817
- },
14818
- "max_remaining_hp": {
15268
+ },
15269
+ "TargetSelectionGroup": {
15270
+ "type": "object",
15271
+ "properties": {
15272
+ "clauseId": {
15273
+ "description": "Stable, per-ability identifier for the clause this group belongs to.\n\nFor multi-group abilities the engine assigns an ascending index (0-based)\nin group order. Single-group abilities leave this `None`.",
14819
15274
  "type": [
14820
15275
  "integer",
14821
15276
  "null"
14822
15277
  ],
14823
- "format": "int16",
14824
- "maximum": 32767,
14825
- "minimum": -32768
15278
+ "format": "uint32",
15279
+ "minimum": 0
14826
15280
  },
14827
- "max_remaining_hp_less_than_source": {
15281
+ "distinct": {
14828
15282
  "type": "boolean"
14829
15283
  },
14830
- "min_cost": {
14831
- "type": [
14832
- "integer",
14833
- "null"
14834
- ],
15284
+ "max": {
15285
+ "type": "integer",
14835
15286
  "format": "uint8",
14836
15287
  "maximum": 255,
14837
15288
  "minimum": 0
14838
15289
  },
14839
- "min_cost_greater_than_remembered_cost": {
14840
- "description": "Only matches units whose cost is strictly greater than the cost stored in\ncontext.remembered_unit_cost (e.g. Reckless Sacrifice's \"a unit that costs\nmore than the discarded card\").",
14841
- "type": "boolean",
14842
- "default": false
15290
+ "min": {
15291
+ "type": "integer",
15292
+ "format": "uint8",
15293
+ "maximum": 255,
15294
+ "minimum": 0
14843
15295
  },
14844
- "min_hp": {
14845
- "type": [
14846
- "integer",
14847
- "null"
14848
- ],
14849
- "format": "int16",
14850
- "maximum": 32767,
14851
- "minimum": -32768
15296
+ "purpose": {
15297
+ "description": "Structural purpose of this individual target group, so the UI can render\na localized per-clause label instead of parsing printed card text.\n\nPopulated from the typed effect variant that produced the group. Single-\ngroup abilities also carry a purpose. `None` only when the producing\neffect requests targets but has no classifiable structural meaning.",
15298
+ "anyOf": [
15299
+ {
15300
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TargetGroupPurpose"
15301
+ },
15302
+ {
15303
+ "type": "null"
15304
+ }
15305
+ ]
14852
15306
  },
14853
- "min_power": {
14854
- "type": [
14855
- "integer",
14856
- "null"
14857
- ],
14858
- "format": "int16",
14859
- "maximum": 32767,
14860
- "minimum": -32768
15307
+ "textReferences": {
15308
+ "description": "Reviewed printed text that produced this exact group.\n\nReferences are locale-neutral and preserve nested printed-effect\nownership without placing card prose in public match state.",
15309
+ "type": "array",
15310
+ "items": {
15311
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/CardTextRef"
15312
+ }
15313
+ },
15314
+ "validTargets": {
15315
+ "type": "array",
15316
+ "items": {
15317
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/AbilityTarget"
15318
+ }
15319
+ }
15320
+ },
15321
+ "required": [
15322
+ "validTargets",
15323
+ "min",
15324
+ "max",
15325
+ "distinct"
15326
+ ]
15327
+ },
15328
+ "TargetSelectionPlanView": {
15329
+ "description": "Public target-selection contract for one prompt or pending ability.\n\nThe engine keeps resolution-only bindings internally. Clients receive only\nthe ordered groups needed to render legal targets and submit selections.",
15330
+ "type": "object",
15331
+ "properties": {
15332
+ "groups": {
15333
+ "type": "array",
15334
+ "items": {
15335
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TargetSelectionGroup"
15336
+ }
15337
+ }
15338
+ },
15339
+ "required": [
15340
+ "groups"
15341
+ ]
15342
+ },
15343
+ "TournamentRoomMatchReadyPayload": {
15344
+ "description": "Private match access delivered over a tournament room socket.",
15345
+ "type": "object",
15346
+ "properties": {
15347
+ "access": {
15348
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/MatchAccessResponse"
14861
15349
  },
14862
- "min_remaining_hp": {
15350
+ "tableId": {
15351
+ "type": "string",
15352
+ "format": "uuid"
15353
+ }
15354
+ },
15355
+ "required": [
15356
+ "tableId",
15357
+ "access"
15358
+ ]
15359
+ },
15360
+ "TournamentRoomPlayerView": {
15361
+ "description": "Public tournament player row.",
15362
+ "type": "object",
15363
+ "properties": {
15364
+ "activeTableId": {
14863
15365
  "type": [
14864
- "integer",
15366
+ "string",
14865
15367
  "null"
14866
15368
  ],
14867
- "format": "int16",
14868
- "default": null,
14869
- "maximum": 32767,
14870
- "minimum": -32768
15369
+ "format": "uuid"
15370
+ },
15371
+ "authenticated": {
15372
+ "description": "Whether this player joined from an authenticated app session.",
15373
+ "type": "boolean"
14871
15374
  },
14872
- "minimum_distinct_keywords": {
14873
- "description": "Only matches Units with at least this many distinct active keywords.",
15375
+ "avatarUrl": {
14874
15376
  "type": [
14875
- "integer",
15377
+ "string",
14876
15378
  "null"
14877
- ],
14878
- "format": "uint8",
14879
- "default": null,
14880
- "maximum": 255,
14881
- "minimum": 0
15379
+ ]
14882
15380
  },
14883
- "non_leader": {
15381
+ "connected": {
14884
15382
  "type": "boolean"
14885
15383
  },
14886
- "owner": {
14887
- "description": "Requires canonical ownership by one typed player independently from\ncurrent controller relation.",
15384
+ "deck": {
14888
15385
  "anyOf": [
14889
15386
  {
14890
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/PlayerTargetPattern"
15387
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LobbyDeckPreview"
14891
15388
  },
14892
15389
  {
14893
15390
  "type": "null"
14894
15391
  }
14895
- ],
14896
- "default": null
14897
- },
14898
- "relation": {
14899
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/RelationFilter"
14900
- },
14901
- "require_attacked_this_phase": {
14902
- "description": "Only matches units that attacked during the current phase.",
14903
- "type": "boolean",
14904
- "default": false
14905
- },
14906
- "require_damaged": {
14907
- "type": "boolean"
15392
+ ]
14908
15393
  },
14909
- "require_entered_this_phase": {
14910
- "description": "Only matches units that entered play this phase (UnitState::entered_this_phase).",
15394
+ "deckReady": {
14911
15395
  "type": "boolean"
14912
15396
  },
14913
- "require_exhausted": {
15397
+ "host": {
14914
15398
  "type": "boolean"
14915
15399
  },
14916
- "require_has_keyword": {
14917
- "description": "Only matches units that have at least one keyword (printed or granted).",
14918
- "type": "boolean",
14919
- "default": false
14920
- },
14921
- "require_healed_this_phase": {
14922
- "description": "Only matches Units healed at least once during current phase.",
14923
- "type": "boolean",
14924
- "default": false
14925
- },
14926
- "require_leader": {
14927
- "description": "Restrict to leader units (deployed leaders). Set by \"a friendly leader\"\ntargets, e.g. Mando's N-1 Starfighter (ASH 52696).",
15400
+ "isAi": {
15401
+ "description": "Whether server automation permanently controls this participant.",
14928
15402
  "type": "boolean",
14929
15403
  "default": false
14930
15404
  },
14931
- "require_no_experience": {
14932
- "description": "Filters out units that have an Experience token attached.",
14933
- "type": "boolean"
14934
- },
14935
- "require_no_pilot": {
14936
- "type": "boolean"
15405
+ "joinedAtMs": {
15406
+ "type": "integer",
15407
+ "format": "uint64",
15408
+ "minimum": 0
14937
15409
  },
14938
- "require_not_attacked_this_phase": {
14939
- "description": "Filters out units that attacked earlier this phase.",
14940
- "type": "boolean"
15410
+ "name": {
15411
+ "type": "string"
14941
15412
  },
14942
- "require_not_entered_this_phase": {
14943
- "description": "Only matches Units that did not enter play during current phase.",
14944
- "type": "boolean",
14945
- "default": false
15413
+ "playerId": {
15414
+ "type": "string",
15415
+ "format": "uuid"
14946
15416
  },
14947
- "require_not_entered_this_round": {
14948
- "description": "Only matches Units that did not enter play during current round.",
14949
- "type": "boolean",
14950
- "default": false
15417
+ "profileUrl": {
15418
+ "type": [
15419
+ "string",
15420
+ "null"
15421
+ ]
14951
15422
  },
14952
- "require_other": {
15423
+ "ready": {
14953
15424
  "type": "boolean"
15425
+ }
15426
+ },
15427
+ "required": [
15428
+ "playerId",
15429
+ "name",
15430
+ "authenticated",
15431
+ "host",
15432
+ "connected",
15433
+ "ready",
15434
+ "deckReady",
15435
+ "joinedAtMs"
15436
+ ]
15437
+ },
15438
+ "TournamentRoomPrivateView": {
15439
+ "description": "Private tournament room state for the requester.",
15440
+ "type": "object",
15441
+ "properties": {
15442
+ "eventAccess": {
15443
+ "anyOf": [
15444
+ {
15445
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LimitedEventAccessResponse"
15446
+ },
15447
+ {
15448
+ "type": "null"
15449
+ }
15450
+ ]
14954
15451
  },
14955
- "require_ready": {
15452
+ "host": {
14956
15453
  "type": "boolean"
14957
15454
  },
14958
- "require_shield_token": {
14959
- "description": "Only matches units that have at least one Shield token attached.",
14960
- "type": "boolean",
14961
- "default": false
14962
- },
14963
- "require_undamaged": {
14964
- "type": "boolean"
15455
+ "matchAccess": {
15456
+ "anyOf": [
15457
+ {
15458
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/MatchAccessResponse"
15459
+ },
15460
+ {
15461
+ "type": "null"
15462
+ }
15463
+ ]
14965
15464
  },
14966
- "required_aspects": {
15465
+ "playerId": {
15466
+ "type": "string",
15467
+ "format": "uuid"
15468
+ }
15469
+ },
15470
+ "required": [
15471
+ "playerId",
15472
+ "host"
15473
+ ]
15474
+ },
15475
+ "TournamentRoomSnapshot": {
15476
+ "description": "Public tournament room snapshot.",
15477
+ "type": "object",
15478
+ "properties": {
15479
+ "activity": {
15480
+ "description": "Recent human-player connection activity for the tournament room.",
14967
15481
  "type": "array",
14968
15482
  "items": {
14969
- "type": "string"
15483
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/RoomPlayerPresenceEvent"
14970
15484
  }
14971
15485
  },
14972
- "required_aspects_any": {
14973
- "type": "array",
14974
- "items": {
14975
- "type": "string"
14976
- }
15486
+ "bestOfMatches": {
15487
+ "type": "integer",
15488
+ "format": "uint8",
15489
+ "maximum": 255,
15490
+ "minimum": 0
14977
15491
  },
14978
- "required_card_or_upgrade_traits_any": {
15492
+ "chat": {
14979
15493
  "type": "array",
14980
15494
  "items": {
14981
- "type": "string"
15495
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LobbyChatMessage"
14982
15496
  }
14983
15497
  },
14984
- "required_keywords_any": {
15498
+ "draftRounds": {
14985
15499
  "type": "array",
14986
15500
  "items": {
14987
- "type": "string"
15501
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/DraftRoundConfig"
14988
15502
  }
14989
15503
  },
14990
- "required_traits": {
14991
- "type": "array",
14992
- "items": {
14993
- "type": "string"
14994
- }
15504
+ "event": {
15505
+ "anyOf": [
15506
+ {
15507
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LimitedEventSnapshot"
15508
+ },
15509
+ {
15510
+ "type": "null"
15511
+ }
15512
+ ]
15513
+ },
15514
+ "eventKind": {
15515
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LimitedEventKind"
15516
+ },
15517
+ "hostPlayerId": {
15518
+ "type": "string",
15519
+ "format": "uuid"
15520
+ },
15521
+ "matchSeed": {
15522
+ "description": "Fixed duel match seed when configured.",
15523
+ "type": [
15524
+ "string",
15525
+ "null"
15526
+ ]
15527
+ },
15528
+ "packSeed": {
15529
+ "description": "Fixed limited pack/leader seed when configured.",
15530
+ "type": [
15531
+ "string",
15532
+ "null"
15533
+ ]
14995
15534
  },
14996
- "required_traits_any": {
15535
+ "players": {
14997
15536
  "type": "array",
14998
15537
  "items": {
14999
- "type": "string"
15538
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TournamentRoomPlayerView"
15000
15539
  }
15001
15540
  },
15002
- "requires_chosen_aspect": {
15003
- "type": "boolean"
15004
- },
15005
- "same_arena_as_remembered_unit": {
15006
- "description": "Matches the arena occupied by Unit selected earlier in this ability.",
15007
- "type": "boolean",
15008
- "default": false
15009
- },
15010
- "same_arena_as_source": {
15011
- "type": "boolean"
15012
- },
15013
- "same_name_as_remembered_card": {
15014
- "type": "boolean"
15541
+ "requiredPlayerCount": {
15542
+ "type": "integer",
15543
+ "format": "uint8",
15544
+ "maximum": 255,
15545
+ "minimum": 0
15015
15546
  },
15016
- "same_name_as_remembered_unit": {
15017
- "description": "Matches Units with same name as Unit stored by preceding target choice.",
15018
- "type": "boolean",
15019
- "default": false
15547
+ "roomId": {
15548
+ "type": "string",
15549
+ "format": "uuid"
15020
15550
  },
15021
- "selected_max_combined_cost": {
15022
- "description": "Requires the selected units' printed costs to be at most this value.",
15551
+ "sealedPackCount": {
15023
15552
  "type": [
15024
15553
  "integer",
15025
15554
  "null"
15026
15555
  ],
15027
15556
  "format": "uint8",
15028
- "default": null,
15029
15557
  "maximum": 255,
15030
15558
  "minimum": 0
15031
15559
  },
15032
- "selected_max_combined_power": {
15033
- "description": "Requires selected Units' current combined power to be at most this value.",
15560
+ "setCode": {
15561
+ "type": "string"
15562
+ },
15563
+ "status": {
15564
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TournamentRoomStatus"
15565
+ },
15566
+ "tables": {
15567
+ "type": "array",
15568
+ "items": {
15569
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TournamentTableView"
15570
+ }
15571
+ },
15572
+ "visibility": {
15573
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LobbyVisibility"
15574
+ }
15575
+ },
15576
+ "required": [
15577
+ "roomId",
15578
+ "status",
15579
+ "visibility",
15580
+ "eventKind",
15581
+ "setCode",
15582
+ "bestOfMatches",
15583
+ "draftRounds",
15584
+ "hostPlayerId",
15585
+ "requiredPlayerCount",
15586
+ "players",
15587
+ "tables",
15588
+ "chat",
15589
+ "activity"
15590
+ ]
15591
+ },
15592
+ "TournamentRoomStatus": {
15593
+ "description": "Public lifecycle state for one tournament room.",
15594
+ "type": "string",
15595
+ "enum": [
15596
+ "waiting",
15597
+ "eventStarted",
15598
+ "deckBuilding",
15599
+ "matchmaking",
15600
+ "closed"
15601
+ ]
15602
+ },
15603
+ "TournamentRoomWelcomePayload": {
15604
+ "description": "Welcome payload for tournament room sockets.",
15605
+ "type": "object",
15606
+ "properties": {
15607
+ "playerId": {
15608
+ "type": "string",
15609
+ "format": "uuid"
15610
+ },
15611
+ "roomId": {
15612
+ "type": "string",
15613
+ "format": "uuid"
15614
+ }
15615
+ },
15616
+ "required": [
15617
+ "roomId",
15618
+ "playerId"
15619
+ ]
15620
+ },
15621
+ "TournamentTableStatus": {
15622
+ "description": "Public duel table lifecycle.",
15623
+ "type": "string",
15624
+ "enum": [
15625
+ "open",
15626
+ "active",
15627
+ "closed"
15628
+ ]
15629
+ },
15630
+ "TournamentTableView": {
15631
+ "description": "Public state for one open or active duel table.",
15632
+ "type": "object",
15633
+ "properties": {
15634
+ "createdAtMs": {
15635
+ "type": "integer",
15636
+ "format": "uint64",
15637
+ "minimum": 0
15638
+ },
15639
+ "creatorPlayerId": {
15640
+ "type": "string",
15641
+ "format": "uuid"
15642
+ },
15643
+ "matchId": {
15034
15644
  "type": [
15035
- "integer",
15645
+ "string",
15036
15646
  "null"
15037
15647
  ],
15038
- "format": "int16",
15039
- "default": null,
15040
- "maximum": 32767,
15041
- "minimum": -32768
15648
+ "format": "uuid"
15042
15649
  },
15043
- "selected_max_combined_remaining_hp": {
15044
- "description": "Requires the selected units' combined remaining HP to be at most this\nvalue (Pre Vizsla ASH 51947: \"with a total of N or less remaining HP\").",
15650
+ "opponentPlayerId": {
15045
15651
  "type": [
15046
- "integer",
15652
+ "string",
15047
15653
  "null"
15048
15654
  ],
15049
- "format": "int16",
15050
- "default": null,
15051
- "maximum": 32767,
15052
- "minimum": -32768
15655
+ "format": "uuid"
15053
15656
  },
15054
- "selected_same_arena": {
15055
- "description": "Requires every selected unit in a multi-unit selection to share an arena.",
15056
- "type": "boolean",
15057
- "default": false
15657
+ "returnedPlayerIds": {
15658
+ "type": "array",
15659
+ "items": {
15660
+ "type": "string",
15661
+ "format": "uuid"
15662
+ }
15058
15663
  },
15059
- "selected_share_trait": {
15060
- "description": "Requires every selected Unit to share at least one Trait.",
15061
- "type": "boolean",
15062
- "default": false
15664
+ "status": {
15665
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/TournamentTableStatus"
15063
15666
  },
15064
- "shares_aspect_with_context_unit": {
15065
- "type": "boolean"
15667
+ "tableId": {
15668
+ "type": "string",
15669
+ "format": "uuid"
15670
+ }
15671
+ },
15672
+ "required": [
15673
+ "tableId",
15674
+ "status",
15675
+ "creatorPlayerId",
15676
+ "returnedPlayerIds",
15677
+ "createdAtMs"
15678
+ ]
15679
+ },
15680
+ "TriggerWindowView": {
15681
+ "description": "Condensed public trigger timing for granted abilities.\n\nA deliberate bucket list rather than the full parser window enum: each\nvariant needs localized copy in every client language, so only timings\ncommon on grants get their own bucket and the rest collapse to `Other`.",
15682
+ "type": "string",
15683
+ "enum": [
15684
+ "whenPlayed",
15685
+ "onAttack",
15686
+ "whenDefeated",
15687
+ "whenAttacked",
15688
+ "whenDamaged",
15689
+ "whenHealed",
15690
+ "whenCaptured",
15691
+ "whenReadies",
15692
+ "whenAttackEnds",
15693
+ "whenDealsCombatDamage",
15694
+ "startOfActionPhase",
15695
+ "startOfRegroup",
15696
+ "other"
15697
+ ]
15698
+ },
15699
+ "TurnPassSource": {
15700
+ "type": "string",
15701
+ "enum": [
15702
+ "playerAction",
15703
+ "automatic"
15704
+ ]
15705
+ },
15706
+ "TwinSunsCounter": {
15707
+ "description": "Shared counters that can be taken as a Twin Suns action.",
15708
+ "type": "string",
15709
+ "enum": [
15710
+ "initiative",
15711
+ "blast",
15712
+ "plan"
15713
+ ]
15714
+ },
15715
+ "TwinSunsCountersView": {
15716
+ "type": "object",
15717
+ "properties": {
15718
+ "blast": {
15719
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/SharedCounterState"
15066
15720
  },
15067
- "shares_trait_with_friendly_leader": {
15068
- "description": "Requires the target to share a trait with a leader card controlled by the source player.",
15069
- "type": "boolean"
15721
+ "initiative": {
15722
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/SharedCounterState"
15723
+ },
15724
+ "plan": {
15725
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/SharedCounterState"
15726
+ }
15727
+ },
15728
+ "required": [
15729
+ "initiative",
15730
+ "blast",
15731
+ "plan"
15732
+ ]
15733
+ },
15734
+ "UndoCancelReason": {
15735
+ "description": "Why a pending undo request was cancelled without applying.",
15736
+ "oneOf": [
15737
+ {
15738
+ "description": "The requester withdrew their own request.",
15739
+ "type": "string",
15740
+ "const": "requester"
15741
+ },
15742
+ {
15743
+ "description": "A newer game mutation (command, ready, format event) made the request\nstale, so it was discarded automatically.",
15744
+ "type": "string",
15745
+ "const": "superseded"
15070
15746
  },
15071
- "token_filter": {
15072
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/PresenceFilter"
15747
+ {
15748
+ "description": "The undo target no longer matched the match history when the final\napproval arrived.",
15749
+ "type": "string",
15750
+ "const": "invalidated"
15751
+ }
15752
+ ]
15753
+ },
15754
+ "UndoRequestReason": {
15755
+ "description": "Why an undo needs approval from the other players.",
15756
+ "oneOf": [
15757
+ {
15758
+ "description": "The checkpoint group being undone revealed hidden information\n(card draws, deck searches, reveals, deck discards, mulligan).",
15759
+ "type": "string",
15760
+ "const": "revealedHiddenInfo"
15073
15761
  },
15074
- "uniqueness_filter": {
15075
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/UniquenessFilter"
15762
+ {
15763
+ "description": "The most recent checkpoint was created by a different seat than the\nrequester, so the undo would erase another player's action.",
15764
+ "type": "string",
15765
+ "const": "otherPlayerActed"
15766
+ }
15767
+ ]
15768
+ },
15769
+ "UnitAbilitySuppressionView": {
15770
+ "type": "string",
15771
+ "enum": [
15772
+ "none",
15773
+ "partial",
15774
+ "full"
15775
+ ]
15776
+ },
15777
+ "UnitCopiedCardEntry": {
15778
+ "description": "Mirror of one [`UnitState::copied_card`] value on the wire.",
15779
+ "type": "object",
15780
+ "properties": {
15781
+ "copiedCardId": {
15782
+ "description": "Card id of the card that was copied — the copy *source*, not the\nphysical card on the board (which travels in `UnitState::card_id`).\nResolved against the catalog at restore time — restore fails if the id\nis not present.",
15783
+ "type": "integer",
15784
+ "format": "uint32",
15785
+ "minimum": 0
15076
15786
  },
15077
- "upgrade_filter": {
15078
- "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/PresenceFilter"
15787
+ "unitInstanceId": {
15788
+ "description": "Instance id of the unit whose `copied_card` should be rebound.",
15789
+ "type": "integer",
15790
+ "format": "uint64",
15791
+ "minimum": 0
15079
15792
  }
15080
15793
  },
15081
15794
  "required": [
15082
- "relation",
15083
- "controller_is_remembered_player",
15084
- "require_other",
15085
- "require_damaged",
15086
- "require_undamaged",
15087
- "require_exhausted",
15088
- "require_ready",
15089
- "require_no_pilot",
15090
- "non_leader",
15091
- "uniqueness_filter",
15092
- "token_filter",
15093
- "upgrade_filter",
15094
- "exact_power_equal_ready_resources",
15095
- "exact_remaining_hp_equal_ready_resources",
15096
- "max_cost_same_or_less_than_source",
15097
- "max_power_less_than_source",
15098
- "max_remaining_hp_less_than_source",
15099
- "attacked_base_this_phase",
15100
- "dealt_base_damage_this_phase",
15101
- "required_traits",
15102
- "required_traits_any",
15103
- "shares_trait_with_friendly_leader",
15104
- "required_card_or_upgrade_traits_any",
15105
- "excluded_traits",
15106
- "required_aspects",
15107
- "required_aspects_any",
15108
- "excluded_aspects",
15109
- "required_keywords_any",
15110
- "requires_chosen_aspect",
15111
- "same_name_as_remembered_card",
15112
- "different_aspect_from_remembered_card",
15113
- "same_arena_as_source",
15114
- "shares_aspect_with_context_unit",
15115
- "exact_titles_any",
15116
- "require_no_experience",
15117
- "max_cost_same_or_less_than_remembered_cost",
15118
- "max_power_same_or_less_than_remembered_power",
15119
- "require_entered_this_phase",
15120
- "require_not_attacked_this_phase"
15795
+ "unitInstanceId",
15796
+ "copiedCardId"
15797
+ ]
15798
+ },
15799
+ "UnitDefeatCause": {
15800
+ "type": "string",
15801
+ "enum": [
15802
+ "other",
15803
+ "damage"
15121
15804
  ]
15122
15805
  },
15123
15806
  "UnitStateView": {
@@ -16847,6 +17530,24 @@ export const sdkSchemas = {
16847
17530
  "maximum": 255,
16848
17531
  "minimum": 0
16849
17532
  },
17533
+ "clearMatchSeed": {
17534
+ "description": "Clears the deterministic match seed, restoring random matches.",
17535
+ "type": "boolean"
17536
+ },
17537
+ "clearPackSeed": {
17538
+ "description": "Clears the deterministic Limited pool seed, restoring random pools.",
17539
+ "type": "boolean"
17540
+ },
17541
+ "draftRounds": {
17542
+ "description": "Replacement Chaos Draft booster sequence.",
17543
+ "type": [
17544
+ "array",
17545
+ "null"
17546
+ ],
17547
+ "items": {
17548
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/DraftRoundConfig"
17549
+ }
17550
+ },
16850
17551
  "gameTimerEnabled": {
16851
17552
  "type": [
16852
17553
  "boolean",
@@ -16864,6 +17565,27 @@ export const sdkSchemas = {
16864
17565
  }
16865
17566
  ]
16866
17567
  },
17568
+ "matchSeed": {
17569
+ "description": "Replacement deterministic match seed.",
17570
+ "type": [
17571
+ "string",
17572
+ "null"
17573
+ ]
17574
+ },
17575
+ "packSeed": {
17576
+ "description": "Replacement deterministic Limited pool seed.",
17577
+ "type": [
17578
+ "string",
17579
+ "null"
17580
+ ]
17581
+ },
17582
+ "pickTimerEnabled": {
17583
+ "description": "Enables or disables draft pick auto-selection countdowns.",
17584
+ "type": [
17585
+ "boolean",
17586
+ "null"
17587
+ ]
17588
+ },
16867
17589
  "playerCount": {
16868
17590
  "type": [
16869
17591
  "integer",
@@ -16876,6 +17598,34 @@ export const sdkSchemas = {
16876
17598
  "playerToken": {
16877
17599
  "type": "string"
16878
17600
  },
17601
+ "sealedPackCount": {
17602
+ "description": "Replacement Sealed booster count.",
17603
+ "type": [
17604
+ "integer",
17605
+ "null"
17606
+ ],
17607
+ "format": "uint8",
17608
+ "maximum": 255,
17609
+ "minimum": 0
17610
+ },
17611
+ "setCode": {
17612
+ "description": "Replacement Limited set code for sealed and normal Draft lobbies.",
17613
+ "type": [
17614
+ "string",
17615
+ "null"
17616
+ ]
17617
+ },
17618
+ "timerSettings": {
17619
+ "description": "Replaces timer durations for the final match and Limited event.",
17620
+ "anyOf": [
17621
+ {
17622
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LobbyTimerSettings"
17623
+ },
17624
+ {
17625
+ "type": "null"
17626
+ }
17627
+ ]
17628
+ },
16879
17629
  "trilogyFormat": {
16880
17630
  "description": "Replacement legality profile for Trilogy lobbies.",
16881
17631
  "anyOf": [
@@ -17828,6 +18578,17 @@ export const sdkSchemas = {
17828
18578
  "setCode": {
17829
18579
  "description": "Set code used for booster generation.",
17830
18580
  "type": "string"
18581
+ },
18582
+ "timerSettings": {
18583
+ "description": "Optional lobby-owned pick and deck-construction schedule.",
18584
+ "anyOf": [
18585
+ {
18586
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LimitedLobbyTimerSettings"
18587
+ },
18588
+ {
18589
+ "type": "null"
18590
+ }
18591
+ ]
17831
18592
  }
17832
18593
  },
17833
18594
  "required": [
@@ -17936,6 +18697,84 @@ export const sdkSchemas = {
17936
18697
  "description": "Empty request body for joining one limited event.",
17937
18698
  "type": "object"
17938
18699
  },
18700
+ 'leave-limited-event-request': {
18701
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
18702
+ "title": "LeaveLimitedEventRequest",
18703
+ "description": "Explicit departure from one direct Limited Event seat.",
18704
+ "type": "object",
18705
+ "properties": {
18706
+ "seatToken": {
18707
+ "description": "Seat token returned by create or join.",
18708
+ "type": "string"
18709
+ }
18710
+ },
18711
+ "required": [
18712
+ "seatToken"
18713
+ ]
18714
+ },
18715
+ 'limited-event-server-message': {
18716
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
18717
+ "title": "LimitedEventServerMessage",
18718
+ "description": "Server messages emitted by direct Limited Event sockets.",
18719
+ "oneOf": [
18720
+ {
18721
+ "type": "object",
18722
+ "properties": {
18723
+ "payload": {
18724
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/LimitedEventSnapshot"
18725
+ },
18726
+ "type": {
18727
+ "type": "string",
18728
+ "const": "snapshot"
18729
+ }
18730
+ },
18731
+ "required": [
18732
+ "type",
18733
+ "payload"
18734
+ ]
18735
+ },
18736
+ {
18737
+ "type": "object",
18738
+ "properties": {
18739
+ "payload": {
18740
+ "type": "object",
18741
+ "properties": {
18742
+ "nonce": {
18743
+ "type": [
18744
+ "string",
18745
+ "null"
18746
+ ]
18747
+ }
18748
+ }
18749
+ },
18750
+ "type": {
18751
+ "type": "string",
18752
+ "const": "pong"
18753
+ }
18754
+ },
18755
+ "required": [
18756
+ "type",
18757
+ "payload"
18758
+ ]
18759
+ },
18760
+ {
18761
+ "type": "object",
18762
+ "properties": {
18763
+ "payload": {
18764
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/ErrorPayload"
18765
+ },
18766
+ "type": {
18767
+ "type": "string",
18768
+ "const": "error"
18769
+ }
18770
+ },
18771
+ "required": [
18772
+ "type",
18773
+ "payload"
18774
+ ]
18775
+ }
18776
+ ]
18777
+ },
17939
18778
  'match-access-response': {
17940
18779
  "$schema": "https://json-schema.org/draft/2020-12/schema",
17941
18780
  "title": "MatchAccessResponse",
@@ -18778,6 +19617,61 @@ export const sdkSchemas = {
18778
19617
  "archive"
18779
19618
  ]
18780
19619
  },
19620
+ 'submit-ai-game-feedback-request': {
19621
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
19622
+ "title": "SubmitAiGameFeedbackRequest",
19623
+ "description": "Participant-authorized feedback for one completed Solo-versus-AI game.",
19624
+ "type": "object",
19625
+ "properties": {
19626
+ "comments": {
19627
+ "type": [
19628
+ "string",
19629
+ "null"
19630
+ ],
19631
+ "maxLength": 2000
19632
+ },
19633
+ "gameNumber": {
19634
+ "type": "integer",
19635
+ "format": "uint8",
19636
+ "maximum": 255,
19637
+ "minimum": 1
19638
+ },
19639
+ "identities": {
19640
+ "type": "array",
19641
+ "items": {
19642
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/HistoryIdentityInput"
19643
+ },
19644
+ "minItems": 1
19645
+ },
19646
+ "rating": {
19647
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/AiGameFeedbackRating"
19648
+ }
19649
+ },
19650
+ "required": [
19651
+ "identities",
19652
+ "gameNumber",
19653
+ "rating"
19654
+ ]
19655
+ },
19656
+ 'submit-ai-game-feedback-response': {
19657
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
19658
+ "title": "SubmitAiGameFeedbackResponse",
19659
+ "description": "Result of an idempotent AI-game-feedback submission.",
19660
+ "type": "object",
19661
+ "properties": {
19662
+ "created": {
19663
+ "description": "`false` means this game had already received feedback.",
19664
+ "type": "boolean"
19665
+ },
19666
+ "feedback": {
19667
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/AiGameFeedback"
19668
+ }
19669
+ },
19670
+ "required": [
19671
+ "feedback",
19672
+ "created"
19673
+ ]
19674
+ },
18781
19675
  'create-match-history-replay-share-request': {
18782
19676
  "$schema": "https://json-schema.org/draft/2020-12/schema",
18783
19677
  "title": "CreateMatchHistoryReplayShareRequest",
@@ -20549,11 +21443,33 @@ export const sdkSchemas = {
20549
21443
  "format": "uint32",
20550
21444
  "minimum": 0
20551
21445
  },
21446
+ "inputProvenance": {
21447
+ "description": "Exact reviewed owners for inputs supplied while playing this event.\n\nThis is emitted only for migrated declarations. It captures the\nplay command before later event clauses can replace the active\nprompt, which lets draft/history consumers retain the source input\nrather than borrowing a descendant's text.",
21448
+ "anyOf": [
21449
+ {
21450
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EventPlayInputProvenance"
21451
+ },
21452
+ {
21453
+ "type": "null"
21454
+ }
21455
+ ]
21456
+ },
20552
21457
  "playedWithSmuggle": {
20553
21458
  "type": "boolean"
20554
21459
  },
20555
21460
  "seat": {
20556
21461
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/Seat"
21462
+ },
21463
+ "text": {
21464
+ "description": "Exact printed event declaration exposed when this public event was played.",
21465
+ "anyOf": [
21466
+ {
21467
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
21468
+ },
21469
+ {
21470
+ "type": "null"
21471
+ }
21472
+ ]
20557
21473
  }
20558
21474
  },
20559
21475
  "required": [
@@ -21020,6 +21936,38 @@ export const sdkSchemas = {
21020
21936
  "cardsRevealed"
21021
21937
  ]
21022
21938
  },
21939
+ {
21940
+ "description": "Public cards explicitly selected from a discard pile during ability resolution.",
21941
+ "type": "object",
21942
+ "properties": {
21943
+ "cardsChosenFromDiscard": {
21944
+ "type": "object",
21945
+ "properties": {
21946
+ "cardIds": {
21947
+ "description": "Printed card identities in command order; duplicates represent distinct copies.",
21948
+ "type": "array",
21949
+ "items": {
21950
+ "type": "integer",
21951
+ "format": "uint32",
21952
+ "minimum": 0
21953
+ }
21954
+ },
21955
+ "seat": {
21956
+ "description": "Player who made the selection, which may differ from the discard-pile owner.",
21957
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/Seat"
21958
+ }
21959
+ },
21960
+ "required": [
21961
+ "seat",
21962
+ "cardIds"
21963
+ ]
21964
+ }
21965
+ },
21966
+ "additionalProperties": false,
21967
+ "required": [
21968
+ "cardsChosenFromDiscard"
21969
+ ]
21970
+ },
21023
21971
  {
21024
21972
  "type": "object",
21025
21973
  "properties": {
@@ -21212,6 +22160,17 @@ export const sdkSchemas = {
21212
22160
  "items": {
21213
22161
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/AbilityTarget"
21214
22162
  }
22163
+ },
22164
+ "text": {
22165
+ "description": "Exact public Action or Epic Action declaration that was used.",
22166
+ "anyOf": [
22167
+ {
22168
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
22169
+ },
22170
+ {
22171
+ "type": "null"
22172
+ }
22173
+ ]
21215
22174
  }
21216
22175
  },
21217
22176
  "required": [
@@ -21251,6 +22210,17 @@ export const sdkSchemas = {
21251
22210
  "format": "uint64",
21252
22211
  "minimum": 0
21253
22212
  },
22213
+ "text": {
22214
+ "description": "Exact public trigger declaration and currently resolved effect.",
22215
+ "anyOf": [
22216
+ {
22217
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/EffectTextRefsView"
22218
+ },
22219
+ {
22220
+ "type": "null"
22221
+ }
22222
+ ]
22223
+ },
21254
22224
  "window": {
21255
22225
  "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/AbilityWindow"
21256
22226
  }
@@ -22503,6 +23473,14 @@ export const sdkSchemas = {
22503
23473
  "type": "boolean",
22504
23474
  "default": false
22505
23475
  },
23476
+ "playgroundActionAbilities": {
23477
+ "description": "Host-only Playground ability projection. Empty for normal matches and\nwhile a resolution owns the command boundary.",
23478
+ "type": "array",
23479
+ "default": [],
23480
+ "items": {
23481
+ "$ref": "https://simulator-sdk.my-swu.com/schema/common.json#/$defs/PlaygroundActionAbilityView"
23482
+ }
23483
+ },
22506
23484
  "playgroundDeckCardIds": {
22507
23485
  "description": "Printed cards supplied by every configured Playground deck.",
22508
23486
  "type": "array",
@@ -22773,7 +23751,7 @@ export const sdkSchemas = {
22773
23751
  "description": "The serialized engine state. Catalog `Arc`s are skip-default here\nand grafted on by the restore path before the state goes live.\n\nOpaque to the public schema — SDK consumers should treat this as an\nimplementation-defined object that round-trips byte-for-byte. Pinning\nevery engine sub-struct into the schema would couple the SDK type\nsurface to the entire engine, which we explicitly do not want."
22774
23752
  },
22775
23753
  "version": {
22776
- "description": "Wire-format version. Always [`MATCH_SAVE_VERSION`] for newly minted\npayloads; restore rejects mismatches.",
23754
+ "description": "Wire-format version. Always [`MATCH_SAVE_VERSION`] for newly minted\npayloads; restore accepts every [`SUPPORTED_SAVE_VERSIONS`] entry and\nrejects anything else.",
22777
23755
  "type": "integer",
22778
23756
  "format": "uint8",
22779
23757
  "maximum": 255,